blob: f324be3ea02a214cf230971b9b03be0d43d07e92 [file] [log] [blame]
%verify "executed"
%default {"routine":"__divdi3","special":"$0x80000000"}
/* div vAA, vBB, vCC */
movzbl 3(rPC),%eax # eax<- CC
movzbl 2(rPC),%ecx # ecx<- BB
SPILL(rPC)
GET_VREG_WORD(rPC,%eax,0)
GET_VREG_WORD(%eax,%eax,1)
movl rPC,OUT_ARG2(%esp)
testl %eax,%eax
je .L${opcode}_check_zero
cmpl $$-1,%eax
je .L${opcode}_check_neg1
.L${opcode}_notSpecial:
GET_VREG_WORD(rPC,%ecx,0)
GET_VREG_WORD(%ecx,%ecx,1)
.L${opcode}_notSpecial1:
movl %eax,OUT_ARG3(%esp)
movl rPC,OUT_ARG0(%esp)
movl %ecx,OUT_ARG1(%esp)
jmp .L${opcode}_continue
%break
.L${opcode}_continue:
call $routine
.L${opcode}_finish:
movzbl rINST_HI,%ecx
SET_VREG_WORD(rPC,%ecx,1)
UNSPILL(rPC)
SET_VREG_WORD(%eax,%ecx,0)
FETCH_INST_WORD(2)
ADVANCE_PC(2)
GOTO_NEXT
.L${opcode}_check_zero:
testl rPC,rPC
jne .L${opcode}_notSpecial
UNSPILL(rPC)
jmp common_errDivideByZero
.L${opcode}_check_neg1:
testl rPC,%eax
jne .L${opcode}_notSpecial
GET_VREG_WORD(rPC,%ecx,0)
GET_VREG_WORD(%ecx,%ecx,1)
testl rPC,rPC
jne .L${opcode}_notSpecial1
cmpl $$0x80000000,%ecx
jne .L${opcode}_notSpecial1
/* minint / -1, return minint on div, 0 on rem */
xorl %eax,%eax
movl $special,%edx
jmp .L${opcode}_finish