35 lines
1.1 KiB
ArmAsm
35 lines
1.1 KiB
ArmAsm
%default {"result":"","second":"","wide":"","suffix":"","rem":"0","ext":"cdq"}
|
|
/*
|
|
* 32-bit binary div/rem operation. Handles special case of op1=-1.
|
|
*/
|
|
/* div/rem/2addr vA, vB */
|
|
movl rINST, %ecx # rcx <- BA
|
|
sarl $$4, %ecx # rcx <- B
|
|
andb $$0xf, rINSTbl # rINST <- A
|
|
.if $wide
|
|
GET_WIDE_VREG %rax, rINSTq # eax <- vA
|
|
GET_WIDE_VREG $second, %rcx # ecx <- vB
|
|
.else
|
|
GET_VREG %eax, rINSTq # eax <- vA
|
|
GET_VREG $second, %rcx # ecx <- vB
|
|
.endif
|
|
test${suffix} $second, $second
|
|
jz common_errDivideByZero
|
|
cmp${suffix} $$-1, $second
|
|
je 2f
|
|
$ext # rdx:rax <- sign-extended of rax
|
|
idiv${suffix} $second
|
|
1:
|
|
.if $wide
|
|
SET_WIDE_VREG $result, rINSTq # vA <- result
|
|
.else
|
|
SET_VREG $result, rINSTq # vA <- result
|
|
.endif
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
|
|
2:
|
|
.if $rem
|
|
xor${suffix} $result, $result
|
|
.else
|
|
neg${suffix} $result
|
|
.endif
|
|
jmp 1b
|