mult.isa revision 8588
17160Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27160Sgblack@eecs.umich.edu
37160Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
47160Sgblack@eecs.umich.edu// All rights reserved
57160Sgblack@eecs.umich.edu//
67160Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77160Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87160Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97160Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107160Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117160Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127160Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137160Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147160Sgblack@eecs.umich.edu//
157160Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
167160Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
177160Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
187160Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
197160Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
207160Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
217160Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
227160Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
237160Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
247160Sgblack@eecs.umich.edu// this software without specific prior written permission.
257160Sgblack@eecs.umich.edu//
267160Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277160Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287160Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297160Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
307160Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
317160Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
327160Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337160Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
347160Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
357160Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
367160Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377160Sgblack@eecs.umich.edu//
387160Sgblack@eecs.umich.edu// Authors: Gabe Black
397160Sgblack@eecs.umich.edu
407160Sgblack@eecs.umich.edulet {{
417160Sgblack@eecs.umich.edu
427160Sgblack@eecs.umich.edu    header_output = ""
437160Sgblack@eecs.umich.edu    decoder_output = ""
447160Sgblack@eecs.umich.edu    exec_output = ""
457160Sgblack@eecs.umich.edu
467160Sgblack@eecs.umich.edu    calcQCode = '''
478302SAli.Saidi@ARM.com        CpsrQ = (resTemp & 1) << 27;
487160Sgblack@eecs.umich.edu    '''
497160Sgblack@eecs.umich.edu
507160Sgblack@eecs.umich.edu    calcCcCode = '''
517160Sgblack@eecs.umich.edu        uint16_t _iz, _in;
527160Sgblack@eecs.umich.edu        _in = (resTemp >> %(negBit)d) & 1;
537160Sgblack@eecs.umich.edu        _iz = ((%(zType)s)resTemp == 0);
547160Sgblack@eecs.umich.edu
558303SAli.Saidi@ARM.com        CondCodesNZ = (_in << 1) | _iz;
567160Sgblack@eecs.umich.edu
577160Sgblack@eecs.umich.edu        DPRINTF(Arm, "(in, iz) = (%%d, %%d)\\n", _in, _iz);
587160Sgblack@eecs.umich.edu       '''
597160Sgblack@eecs.umich.edu
607160Sgblack@eecs.umich.edu    def buildMultInst(mnem, doCc, unCc, regs, code, flagType):
617160Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
627160Sgblack@eecs.umich.edu        cCode = carryCode[flagType]
637160Sgblack@eecs.umich.edu        vCode = overflowCode[flagType]
647160Sgblack@eecs.umich.edu        zType = "uint32_t"
657160Sgblack@eecs.umich.edu        negBit = 31
667160Sgblack@eecs.umich.edu        if flagType == "llbit":
677160Sgblack@eecs.umich.edu            zType = "uint64_t"
687160Sgblack@eecs.umich.edu            negBit = 63
697160Sgblack@eecs.umich.edu        if flagType == "overflow":
707160Sgblack@eecs.umich.edu            ccCode = calcQCode
717160Sgblack@eecs.umich.edu        else:
727160Sgblack@eecs.umich.edu            ccCode = calcCcCode % {
737160Sgblack@eecs.umich.edu                "negBit": negBit,
747160Sgblack@eecs.umich.edu                "zType": zType
757160Sgblack@eecs.umich.edu            }
767160Sgblack@eecs.umich.edu
777160Sgblack@eecs.umich.edu        if not regs in (3, 4):
787160Sgblack@eecs.umich.edu            raise Exception, "Multiplication instructions with %d " + \
797160Sgblack@eecs.umich.edu                             "registers are not implemented"
807160Sgblack@eecs.umich.edu
817160Sgblack@eecs.umich.edu        if regs == 3:
827160Sgblack@eecs.umich.edu            base = 'Mult3'
837160Sgblack@eecs.umich.edu        else:
847160Sgblack@eecs.umich.edu            base = 'Mult4'
857160Sgblack@eecs.umich.edu
867162Sgblack@eecs.umich.edu        Name = mnem.capitalize()
877160Sgblack@eecs.umich.edu
887160Sgblack@eecs.umich.edu        if unCc:
897160Sgblack@eecs.umich.edu            iop = InstObjParams(mnem, Name, base,
908304SAli.Saidi@ARM.com                            {"code" : code,
918304SAli.Saidi@ARM.com                             "predicate_test": pickPredicate(code),
928304SAli.Saidi@ARM.com                             "op_class": "IntMultOp" })
937160Sgblack@eecs.umich.edu        if doCc:
947160Sgblack@eecs.umich.edu            iopCc = InstObjParams(mnem + "s", Name + "Cc", base,
958304SAli.Saidi@ARM.com                              {"code" : code + ccCode,
968304SAli.Saidi@ARM.com                               "predicate_test": pickPredicate(code + ccCode),
978304SAli.Saidi@ARM.com                               "op_class": "IntMultOp" })
987160Sgblack@eecs.umich.edu
997160Sgblack@eecs.umich.edu        if regs == 3:
1007160Sgblack@eecs.umich.edu            declare = Mult3Declare
1017160Sgblack@eecs.umich.edu            constructor = Mult3Constructor
1027160Sgblack@eecs.umich.edu        else:
1037160Sgblack@eecs.umich.edu            declare = Mult4Declare
1047160Sgblack@eecs.umich.edu            constructor = Mult4Constructor
1057160Sgblack@eecs.umich.edu
1067160Sgblack@eecs.umich.edu        if unCc:
1077160Sgblack@eecs.umich.edu            header_output += declare.subst(iop)
1087160Sgblack@eecs.umich.edu            decoder_output += constructor.subst(iop)
1097160Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
1107160Sgblack@eecs.umich.edu        if doCc:
1117160Sgblack@eecs.umich.edu            header_output += declare.subst(iopCc)
1127160Sgblack@eecs.umich.edu            decoder_output += constructor.subst(iopCc)
1137160Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iopCc)
1147160Sgblack@eecs.umich.edu
1157160Sgblack@eecs.umich.edu    def buildMult3Inst(mnem, code, flagType = "logic"):
1167160Sgblack@eecs.umich.edu        buildMultInst(mnem, True, True, 3, code, flagType)
1177160Sgblack@eecs.umich.edu
1187160Sgblack@eecs.umich.edu    def buildMult3InstCc(mnem, code, flagType = "logic"):
1197160Sgblack@eecs.umich.edu        buildMultInst(mnem, True, False, 3, code, flagType)
1207160Sgblack@eecs.umich.edu
1217160Sgblack@eecs.umich.edu    def buildMult3InstUnCc(mnem, code, flagType = "logic"):
1227160Sgblack@eecs.umich.edu        buildMultInst(mnem, False, True, 3, code, flagType)
1237160Sgblack@eecs.umich.edu
1247160Sgblack@eecs.umich.edu    def buildMult4Inst(mnem, code, flagType = "logic"):
1257160Sgblack@eecs.umich.edu        buildMultInst(mnem, True, True, 4, code, flagType)
1267160Sgblack@eecs.umich.edu
1277160Sgblack@eecs.umich.edu    def buildMult4InstCc(mnem, code, flagType = "logic"):
1287160Sgblack@eecs.umich.edu        buildMultInst(mnem, True, False, 4, code, flagType)
1297160Sgblack@eecs.umich.edu
1307160Sgblack@eecs.umich.edu    def buildMult4InstUnCc(mnem, code, flagType = "logic"):
1317160Sgblack@eecs.umich.edu        buildMultInst(mnem, False, True, 4, code, flagType)
1327160Sgblack@eecs.umich.edu
1337160Sgblack@eecs.umich.edu    buildMult4Inst    ("mla", "Reg0 = resTemp = Reg1 * Reg2 + Reg3;")
1347160Sgblack@eecs.umich.edu    buildMult4InstUnCc("mls", "Reg0 = resTemp = Reg3 - Reg1 * Reg2;")
1357160Sgblack@eecs.umich.edu    buildMult3Inst    ("mul", "Reg0 = resTemp = Reg1 * Reg2;")
1367160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlabb", '''Reg0 = resTemp =
1377160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
1388588Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2_sw, 15, 0)) +
1398588Sgblack@eecs.umich.edu                                        Reg3_sw;
1407196Sgblack@eecs.umich.edu                                 resTemp = bits(resTemp, 32) !=
1417196Sgblack@eecs.umich.edu                                           bits(resTemp, 31);
1427160Sgblack@eecs.umich.edu                                 ''', "overflow")
1437160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlabt", '''Reg0 = resTemp =
1447160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
1458588Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2_sw, 31, 16)) +
1468588Sgblack@eecs.umich.edu                                        Reg3_sw;
1477196Sgblack@eecs.umich.edu                                 resTemp = bits(resTemp, 32) !=
1487196Sgblack@eecs.umich.edu                                           bits(resTemp, 31);
1497160Sgblack@eecs.umich.edu                                 ''', "overflow")
1507160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlatb", '''Reg0 = resTemp =
1517160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
1528588Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2_sw, 15, 0)) +
1538588Sgblack@eecs.umich.edu                                        Reg3_sw;
1547196Sgblack@eecs.umich.edu                                 resTemp = bits(resTemp, 32) !=
1557196Sgblack@eecs.umich.edu                                           bits(resTemp, 31);
1567160Sgblack@eecs.umich.edu                                 ''', "overflow")
1577160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlatt", '''Reg0 = resTemp =
1587160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
1598588Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2_sw, 31, 16)) +
1608588Sgblack@eecs.umich.edu                                        Reg3_sw;
1617196Sgblack@eecs.umich.edu                                 resTemp = bits(resTemp, 32) !=
1627196Sgblack@eecs.umich.edu                                           bits(resTemp, 31);
1637160Sgblack@eecs.umich.edu                                 ''', "overflow")
1647160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlad", '''Reg0 = resTemp =
1657160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
1667160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16)) +
1677160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
1687160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0)) +
1698588Sgblack@eecs.umich.edu                                        Reg3_sw;
1707228Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
1717228Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
1727160Sgblack@eecs.umich.edu                                ''', "overflow")
1737160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smladx", '''Reg0 = resTemp =
1747160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg1, 31, 16)) *
1757160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0)) +
1767160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg1, 15, 0)) *
1777160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16)) +
1788588Sgblack@eecs.umich.edu                                         Reg3_sw;
1797228Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
1807228Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
1817160Sgblack@eecs.umich.edu                                 ''', "overflow")
1827160Sgblack@eecs.umich.edu    buildMult4Inst    ("smlal", '''resTemp = sext<32>(Reg2) * sext<32>(Reg3) +
1838588Sgblack@eecs.umich.edu                                       (int64_t)((Reg1_ud << 32) | Reg0_ud);
1848588Sgblack@eecs.umich.edu                                   Reg0_ud = (uint32_t)resTemp;
1858588Sgblack@eecs.umich.edu                                   Reg1_ud = (uint32_t)(resTemp >> 32);
1867160Sgblack@eecs.umich.edu                                ''', "llbit")
1877160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlalbb", '''resTemp = sext<16>(bits(Reg2, 15, 0)) *
1887160Sgblack@eecs.umich.edu                                               sext<16>(bits(Reg3, 15, 0)) +
1898588Sgblack@eecs.umich.edu                                               (int64_t)((Reg1_ud << 32) |
1908588Sgblack@eecs.umich.edu                                                         Reg0_ud);
1918588Sgblack@eecs.umich.edu                                     Reg0_ud = (uint32_t)resTemp;
1928588Sgblack@eecs.umich.edu                                     Reg1_ud = (uint32_t)(resTemp >> 32);
1937160Sgblack@eecs.umich.edu                                  ''')
1947160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlalbt", '''resTemp = sext<16>(bits(Reg2, 15, 0)) *
1957160Sgblack@eecs.umich.edu                                               sext<16>(bits(Reg3, 31, 16)) +
1968588Sgblack@eecs.umich.edu                                               (int64_t)((Reg1_ud << 32) |
1978588Sgblack@eecs.umich.edu                                                         Reg0_ud);
1988588Sgblack@eecs.umich.edu                                     Reg0_ud = (uint32_t)resTemp;
1998588Sgblack@eecs.umich.edu                                     Reg1_ud = (uint32_t)(resTemp >> 32);
2007160Sgblack@eecs.umich.edu                                  ''')
2017160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlaltb", '''resTemp = sext<16>(bits(Reg2, 31, 16)) *
2027160Sgblack@eecs.umich.edu                                               sext<16>(bits(Reg3, 15, 0)) +
2038588Sgblack@eecs.umich.edu                                               (int64_t)((Reg1_ud << 32) |
2048588Sgblack@eecs.umich.edu                                                         Reg0_ud);
2058588Sgblack@eecs.umich.edu                                     Reg0_ud = (uint32_t)resTemp;
2068588Sgblack@eecs.umich.edu                                     Reg1_ud = (uint32_t)(resTemp >> 32);
2077160Sgblack@eecs.umich.edu                                  ''')
2087160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlaltt", '''resTemp = sext<16>(bits(Reg2, 31, 16)) *
2097160Sgblack@eecs.umich.edu                                               sext<16>(bits(Reg3, 31, 16)) +
2108588Sgblack@eecs.umich.edu                                               (int64_t)((Reg1_ud << 32) |
2118588Sgblack@eecs.umich.edu                                                         Reg0_ud);
2128588Sgblack@eecs.umich.edu                                     Reg0_ud = (uint32_t)resTemp;
2138588Sgblack@eecs.umich.edu                                     Reg1_ud = (uint32_t)(resTemp >> 32);
2147160Sgblack@eecs.umich.edu                                  ''')
2157160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlald", '''resTemp =
2167160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16)) *
2177160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg3, 31, 16)) +
2187160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0)) *
2197160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg3, 15, 0)) +
2208588Sgblack@eecs.umich.edu                                        (int64_t)((Reg1_ud << 32) |
2218588Sgblack@eecs.umich.edu                                                  Reg0_ud);
2228588Sgblack@eecs.umich.edu                                    Reg0_ud = (uint32_t)resTemp;
2238588Sgblack@eecs.umich.edu                                    Reg1_ud = (uint32_t)(resTemp >> 32);
2247160Sgblack@eecs.umich.edu                                 ''')
2257160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlaldx", '''resTemp =
2267160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16)) *
2277160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg3, 15, 0)) +
2287160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0)) *
2297160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg3, 31, 16)) +
2308588Sgblack@eecs.umich.edu                                         (int64_t)((Reg1_ud << 32) |
2318588Sgblack@eecs.umich.edu                                                   Reg0_ud);
2328588Sgblack@eecs.umich.edu                                     Reg0_ud = (uint32_t)resTemp;
2338588Sgblack@eecs.umich.edu                                     Reg1_ud = (uint32_t)(resTemp >> 32);
2347160Sgblack@eecs.umich.edu                                  ''')
2357160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlawb", '''Reg0 = resTemp =
2368588Sgblack@eecs.umich.edu                                        (Reg1_sw *
2377160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0)) +
2388588Sgblack@eecs.umich.edu                                         ((int64_t)Reg3_sw << 16)) >> 16;
2397196Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
2407196Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
2417160Sgblack@eecs.umich.edu                                 ''', "overflow")
2427160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlawt", '''Reg0 = resTemp =
2438588Sgblack@eecs.umich.edu                                        (Reg1_sw *
2447160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16)) +
2458588Sgblack@eecs.umich.edu                                         ((int64_t)Reg3_sw << 16)) >> 16;
2467196Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
2477196Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
2487160Sgblack@eecs.umich.edu                                 ''', "overflow")
2497160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlsd", '''Reg0 = resTemp =
2507160Sgblack@eecs.umich.edu                                       sext<16>(bits(Reg1, 15, 0)) *
2517160Sgblack@eecs.umich.edu                                       sext<16>(bits(Reg2, 15, 0)) -
2527160Sgblack@eecs.umich.edu                                       sext<16>(bits(Reg1, 31, 16)) *
2537160Sgblack@eecs.umich.edu                                       sext<16>(bits(Reg2, 31, 16)) +
2548588Sgblack@eecs.umich.edu                                       Reg3_sw;
2557228Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
2567228Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
2577160Sgblack@eecs.umich.edu                                ''', "overflow")
2587160Sgblack@eecs.umich.edu    buildMult4InstCc  ("smlsdx", '''Reg0 = resTemp =
2597160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
2607160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16)) -
2617160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
2627160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0)) +
2638588Sgblack@eecs.umich.edu                                        Reg3_sw;
2647228Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
2657228Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
2667160Sgblack@eecs.umich.edu                                 ''', "overflow")
2677160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlsld", '''resTemp =
2687160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0)) *
2697160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg3, 15, 0)) -
2707160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16)) *
2717160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg3, 31, 16)) +
2728588Sgblack@eecs.umich.edu                                        (int64_t)((Reg1_ud << 32) |
2738588Sgblack@eecs.umich.edu                                                  Reg0_ud);
2748588Sgblack@eecs.umich.edu                                    Reg0_ud = (uint32_t)resTemp;
2758588Sgblack@eecs.umich.edu                                    Reg1_ud = (uint32_t)(resTemp >> 32);
2767160Sgblack@eecs.umich.edu                                 ''')
2777160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smlsldx", '''resTemp =
2787160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0)) *
2797160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg3, 31, 16)) -
2807160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16)) *
2817160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg3, 15, 0)) +
2828588Sgblack@eecs.umich.edu                                         (int64_t)((Reg1_ud << 32) |
2838588Sgblack@eecs.umich.edu                                                   Reg0_ud);
2848588Sgblack@eecs.umich.edu                                     Reg0_ud = (uint32_t)resTemp;
2858588Sgblack@eecs.umich.edu                                     Reg1_ud = (uint32_t)(resTemp >> 32);
2867160Sgblack@eecs.umich.edu                                  ''')
2877160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smmla", '''Reg0 = resTemp =
2888588Sgblack@eecs.umich.edu                                       ((int64_t)(Reg3_ud << 32) +
2898588Sgblack@eecs.umich.edu                                        (int64_t)Reg1_sw *
2908588Sgblack@eecs.umich.edu                                        (int64_t)Reg2_sw) >> 32;
2917160Sgblack@eecs.umich.edu                                ''')
2927160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smmlar", '''Reg0 = resTemp =
2938588Sgblack@eecs.umich.edu                                        ((int64_t)(Reg3_ud << 32) +
2948588Sgblack@eecs.umich.edu                                         (int64_t)Reg1_sw *
2958588Sgblack@eecs.umich.edu                                         (int64_t)Reg2_sw +
2967160Sgblack@eecs.umich.edu                                         ULL(0x80000000)) >> 32;
2977160Sgblack@eecs.umich.edu                                 ''')
2987160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smmls", '''Reg0 = resTemp =
2998588Sgblack@eecs.umich.edu                                       ((int64_t)(Reg3_ud << 32) -
3008588Sgblack@eecs.umich.edu                                        (int64_t)Reg1_sw *
3018588Sgblack@eecs.umich.edu                                        (int64_t)Reg2_sw) >> 32;
3027160Sgblack@eecs.umich.edu                                ''')
3037160Sgblack@eecs.umich.edu    buildMult4InstUnCc("smmlsr", '''Reg0 = resTemp =
3048588Sgblack@eecs.umich.edu                                        ((int64_t)(Reg3_ud << 32) -
3058588Sgblack@eecs.umich.edu                                         (int64_t)Reg1_sw *
3068588Sgblack@eecs.umich.edu                                         (int64_t)Reg2_sw +
3077160Sgblack@eecs.umich.edu                                         ULL(0x80000000)) >> 32;
3087160Sgblack@eecs.umich.edu                                 ''')
3097160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smmul", '''Reg0 = resTemp =
3108588Sgblack@eecs.umich.edu                                       ((int64_t)Reg1_sw *
3118588Sgblack@eecs.umich.edu                                        (int64_t)Reg2_sw) >> 32;
3127160Sgblack@eecs.umich.edu                                ''')
3137160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smmulr", '''Reg0 = resTemp =
3148588Sgblack@eecs.umich.edu                                        ((int64_t)Reg1_sw *
3158588Sgblack@eecs.umich.edu                                         (int64_t)Reg2_sw +
3167160Sgblack@eecs.umich.edu                                         ULL(0x80000000)) >> 32;
3177160Sgblack@eecs.umich.edu                                 ''')
3187160Sgblack@eecs.umich.edu    buildMult3InstCc  ("smuad", '''Reg0 = resTemp =
3197160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
3207160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0)) +
3217160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
3227160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16));
3237228Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
3247228Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
3257160Sgblack@eecs.umich.edu                                ''', "overflow")
3267160Sgblack@eecs.umich.edu    buildMult3InstCc  ("smuadx", '''Reg0 = resTemp =
3277160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
3287160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16)) +
3297160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
3307160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0));
3317228Sgblack@eecs.umich.edu                                    resTemp = bits(resTemp, 32) !=
3327228Sgblack@eecs.umich.edu                                              bits(resTemp, 31);
3337160Sgblack@eecs.umich.edu                                 ''', "overflow")
3347160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smulbb", '''Reg0 = resTemp =
3357160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg1, 15, 0)) *
3367160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0));
3377160Sgblack@eecs.umich.edu                                 ''')
3387160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smulbt", '''Reg0 = resTemp =
3397196Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg1, 15, 0)) *
3407196Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16));
3417196Sgblack@eecs.umich.edu                                 ''')
3427196Sgblack@eecs.umich.edu    buildMult3InstUnCc("smultb", '''Reg0 = resTemp =
3437160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg1, 31, 16)) *
3447160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0));
3457160Sgblack@eecs.umich.edu                                 ''')
3467160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smultt", '''Reg0 = resTemp =
3477160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg1, 31, 16)) *
3487160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16));
3497160Sgblack@eecs.umich.edu                                 ''')
3508588Sgblack@eecs.umich.edu    buildMult4Inst    ("smull", '''resTemp = (int64_t)Reg2_sw *
3518588Sgblack@eecs.umich.edu                                             (int64_t)Reg3_sw;
3528206SWilliam.Wang@arm.com                                   Reg1 = (int32_t)(resTemp >> 32);
3537160Sgblack@eecs.umich.edu                                   Reg0 = (int32_t)resTemp;
3547160Sgblack@eecs.umich.edu                                ''', "llbit")
3557160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smulwb", '''Reg0 = resTemp =
3568588Sgblack@eecs.umich.edu                                        (Reg1_sw *
3577160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 15, 0))) >> 16;
3587160Sgblack@eecs.umich.edu                                 ''')
3597160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smulwt", '''Reg0 = resTemp =
3608588Sgblack@eecs.umich.edu                                        (Reg1_sw *
3617160Sgblack@eecs.umich.edu                                         sext<16>(bits(Reg2, 31, 16))) >> 16;
3627160Sgblack@eecs.umich.edu                                 ''')
3637160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smusd", '''Reg0 = resTemp =
3647160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
3657160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0)) -
3667160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
3677160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16));
3687160Sgblack@eecs.umich.edu                                ''')
3697160Sgblack@eecs.umich.edu    buildMult3InstUnCc("smusdx", '''Reg0 = resTemp =
3707160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 15, 0)) *
3717160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 31, 16)) -
3727160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg1, 31, 16)) *
3737160Sgblack@eecs.umich.edu                                        sext<16>(bits(Reg2, 15, 0));
3747160Sgblack@eecs.umich.edu                                 ''')
3758588Sgblack@eecs.umich.edu    buildMult4InstUnCc("umaal", '''resTemp = Reg2_ud * Reg3_ud +
3768588Sgblack@eecs.umich.edu                                             Reg0_ud + Reg1_ud;
3778588Sgblack@eecs.umich.edu                                   Reg1_ud = (uint32_t)(resTemp >> 32);
3788588Sgblack@eecs.umich.edu                                   Reg0_ud = (uint32_t)resTemp;
3797160Sgblack@eecs.umich.edu                                ''')
3808588Sgblack@eecs.umich.edu    buildMult4Inst    ("umlal", '''resTemp = Reg2_ud * Reg3_ud + Reg0_ud +
3818588Sgblack@eecs.umich.edu                                             (Reg1_ud << 32);
3828588Sgblack@eecs.umich.edu                                   Reg1_ud = (uint32_t)(resTemp >> 32);
3838588Sgblack@eecs.umich.edu                                   Reg0_ud = (uint32_t)resTemp;
3847160Sgblack@eecs.umich.edu                                ''', "llbit")
3858588Sgblack@eecs.umich.edu    buildMult4Inst    ("umull", '''resTemp = Reg2_ud * Reg3_ud;
3868206SWilliam.Wang@arm.com                                   Reg1 = (uint32_t)(resTemp >> 32);
3877160Sgblack@eecs.umich.edu                                   Reg0 = (uint32_t)resTemp;
3887160Sgblack@eecs.umich.edu                                ''', "llbit")
3897160Sgblack@eecs.umich.edu}};
390