| %default {"result":"","special":""} |
| /* |
| * 32-bit binary div/rem operation. Handles special case of op0=minint and |
| * op1=-1. |
| */ |
| /* div/rem/lit16 vA, vB, #+CCCC */ |
| /* Need A in rINST, ssssCCCC in ecx, vB in eax */ |
| movzbl rINSTbl,%eax # eax<- 000000BA |
| SPILL(rIBASE) |
| sarl $$4,%eax # eax<- B |
| GET_VREG_R %eax %eax # eax<- vB |
| movswl 2(rPC),%ecx # ecx<- ssssCCCC |
| andb $$0xf,rINSTbl # rINST<- A |
| cmpl $$0,%ecx |
| je common_errDivideByZero |
| cmpl $$-1,%ecx |
| jne .L${opcode}_continue_div |
| cmpl $$0x80000000,%eax |
| jne .L${opcode}_continue_div |
| movl $special,$result |
| SET_VREG $result rINST |
| UNSPILL(rIBASE) |
| FETCH_INST_OPCODE 2 %ecx |
| ADVANCE_PC 2 |
| GOTO_NEXT_R %ecx |
| |
| .L${opcode}_continue_div: |
| cltd |
| idivl %ecx |
| SET_VREG $result rINST |
| UNSPILL(rIBASE) |
| FETCH_INST_OPCODE 2 %ecx |
| ADVANCE_PC 2 |
| GOTO_NEXT_R %ecx |