blob: be094aee496e172908f4c3f0387722d01766eb50 [file] [log] [blame]
Bill Buzbee7c58bd42016-01-20 20:46:01 +00001%default {"result":"","special":""}
2/*
3 * 32-bit binary div/rem operation. Handles special case of op0=minint and
4 * op1=-1.
5 */
6 /* div/rem/lit16 vA, vB, #+CCCC */
7 /* Need A in rINST, ssssCCCC in ecx, vB in eax */
8 movzbl rINSTbl, %eax # eax <- 000000BA
9 sarl $$4, %eax # eax <- B
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060010 GET_VREG %eax, %eax # eax <- vB
Bill Buzbee7c58bd42016-01-20 20:46:01 +000011 movswl 2(rPC), %ecx # ecx <- ssssCCCC
12 andb $$0xf, rINSTbl # rINST <- A
13 testl %ecx, %ecx
14 je common_errDivideByZero
15 cmpl $$-1, %ecx
16 jne .L${opcode}_continue_div
17 cmpl $$0x80000000, %eax
18 jne .L${opcode}_continue_div
19 movl $special, %eax
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060020 SET_VREG %eax, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +000021 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
22
23.L${opcode}_continue_div:
24 mov rIBASE, LOCAL0(%esp)
25 cltd
26 idivl %ecx
Serguei Katkov05dfaaa2016-01-28 08:21:26 +060027 SET_VREG $result, rINST
Bill Buzbee7c58bd42016-01-20 20:46:01 +000028 mov LOCAL0(%esp), rIBASE
29 ADVANCE_PC_FETCH_AND_GOTO_NEXT 2