multiply_and_divide.py revision 5661
15081Sgblack@eecs.umich.edu# Copyright (c) 2007 The Hewlett-Packard Development Company
25081Sgblack@eecs.umich.edu# All rights reserved.
35081Sgblack@eecs.umich.edu#
45081Sgblack@eecs.umich.edu# Redistribution and use of this software in source and binary forms,
55081Sgblack@eecs.umich.edu# with or without modification, are permitted provided that the
65081Sgblack@eecs.umich.edu# following conditions are met:
75081Sgblack@eecs.umich.edu#
85081Sgblack@eecs.umich.edu# The software must be used only for Non-Commercial Use which means any
95081Sgblack@eecs.umich.edu# use which is NOT directed to receiving any direct monetary
105081Sgblack@eecs.umich.edu# compensation for, or commercial advantage from such use.  Illustrative
115081Sgblack@eecs.umich.edu# examples of non-commercial use are academic research, personal study,
125081Sgblack@eecs.umich.edu# teaching, education and corporate research & development.
135081Sgblack@eecs.umich.edu# Illustrative examples of commercial use are distributing products for
145081Sgblack@eecs.umich.edu# commercial advantage and providing services using the software for
155081Sgblack@eecs.umich.edu# commercial advantage.
165081Sgblack@eecs.umich.edu#
175081Sgblack@eecs.umich.edu# If you wish to use this software or functionality therein that may be
185081Sgblack@eecs.umich.edu# covered by patents for commercial use, please contact:
195081Sgblack@eecs.umich.edu#     Director of Intellectual Property Licensing
205081Sgblack@eecs.umich.edu#     Office of Strategy and Technology
215081Sgblack@eecs.umich.edu#     Hewlett-Packard Company
225081Sgblack@eecs.umich.edu#     1501 Page Mill Road
235081Sgblack@eecs.umich.edu#     Palo Alto, California  94304
245081Sgblack@eecs.umich.edu#
255081Sgblack@eecs.umich.edu# Redistributions of source code must retain the above copyright notice,
265081Sgblack@eecs.umich.edu# this list of conditions and the following disclaimer.  Redistributions
275081Sgblack@eecs.umich.edu# in binary form must reproduce the above copyright notice, this list of
285081Sgblack@eecs.umich.edu# conditions and the following disclaimer in the documentation and/or
295081Sgblack@eecs.umich.edu# other materials provided with the distribution.  Neither the name of
305081Sgblack@eecs.umich.edu# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
315081Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from
325081Sgblack@eecs.umich.edu# this software without specific prior written permission.  No right of
335081Sgblack@eecs.umich.edu# sublicense is granted herewith.  Derivatives of the software and
345081Sgblack@eecs.umich.edu# output created using the software may be prepared, but only for
355081Sgblack@eecs.umich.edu# Non-Commercial Uses.  Derivatives of the software may be shared with
365081Sgblack@eecs.umich.edu# others provided: (i) the others agree to abide by the list of
375081Sgblack@eecs.umich.edu# conditions herein which includes the Non-Commercial Use restrictions;
385081Sgblack@eecs.umich.edu# and (ii) such Derivatives of the software include the above copyright
395081Sgblack@eecs.umich.edu# notice to acknowledge the contribution from this software where
405081Sgblack@eecs.umich.edu# applicable, this list of conditions and the disclaimer below.
415081Sgblack@eecs.umich.edu#
425081Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
435081Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
445081Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
455081Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
465081Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
475081Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
485081Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
495081Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
505081Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
515081Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
525081Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
535081Sgblack@eecs.umich.edu#
545081Sgblack@eecs.umich.edu# Authors: Gabe Black
555081Sgblack@eecs.umich.edu
565081Sgblack@eecs.umich.edumicrocode = '''
575081Sgblack@eecs.umich.edu
585081Sgblack@eecs.umich.edu#
595081Sgblack@eecs.umich.edu# Byte version of one operand unsigned multiply.
605081Sgblack@eecs.umich.edu#
615081Sgblack@eecs.umich.edu
625081Sgblack@eecs.umich.edudef macroop MUL_B_R
635081Sgblack@eecs.umich.edu{
645081Sgblack@eecs.umich.edu    mul1u rax, reg
655081Sgblack@eecs.umich.edu    mulel rax
665081Sgblack@eecs.umich.edu    # Really ah
675081Sgblack@eecs.umich.edu    muleh rsi, flags=(OF,CF)
685081Sgblack@eecs.umich.edu};
695081Sgblack@eecs.umich.edu
705081Sgblack@eecs.umich.edudef macroop MUL_B_M
715081Sgblack@eecs.umich.edu{
725081Sgblack@eecs.umich.edu    ld t1, seg, sib, disp
735081Sgblack@eecs.umich.edu    mul1u rax, t1
745081Sgblack@eecs.umich.edu    mulel rax
755081Sgblack@eecs.umich.edu    # Really ah
765081Sgblack@eecs.umich.edu    muleh rsi, flags=(OF,CF)
775081Sgblack@eecs.umich.edu};
785081Sgblack@eecs.umich.edu
795081Sgblack@eecs.umich.edudef macroop MUL_B_P
805081Sgblack@eecs.umich.edu{
815081Sgblack@eecs.umich.edu    rdip t7
825081Sgblack@eecs.umich.edu    ld t1, seg, riprel, disp
835081Sgblack@eecs.umich.edu    mul1u rax, t1
845081Sgblack@eecs.umich.edu    mulel rax
855081Sgblack@eecs.umich.edu    # Really ah
865081Sgblack@eecs.umich.edu    muleh rsi, flags=(OF,CF)
875081Sgblack@eecs.umich.edu};
885081Sgblack@eecs.umich.edu
895081Sgblack@eecs.umich.edu#
905081Sgblack@eecs.umich.edu# One operand unsigned multiply.
915081Sgblack@eecs.umich.edu#
925081Sgblack@eecs.umich.edu
935081Sgblack@eecs.umich.edudef macroop MUL_R
945081Sgblack@eecs.umich.edu{
955081Sgblack@eecs.umich.edu    mul1u rax, reg
965081Sgblack@eecs.umich.edu    mulel rax
975081Sgblack@eecs.umich.edu    muleh rdx, flags=(OF,CF)
985081Sgblack@eecs.umich.edu};
995081Sgblack@eecs.umich.edu
1005081Sgblack@eecs.umich.edudef macroop MUL_M
1015081Sgblack@eecs.umich.edu{
1025081Sgblack@eecs.umich.edu    ld t1, seg, sib, disp
1035081Sgblack@eecs.umich.edu    mul1u rax, t1
1045081Sgblack@eecs.umich.edu    mulel rax
1055081Sgblack@eecs.umich.edu    muleh rdx, flags=(OF,CF)
1065081Sgblack@eecs.umich.edu};
1075081Sgblack@eecs.umich.edu
1085081Sgblack@eecs.umich.edudef macroop MUL_P
1095081Sgblack@eecs.umich.edu{
1105081Sgblack@eecs.umich.edu    rdip t7
1115081Sgblack@eecs.umich.edu    ld t1, seg, riprel, disp
1125081Sgblack@eecs.umich.edu    mul1u rax, t1
1135081Sgblack@eecs.umich.edu    mulel rax
1145081Sgblack@eecs.umich.edu    muleh rdx, flags=(OF,CF)
1155081Sgblack@eecs.umich.edu};
1165081Sgblack@eecs.umich.edu
1175081Sgblack@eecs.umich.edu#
1185081Sgblack@eecs.umich.edu# Byte version of one operand signed multiply.
1195081Sgblack@eecs.umich.edu#
1205081Sgblack@eecs.umich.edu
1215081Sgblack@eecs.umich.edudef macroop IMUL_B_R
1225081Sgblack@eecs.umich.edu{
1235081Sgblack@eecs.umich.edu    mul1s rax, reg
1245081Sgblack@eecs.umich.edu    mulel rax
1255081Sgblack@eecs.umich.edu    # Really ah
1265081Sgblack@eecs.umich.edu    muleh rsi, flags=(OF,CF)
1275081Sgblack@eecs.umich.edu};
1285081Sgblack@eecs.umich.edu
1295081Sgblack@eecs.umich.edudef macroop IMUL_B_M
1305081Sgblack@eecs.umich.edu{
1315081Sgblack@eecs.umich.edu    ld t1, seg, sib, disp
1325081Sgblack@eecs.umich.edu    mul1s rax, t1
1335081Sgblack@eecs.umich.edu    mulel rax
1345081Sgblack@eecs.umich.edu    # Really ah
1355081Sgblack@eecs.umich.edu    muleh rsi, flags=(OF,CF)
1365081Sgblack@eecs.umich.edu};
1375081Sgblack@eecs.umich.edu
1385081Sgblack@eecs.umich.edudef macroop IMUL_B_P
1395081Sgblack@eecs.umich.edu{
1405081Sgblack@eecs.umich.edu    rdip t7
1415081Sgblack@eecs.umich.edu    ld t1, seg, riprel, disp
1425081Sgblack@eecs.umich.edu    mul1s rax, t1
1435081Sgblack@eecs.umich.edu    mulel rax
1445081Sgblack@eecs.umich.edu    # Really ah
1455081Sgblack@eecs.umich.edu    muleh rsi, flags=(OF,CF)
1465081Sgblack@eecs.umich.edu};
1475081Sgblack@eecs.umich.edu
1485081Sgblack@eecs.umich.edu#
1495081Sgblack@eecs.umich.edu# One operand signed multiply.
1505081Sgblack@eecs.umich.edu#
1515081Sgblack@eecs.umich.edu
1525081Sgblack@eecs.umich.edudef macroop IMUL_R
1535081Sgblack@eecs.umich.edu{
1545081Sgblack@eecs.umich.edu    mul1s rax, reg
1555081Sgblack@eecs.umich.edu    mulel rax
1565081Sgblack@eecs.umich.edu    muleh rdx, flags=(OF,CF)
1575081Sgblack@eecs.umich.edu};
1585081Sgblack@eecs.umich.edu
1595081Sgblack@eecs.umich.edudef macroop IMUL_M
1605081Sgblack@eecs.umich.edu{
1615081Sgblack@eecs.umich.edu    ld t1, seg, sib, disp
1625081Sgblack@eecs.umich.edu    mul1s rax, t1
1635081Sgblack@eecs.umich.edu    mulel rax
1645081Sgblack@eecs.umich.edu    muleh rdx, flags=(OF,CF)
1655081Sgblack@eecs.umich.edu};
1665081Sgblack@eecs.umich.edu
1675081Sgblack@eecs.umich.edudef macroop IMUL_P
1685081Sgblack@eecs.umich.edu{
1695081Sgblack@eecs.umich.edu    rdip t7
1705081Sgblack@eecs.umich.edu    ld t1, seg, riprel, disp
1715081Sgblack@eecs.umich.edu    mul1s rax, t1
1725081Sgblack@eecs.umich.edu    mulel rax
1735081Sgblack@eecs.umich.edu    muleh rdx, flags=(OF,CF)
1745081Sgblack@eecs.umich.edu};
1755081Sgblack@eecs.umich.edu
1765081Sgblack@eecs.umich.edudef macroop IMUL_R_R
1775081Sgblack@eecs.umich.edu{
1785081Sgblack@eecs.umich.edu    mul1s reg, regm
1795081Sgblack@eecs.umich.edu    mulel reg
1805081Sgblack@eecs.umich.edu    muleh t0, flags=(CF,OF)
1815081Sgblack@eecs.umich.edu};
1825081Sgblack@eecs.umich.edu
1835081Sgblack@eecs.umich.edudef macroop IMUL_R_M
1845081Sgblack@eecs.umich.edu{
1855081Sgblack@eecs.umich.edu    ld t1, seg, sib, disp
1865081Sgblack@eecs.umich.edu    mul1s reg, t1
1875081Sgblack@eecs.umich.edu    mulel reg
1885081Sgblack@eecs.umich.edu    muleh t0, flags=(CF,OF)
1895081Sgblack@eecs.umich.edu};
1905081Sgblack@eecs.umich.edu
1915081Sgblack@eecs.umich.edudef macroop IMUL_R_P
1925081Sgblack@eecs.umich.edu{
1935081Sgblack@eecs.umich.edu    rdip t7
1945081Sgblack@eecs.umich.edu    ld t1, seg, riprel, disp
1955081Sgblack@eecs.umich.edu    mul1s reg, t1
1965081Sgblack@eecs.umich.edu    mulel reg
1975081Sgblack@eecs.umich.edu    muleh t0, flags=(CF,OF)
1985081Sgblack@eecs.umich.edu};
1995081Sgblack@eecs.umich.edu
2005081Sgblack@eecs.umich.edu#
2015081Sgblack@eecs.umich.edu# Three operand signed multiply.
2025081Sgblack@eecs.umich.edu#
2035081Sgblack@eecs.umich.edu
2045081Sgblack@eecs.umich.edudef macroop IMUL_R_R_I
2055081Sgblack@eecs.umich.edu{
2065081Sgblack@eecs.umich.edu    limm t1, imm
2075081Sgblack@eecs.umich.edu    mul1s regm, t1
2085081Sgblack@eecs.umich.edu    mulel reg
2095081Sgblack@eecs.umich.edu    muleh t0, flags=(OF,CF)
2105081Sgblack@eecs.umich.edu};
2115081Sgblack@eecs.umich.edu
2125081Sgblack@eecs.umich.edudef macroop IMUL_R_M_I
2135081Sgblack@eecs.umich.edu{
2145081Sgblack@eecs.umich.edu    limm t1, imm
2155081Sgblack@eecs.umich.edu    ld t2, seg, sib, disp
2165081Sgblack@eecs.umich.edu    mul1s t2, t1
2175081Sgblack@eecs.umich.edu    mulel reg
2185081Sgblack@eecs.umich.edu    muleh t0, flags=(OF,CF)
2195081Sgblack@eecs.umich.edu};
2205081Sgblack@eecs.umich.edu
2215081Sgblack@eecs.umich.edudef macroop IMUL_R_P_I
2225081Sgblack@eecs.umich.edu{
2235081Sgblack@eecs.umich.edu    rdip t7
2245081Sgblack@eecs.umich.edu    limm t1, imm
2255081Sgblack@eecs.umich.edu    ld t2, seg, riprel
2265081Sgblack@eecs.umich.edu    mul1s t2, t1
2275081Sgblack@eecs.umich.edu    mulel reg
2285081Sgblack@eecs.umich.edu    muleh t0, flags=(OF,CF)
2295081Sgblack@eecs.umich.edu};
2305081Sgblack@eecs.umich.edu
2315081Sgblack@eecs.umich.edu#
2325081Sgblack@eecs.umich.edu# One byte version of unsigned division
2335081Sgblack@eecs.umich.edu#
2345081Sgblack@eecs.umich.edu
2355081Sgblack@eecs.umich.edudef macroop DIV_B_R
2365081Sgblack@eecs.umich.edu{
2375081Sgblack@eecs.umich.edu    # Do the initial part of the division
2385081Sgblack@eecs.umich.edu    div1 rsi, reg, dataSize=1
2395081Sgblack@eecs.umich.edu
2405081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
2415081Sgblack@eecs.umich.edu    #second register
2425081Sgblack@eecs.umich.edu    div2i t1, rax, 8, dataSize=1
2435081Sgblack@eecs.umich.edu    div2 t1, rax, t1, dataSize=1
2445081Sgblack@eecs.umich.edu
2455081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
2465081Sgblack@eecs.umich.edudivLoopTop:
2475081Sgblack@eecs.umich.edu    div2 t1, rax, t1, dataSize=1
2485081Sgblack@eecs.umich.edu    div2 t1, rax, t1, flags=(EZF,), dataSize=1
2495661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
2505081Sgblack@eecs.umich.edu
2515081Sgblack@eecs.umich.edu    #Unload the answer
2525081Sgblack@eecs.umich.edu    divq rax, dataSize=1
2535081Sgblack@eecs.umich.edu    divr rsi, dataSize=1
2545081Sgblack@eecs.umich.edu};
2555081Sgblack@eecs.umich.edu
2565081Sgblack@eecs.umich.edudef macroop DIV_B_M
2575081Sgblack@eecs.umich.edu{
2585081Sgblack@eecs.umich.edu    ld t2, seg, sib, disp
2595081Sgblack@eecs.umich.edu
2605081Sgblack@eecs.umich.edu    # Do the initial part of the division
2615081Sgblack@eecs.umich.edu    div1 rsi, t2, dataSize=1
2625081Sgblack@eecs.umich.edu
2635081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
2645081Sgblack@eecs.umich.edu    #second register
2655081Sgblack@eecs.umich.edu    div2i t1, rax, 8, dataSize=1
2665081Sgblack@eecs.umich.edu    div2 t1, rax, t1, dataSize=1
2675081Sgblack@eecs.umich.edu
2685081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
2695081Sgblack@eecs.umich.edudivLoopTop:
2705081Sgblack@eecs.umich.edu    div2 t1, rax, t1, dataSize=1
2715081Sgblack@eecs.umich.edu    div2 t1, rax, t1, flags=(EZF,), dataSize=1
2725661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
2735081Sgblack@eecs.umich.edu
2745081Sgblack@eecs.umich.edu    #Unload the answer
2755081Sgblack@eecs.umich.edu    divq rax, dataSize=1
2765081Sgblack@eecs.umich.edu    divr rsi, dataSize=1
2775081Sgblack@eecs.umich.edu};
2785081Sgblack@eecs.umich.edu
2795081Sgblack@eecs.umich.edudef macroop DIV_B_P
2805081Sgblack@eecs.umich.edu{
2815081Sgblack@eecs.umich.edu    rdip t7
2825081Sgblack@eecs.umich.edu    ld t2, seg, riprel, disp
2835081Sgblack@eecs.umich.edu
2845081Sgblack@eecs.umich.edu    # Do the initial part of the division
2855081Sgblack@eecs.umich.edu    div1 rsi, t2, dataSize=1
2865081Sgblack@eecs.umich.edu
2875081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
2885081Sgblack@eecs.umich.edu    #second register
2895081Sgblack@eecs.umich.edu    div2i t1, rax, 8, dataSize=1
2905081Sgblack@eecs.umich.edu    div2 t1, rax, t1, dataSize=1
2915081Sgblack@eecs.umich.edu
2925081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
2935081Sgblack@eecs.umich.edudivLoopTop:
2945081Sgblack@eecs.umich.edu    div2 t1, rax, t1, dataSize=1
2955081Sgblack@eecs.umich.edu    div2 t1, rax, t1, flags=(EZF,), dataSize=1
2965661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
2975081Sgblack@eecs.umich.edu
2985081Sgblack@eecs.umich.edu    #Unload the answer
2995081Sgblack@eecs.umich.edu    divq rax, dataSize=1
3005081Sgblack@eecs.umich.edu    divr rsi, dataSize=1
3015081Sgblack@eecs.umich.edu};
3025081Sgblack@eecs.umich.edu
3035081Sgblack@eecs.umich.edu#
3045081Sgblack@eecs.umich.edu# Unsigned division
3055081Sgblack@eecs.umich.edu#
3065081Sgblack@eecs.umich.edu
3075081Sgblack@eecs.umich.edudef macroop DIV_R
3085081Sgblack@eecs.umich.edu{
3095081Sgblack@eecs.umich.edu    # Do the initial part of the division
3105081Sgblack@eecs.umich.edu    div1 rdx, reg
3115081Sgblack@eecs.umich.edu
3125081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
3135081Sgblack@eecs.umich.edu    #second register
3145081Sgblack@eecs.umich.edu    div2i t1, rax, "env.dataSize * 8"
3155081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3165081Sgblack@eecs.umich.edu
3175081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
3185081Sgblack@eecs.umich.edu    #The amount of unrolling here could stand some tuning
3195081Sgblack@eecs.umich.edudivLoopTop:
3205081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3215081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3225081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3235081Sgblack@eecs.umich.edu    div2 t1, rax, t1, flags=(EZF,)
3245661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
3255081Sgblack@eecs.umich.edu
3265081Sgblack@eecs.umich.edu    #Unload the answer
3275081Sgblack@eecs.umich.edu    divq rax
3285081Sgblack@eecs.umich.edu    divr rdx
3295081Sgblack@eecs.umich.edu};
3305081Sgblack@eecs.umich.edu
3315081Sgblack@eecs.umich.edudef macroop DIV_M
3325081Sgblack@eecs.umich.edu{
3335081Sgblack@eecs.umich.edu    ld t2, seg, sib, disp
3345081Sgblack@eecs.umich.edu
3355081Sgblack@eecs.umich.edu    # Do the initial part of the division
3365081Sgblack@eecs.umich.edu    div1 rdx, t2
3375081Sgblack@eecs.umich.edu
3385081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
3395081Sgblack@eecs.umich.edu    #second register
3405081Sgblack@eecs.umich.edu    div2i t1, rax, "env.dataSize * 8"
3415081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3425081Sgblack@eecs.umich.edu
3435081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
3445081Sgblack@eecs.umich.edu    #The amount of unrolling here could stand some tuning
3455081Sgblack@eecs.umich.edudivLoopTop:
3465081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3475081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3485081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3495081Sgblack@eecs.umich.edu    div2 t1, rax, t1, flags=(EZF,)
3505661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
3515081Sgblack@eecs.umich.edu
3525081Sgblack@eecs.umich.edu    #Unload the answer
3535081Sgblack@eecs.umich.edu    divq rax
3545081Sgblack@eecs.umich.edu    divr rdx
3555081Sgblack@eecs.umich.edu};
3565081Sgblack@eecs.umich.edu
3575081Sgblack@eecs.umich.edudef macroop DIV_P
3585081Sgblack@eecs.umich.edu{
3595081Sgblack@eecs.umich.edu    rdip t7
3605081Sgblack@eecs.umich.edu    ld t2, seg, riprel, disp
3615081Sgblack@eecs.umich.edu
3625081Sgblack@eecs.umich.edu    # Do the initial part of the division
3635081Sgblack@eecs.umich.edu    div1 rdx, t2
3645081Sgblack@eecs.umich.edu
3655081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
3665081Sgblack@eecs.umich.edu    #second register
3675081Sgblack@eecs.umich.edu    div2i t1, rax, "env.dataSize * 8"
3685081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3695081Sgblack@eecs.umich.edu
3705081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
3715081Sgblack@eecs.umich.edu    #The amount of unrolling here could stand some tuning
3725081Sgblack@eecs.umich.edudivLoopTop:
3735081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3745081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3755081Sgblack@eecs.umich.edu    div2 t1, rax, t1
3765081Sgblack@eecs.umich.edu    div2 t1, rax, t1, flags=(EZF,)
3775661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
3785081Sgblack@eecs.umich.edu
3795081Sgblack@eecs.umich.edu    #Unload the answer
3805081Sgblack@eecs.umich.edu    divq rax
3815081Sgblack@eecs.umich.edu    divr rdx
3825081Sgblack@eecs.umich.edu};
3835081Sgblack@eecs.umich.edu
3845081Sgblack@eecs.umich.edu#
3855081Sgblack@eecs.umich.edu# One byte version of signed division
3865081Sgblack@eecs.umich.edu#
3875081Sgblack@eecs.umich.edu
3885081Sgblack@eecs.umich.edudef macroop IDIV_B_R
3895081Sgblack@eecs.umich.edu{
3905081Sgblack@eecs.umich.edu    # Negate dividend
3915081Sgblack@eecs.umich.edu    sub t1, t0, rax, flags=(ECF,), dataSize=1
3925081Sgblack@eecs.umich.edu    ruflag t4, 3
3935081Sgblack@eecs.umich.edu    sub t2, t0, rsi, dataSize=1
3945081Sgblack@eecs.umich.edu    sub t2, t2, t4
3955081Sgblack@eecs.umich.edu
3965081Sgblack@eecs.umich.edu    #Find the sign of the divisor
3975081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
3985081Sgblack@eecs.umich.edu    slli t0, reg, 1, flags=(ECF,), dataSize=1
3995081Sgblack@eecs.umich.edu
4005081Sgblack@eecs.umich.edu    # Negate divisor
4015081Sgblack@eecs.umich.edu    sub t3, t0, reg, dataSize=1
4025081Sgblack@eecs.umich.edu    # Put the divisor's absolute value into t3
4035081Sgblack@eecs.umich.edu    mov t3, t3, reg, flags=(nCECF,), dataSize=1
4045081Sgblack@eecs.umich.edu
4055081Sgblack@eecs.umich.edu    #Find the sign of the dividend
4065081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
4075081Sgblack@eecs.umich.edu    slli t0, rsi, 1, flags=(ECF,), dataSize=1
4085081Sgblack@eecs.umich.edu
4095081Sgblack@eecs.umich.edu    # Put the dividend's absolute value into t1 and t2
4105081Sgblack@eecs.umich.edu    mov t1, t1, rax, flags=(nCECF,), dataSize=1
4115081Sgblack@eecs.umich.edu    mov t2, t2, rsi, flags=(nCECF,), dataSize=1
4125081Sgblack@eecs.umich.edu
4135081Sgblack@eecs.umich.edu    # Do the initial part of the division
4145081Sgblack@eecs.umich.edu    div1 t2, t3, dataSize=1
4155081Sgblack@eecs.umich.edu
4165081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
4175081Sgblack@eecs.umich.edu    #second register
4185081Sgblack@eecs.umich.edu    div2i t4, t1, 8, dataSize=1
4195081Sgblack@eecs.umich.edu    div2 t4, t1, t4, dataSize=1
4205081Sgblack@eecs.umich.edu
4215081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
4225081Sgblack@eecs.umich.edudivLoopTop:
4235081Sgblack@eecs.umich.edu    div2 t4, t1, t4, dataSize=1
4245081Sgblack@eecs.umich.edu    div2 t4, t1, t4, flags=(EZF,), dataSize=1
4255661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
4265081Sgblack@eecs.umich.edu
4275081Sgblack@eecs.umich.edu    #Unload the answer
4285081Sgblack@eecs.umich.edu    divq t5, dataSize=1
4295081Sgblack@eecs.umich.edu    divr t6, dataSize=1
4305081Sgblack@eecs.umich.edu
4315081Sgblack@eecs.umich.edu    # Fix up signs. The sign of the dividend is still lying around in ECF.
4325081Sgblack@eecs.umich.edu    # The sign of the remainder, ah, is the same as the dividend. The sign
4335081Sgblack@eecs.umich.edu    # of the quotient is negated if the signs of the divisor and dividend
4345081Sgblack@eecs.umich.edu    # were different.
4355081Sgblack@eecs.umich.edu
4365081Sgblack@eecs.umich.edu    # Negate the remainder
4375081Sgblack@eecs.umich.edu    sub t4, t0, t6, dataSize=1
4385081Sgblack@eecs.umich.edu    # If the dividend was negitive, put the negated remainder in rsi.
4395081Sgblack@eecs.umich.edu    mov rsi, rsi, t4, (CECF,), dataSize=1
4405081Sgblack@eecs.umich.edu    # Otherwise put the regular remainder in rsi.
4415081Sgblack@eecs.umich.edu    mov rsi, rsi, t6, (nCECF,), dataSize=1
4425081Sgblack@eecs.umich.edu
4435081Sgblack@eecs.umich.edu    # Negate the quotient.
4445081Sgblack@eecs.umich.edu    sub t4, t0, t5, dataSize=1
4455081Sgblack@eecs.umich.edu    # If the dividend was negative, start using the negated quotient
4465081Sgblack@eecs.umich.edu    mov t5, t5, t4, (CECF,), dataSize=1
4475081Sgblack@eecs.umich.edu
4485081Sgblack@eecs.umich.edu    # Check the sign of the divisor
4495081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,), dataSize=1
4505081Sgblack@eecs.umich.edu
4515081Sgblack@eecs.umich.edu    # Negate the (possibly already negated) quotient
4525081Sgblack@eecs.umich.edu    sub t4, t0, t5, dataSize=1
4535081Sgblack@eecs.umich.edu    # If the divisor was negative, put the negated quotient in rax.
4545081Sgblack@eecs.umich.edu    mov rax, rax, t4, (CECF,), dataSize=1
4555081Sgblack@eecs.umich.edu    # Otherwise put the one that wasn't negated (at least here) in rax.
4565081Sgblack@eecs.umich.edu    mov rax, rax, t5, (nCECF,), dataSize=1
4575081Sgblack@eecs.umich.edu};
4585081Sgblack@eecs.umich.edu
4595081Sgblack@eecs.umich.edudef macroop IDIV_B_M
4605081Sgblack@eecs.umich.edu{
4615081Sgblack@eecs.umich.edu    # Negate dividend
4625081Sgblack@eecs.umich.edu    sub t1, t0, rax, flags=(ECF,), dataSize=1
4635081Sgblack@eecs.umich.edu    ruflag t4, 3
4645081Sgblack@eecs.umich.edu    sub t2, t0, rsi, dataSize=1
4655081Sgblack@eecs.umich.edu    sub t2, t2, t4
4665081Sgblack@eecs.umich.edu
4675081Sgblack@eecs.umich.edu    ld t3, seg, sib, disp
4685081Sgblack@eecs.umich.edu
4695081Sgblack@eecs.umich.edu    #Find the sign of the divisor
4705081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
4715081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,), dataSize=1
4725081Sgblack@eecs.umich.edu
4735081Sgblack@eecs.umich.edu    # Negate divisor
4745081Sgblack@eecs.umich.edu    sub t4, t0, t3, dataSize=1
4755081Sgblack@eecs.umich.edu    # Put the divisor's absolute value into t3
4765081Sgblack@eecs.umich.edu    mov t3, t3, t4, flags=(CECF,), dataSize=1
4775081Sgblack@eecs.umich.edu
4785081Sgblack@eecs.umich.edu    #Find the sign of the dividend
4795081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
4805081Sgblack@eecs.umich.edu    slli t0, rsi, 1, flags=(ECF,), dataSize=1
4815081Sgblack@eecs.umich.edu
4825081Sgblack@eecs.umich.edu    # Put the dividend's absolute value into t1 and t2
4835081Sgblack@eecs.umich.edu    mov t1, t1, rax, flags=(nCECF,), dataSize=1
4845081Sgblack@eecs.umich.edu    mov t2, t2, rsi, flags=(nCECF,), dataSize=1
4855081Sgblack@eecs.umich.edu
4865081Sgblack@eecs.umich.edu    # Do the initial part of the division
4875081Sgblack@eecs.umich.edu    div1 t2, t3, dataSize=1
4885081Sgblack@eecs.umich.edu
4895081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
4905081Sgblack@eecs.umich.edu    #second register
4915081Sgblack@eecs.umich.edu    div2i t4, t1, 8, dataSize=1
4925081Sgblack@eecs.umich.edu    div2 t4, t1, t4, dataSize=1
4935081Sgblack@eecs.umich.edu
4945081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
4955081Sgblack@eecs.umich.edudivLoopTop:
4965081Sgblack@eecs.umich.edu    div2 t4, t1, t4, dataSize=1
4975081Sgblack@eecs.umich.edu    div2 t4, t1, t4, flags=(EZF,), dataSize=1
4985661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
4995081Sgblack@eecs.umich.edu
5005081Sgblack@eecs.umich.edu    #Unload the answer
5015081Sgblack@eecs.umich.edu    divq t5, dataSize=1
5025081Sgblack@eecs.umich.edu    divr t6, dataSize=1
5035081Sgblack@eecs.umich.edu
5045081Sgblack@eecs.umich.edu    # Fix up signs. The sign of the dividend is still lying around in ECF.
5055081Sgblack@eecs.umich.edu    # The sign of the remainder, ah, is the same as the dividend. The sign
5065081Sgblack@eecs.umich.edu    # of the quotient is negated if the signs of the divisor and dividend
5075081Sgblack@eecs.umich.edu    # were different.
5085081Sgblack@eecs.umich.edu
5095081Sgblack@eecs.umich.edu    # Negate the remainder
5105081Sgblack@eecs.umich.edu    sub t4, t0, t6, dataSize=1
5115081Sgblack@eecs.umich.edu    # If the dividend was negitive, put the negated remainder in rsi.
5125081Sgblack@eecs.umich.edu    mov rsi, rsi, t4, (CECF,), dataSize=1
5135081Sgblack@eecs.umich.edu    # Otherwise put the regular remainder in rsi.
5145081Sgblack@eecs.umich.edu    mov rsi, rsi, t6, (nCECF,), dataSize=1
5155081Sgblack@eecs.umich.edu
5165081Sgblack@eecs.umich.edu    # Negate the quotient.
5175081Sgblack@eecs.umich.edu    sub t4, t0, t5, dataSize=1
5185081Sgblack@eecs.umich.edu    # If the dividend was negative, start using the negated quotient
5195081Sgblack@eecs.umich.edu    mov t5, t5, t4, (CECF,), dataSize=1
5205081Sgblack@eecs.umich.edu
5215081Sgblack@eecs.umich.edu    # Check the sign of the divisor
5225081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,), dataSize=1
5235081Sgblack@eecs.umich.edu
5245081Sgblack@eecs.umich.edu    # Negate the (possibly already negated) quotient
5255081Sgblack@eecs.umich.edu    sub t4, t0, t5, dataSize=1
5265081Sgblack@eecs.umich.edu    # If the divisor was negative, put the negated quotient in rax.
5275081Sgblack@eecs.umich.edu    mov rax, rax, t4, (CECF,), dataSize=1
5285081Sgblack@eecs.umich.edu    # Otherwise put the one that wasn't negated (at least here) in rax.
5295081Sgblack@eecs.umich.edu    mov rax, rax, t5, (nCECF,), dataSize=1
5305081Sgblack@eecs.umich.edu};
5315081Sgblack@eecs.umich.edu
5325081Sgblack@eecs.umich.edudef macroop IDIV_B_P
5335081Sgblack@eecs.umich.edu{
5345081Sgblack@eecs.umich.edu    # Negate dividend
5355081Sgblack@eecs.umich.edu    sub t1, t0, rax, flags=(ECF,), dataSize=1
5365081Sgblack@eecs.umich.edu    ruflag t4, 3
5375081Sgblack@eecs.umich.edu    sub t2, t0, rsi, dataSize=1
5385081Sgblack@eecs.umich.edu    sub t2, t2, t4
5395081Sgblack@eecs.umich.edu
5405081Sgblack@eecs.umich.edu    rdip t7
5415081Sgblack@eecs.umich.edu    ld t3, seg, riprel, disp
5425081Sgblack@eecs.umich.edu
5435081Sgblack@eecs.umich.edu    #Find the sign of the divisor
5445081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
5455081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,), dataSize=1
5465081Sgblack@eecs.umich.edu
5475081Sgblack@eecs.umich.edu    # Negate divisor
5485081Sgblack@eecs.umich.edu    sub t4, t0, t3, dataSize=1
5495081Sgblack@eecs.umich.edu    # Put the divisor's absolute value into t3
5505081Sgblack@eecs.umich.edu    mov t3, t3, t4, flags=(CECF,), dataSize=1
5515081Sgblack@eecs.umich.edu
5525081Sgblack@eecs.umich.edu    #Find the sign of the dividend
5535081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
5545081Sgblack@eecs.umich.edu    slli t0, rsi, 1, flags=(ECF,), dataSize=1
5555081Sgblack@eecs.umich.edu
5565081Sgblack@eecs.umich.edu    # Put the dividend's absolute value into t1 and t2
5575081Sgblack@eecs.umich.edu    mov t1, t1, rax, flags=(nCECF,), dataSize=1
5585081Sgblack@eecs.umich.edu    mov t2, t2, rsi, flags=(nCECF,), dataSize=1
5595081Sgblack@eecs.umich.edu
5605081Sgblack@eecs.umich.edu    # Do the initial part of the division
5615081Sgblack@eecs.umich.edu    div1 t2, t3, dataSize=1
5625081Sgblack@eecs.umich.edu
5635081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
5645081Sgblack@eecs.umich.edu    #second register
5655081Sgblack@eecs.umich.edu    div2i t4, t1, 8, dataSize=1
5665081Sgblack@eecs.umich.edu    div2 t4, t1, t4, dataSize=1
5675081Sgblack@eecs.umich.edu
5685081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
5695081Sgblack@eecs.umich.edudivLoopTop:
5705081Sgblack@eecs.umich.edu    div2 t4, t1, t4, dataSize=1
5715081Sgblack@eecs.umich.edu    div2 t4, t1, t4, flags=(EZF,), dataSize=1
5725661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
5735081Sgblack@eecs.umich.edu
5745081Sgblack@eecs.umich.edu    #Unload the answer
5755081Sgblack@eecs.umich.edu    divq t5, dataSize=1
5765081Sgblack@eecs.umich.edu    divr t6, dataSize=1
5775081Sgblack@eecs.umich.edu
5785081Sgblack@eecs.umich.edu    # Fix up signs. The sign of the dividend is still lying around in ECF.
5795081Sgblack@eecs.umich.edu    # The sign of the remainder, ah, is the same as the dividend. The sign
5805081Sgblack@eecs.umich.edu    # of the quotient is negated if the signs of the divisor and dividend
5815081Sgblack@eecs.umich.edu    # were different.
5825081Sgblack@eecs.umich.edu
5835081Sgblack@eecs.umich.edu    # Negate the remainder
5845081Sgblack@eecs.umich.edu    sub t4, t0, t6, dataSize=1
5855081Sgblack@eecs.umich.edu    # If the dividend was negitive, put the negated remainder in rsi.
5865081Sgblack@eecs.umich.edu    mov rsi, rsi, t4, (CECF,), dataSize=1
5875081Sgblack@eecs.umich.edu    # Otherwise put the regular remainder in rsi.
5885081Sgblack@eecs.umich.edu    mov rsi, rsi, t6, (nCECF,), dataSize=1
5895081Sgblack@eecs.umich.edu
5905081Sgblack@eecs.umich.edu    # Negate the quotient.
5915081Sgblack@eecs.umich.edu    sub t4, t0, t5, dataSize=1
5925081Sgblack@eecs.umich.edu    # If the dividend was negative, start using the negated quotient
5935081Sgblack@eecs.umich.edu    mov t5, t5, t4, (CECF,), dataSize=1
5945081Sgblack@eecs.umich.edu
5955081Sgblack@eecs.umich.edu    # Check the sign of the divisor
5965081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,), dataSize=1
5975081Sgblack@eecs.umich.edu
5985081Sgblack@eecs.umich.edu    # Negate the (possibly already negated) quotient
5995081Sgblack@eecs.umich.edu    sub t4, t0, t5, dataSize=1
6005081Sgblack@eecs.umich.edu    # If the divisor was negative, put the negated quotient in rax.
6015081Sgblack@eecs.umich.edu    mov rax, rax, t4, (CECF,), dataSize=1
6025081Sgblack@eecs.umich.edu    # Otherwise put the one that wasn't negated (at least here) in rax.
6035081Sgblack@eecs.umich.edu    mov rax, rax, t5, (nCECF,), dataSize=1
6045081Sgblack@eecs.umich.edu};
6055081Sgblack@eecs.umich.edu
6065081Sgblack@eecs.umich.edu#
6075081Sgblack@eecs.umich.edu# Signed division
6085081Sgblack@eecs.umich.edu#
6095081Sgblack@eecs.umich.edu
6105081Sgblack@eecs.umich.edudef macroop IDIV_R
6115081Sgblack@eecs.umich.edu{
6125081Sgblack@eecs.umich.edu    # Negate dividend
6135081Sgblack@eecs.umich.edu    sub t1, t0, rax, flags=(ECF,)
6145081Sgblack@eecs.umich.edu    ruflag t4, 3
6155081Sgblack@eecs.umich.edu    sub t2, t0, rdx
6165081Sgblack@eecs.umich.edu    sub t2, t2, t4
6175081Sgblack@eecs.umich.edu
6185081Sgblack@eecs.umich.edu    #Find the sign of the divisor
6195081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
6205081Sgblack@eecs.umich.edu    slli t0, reg, 1, flags=(ECF,)
6215081Sgblack@eecs.umich.edu
6225081Sgblack@eecs.umich.edu    # Negate divisor
6235081Sgblack@eecs.umich.edu    sub t3, t0, reg
6245081Sgblack@eecs.umich.edu    # Put the divisor's absolute value into t3
6255081Sgblack@eecs.umich.edu    mov t3, t3, reg, flags=(nCECF,)
6265081Sgblack@eecs.umich.edu
6275081Sgblack@eecs.umich.edu    #Find the sign of the dividend
6285081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
6295081Sgblack@eecs.umich.edu    slli t0, rdx, 1, flags=(ECF,)
6305081Sgblack@eecs.umich.edu
6315081Sgblack@eecs.umich.edu    # Put the dividend's absolute value into t1 and t2
6325081Sgblack@eecs.umich.edu    mov t1, t1, rax, flags=(nCECF,)
6335081Sgblack@eecs.umich.edu    mov t2, t2, rdx, flags=(nCECF,)
6345081Sgblack@eecs.umich.edu
6355081Sgblack@eecs.umich.edu    # Do the initial part of the division
6365081Sgblack@eecs.umich.edu    div1 t2, t3
6375081Sgblack@eecs.umich.edu
6385081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
6395081Sgblack@eecs.umich.edu    #second register
6405081Sgblack@eecs.umich.edu    div2i t4, t1, "env.dataSize * 8"
6415081Sgblack@eecs.umich.edu    div2 t4, t1, t4
6425081Sgblack@eecs.umich.edu
6435081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
6445081Sgblack@eecs.umich.edudivLoopTop:
6455081Sgblack@eecs.umich.edu    div2 t4, t1, t4
6465081Sgblack@eecs.umich.edu    div2 t4, t1, t4
6475081Sgblack@eecs.umich.edu    div2 t4, t1, t4
6485081Sgblack@eecs.umich.edu    div2 t4, t1, t4, flags=(EZF,)
6495661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
6505081Sgblack@eecs.umich.edu
6515081Sgblack@eecs.umich.edu    #Unload the answer
6525081Sgblack@eecs.umich.edu    divq t5
6535081Sgblack@eecs.umich.edu    divr t6
6545081Sgblack@eecs.umich.edu
6555081Sgblack@eecs.umich.edu    # Fix up signs. The sign of the dividend is still lying around in ECF.
6565081Sgblack@eecs.umich.edu    # The sign of the remainder, ah, is the same as the dividend. The sign
6575081Sgblack@eecs.umich.edu    # of the quotient is negated if the signs of the divisor and dividend
6585081Sgblack@eecs.umich.edu    # were different.
6595081Sgblack@eecs.umich.edu
6605081Sgblack@eecs.umich.edu    # Negate the remainder
6615081Sgblack@eecs.umich.edu    sub t4, t0, t6
6625081Sgblack@eecs.umich.edu    # If the dividend was negitive, put the negated remainder in rdx.
6635081Sgblack@eecs.umich.edu    mov rdx, rdx, t4, (CECF,)
6645081Sgblack@eecs.umich.edu    # Otherwise put the regular remainder in rdx.
6655081Sgblack@eecs.umich.edu    mov rdx, rdx, t6, (nCECF,)
6665081Sgblack@eecs.umich.edu
6675081Sgblack@eecs.umich.edu    # Negate the quotient.
6685081Sgblack@eecs.umich.edu    sub t4, t0, t5
6695081Sgblack@eecs.umich.edu    # If the dividend was negative, start using the negated quotient
6705081Sgblack@eecs.umich.edu    mov t5, t5, t4, (CECF,)
6715081Sgblack@eecs.umich.edu
6725081Sgblack@eecs.umich.edu    # Check the sign of the divisor
6735081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,)
6745081Sgblack@eecs.umich.edu
6755081Sgblack@eecs.umich.edu    # Negate the (possibly already negated) quotient
6765081Sgblack@eecs.umich.edu    sub t4, t0, t5
6775081Sgblack@eecs.umich.edu    # If the divisor was negative, put the negated quotient in rax.
6785081Sgblack@eecs.umich.edu    mov rax, rax, t4, (CECF,)
6795081Sgblack@eecs.umich.edu    # Otherwise put the one that wasn't negated (at least here) in rax.
6805081Sgblack@eecs.umich.edu    mov rax, rax, t5, (nCECF,)
6815081Sgblack@eecs.umich.edu};
6825081Sgblack@eecs.umich.edu
6835081Sgblack@eecs.umich.edudef macroop IDIV_M
6845081Sgblack@eecs.umich.edu{
6855081Sgblack@eecs.umich.edu    # Negate dividend
6865081Sgblack@eecs.umich.edu    sub t1, t0, rax, flags=(ECF,)
6875081Sgblack@eecs.umich.edu    ruflag t4, 3
6885081Sgblack@eecs.umich.edu    sub t2, t0, rdx
6895081Sgblack@eecs.umich.edu    sub t2, t2, t4
6905081Sgblack@eecs.umich.edu
6915081Sgblack@eecs.umich.edu    ld t3, seg, sib, disp
6925081Sgblack@eecs.umich.edu
6935081Sgblack@eecs.umich.edu    #Find the sign of the divisor
6945081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
6955081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,)
6965081Sgblack@eecs.umich.edu
6975081Sgblack@eecs.umich.edu    # Negate divisor
6985081Sgblack@eecs.umich.edu    sub t4, t0, t3
6995081Sgblack@eecs.umich.edu    # Put the divisor's absolute value into t3
7005081Sgblack@eecs.umich.edu    mov t3, t3, t4, flags=(CECF,)
7015081Sgblack@eecs.umich.edu
7025081Sgblack@eecs.umich.edu    #Find the sign of the dividend
7035081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
7045081Sgblack@eecs.umich.edu    slli t0, rdx, 1, flags=(ECF,)
7055081Sgblack@eecs.umich.edu
7065081Sgblack@eecs.umich.edu    # Put the dividend's absolute value into t1 and t2
7075081Sgblack@eecs.umich.edu    mov t1, t1, rax, flags=(nCECF,)
7085081Sgblack@eecs.umich.edu    mov t2, t2, rdx, flags=(nCECF,)
7095081Sgblack@eecs.umich.edu
7105081Sgblack@eecs.umich.edu    # Do the initial part of the division
7115081Sgblack@eecs.umich.edu    div1 t2, t3
7125081Sgblack@eecs.umich.edu
7135081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
7145081Sgblack@eecs.umich.edu    #second register
7155081Sgblack@eecs.umich.edu    div2i t4, t1, "env.dataSize * 8"
7165081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7175081Sgblack@eecs.umich.edu
7185081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
7195081Sgblack@eecs.umich.edudivLoopTop:
7205081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7215081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7225081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7235081Sgblack@eecs.umich.edu    div2 t4, t1, t4, flags=(EZF,)
7245661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
7255081Sgblack@eecs.umich.edu
7265081Sgblack@eecs.umich.edu    #Unload the answer
7275081Sgblack@eecs.umich.edu    divq t5
7285081Sgblack@eecs.umich.edu    divr t6
7295081Sgblack@eecs.umich.edu
7305081Sgblack@eecs.umich.edu    # Fix up signs. The sign of the dividend is still lying around in ECF.
7315081Sgblack@eecs.umich.edu    # The sign of the remainder, ah, is the same as the dividend. The sign
7325081Sgblack@eecs.umich.edu    # of the quotient is negated if the signs of the divisor and dividend
7335081Sgblack@eecs.umich.edu    # were different.
7345081Sgblack@eecs.umich.edu
7355081Sgblack@eecs.umich.edu    # Negate the remainder
7365081Sgblack@eecs.umich.edu    sub t4, t0, t6
7375081Sgblack@eecs.umich.edu    # If the dividend was negitive, put the negated remainder in rdx.
7385081Sgblack@eecs.umich.edu    mov rdx, rdx, t4, (CECF,)
7395081Sgblack@eecs.umich.edu    # Otherwise put the regular remainder in rdx.
7405081Sgblack@eecs.umich.edu    mov rdx, rdx, t6, (nCECF,)
7415081Sgblack@eecs.umich.edu
7425081Sgblack@eecs.umich.edu    # Negate the quotient.
7435081Sgblack@eecs.umich.edu    sub t4, t0, t5
7445081Sgblack@eecs.umich.edu    # If the dividend was negative, start using the negated quotient
7455081Sgblack@eecs.umich.edu    mov t5, t5, t4, (CECF,)
7465081Sgblack@eecs.umich.edu
7475081Sgblack@eecs.umich.edu    # Check the sign of the divisor
7485081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,)
7495081Sgblack@eecs.umich.edu
7505081Sgblack@eecs.umich.edu    # Negate the (possibly already negated) quotient
7515081Sgblack@eecs.umich.edu    sub t4, t0, t5
7525081Sgblack@eecs.umich.edu    # If the divisor was negative, put the negated quotient in rax.
7535081Sgblack@eecs.umich.edu    mov rax, rax, t4, (CECF,)
7545081Sgblack@eecs.umich.edu    # Otherwise put the one that wasn't negated (at least here) in rax.
7555081Sgblack@eecs.umich.edu    mov rax, rax, t5, (nCECF,)
7565081Sgblack@eecs.umich.edu};
7575081Sgblack@eecs.umich.edu
7585081Sgblack@eecs.umich.edudef macroop IDIV_P
7595081Sgblack@eecs.umich.edu{
7605081Sgblack@eecs.umich.edu    # Negate dividend
7615081Sgblack@eecs.umich.edu    sub t1, t0, rax, flags=(ECF,)
7625081Sgblack@eecs.umich.edu    ruflag t4, 3
7635081Sgblack@eecs.umich.edu    sub t2, t0, rdx
7645081Sgblack@eecs.umich.edu    sub t2, t2, t4
7655081Sgblack@eecs.umich.edu
7665081Sgblack@eecs.umich.edu    rdip t7
7675081Sgblack@eecs.umich.edu    ld t3, seg, riprel, disp
7685081Sgblack@eecs.umich.edu
7695081Sgblack@eecs.umich.edu    #Find the sign of the divisor
7705081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
7715081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,)
7725081Sgblack@eecs.umich.edu
7735081Sgblack@eecs.umich.edu    # Negate divisor
7745081Sgblack@eecs.umich.edu    sub t4, t0, t3
7755081Sgblack@eecs.umich.edu    # Put the divisor's absolute value into t3
7765081Sgblack@eecs.umich.edu    mov t3, t3, t4, flags=(CECF,)
7775081Sgblack@eecs.umich.edu
7785081Sgblack@eecs.umich.edu    #Find the sign of the dividend
7795081Sgblack@eecs.umich.edu    #FIXME!!! This depends on shifts setting the carry flag correctly.
7805081Sgblack@eecs.umich.edu    slli t0, rdx, 1, flags=(ECF,)
7815081Sgblack@eecs.umich.edu
7825081Sgblack@eecs.umich.edu    # Put the dividend's absolute value into t1 and t2
7835081Sgblack@eecs.umich.edu    mov t1, t1, rax, flags=(nCECF,)
7845081Sgblack@eecs.umich.edu    mov t2, t2, rdx, flags=(nCECF,)
7855081Sgblack@eecs.umich.edu
7865081Sgblack@eecs.umich.edu    # Do the initial part of the division
7875081Sgblack@eecs.umich.edu    div1 t2, t3
7885081Sgblack@eecs.umich.edu
7895081Sgblack@eecs.umich.edu    #These are split out so we can initialize the number of bits in the
7905081Sgblack@eecs.umich.edu    #second register
7915081Sgblack@eecs.umich.edu    div2i t4, t1, "env.dataSize * 8"
7925081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7935081Sgblack@eecs.umich.edu
7945081Sgblack@eecs.umich.edu    #Loop until we're out of bits to shift in
7955081Sgblack@eecs.umich.edudivLoopTop:
7965081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7975081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7985081Sgblack@eecs.umich.edu    div2 t4, t1, t4
7995081Sgblack@eecs.umich.edu    div2 t4, t1, t4, flags=(EZF,)
8005661Sgblack@eecs.umich.edu    br label("divLoopTop"), flags=(nCEZF,)
8015081Sgblack@eecs.umich.edu
8025081Sgblack@eecs.umich.edu    #Unload the answer
8035081Sgblack@eecs.umich.edu    divq t5
8045081Sgblack@eecs.umich.edu    divr t6
8055081Sgblack@eecs.umich.edu
8065081Sgblack@eecs.umich.edu    # Fix up signs. The sign of the dividend is still lying around in ECF.
8075081Sgblack@eecs.umich.edu    # The sign of the remainder, ah, is the same as the dividend. The sign
8085081Sgblack@eecs.umich.edu    # of the quotient is negated if the signs of the divisor and dividend
8095081Sgblack@eecs.umich.edu    # were different.
8105081Sgblack@eecs.umich.edu
8115081Sgblack@eecs.umich.edu    # Negate the remainder
8125081Sgblack@eecs.umich.edu    sub t4, t0, t6
8135081Sgblack@eecs.umich.edu    # If the dividend was negitive, put the negated remainder in rdx.
8145081Sgblack@eecs.umich.edu    mov rdx, rdx, t4, (CECF,)
8155081Sgblack@eecs.umich.edu    # Otherwise put the regular remainder in rdx.
8165081Sgblack@eecs.umich.edu    mov rdx, rdx, t6, (nCECF,)
8175081Sgblack@eecs.umich.edu
8185081Sgblack@eecs.umich.edu    # Negate the quotient.
8195081Sgblack@eecs.umich.edu    sub t4, t0, t5
8205081Sgblack@eecs.umich.edu    # If the dividend was negative, start using the negated quotient
8215081Sgblack@eecs.umich.edu    mov t5, t5, t4, (CECF,)
8225081Sgblack@eecs.umich.edu
8235081Sgblack@eecs.umich.edu    # Check the sign of the divisor
8245081Sgblack@eecs.umich.edu    slli t0, t3, 1, flags=(ECF,)
8255081Sgblack@eecs.umich.edu
8265081Sgblack@eecs.umich.edu    # Negate the (possibly already negated) quotient
8275081Sgblack@eecs.umich.edu    sub t4, t0, t5
8285081Sgblack@eecs.umich.edu    # If the divisor was negative, put the negated quotient in rax.
8295081Sgblack@eecs.umich.edu    mov rax, rax, t4, (CECF,)
8305081Sgblack@eecs.umich.edu    # Otherwise put the one that wasn't negated (at least here) in rax.
8315081Sgblack@eecs.umich.edu    mov rax, rax, t5, (nCECF,)
8325081Sgblack@eecs.umich.edu};
8335081Sgblack@eecs.umich.edu'''
834