Home | History | Annotate | Download | only in mips
      1     /*
      2      * Long integer shift.  This is different from the generic 32/64-bit
      3      * binary operations because vAA/vBB are 64-bit but vCC (the shift
      4      * distance) is 32-bit.  Also, Dalvik requires us to ignore all but the low
      5      * 6 bits.
      6      */
      7     /* shr-long vAA:vBB(rARG1:rARG0), vCC(a2) - result in (rRESULT1:rRESULT0) */
      8     sra     rRESULT1, rARG1, a2		#  rhi<- ahi >> (shift&31)
      9     srl     rRESULT0, rARG0, a2		#  rlo<- alo >> (shift&31)
     10     sra     a3, rARG1, 31		#  a3<- sign(ah)
     11     not     rARG0, a2			#  alo<- 31-shift (shift is 5b)
     12     sll     rARG1, 1
     13     sll     rARG1, rARG0		#  ahi<- ahi << (32-(shift&31))
     14     or      rRESULT0, rARG1		#  rlo<- rlo | ahi
     15     andi    a2, 0x20			#  shift & 0x20
     16     movn    rRESULT0, rRESULT1, a2	#  rlo<- rhi (if shift&0x20)
     17     movn    rRESULT1, a3, a2		#  rhi<- sign(ahi) (if shift&0x20)
     18     RETURN
     19