27 lines
881 B
ArmAsm
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
|