Home | History | Annotate | Download | only in mips
      1     /*
      2      * Signed 64-bit integer multiply.
      3      *         a1   a0
      4      *   x     a3   a2
      5      *   -------------
      6      *       a2a1 a2a0
      7      *       a3a0
      8      *  a3a1 (<= unused)
      9      *  ---------------
     10      *         v1   v0
     11      */
     12     /* mul-long vAA, vBB, vCC */
     13     FETCH(a0, 1)                           #  a0 <- CCBB
     14     and       t0, a0, 255                  #  a2 <- BB
     15     srl       t1, a0, 8                    #  a3 <- CC
     16     EAS2(t0, rFP, t0)                      #  t0 <- &fp[BB]
     17     LOAD64(a0, a1, t0)                     #  a0/a1 <- vBB/vBB+1
     18 
     19     EAS2(t1, rFP, t1)                      #  t0 <- &fp[CC]
     20     LOAD64(a2, a3, t1)                     #  a2/a3 <- vCC/vCC+1
     21 
     22     mul       v1, a3, a0                   #  v1= a3a0
     23 #ifdef MIPS32REVGE6
     24     mulu      v0, a2, a0                   #  v0= a2a0
     25     muhu      t1, a2, a0
     26 #else
     27     multu     a2, a0
     28     mfhi      t1
     29     mflo      v0                           #  v0= a2a0
     30 #endif
     31     mul       t0, a2, a1                   #  t0= a2a1
     32     addu      v1, v1, t1                   #  v1+= hi(a2a0)
     33     addu      v1, v1, t0                   #  v1= a3a0 + a2a1;
     34 
     35     GET_OPA(a0)                            #  a0 <- AA
     36     FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
     37     b         .L${opcode}_finish
     38 %break
     39 
     40 .L${opcode}_finish:
     41     GET_INST_OPCODE(t0)                    #  extract opcode from rINST
     42     SET_VREG64_GOTO(v0, v1, a0, t0)        #  vAA/vAA+1 <- v0(low)/v1(high)
     43