ARM: Consolidate the VFP register index computation code.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:14 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:14 +0000 (12:58 -0500)
src/arch/arm/isa/formats/fp.isa

index 850f761d764674783663d64deeedf3a464e17066..a1c11d1d19cdc5b3639f3204a5615268b69e94a9 100644 (file)
@@ -481,281 +481,130 @@ let {{
         const uint32_t opc2 = bits(machInst, 19, 16);
         const uint32_t opc3 = bits(machInst, 7, 6);
         //const uint32_t opc4 = bits(machInst, 3, 0);
+        const bool single = (bits(machInst, 8) == 0);
+        IntRegIndex vd;
+        IntRegIndex vm;
+        IntRegIndex vn;
+        if (single) {
+            vd = (IntRegIndex)(bits(machInst, 22) |
+                    (bits(machInst, 15, 12) << 1));
+            vm = (IntRegIndex)(bits(machInst, 5) |
+                    (bits(machInst, 3, 0) << 1));
+            vn = (IntRegIndex)(bits(machInst, 7) |
+                    (bits(machInst, 19, 16) << 1));
+        } else {
+            vd = (IntRegIndex)((bits(machInst, 22) << 5) |
+                    (bits(machInst, 15, 12) << 1));
+            vm = (IntRegIndex)((bits(machInst, 5) << 5) |
+                    (bits(machInst, 3, 0) << 1));
+            vn = (IntRegIndex)((bits(machInst, 7) << 5) |
+                    (bits(machInst, 19, 16) << 1));
+        }
         switch (opc1 & 0xb /* 1011 */) {
           case 0x0:
             if (bits(machInst, 6) == 0) {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VmlaS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VmlaS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VmlaD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VmlaD(machInst, vd, vn, vm);
                 }
             } else {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VmlsS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VmlsS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VmlsD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VmlsD(machInst, vd, vn, vm);
                 }
             }
           case 0x1:
             if (bits(machInst, 6) == 1) {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VnmlaS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VnmlaS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VnmlaD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VnmlaD(machInst, vd, vn, vm);
                 }
             } else {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VnmlsS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VnmlsS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VnmlsD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VnmlsD(machInst, vd, vn, vm);
                 }
             }
           case 0x2:
             if ((opc3 & 0x1) == 0) {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VmulS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VmulS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VmulD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VmulD(machInst, vd, vn, vm);
                 }
             } else {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VnmulS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VnmulS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VnmulD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VnmulD(machInst, vd, vn, vm);
                 }
             }
           case 0x3:
             if ((opc3 & 0x1) == 0) {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VaddS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VaddS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VaddD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VaddD(machInst, vd, vn, vm);
                 }
             } else {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VsubS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VsubS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VsubD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VsubD(machInst, vd, vn, vm);
                 }
             }
           case 0x8:
             if ((opc3 & 0x1) == 0) {
-                uint32_t vd;
-                uint32_t vm;
-                uint32_t vn;
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                    vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                    vn = bits(machInst, 7) | (bits(machInst, 19, 16) << 1);
-                    return new VdivS(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                if (single) {
+                    return new VdivS(machInst, vd, vn, vm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
-                    vm = (bits(machInst, 5) << 5) |
-                         (bits(machInst, 3, 0) << 1);
-                    vn = (bits(machInst, 7) << 5) |
-                         (bits(machInst, 19, 16) << 1);
-                    return new VdivD(machInst, (IntRegIndex)vd,
-                            (IntRegIndex)vn, (IntRegIndex)vm);
+                    return new VdivD(machInst, vd, vn, vm);
                 }
             }
             break;
           case 0xb:
             if ((opc3 & 0x1) == 0) {
-                uint32_t vd;
                 const uint32_t baseImm =
                     bits(machInst, 3, 0) | (bits(machInst, 19, 16) << 4);
-                if (bits(machInst, 8) == 0) {
-                    vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
+                if (single) {
                     uint32_t imm = vfp_modified_imm(baseImm, false);
-                    return new VmovImmS(machInst, (IntRegIndex)vd, imm);
+                    return new VmovImmS(machInst, vd, imm);
                 } else {
-                    vd = (bits(machInst, 22) << 5) |
-                         (bits(machInst, 15, 12) << 1);
                     uint64_t imm = vfp_modified_imm(baseImm, true);
-                    return new VmovImmD(machInst, (IntRegIndex)vd, imm);
+                    return new VmovImmD(machInst, vd, imm);
                 }
             }
             switch (opc2) {
               case 0x0:
                 if (opc3 == 1) {
-                    uint32_t vd;
-                    uint32_t vm;
-                    if (bits(machInst, 8) == 0) {
-                        vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                        vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                        return new VmovRegS(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                    if (single) {
+                        return new VmovRegS(machInst, vd, vm);
                     } else {
-                        vd = (bits(machInst, 22) << 5) |
-                             (bits(machInst, 15, 12) << 1);
-                        vm = (bits(machInst, 5) << 5) |
-                             (bits(machInst, 3, 0) << 1);
-                        return new VmovRegD(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                        return new VmovRegD(machInst, vd, vm);
                     }
                 } else {
-                    uint32_t vd;
-                    uint32_t vm;
-                    if (bits(machInst, 8) == 0) {
-                        vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                        vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                        return new VabsS(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                    if (single) {
+                        return new VabsS(machInst, vd, vm);
                     } else {
-                        vd = (bits(machInst, 22) << 5) |
-                             (bits(machInst, 15, 12) << 1);
-                        vm = (bits(machInst, 5) << 5) |
-                             (bits(machInst, 3, 0) << 1);
-                        return new VabsD(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                        return new VabsD(machInst, vd, vm);
                     }
                 }
               case 0x1:
                 if (opc3 == 1) {
-                    uint32_t vd;
-                    uint32_t vm;
-                    if (bits(machInst, 8) == 0) {
-                        vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                        vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                        return new VnegS(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                    if (single) {
+                        return new VnegS(machInst, vd, vm);
                     } else {
-                        vd = (bits(machInst, 22) << 5) |
-                             (bits(machInst, 15, 12) << 1);
-                        vm = (bits(machInst, 5) << 5) |
-                             (bits(machInst, 3, 0) << 1);
-                        return new VnegD(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                        return new VnegD(machInst, vd, vm);
                     }
                 } else {
-                    uint32_t vd;
-                    uint32_t vm;
-                    if (bits(machInst, 8) == 0) {
-                        vd = bits(machInst, 22) | (bits(machInst, 15, 12) << 1);
-                        vm = bits(machInst, 5) | (bits(machInst, 3, 0) << 1);
-                        return new VsqrtS(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                    if (single) {
+                        return new VsqrtS(machInst, vd, vm);
                     } else {
-                        vd = (bits(machInst, 22) << 5) |
-                             (bits(machInst, 15, 12) << 1);
-                        vm = (bits(machInst, 5) << 5) |
-                             (bits(machInst, 3, 0) << 1);
-                        return new VsqrtD(machInst,
-                                (IntRegIndex)vd, (IntRegIndex)vm);
+                        return new VsqrtD(machInst, vd, vm);
                     }
                 }
               case 0x2: