mult.isa revision 7243
17161Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
27161Sgblack@eecs.umich.edu// All rights reserved
37161Sgblack@eecs.umich.edu//
47161Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
57161Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
67161Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
77161Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
87161Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
97161Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
107161Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
117161Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
127161Sgblack@eecs.umich.edu//
137161Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
147161Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
157161Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
167161Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
177161Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
187161Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
197161Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
207161Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
217161Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
227161Sgblack@eecs.umich.edu// this software without specific prior written permission.
237161Sgblack@eecs.umich.edu//
247161Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
257161Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
267161Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
277161Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
287161Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
297161Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
307161Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
317161Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
327161Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
337161Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
347161Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
357161Sgblack@eecs.umich.edu//
367161Sgblack@eecs.umich.edu// Authors: Gabe Black
377161Sgblack@eecs.umich.edu
387161Sgblack@eecs.umich.edudef format ArmMultAndMultAcc() {{
397161Sgblack@eecs.umich.edu    decode_block = '''
407161Sgblack@eecs.umich.edu    {
417161Sgblack@eecs.umich.edu        // The manual defines this field as 23-20, but bit 20 is usually
427161Sgblack@eecs.umich.edu        // ignored.
437161Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 23, 21);
447161Sgblack@eecs.umich.edu        const bool s = bits(machInst, 20);
457161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
467161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
477161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
487161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
497161Sgblack@eecs.umich.edu        switch (op) {
507161Sgblack@eecs.umich.edu            case 0x0:
517161Sgblack@eecs.umich.edu              if (s) {
527162Sgblack@eecs.umich.edu                  return new MulCc(machInst, rd, rm, rn);
537161Sgblack@eecs.umich.edu              } else {
547162Sgblack@eecs.umich.edu                  return new Mul(machInst, rd, rm, rn);
557161Sgblack@eecs.umich.edu              }
567161Sgblack@eecs.umich.edu            case 0x1:
577161Sgblack@eecs.umich.edu              if (s) {
587162Sgblack@eecs.umich.edu                  return new MlaCc(machInst, rd, rn, rm, ra);
597161Sgblack@eecs.umich.edu              } else {
607162Sgblack@eecs.umich.edu                  return new Mla(machInst, rd, rn, rm, ra);
617161Sgblack@eecs.umich.edu              }
627161Sgblack@eecs.umich.edu            case 0x2:
637162Sgblack@eecs.umich.edu              return new Umaal(machInst, ra, rd, rn, rm);
647161Sgblack@eecs.umich.edu            case 0x3:
657162Sgblack@eecs.umich.edu              return new Mls(machInst, rd, rn, rm, ra);
667161Sgblack@eecs.umich.edu            case 0x4:
677161Sgblack@eecs.umich.edu              if (s) {
687162Sgblack@eecs.umich.edu                  return new UmullCc(machInst, ra, rd, rn, rm);
697161Sgblack@eecs.umich.edu              } else {
707162Sgblack@eecs.umich.edu                  return new Umull(machInst, ra, rd, rn, rm);
717161Sgblack@eecs.umich.edu              }
727161Sgblack@eecs.umich.edu            case 0x5:
737161Sgblack@eecs.umich.edu              if (s) {
747162Sgblack@eecs.umich.edu                  return new UmlalCc(machInst, ra, rd, rn, rm);
757161Sgblack@eecs.umich.edu              } else {
767162Sgblack@eecs.umich.edu                  return new Umlal(machInst, ra, rd, rn, rm);
777161Sgblack@eecs.umich.edu              }
787161Sgblack@eecs.umich.edu            case 0x6:
797161Sgblack@eecs.umich.edu              if (s) {
807162Sgblack@eecs.umich.edu                  return new SmullCc(machInst, ra, rd, rn, rm);
817161Sgblack@eecs.umich.edu              } else {
827162Sgblack@eecs.umich.edu                  return new Smull(machInst, ra, rd, rn, rm);
837161Sgblack@eecs.umich.edu              }
847161Sgblack@eecs.umich.edu            case 0x7:
857161Sgblack@eecs.umich.edu              if (s) {
867162Sgblack@eecs.umich.edu                  return new SmlalCc(machInst, ra, rd, rn, rm);
877161Sgblack@eecs.umich.edu              } else {
887162Sgblack@eecs.umich.edu                  return new Smlal(machInst, ra, rd, rn, rm);
897161Sgblack@eecs.umich.edu              }
907161Sgblack@eecs.umich.edu        }
917161Sgblack@eecs.umich.edu    }
927161Sgblack@eecs.umich.edu    '''
937161Sgblack@eecs.umich.edu}};
947161Sgblack@eecs.umich.edu
957161Sgblack@eecs.umich.edudef format ArmHalfWordMultAndMultAcc() {{
967161Sgblack@eecs.umich.edu    decode_block = '''
977161Sgblack@eecs.umich.edu    {
987161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 21);
997161Sgblack@eecs.umich.edu        const bool op = bits(machInst, 5);
1007161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
1017161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
1027161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
1037161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
1047161Sgblack@eecs.umich.edu        switch (op1) {
1057161Sgblack@eecs.umich.edu          case 0x0:
1067161Sgblack@eecs.umich.edu            switch (bits(machInst, 6, 5)) {
1077161Sgblack@eecs.umich.edu              case 0x0:
1087162Sgblack@eecs.umich.edu                return new SmlabbCc(machInst, rd, rn, rm, ra);
1097161Sgblack@eecs.umich.edu              case 0x1:
1107162Sgblack@eecs.umich.edu                return new SmlatbCc(machInst, rd, rn, rm, ra);
1117161Sgblack@eecs.umich.edu              case 0x2:
1127162Sgblack@eecs.umich.edu                return new SmlabtCc(machInst, rd, rn, rm, ra);
1137161Sgblack@eecs.umich.edu              case 0x3:
1147162Sgblack@eecs.umich.edu                return new SmlattCc(machInst, rd, rn, rm, ra);
1157161Sgblack@eecs.umich.edu            }
1167161Sgblack@eecs.umich.edu          case 0x1:
1177161Sgblack@eecs.umich.edu            if (op) {
1187161Sgblack@eecs.umich.edu                if (bits(machInst, 6)) {
1197162Sgblack@eecs.umich.edu                    return new Smulwt(machInst, rd, rn, rm);
1207161Sgblack@eecs.umich.edu                } else {
1217162Sgblack@eecs.umich.edu                    return new Smulwb(machInst, rd, rn, rm);
1227161Sgblack@eecs.umich.edu                }
1237161Sgblack@eecs.umich.edu            } else {
1247161Sgblack@eecs.umich.edu                if (bits(machInst, 6)) {
1257162Sgblack@eecs.umich.edu                    return new SmlawtCc(machInst, rd, rn, rm, ra);
1267161Sgblack@eecs.umich.edu                } else {
1277162Sgblack@eecs.umich.edu                    return new SmlawbCc(machInst, rd, rn, rm, ra);
1287161Sgblack@eecs.umich.edu                }
1297161Sgblack@eecs.umich.edu            }
1307161Sgblack@eecs.umich.edu          case 0x2:
1317161Sgblack@eecs.umich.edu            switch (bits(machInst, 6, 5)) {
1327161Sgblack@eecs.umich.edu              case 0x0:
1337162Sgblack@eecs.umich.edu                return new Smlalbb(machInst, ra, rd, rn, rm);
1347161Sgblack@eecs.umich.edu              case 0x1:
1357162Sgblack@eecs.umich.edu                return new Smlaltb(machInst, ra, rd, rn, rm);
1367161Sgblack@eecs.umich.edu              case 0x2:
1377162Sgblack@eecs.umich.edu                return new Smlalbt(machInst, ra, rd, rn, rm);
1387161Sgblack@eecs.umich.edu              case 0x3:
1397162Sgblack@eecs.umich.edu                return new Smlaltt(machInst, ra, rd, rn, rm);
1407161Sgblack@eecs.umich.edu            }
1417161Sgblack@eecs.umich.edu          case 0x3:
1427161Sgblack@eecs.umich.edu            switch (bits(machInst, 6, 5)) {
1437161Sgblack@eecs.umich.edu              case 0x0:
1447162Sgblack@eecs.umich.edu                return new Smulbb(machInst, rd, rn, rm);
1457161Sgblack@eecs.umich.edu              case 0x1:
1467162Sgblack@eecs.umich.edu                return new Smultb(machInst, rd, rn, rm);
1477161Sgblack@eecs.umich.edu              case 0x2:
1487162Sgblack@eecs.umich.edu                return new Smulbt(machInst, rd, rn, rm);
1497161Sgblack@eecs.umich.edu              case 0x3:
1507162Sgblack@eecs.umich.edu                return new Smultt(machInst, rd, rn, rm);
1517161Sgblack@eecs.umich.edu            }
1527161Sgblack@eecs.umich.edu        }
1537161Sgblack@eecs.umich.edu    }
1547161Sgblack@eecs.umich.edu    '''
1557161Sgblack@eecs.umich.edu}};
1567161Sgblack@eecs.umich.edu
1577161Sgblack@eecs.umich.edudef format Thumb32MulMulAccAndAbsDiff() {{
1587161Sgblack@eecs.umich.edu    decode_block = '''
1597161Sgblack@eecs.umich.edu    {
1607161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 20);
1617161Sgblack@eecs.umich.edu        const uint32_t op2 = bits(machInst, 5, 4);
1627161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
1637161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
1647161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
1657161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
1667161Sgblack@eecs.umich.edu        if (op1 != 0x1 && bits(op2, 1) != 0) {
1677161Sgblack@eecs.umich.edu            return new Unknown(machInst);
1687161Sgblack@eecs.umich.edu        }
1697161Sgblack@eecs.umich.edu        switch (op1) {
1707161Sgblack@eecs.umich.edu          case 0x0:
1717161Sgblack@eecs.umich.edu            if (op2 == 0) {
1727161Sgblack@eecs.umich.edu                if (ra == 0xf) {
1737162Sgblack@eecs.umich.edu                    return new Mul(machInst, rd, rn, rm);
1747161Sgblack@eecs.umich.edu                } else {
1757162Sgblack@eecs.umich.edu                    return new Mla(machInst, rd, rn, rm, ra);
1767161Sgblack@eecs.umich.edu                }
1777161Sgblack@eecs.umich.edu            } else {
1787162Sgblack@eecs.umich.edu                return new Mls(machInst, rd, rn, rm, ra);
1797161Sgblack@eecs.umich.edu            }
1807161Sgblack@eecs.umich.edu          case 0x1:
1817161Sgblack@eecs.umich.edu            if (ra == 0xf) {
1827161Sgblack@eecs.umich.edu                switch (bits(machInst, 5, 4)) {
1837161Sgblack@eecs.umich.edu                  case 0x0:
1847162Sgblack@eecs.umich.edu                    return new Smulbb(machInst, rd, rn, rm);
1857161Sgblack@eecs.umich.edu                  case 0x1:
1867162Sgblack@eecs.umich.edu                    return new Smulbt(machInst, rd, rn, rm);
1877161Sgblack@eecs.umich.edu                  case 0x2:
1887162Sgblack@eecs.umich.edu                    return new Smultb(machInst, rd, rn, rm);
1897161Sgblack@eecs.umich.edu                  case 0x3:
1907162Sgblack@eecs.umich.edu                    return new Smultt(machInst, rd, rn, rm);
1917161Sgblack@eecs.umich.edu                }
1927161Sgblack@eecs.umich.edu            } else {
1937161Sgblack@eecs.umich.edu                switch (bits(machInst, 5, 4)) {
1947161Sgblack@eecs.umich.edu                  case 0x0:
1957162Sgblack@eecs.umich.edu                    return new SmlabbCc(machInst, rd, rn, rm, ra);
1967161Sgblack@eecs.umich.edu                  case 0x1:
1977162Sgblack@eecs.umich.edu                    return new SmlabtCc(machInst, rd, rn, rm, ra);
1987161Sgblack@eecs.umich.edu                  case 0x2:
1997162Sgblack@eecs.umich.edu                    return new SmlatbCc(machInst, rd, rn, rm, ra);
2007161Sgblack@eecs.umich.edu                  case 0x3:
2017162Sgblack@eecs.umich.edu                    return new SmlattCc(machInst, rd, rn, rm, ra);
2027161Sgblack@eecs.umich.edu                }
2037161Sgblack@eecs.umich.edu            }
2047161Sgblack@eecs.umich.edu          case 0x2:
2057161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2067161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2077162Sgblack@eecs.umich.edu                    return new SmuadxCc(machInst, rd, rn, rm);
2087161Sgblack@eecs.umich.edu                } else {
2097162Sgblack@eecs.umich.edu                    return new SmuadCc(machInst, rd, rn, rm);
2107161Sgblack@eecs.umich.edu                }
2117161Sgblack@eecs.umich.edu            } else {
2127161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2137162Sgblack@eecs.umich.edu                    return new SmladxCc(machInst, rd, rn, rm, ra);
2147161Sgblack@eecs.umich.edu                } else {
2157162Sgblack@eecs.umich.edu                    return new SmladCc(machInst, rd, rn, rm, ra);
2167161Sgblack@eecs.umich.edu                }
2177161Sgblack@eecs.umich.edu            }
2187161Sgblack@eecs.umich.edu          case 0x3:
2197161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2207161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2217162Sgblack@eecs.umich.edu                    return new Smulwt(machInst, rd, rn, rm);
2227161Sgblack@eecs.umich.edu                } else {
2237162Sgblack@eecs.umich.edu                    return new Smulwb(machInst, rd, rn, rm);
2247161Sgblack@eecs.umich.edu                }
2257161Sgblack@eecs.umich.edu            } else {
2267161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2277162Sgblack@eecs.umich.edu                    return new SmlawtCc(machInst, rd, rn, rm, ra);
2287161Sgblack@eecs.umich.edu                } else {
2297162Sgblack@eecs.umich.edu                    return new SmlawbCc(machInst, rd, rn, rm, ra);
2307161Sgblack@eecs.umich.edu                }
2317161Sgblack@eecs.umich.edu            }
2327161Sgblack@eecs.umich.edu          case 0x4:
2337161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2347161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2357162Sgblack@eecs.umich.edu                    return new Smusdx(machInst, rd, rn, rm);
2367161Sgblack@eecs.umich.edu                } else {
2377162Sgblack@eecs.umich.edu                    return new Smusd(machInst, rd, rn, rm);
2387161Sgblack@eecs.umich.edu                }
2397161Sgblack@eecs.umich.edu            } else {
2407161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2417162Sgblack@eecs.umich.edu                    return new SmlsdxCc(machInst, rd, rn, rm, ra);
2427161Sgblack@eecs.umich.edu                } else {
2437162Sgblack@eecs.umich.edu                    return new SmlsdCc(machInst, rd, rn, rm, ra);
2447161Sgblack@eecs.umich.edu                }
2457161Sgblack@eecs.umich.edu            }
2467161Sgblack@eecs.umich.edu          case 0x5:
2477161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2487161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2497162Sgblack@eecs.umich.edu                    return new Smmulr(machInst, rd, rn, rm);
2507161Sgblack@eecs.umich.edu                } else {
2517162Sgblack@eecs.umich.edu                    return new Smmul(machInst, rd, rn, rm);
2527161Sgblack@eecs.umich.edu                }
2537161Sgblack@eecs.umich.edu            } else {
2547161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2557162Sgblack@eecs.umich.edu                    return new Smmlar(machInst, rd, rn, rm, ra);
2567161Sgblack@eecs.umich.edu                } else {
2577162Sgblack@eecs.umich.edu                    return new Smmla(machInst, rd, rn, rm, ra);
2587161Sgblack@eecs.umich.edu                }
2597161Sgblack@eecs.umich.edu            }
2607161Sgblack@eecs.umich.edu          case 0x6:
2617161Sgblack@eecs.umich.edu            if (bits(machInst, 4)) {
2627162Sgblack@eecs.umich.edu                return new Smmlsr(machInst, rd, rn, rm, ra);
2637161Sgblack@eecs.umich.edu            } else {
2647162Sgblack@eecs.umich.edu                return new Smmls(machInst, rd, rn, rm, ra);
2657161Sgblack@eecs.umich.edu            }
2667161Sgblack@eecs.umich.edu          case 0x7:
2677161Sgblack@eecs.umich.edu            if (op2 != 0x0) {
2687161Sgblack@eecs.umich.edu                return new Unknown(machInst);
2697161Sgblack@eecs.umich.edu            } else if (ra == 0xf) {
2707243Sgblack@eecs.umich.edu                return new Usad8(machInst, rd, rn, rm);
2717161Sgblack@eecs.umich.edu            } else {
2727243Sgblack@eecs.umich.edu                return new Usada8(machInst, rd, rn, rm, ra);
2737161Sgblack@eecs.umich.edu            }
2747161Sgblack@eecs.umich.edu        }
2757161Sgblack@eecs.umich.edu    }
2767161Sgblack@eecs.umich.edu    '''
2777161Sgblack@eecs.umich.edu}};
2787161Sgblack@eecs.umich.edu
2797161Sgblack@eecs.umich.edudef format Thumb32LongMulMulAccAndDiv() {{
2807161Sgblack@eecs.umich.edu    decode_block = '''
2817161Sgblack@eecs.umich.edu    {
2827161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 20);
2837161Sgblack@eecs.umich.edu        const uint32_t op2 = bits(machInst, 7, 4);
2847161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
2857161Sgblack@eecs.umich.edu        const IntRegIndex rdlo = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
2867161Sgblack@eecs.umich.edu        const IntRegIndex rdhi = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
2877161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
2887161Sgblack@eecs.umich.edu        switch (op1) {
2897161Sgblack@eecs.umich.edu          case 0x0:
2907161Sgblack@eecs.umich.edu            if (op2 == 0x0) {
2917162Sgblack@eecs.umich.edu                return new Smull(machInst, rdlo, rdhi, rn, rm);
2927161Sgblack@eecs.umich.edu            }
2937161Sgblack@eecs.umich.edu            break;
2947161Sgblack@eecs.umich.edu          case 0x1:
2957161Sgblack@eecs.umich.edu            if (op2 == 0xf) {
2967161Sgblack@eecs.umich.edu                return new WarnUnimplemented("sdiv", machInst);
2977161Sgblack@eecs.umich.edu            }
2987161Sgblack@eecs.umich.edu            break;
2997161Sgblack@eecs.umich.edu          case 0x2:
3007161Sgblack@eecs.umich.edu            if (op2 == 0x0) {
3017162Sgblack@eecs.umich.edu                return new Umull(machInst, rdlo, rdhi, rn, rm);
3027161Sgblack@eecs.umich.edu            }
3037161Sgblack@eecs.umich.edu            break;
3047161Sgblack@eecs.umich.edu          case 0x3:
3057161Sgblack@eecs.umich.edu            if (op2 == 0xf) {
3067161Sgblack@eecs.umich.edu                return new WarnUnimplemented("udiv", machInst);
3077161Sgblack@eecs.umich.edu            }
3087161Sgblack@eecs.umich.edu            break;
3097161Sgblack@eecs.umich.edu          case 0x4:
3107161Sgblack@eecs.umich.edu            if (op2 == 0) {
3117162Sgblack@eecs.umich.edu                return new Smlal(machInst, rdlo, rdhi, rn, rm);
3127161Sgblack@eecs.umich.edu            } else if (bits(op2, 3, 2) == 0x2) {
3137161Sgblack@eecs.umich.edu                switch (bits(machInst, 5, 4)) {
3147161Sgblack@eecs.umich.edu                  case 0x0:
3157162Sgblack@eecs.umich.edu                    return new Smlalbb(machInst, rdlo, rdhi, rn, rm);
3167161Sgblack@eecs.umich.edu                  case 0x1:
3177162Sgblack@eecs.umich.edu                    return new Smlalbt(machInst, rdlo, rdhi, rn, rm);
3187161Sgblack@eecs.umich.edu                  case 0x2:
3197162Sgblack@eecs.umich.edu                    return new Smlaltb(machInst, rdlo, rdhi, rn, rm);
3207161Sgblack@eecs.umich.edu                  case 0x3:
3217162Sgblack@eecs.umich.edu                    return new Smlaltt(machInst, rdlo, rdhi, rn, rm);
3227161Sgblack@eecs.umich.edu                }
3237161Sgblack@eecs.umich.edu            } else if (bits(op2, 3, 1) == 0x6) {
3247161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
3257162Sgblack@eecs.umich.edu                    return new Smlaldx(machInst, rdlo, rdhi, rn, rm);
3267161Sgblack@eecs.umich.edu                } else {
3277162Sgblack@eecs.umich.edu                    return new Smlald(machInst, rdlo, rdhi, rn, rm);
3287161Sgblack@eecs.umich.edu                }
3297161Sgblack@eecs.umich.edu            }
3307161Sgblack@eecs.umich.edu            break;
3317161Sgblack@eecs.umich.edu          case 0x5:
3327161Sgblack@eecs.umich.edu            if (bits(op2, 3, 1) == 0x6) {
3337161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
3347162Sgblack@eecs.umich.edu                    return new Smlsldx(machInst, rdlo, rdhi, rn, rm);
3357161Sgblack@eecs.umich.edu                } else {
3367162Sgblack@eecs.umich.edu                    return new Smlsld(machInst, rdlo, rdhi, rn, rm);
3377161Sgblack@eecs.umich.edu                }
3387161Sgblack@eecs.umich.edu            }
3397161Sgblack@eecs.umich.edu          case 0x6:
3407161Sgblack@eecs.umich.edu            if (op2 == 0) {
3417162Sgblack@eecs.umich.edu                return new Umlal(machInst, rdlo, rdhi, rn, rm);
3427161Sgblack@eecs.umich.edu            } else if (op2 == 0x6) {
3437162Sgblack@eecs.umich.edu                return new Umaal(machInst, rdlo, rdhi, rn, rm);
3447161Sgblack@eecs.umich.edu            }
3457161Sgblack@eecs.umich.edu            break;
3467161Sgblack@eecs.umich.edu        }
3477161Sgblack@eecs.umich.edu        return new Unknown(machInst);
3487161Sgblack@eecs.umich.edu    }
3497161Sgblack@eecs.umich.edu    '''
3507161Sgblack@eecs.umich.edu}};
3517161Sgblack@eecs.umich.edu
3527161Sgblack@eecs.umich.edudef format ArmSignedMultiplies() {{
3537161Sgblack@eecs.umich.edu    decode_block = '''
3547161Sgblack@eecs.umich.edu    {
3557161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 20);
3567161Sgblack@eecs.umich.edu        // This is 7-5 in the manual, but bit 5 is always ignored.
3577161Sgblack@eecs.umich.edu        const uint32_t op2 = bits(machInst, 7, 6);
3587161Sgblack@eecs.umich.edu        const bool aIsF = (bits(machInst, 15, 12) == 0xf);
3597161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
3607161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
3617161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
3627161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
3637161Sgblack@eecs.umich.edu        const bool m = bits(machInst, 5);
3647161Sgblack@eecs.umich.edu        switch (op1) {
3657161Sgblack@eecs.umich.edu          case 0x0:
3667161Sgblack@eecs.umich.edu            if (op2 == 0) {
3677161Sgblack@eecs.umich.edu                if (aIsF) {
3687161Sgblack@eecs.umich.edu                    if (m) {
3697162Sgblack@eecs.umich.edu                        return new SmuadxCc(machInst, rd, rn, rm);
3707161Sgblack@eecs.umich.edu                    } else {
3717162Sgblack@eecs.umich.edu                        return new SmuadCc(machInst, rd, rn, rm);
3727161Sgblack@eecs.umich.edu                    }
3737161Sgblack@eecs.umich.edu                } else {
3747161Sgblack@eecs.umich.edu                    if (m) {
3757162Sgblack@eecs.umich.edu                        return new SmladxCc(machInst, rd, rn, rm, ra);
3767161Sgblack@eecs.umich.edu                    } else {
3777162Sgblack@eecs.umich.edu                        return new SmladCc(machInst, rd, rn, rm, ra);
3787161Sgblack@eecs.umich.edu                    }
3797161Sgblack@eecs.umich.edu                }
3807161Sgblack@eecs.umich.edu            } else if (op2 == 1) {
3817161Sgblack@eecs.umich.edu                if (aIsF) {
3827161Sgblack@eecs.umich.edu                    if (m) {
3837162Sgblack@eecs.umich.edu                        return new Smusdx(machInst, rd, rn, rm);
3847161Sgblack@eecs.umich.edu                    } else {
3857162Sgblack@eecs.umich.edu                        return new Smusd(machInst, rd, rn, rm);
3867161Sgblack@eecs.umich.edu                    }
3877161Sgblack@eecs.umich.edu                } else {
3887161Sgblack@eecs.umich.edu                    if (m) {
3897162Sgblack@eecs.umich.edu                        return new SmlsdxCc(machInst, rd, rn, rm, ra);
3907161Sgblack@eecs.umich.edu                    } else {
3917162Sgblack@eecs.umich.edu                        return new SmlsdCc(machInst, rd, rn, rm, ra);
3927161Sgblack@eecs.umich.edu                    }
3937161Sgblack@eecs.umich.edu                }
3947161Sgblack@eecs.umich.edu            }
3957161Sgblack@eecs.umich.edu            break;
3967161Sgblack@eecs.umich.edu          case 0x4:
3977161Sgblack@eecs.umich.edu            if (op2 == 0) {
3987161Sgblack@eecs.umich.edu                if (m) {
3997162Sgblack@eecs.umich.edu                    return new Smlaldx(machInst, ra, rd, rn, rm);
4007161Sgblack@eecs.umich.edu                } else {
4017162Sgblack@eecs.umich.edu                    return new Smlald(machInst, ra, rd, rn, rm);
4027161Sgblack@eecs.umich.edu                }
4037161Sgblack@eecs.umich.edu            } else if (op2 == 1) {
4047161Sgblack@eecs.umich.edu                if (m) {
4057162Sgblack@eecs.umich.edu                    return new Smlsldx(machInst, ra, rd, rn, rm);
4067161Sgblack@eecs.umich.edu                } else {
4077162Sgblack@eecs.umich.edu                    return new Smlsld(machInst, ra, rd, rn, rm);
4087161Sgblack@eecs.umich.edu                }
4097161Sgblack@eecs.umich.edu            }
4107161Sgblack@eecs.umich.edu            break;
4117161Sgblack@eecs.umich.edu          case 0x5:
4127161Sgblack@eecs.umich.edu            if (op2 == 0) {
4137161Sgblack@eecs.umich.edu                if (aIsF) {
4147161Sgblack@eecs.umich.edu                    if (m) {
4157162Sgblack@eecs.umich.edu                        return new Smmulr(machInst, rd, rn, rm);
4167161Sgblack@eecs.umich.edu                    } else {
4177162Sgblack@eecs.umich.edu                        return new Smmul(machInst, rd, rn, rm);
4187161Sgblack@eecs.umich.edu                    }
4197161Sgblack@eecs.umich.edu                } else {
4207161Sgblack@eecs.umich.edu                    if (m) {
4217162Sgblack@eecs.umich.edu                        return new Smmlar(machInst, rd, rn, rm, ra);
4227161Sgblack@eecs.umich.edu                    } else {
4237162Sgblack@eecs.umich.edu                        return new Smmla(machInst, rd, rn, rm, ra);
4247161Sgblack@eecs.umich.edu                    }
4257161Sgblack@eecs.umich.edu                }
4267161Sgblack@eecs.umich.edu            } else if (op2 == 0x3) {
4277161Sgblack@eecs.umich.edu                if (m) {
4287162Sgblack@eecs.umich.edu                    return new Smmlsr(machInst, rd, rn, rm, ra);
4297161Sgblack@eecs.umich.edu                } else {
4307162Sgblack@eecs.umich.edu                    return new Smmls(machInst, rd, rn, rm, ra);
4317161Sgblack@eecs.umich.edu                }
4327161Sgblack@eecs.umich.edu            }
4337161Sgblack@eecs.umich.edu            break;
4347161Sgblack@eecs.umich.edu          default:
4357161Sgblack@eecs.umich.edu            break;
4367161Sgblack@eecs.umich.edu        }
4377161Sgblack@eecs.umich.edu        return new Unknown(machInst);
4387161Sgblack@eecs.umich.edu    }
4397161Sgblack@eecs.umich.edu    '''
4407161Sgblack@eecs.umich.edu}};
441