16cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov%default {"result":"","rem":"0"}
26cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov/*
36cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov * 32-bit binary div/rem operation.  Handles special case of op1=-1.
46cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov */
56cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    /* div/rem/lit16 vA, vB, #+CCCC */
66cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
76cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    movl    rINST, %eax                     # rax <- 000000BA
86cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    sarl    $$4, %eax                       # eax <- B
96cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    GET_VREG %eax, %rax                     # eax <- vB
106cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    movswl  2(rPC), %ecx                    # ecx <- ssssCCCC
116cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    andb    $$0xf, rINSTbl                  # rINST <- A
126cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    testl   %ecx, %ecx
136cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    jz      common_errDivideByZero
146cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    cmpl    $$-1, %ecx
156cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    je      2f
166cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    cdq                                     # rax <- sign-extended of eax
176cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    idivl   %ecx
186cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov1:
196cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    SET_VREG $result, rINSTq                # vA <- result
206cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
216cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov2:
226cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .if $rem
236cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    xorl    $result, $result
246cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .else
256cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    negl    $result
266cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .endif
276cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    jmp     1b
28