29 lines
956 B
ArmAsm
29 lines
956 B
ArmAsm
%default {"result":"","special":""}
|
|
/*
|
|
* 32-bit binary div/rem operation. Handles special case of op0=minint and
|
|
* op1=-1.
|
|
*/
|
|
/* div/rem/2addr vA, vB */
|
|
movzx rINSTbl, %ecx # eax <- BA
|
|
mov rIBASE, LOCAL0(%esp)
|
|
sarl $$4, %ecx # ecx <- B
|
|
GET_VREG %ecx, %ecx # eax <- vBB
|
|
andb $$0xf, rINSTbl # rINST <- A
|
|
GET_VREG %eax, rINST # eax <- vBB
|
|
testl %ecx, %ecx
|
|
je common_errDivideByZero
|
|
cmpl $$-1, %ecx
|
|
jne .L${opcode}_continue_div2addr
|
|
cmpl $$0x80000000, %eax
|
|
jne .L${opcode}_continue_div2addr
|
|
movl $special, $result
|
|
SET_VREG $result, rINST
|
|
mov LOCAL0(%esp), rIBASE
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
|
|
|
|
.L${opcode}_continue_div2addr:
|
|
cltd
|
|
idivl %ecx
|
|
SET_VREG $result, rINST
|
|
mov LOCAL0(%esp), rIBASE
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
|