allwinner_a64/android/art/runtime/interpreter/mterp/x86_64/bindivLit16.S
2018-08-08 16:48:17 +08:00

27 lines
881 B
ArmAsm

%default {"result":"","rem":"0"}
/*
* 32-bit binary div/rem operation. Handles special case of op1=-1.
*/
/* div/rem/lit16 vA, vB, #+CCCC */
/* Need A in rINST, ssssCCCC in ecx, vB in eax */
movl rINST, %eax # rax <- 000000BA
sarl $$4, %eax # eax <- B
GET_VREG %eax, %rax # eax <- vB
movswl 2(rPC), %ecx # ecx <- ssssCCCC
andb $$0xf, rINSTbl # rINST <- A
testl %ecx, %ecx
jz common_errDivideByZero
cmpl $$-1, %ecx
je 2f
cdq # rax <- sign-extended of eax
idivl %ecx
1:
SET_VREG $result, rINSTq # vA <- result
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
2:
.if $rem
xorl $result, $result
.else
negl $result
.endif
jmp 1b