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              }
9012595Ssiddhesh.poyarekar@gmail.com            default:
9112595Ssiddhesh.poyarekar@gmail.com              M5_UNREACHABLE;
927161Sgblack@eecs.umich.edu        }
937161Sgblack@eecs.umich.edu    }
947161Sgblack@eecs.umich.edu    '''
957161Sgblack@eecs.umich.edu}};
967161Sgblack@eecs.umich.edu
977161Sgblack@eecs.umich.edudef format ArmHalfWordMultAndMultAcc() {{
987161Sgblack@eecs.umich.edu    decode_block = '''
997161Sgblack@eecs.umich.edu    {
1007161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 21);
1017161Sgblack@eecs.umich.edu        const bool op = bits(machInst, 5);
1027161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
1037161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
1047161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
1057161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
1067161Sgblack@eecs.umich.edu        switch (op1) {
1077161Sgblack@eecs.umich.edu          case 0x0:
1087161Sgblack@eecs.umich.edu            switch (bits(machInst, 6, 5)) {
1097161Sgblack@eecs.umich.edu              case 0x0:
1107162Sgblack@eecs.umich.edu                return new SmlabbCc(machInst, rd, rn, rm, ra);
1117161Sgblack@eecs.umich.edu              case 0x1:
1127162Sgblack@eecs.umich.edu                return new SmlatbCc(machInst, rd, rn, rm, ra);
1137161Sgblack@eecs.umich.edu              case 0x2:
1147162Sgblack@eecs.umich.edu                return new SmlabtCc(machInst, rd, rn, rm, ra);
1157161Sgblack@eecs.umich.edu              case 0x3:
1167162Sgblack@eecs.umich.edu                return new SmlattCc(machInst, rd, rn, rm, ra);
11712595Ssiddhesh.poyarekar@gmail.com              default:
11812595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
1197161Sgblack@eecs.umich.edu            }
1207161Sgblack@eecs.umich.edu          case 0x1:
1217161Sgblack@eecs.umich.edu            if (op) {
1227161Sgblack@eecs.umich.edu                if (bits(machInst, 6)) {
1237162Sgblack@eecs.umich.edu                    return new Smulwt(machInst, rd, rn, rm);
1247161Sgblack@eecs.umich.edu                } else {
1257162Sgblack@eecs.umich.edu                    return new Smulwb(machInst, rd, rn, rm);
1267161Sgblack@eecs.umich.edu                }
1277161Sgblack@eecs.umich.edu            } else {
1287161Sgblack@eecs.umich.edu                if (bits(machInst, 6)) {
1297162Sgblack@eecs.umich.edu                    return new SmlawtCc(machInst, rd, rn, rm, ra);
1307161Sgblack@eecs.umich.edu                } else {
1317162Sgblack@eecs.umich.edu                    return new SmlawbCc(machInst, rd, rn, rm, ra);
1327161Sgblack@eecs.umich.edu                }
1337161Sgblack@eecs.umich.edu            }
1347161Sgblack@eecs.umich.edu          case 0x2:
1357161Sgblack@eecs.umich.edu            switch (bits(machInst, 6, 5)) {
1367161Sgblack@eecs.umich.edu              case 0x0:
1377162Sgblack@eecs.umich.edu                return new Smlalbb(machInst, ra, rd, rn, rm);
1387161Sgblack@eecs.umich.edu              case 0x1:
1397162Sgblack@eecs.umich.edu                return new Smlaltb(machInst, ra, rd, rn, rm);
1407161Sgblack@eecs.umich.edu              case 0x2:
1417162Sgblack@eecs.umich.edu                return new Smlalbt(machInst, ra, rd, rn, rm);
1427161Sgblack@eecs.umich.edu              case 0x3:
1437162Sgblack@eecs.umich.edu                return new Smlaltt(machInst, ra, rd, rn, rm);
14412595Ssiddhesh.poyarekar@gmail.com              default:
14512595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
1467161Sgblack@eecs.umich.edu            }
1477161Sgblack@eecs.umich.edu          case 0x3:
1487161Sgblack@eecs.umich.edu            switch (bits(machInst, 6, 5)) {
1497161Sgblack@eecs.umich.edu              case 0x0:
1507162Sgblack@eecs.umich.edu                return new Smulbb(machInst, rd, rn, rm);
1517161Sgblack@eecs.umich.edu              case 0x1:
1527162Sgblack@eecs.umich.edu                return new Smultb(machInst, rd, rn, rm);
1537161Sgblack@eecs.umich.edu              case 0x2:
1547162Sgblack@eecs.umich.edu                return new Smulbt(machInst, rd, rn, rm);
1557161Sgblack@eecs.umich.edu              case 0x3:
1567162Sgblack@eecs.umich.edu                return new Smultt(machInst, rd, rn, rm);
15712595Ssiddhesh.poyarekar@gmail.com              default:
15812595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
1597161Sgblack@eecs.umich.edu            }
16012595Ssiddhesh.poyarekar@gmail.com          default:
16112595Ssiddhesh.poyarekar@gmail.com            M5_UNREACHABLE;
1627161Sgblack@eecs.umich.edu        }
1637161Sgblack@eecs.umich.edu    }
1647161Sgblack@eecs.umich.edu    '''
1657161Sgblack@eecs.umich.edu}};
1667161Sgblack@eecs.umich.edu
1677161Sgblack@eecs.umich.edudef format Thumb32MulMulAccAndAbsDiff() {{
1687161Sgblack@eecs.umich.edu    decode_block = '''
1697161Sgblack@eecs.umich.edu    {
1707161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 20);
1717161Sgblack@eecs.umich.edu        const uint32_t op2 = bits(machInst, 5, 4);
1727161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
1737161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
1747161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
1757161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
1767161Sgblack@eecs.umich.edu        if (op1 != 0x1 && bits(op2, 1) != 0) {
1777161Sgblack@eecs.umich.edu            return new Unknown(machInst);
1787161Sgblack@eecs.umich.edu        }
1797161Sgblack@eecs.umich.edu        switch (op1) {
1807161Sgblack@eecs.umich.edu          case 0x0:
1817161Sgblack@eecs.umich.edu            if (op2 == 0) {
1827161Sgblack@eecs.umich.edu                if (ra == 0xf) {
1837162Sgblack@eecs.umich.edu                    return new Mul(machInst, rd, rn, rm);
1847161Sgblack@eecs.umich.edu                } else {
1857162Sgblack@eecs.umich.edu                    return new Mla(machInst, rd, rn, rm, ra);
1867161Sgblack@eecs.umich.edu                }
1877161Sgblack@eecs.umich.edu            } else {
1887162Sgblack@eecs.umich.edu                return new Mls(machInst, rd, rn, rm, ra);
1897161Sgblack@eecs.umich.edu            }
1907161Sgblack@eecs.umich.edu          case 0x1:
1917161Sgblack@eecs.umich.edu            if (ra == 0xf) {
1927161Sgblack@eecs.umich.edu                switch (bits(machInst, 5, 4)) {
1937161Sgblack@eecs.umich.edu                  case 0x0:
1947162Sgblack@eecs.umich.edu                    return new Smulbb(machInst, rd, rn, rm);
1957161Sgblack@eecs.umich.edu                  case 0x1:
1967162Sgblack@eecs.umich.edu                    return new Smulbt(machInst, rd, rn, rm);
1977161Sgblack@eecs.umich.edu                  case 0x2:
1987162Sgblack@eecs.umich.edu                    return new Smultb(machInst, rd, rn, rm);
1997161Sgblack@eecs.umich.edu                  case 0x3:
2007162Sgblack@eecs.umich.edu                    return new Smultt(machInst, rd, rn, rm);
2017161Sgblack@eecs.umich.edu                }
2027161Sgblack@eecs.umich.edu            } else {
2037161Sgblack@eecs.umich.edu                switch (bits(machInst, 5, 4)) {
2047161Sgblack@eecs.umich.edu                  case 0x0:
2057162Sgblack@eecs.umich.edu                    return new SmlabbCc(machInst, rd, rn, rm, ra);
2067161Sgblack@eecs.umich.edu                  case 0x1:
2077162Sgblack@eecs.umich.edu                    return new SmlabtCc(machInst, rd, rn, rm, ra);
2087161Sgblack@eecs.umich.edu                  case 0x2:
2097162Sgblack@eecs.umich.edu                    return new SmlatbCc(machInst, rd, rn, rm, ra);
2107161Sgblack@eecs.umich.edu                  case 0x3:
2117162Sgblack@eecs.umich.edu                    return new SmlattCc(machInst, rd, rn, rm, ra);
2127161Sgblack@eecs.umich.edu                }
2137161Sgblack@eecs.umich.edu            }
21412595Ssiddhesh.poyarekar@gmail.com            M5_UNREACHABLE;
2157161Sgblack@eecs.umich.edu          case 0x2:
2167161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2177161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2187162Sgblack@eecs.umich.edu                    return new SmuadxCc(machInst, rd, rn, rm);
2197161Sgblack@eecs.umich.edu                } else {
2207162Sgblack@eecs.umich.edu                    return new SmuadCc(machInst, rd, rn, rm);
2217161Sgblack@eecs.umich.edu                }
2227161Sgblack@eecs.umich.edu            } else {
2237161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2247162Sgblack@eecs.umich.edu                    return new SmladxCc(machInst, rd, rn, rm, ra);
2257161Sgblack@eecs.umich.edu                } else {
2267162Sgblack@eecs.umich.edu                    return new SmladCc(machInst, rd, rn, rm, ra);
2277161Sgblack@eecs.umich.edu                }
2287161Sgblack@eecs.umich.edu            }
2297161Sgblack@eecs.umich.edu          case 0x3:
2307161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2317161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2327162Sgblack@eecs.umich.edu                    return new Smulwt(machInst, rd, rn, rm);
2337161Sgblack@eecs.umich.edu                } else {
2347162Sgblack@eecs.umich.edu                    return new Smulwb(machInst, rd, rn, rm);
2357161Sgblack@eecs.umich.edu                }
2367161Sgblack@eecs.umich.edu            } else {
2377161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2387162Sgblack@eecs.umich.edu                    return new SmlawtCc(machInst, rd, rn, rm, ra);
2397161Sgblack@eecs.umich.edu                } else {
2407162Sgblack@eecs.umich.edu                    return new SmlawbCc(machInst, rd, rn, rm, ra);
2417161Sgblack@eecs.umich.edu                }
2427161Sgblack@eecs.umich.edu            }
2437161Sgblack@eecs.umich.edu          case 0x4:
2447161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2457161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2467162Sgblack@eecs.umich.edu                    return new Smusdx(machInst, rd, rn, rm);
2477161Sgblack@eecs.umich.edu                } else {
2487162Sgblack@eecs.umich.edu                    return new Smusd(machInst, rd, rn, rm);
2497161Sgblack@eecs.umich.edu                }
2507161Sgblack@eecs.umich.edu            } else {
2517161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2527162Sgblack@eecs.umich.edu                    return new SmlsdxCc(machInst, rd, rn, rm, ra);
2537161Sgblack@eecs.umich.edu                } else {
2547162Sgblack@eecs.umich.edu                    return new SmlsdCc(machInst, rd, rn, rm, ra);
2557161Sgblack@eecs.umich.edu                }
2567161Sgblack@eecs.umich.edu            }
2577161Sgblack@eecs.umich.edu          case 0x5:
2587161Sgblack@eecs.umich.edu            if (ra == 0xf) {
2597161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2607162Sgblack@eecs.umich.edu                    return new Smmulr(machInst, rd, rn, rm);
2617161Sgblack@eecs.umich.edu                } else {
2627162Sgblack@eecs.umich.edu                    return new Smmul(machInst, rd, rn, rm);
2637161Sgblack@eecs.umich.edu                }
2647161Sgblack@eecs.umich.edu            } else {
2657161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
2667162Sgblack@eecs.umich.edu                    return new Smmlar(machInst, rd, rn, rm, ra);
2677161Sgblack@eecs.umich.edu                } else {
2687162Sgblack@eecs.umich.edu                    return new Smmla(machInst, rd, rn, rm, ra);
2697161Sgblack@eecs.umich.edu                }
2707161Sgblack@eecs.umich.edu            }
2717161Sgblack@eecs.umich.edu          case 0x6:
2727161Sgblack@eecs.umich.edu            if (bits(machInst, 4)) {
2737162Sgblack@eecs.umich.edu                return new Smmlsr(machInst, rd, rn, rm, ra);
2747161Sgblack@eecs.umich.edu            } else {
2757162Sgblack@eecs.umich.edu                return new Smmls(machInst, rd, rn, rm, ra);
2767161Sgblack@eecs.umich.edu            }
2777161Sgblack@eecs.umich.edu          case 0x7:
2787161Sgblack@eecs.umich.edu            if (op2 != 0x0) {
2797161Sgblack@eecs.umich.edu                return new Unknown(machInst);
2807161Sgblack@eecs.umich.edu            } else if (ra == 0xf) {
2817243Sgblack@eecs.umich.edu                return new Usad8(machInst, rd, rn, rm);
2827161Sgblack@eecs.umich.edu            } else {
2837243Sgblack@eecs.umich.edu                return new Usada8(machInst, rd, rn, rm, ra);
2847161Sgblack@eecs.umich.edu            }
28512595Ssiddhesh.poyarekar@gmail.com          default:
28612595Ssiddhesh.poyarekar@gmail.com            M5_UNREACHABLE;
2877161Sgblack@eecs.umich.edu        }
2887161Sgblack@eecs.umich.edu    }
2897161Sgblack@eecs.umich.edu    '''
2907161Sgblack@eecs.umich.edu}};
2917161Sgblack@eecs.umich.edu
2927161Sgblack@eecs.umich.edudef format Thumb32LongMulMulAccAndDiv() {{
2937161Sgblack@eecs.umich.edu    decode_block = '''
2947161Sgblack@eecs.umich.edu    {
2957161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 20);
2967161Sgblack@eecs.umich.edu        const uint32_t op2 = bits(machInst, 7, 4);
2977161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
2987161Sgblack@eecs.umich.edu        const IntRegIndex rdlo = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
2997161Sgblack@eecs.umich.edu        const IntRegIndex rdhi = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
3007161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
3017161Sgblack@eecs.umich.edu        switch (op1) {
3027161Sgblack@eecs.umich.edu          case 0x0:
3037161Sgblack@eecs.umich.edu            if (op2 == 0x0) {
3047162Sgblack@eecs.umich.edu                return new Smull(machInst, rdlo, rdhi, rn, rm);
3057161Sgblack@eecs.umich.edu            }
3067161Sgblack@eecs.umich.edu            break;
3077161Sgblack@eecs.umich.edu          case 0x1:
3087161Sgblack@eecs.umich.edu            if (op2 == 0xf) {
3097318Sgblack@eecs.umich.edu                return new Sdiv(machInst, rdhi, rn, rm);
3107161Sgblack@eecs.umich.edu            }
3117161Sgblack@eecs.umich.edu            break;
3127161Sgblack@eecs.umich.edu          case 0x2:
3137161Sgblack@eecs.umich.edu            if (op2 == 0x0) {
3147162Sgblack@eecs.umich.edu                return new Umull(machInst, rdlo, rdhi, rn, rm);
3157161Sgblack@eecs.umich.edu            }
3167161Sgblack@eecs.umich.edu            break;
3177161Sgblack@eecs.umich.edu          case 0x3:
3187161Sgblack@eecs.umich.edu            if (op2 == 0xf) {
3197319Sgblack@eecs.umich.edu                return new Udiv(machInst, rdhi, rn, rm);
3207161Sgblack@eecs.umich.edu            }
3217161Sgblack@eecs.umich.edu            break;
3227161Sgblack@eecs.umich.edu          case 0x4:
3237161Sgblack@eecs.umich.edu            if (op2 == 0) {
3247162Sgblack@eecs.umich.edu                return new Smlal(machInst, rdlo, rdhi, rn, rm);
3257161Sgblack@eecs.umich.edu            } else if (bits(op2, 3, 2) == 0x2) {
3267161Sgblack@eecs.umich.edu                switch (bits(machInst, 5, 4)) {
3277161Sgblack@eecs.umich.edu                  case 0x0:
3287162Sgblack@eecs.umich.edu                    return new Smlalbb(machInst, rdlo, rdhi, rn, rm);
3297161Sgblack@eecs.umich.edu                  case 0x1:
3307162Sgblack@eecs.umich.edu                    return new Smlalbt(machInst, rdlo, rdhi, rn, rm);
3317161Sgblack@eecs.umich.edu                  case 0x2:
3327162Sgblack@eecs.umich.edu                    return new Smlaltb(machInst, rdlo, rdhi, rn, rm);
3337161Sgblack@eecs.umich.edu                  case 0x3:
3347162Sgblack@eecs.umich.edu                    return new Smlaltt(machInst, rdlo, rdhi, rn, rm);
3357161Sgblack@eecs.umich.edu                }
3367161Sgblack@eecs.umich.edu            } else if (bits(op2, 3, 1) == 0x6) {
3377161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
3387162Sgblack@eecs.umich.edu                    return new Smlaldx(machInst, rdlo, rdhi, rn, rm);
3397161Sgblack@eecs.umich.edu                } else {
3407162Sgblack@eecs.umich.edu                    return new Smlald(machInst, rdlo, rdhi, rn, rm);
3417161Sgblack@eecs.umich.edu                }
3427161Sgblack@eecs.umich.edu            }
3437161Sgblack@eecs.umich.edu            break;
3447161Sgblack@eecs.umich.edu          case 0x5:
3457161Sgblack@eecs.umich.edu            if (bits(op2, 3, 1) == 0x6) {
3467161Sgblack@eecs.umich.edu                if (bits(machInst, 4)) {
3477162Sgblack@eecs.umich.edu                    return new Smlsldx(machInst, rdlo, rdhi, rn, rm);
3487161Sgblack@eecs.umich.edu                } else {
3497162Sgblack@eecs.umich.edu                    return new Smlsld(machInst, rdlo, rdhi, rn, rm);
3507161Sgblack@eecs.umich.edu                }
3517161Sgblack@eecs.umich.edu            }
3527290Sgblack@eecs.umich.edu            break;
3537161Sgblack@eecs.umich.edu          case 0x6:
3547161Sgblack@eecs.umich.edu            if (op2 == 0) {
3557162Sgblack@eecs.umich.edu                return new Umlal(machInst, rdlo, rdhi, rn, rm);
3567161Sgblack@eecs.umich.edu            } else if (op2 == 0x6) {
3577162Sgblack@eecs.umich.edu                return new Umaal(machInst, rdlo, rdhi, rn, rm);
3587161Sgblack@eecs.umich.edu            }
3597161Sgblack@eecs.umich.edu            break;
3607161Sgblack@eecs.umich.edu        }
3617161Sgblack@eecs.umich.edu        return new Unknown(machInst);
3627161Sgblack@eecs.umich.edu    }
3637161Sgblack@eecs.umich.edu    '''
3647161Sgblack@eecs.umich.edu}};
3657161Sgblack@eecs.umich.edu
3667161Sgblack@eecs.umich.edudef format ArmSignedMultiplies() {{
3677161Sgblack@eecs.umich.edu    decode_block = '''
3687161Sgblack@eecs.umich.edu    {
3697161Sgblack@eecs.umich.edu        const uint32_t op1 = bits(machInst, 22, 20);
3707161Sgblack@eecs.umich.edu        // This is 7-5 in the manual, but bit 5 is always ignored.
3717161Sgblack@eecs.umich.edu        const uint32_t op2 = bits(machInst, 7, 6);
3727161Sgblack@eecs.umich.edu        const bool aIsF = (bits(machInst, 15, 12) == 0xf);
3737161Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
3747161Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
3757161Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
3767161Sgblack@eecs.umich.edu        const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
3777161Sgblack@eecs.umich.edu        const bool m = bits(machInst, 5);
3787161Sgblack@eecs.umich.edu        switch (op1) {
3797161Sgblack@eecs.umich.edu          case 0x0:
3807161Sgblack@eecs.umich.edu            if (op2 == 0) {
3817161Sgblack@eecs.umich.edu                if (aIsF) {
3827161Sgblack@eecs.umich.edu                    if (m) {
3837162Sgblack@eecs.umich.edu                        return new SmuadxCc(machInst, rd, rn, rm);
3847161Sgblack@eecs.umich.edu                    } else {
3857162Sgblack@eecs.umich.edu                        return new SmuadCc(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 SmladxCc(machInst, rd, rn, rm, ra);
3907161Sgblack@eecs.umich.edu                    } else {
3917162Sgblack@eecs.umich.edu                        return new SmladCc(machInst, rd, rn, rm, ra);
3927161Sgblack@eecs.umich.edu                    }
3937161Sgblack@eecs.umich.edu                }
3947161Sgblack@eecs.umich.edu            } else if (op2 == 1) {
3957161Sgblack@eecs.umich.edu                if (aIsF) {
3967161Sgblack@eecs.umich.edu                    if (m) {
3977162Sgblack@eecs.umich.edu                        return new Smusdx(machInst, rd, rn, rm);
3987161Sgblack@eecs.umich.edu                    } else {
3997162Sgblack@eecs.umich.edu                        return new Smusd(machInst, rd, rn, rm);
4007161Sgblack@eecs.umich.edu                    }
4017161Sgblack@eecs.umich.edu                } else {
4027161Sgblack@eecs.umich.edu                    if (m) {
4037162Sgblack@eecs.umich.edu                        return new SmlsdxCc(machInst, rd, rn, rm, ra);
4047161Sgblack@eecs.umich.edu                    } else {
4057162Sgblack@eecs.umich.edu                        return new SmlsdCc(machInst, rd, rn, rm, ra);
4067161Sgblack@eecs.umich.edu                    }
4077161Sgblack@eecs.umich.edu                }
4087161Sgblack@eecs.umich.edu            }
4097161Sgblack@eecs.umich.edu            break;
4108520SAli.Saidi@ARM.com          case 0x1:
4118520SAli.Saidi@ARM.com            if (op2 == 0 && m == 0 && ra == 0xf) {
4128520SAli.Saidi@ARM.com                return new Sdiv(machInst, rd, rn, rm);
4138520SAli.Saidi@ARM.com            }
4148520SAli.Saidi@ARM.com            break;
4158520SAli.Saidi@ARM.com          case 0x3:
4168520SAli.Saidi@ARM.com            if (op2 == 0 && m == 0 && ra == 0xf) {
4178520SAli.Saidi@ARM.com                return new Udiv(machInst, rd, rn, rm);
4188520SAli.Saidi@ARM.com            }
4198520SAli.Saidi@ARM.com            break;
4207161Sgblack@eecs.umich.edu          case 0x4:
4217161Sgblack@eecs.umich.edu            if (op2 == 0) {
4227161Sgblack@eecs.umich.edu                if (m) {
4237162Sgblack@eecs.umich.edu                    return new Smlaldx(machInst, ra, rd, rn, rm);
4247161Sgblack@eecs.umich.edu                } else {
4257162Sgblack@eecs.umich.edu                    return new Smlald(machInst, ra, rd, rn, rm);
4267161Sgblack@eecs.umich.edu                }
4277161Sgblack@eecs.umich.edu            } else if (op2 == 1) {
4287161Sgblack@eecs.umich.edu                if (m) {
4297162Sgblack@eecs.umich.edu                    return new Smlsldx(machInst, ra, rd, rn, rm);
4307161Sgblack@eecs.umich.edu                } else {
4317162Sgblack@eecs.umich.edu                    return new Smlsld(machInst, ra, rd, rn, rm);
4327161Sgblack@eecs.umich.edu                }
4337161Sgblack@eecs.umich.edu            }
4347161Sgblack@eecs.umich.edu            break;
4357161Sgblack@eecs.umich.edu          case 0x5:
4367161Sgblack@eecs.umich.edu            if (op2 == 0) {
4377161Sgblack@eecs.umich.edu                if (aIsF) {
4387161Sgblack@eecs.umich.edu                    if (m) {
4397162Sgblack@eecs.umich.edu                        return new Smmulr(machInst, rd, rn, rm);
4407161Sgblack@eecs.umich.edu                    } else {
4417162Sgblack@eecs.umich.edu                        return new Smmul(machInst, rd, rn, rm);
4427161Sgblack@eecs.umich.edu                    }
4437161Sgblack@eecs.umich.edu                } else {
4447161Sgblack@eecs.umich.edu                    if (m) {
4457162Sgblack@eecs.umich.edu                        return new Smmlar(machInst, rd, rn, rm, ra);
4467161Sgblack@eecs.umich.edu                    } else {
4477162Sgblack@eecs.umich.edu                        return new Smmla(machInst, rd, rn, rm, ra);
4487161Sgblack@eecs.umich.edu                    }
4497161Sgblack@eecs.umich.edu                }
4507161Sgblack@eecs.umich.edu            } else if (op2 == 0x3) {
4517161Sgblack@eecs.umich.edu                if (m) {
4527162Sgblack@eecs.umich.edu                    return new Smmlsr(machInst, rd, rn, rm, ra);
4537161Sgblack@eecs.umich.edu                } else {
4547162Sgblack@eecs.umich.edu                    return new Smmls(machInst, rd, rn, rm, ra);
4557161Sgblack@eecs.umich.edu                }
4567161Sgblack@eecs.umich.edu            }
4577161Sgblack@eecs.umich.edu            break;
4587161Sgblack@eecs.umich.edu          default:
4597161Sgblack@eecs.umich.edu            break;
4607161Sgblack@eecs.umich.edu        }
4617161Sgblack@eecs.umich.edu        return new Unknown(machInst);
4627161Sgblack@eecs.umich.edu    }
4637161Sgblack@eecs.umich.edu    '''
4647161Sgblack@eecs.umich.edu}};
465