summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arch/arm/insts/macromem.cc47
-rw-r--r--src/arch/arm/isa/insts/neon64_mem.isa24
2 files changed, 56 insertions, 15 deletions
diff --git a/src/arch/arm/insts/macromem.cc b/src/arch/arm/insts/macromem.cc
index 2ada29539..65cd2c3b7 100644
--- a/src/arch/arm/insts/macromem.cc
+++ b/src/arch/arm/insts/macromem.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2013 ARM Limited
+ * Copyright (c) 2010-2014 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -1107,9 +1107,26 @@ VldMultOp64::VldMultOp64(const char *mnem, ExtMachInst machInst,
}
for (int i = 0; i < numMarshalMicroops; ++i) {
- microOps[uopIdx++] = new MicroDeintNeon64(
- machInst, vd + (RegIndex) (2 * i), vx, eSize, dataSize,
- numStructElems, numRegs, i /* step */);
+ switch(numRegs) {
+ case 1: microOps[uopIdx++] = new MicroDeintNeon64_1Reg(
+ machInst, vd + (RegIndex) (2 * i), vx, eSize, dataSize,
+ numStructElems, 1, i /* step */);
+ break;
+ case 2: microOps[uopIdx++] = new MicroDeintNeon64_2Reg(
+ machInst, vd + (RegIndex) (2 * i), vx, eSize, dataSize,
+ numStructElems, 2, i /* step */);
+ break;
+ case 3: microOps[uopIdx++] = new MicroDeintNeon64_3Reg(
+ machInst, vd + (RegIndex) (2 * i), vx, eSize, dataSize,
+ numStructElems, 3, i /* step */);
+ break;
+ case 4: microOps[uopIdx++] = new MicroDeintNeon64_4Reg(
+ machInst, vd + (RegIndex) (2 * i), vx, eSize, dataSize,
+ numStructElems, 4, i /* step */);
+ break;
+ default: panic("Invalid number of registers");
+ }
+
}
assert(uopIdx == numMicroops);
@@ -1150,9 +1167,25 @@ VstMultOp64::VstMultOp64(const char *mnem, ExtMachInst machInst,
unsigned uopIdx = 0;
for(int i = 0; i < numMarshalMicroops; ++i) {
- microOps[uopIdx++] = new MicroIntNeon64(
- machInst, vx + (RegIndex) (2 * i), vd, eSize, dataSize,
- numStructElems, numRegs, i /* step */);
+ switch (numRegs) {
+ case 1: microOps[uopIdx++] = new MicroIntNeon64_1Reg(
+ machInst, vx + (RegIndex) (2 * i), vd, eSize, dataSize,
+ numStructElems, 1, i /* step */);
+ break;
+ case 2: microOps[uopIdx++] = new MicroIntNeon64_2Reg(
+ machInst, vx + (RegIndex) (2 * i), vd, eSize, dataSize,
+ numStructElems, 2, i /* step */);
+ break;
+ case 3: microOps[uopIdx++] = new MicroIntNeon64_3Reg(
+ machInst, vx + (RegIndex) (2 * i), vd, eSize, dataSize,
+ numStructElems, 3, i /* step */);
+ break;
+ case 4: microOps[uopIdx++] = new MicroIntNeon64_4Reg(
+ machInst, vx + (RegIndex) (2 * i), vd, eSize, dataSize,
+ numStructElems, 4, i /* step */);
+ break;
+ default: panic("Invalid number of registers");
+ }
}
uint32_t memaccessFlags = TLB::MustBeOne | (TLB::ArmFlags) eSize |
diff --git a/src/arch/arm/isa/insts/neon64_mem.isa b/src/arch/arm/isa/insts/neon64_mem.isa
index 32a37f87e..91fb4fa34 100644
--- a/src/arch/arm/isa/insts/neon64_mem.isa
+++ b/src/arch/arm/isa/insts/neon64_mem.isa
@@ -1,6 +1,6 @@
// -*- mode: c++ -*-
-// Copyright (c) 2012-2013 ARM Limited
+// Copyright (c) 2012-2014 ARM Limited
// All rights reserved
//
// The license below extends only to copyright in the software and shall
@@ -163,11 +163,11 @@ let {{
header_output += MicroNeonMemDeclare64.subst(loadIop) + \
MicroNeonMemDeclare64.subst(storeIop)
- def mkMarshalMicroOp(name, Name):
+ def mkMarshalMicroOp(name, Name, numRegs=4):
global header_output, decoder_output, exec_output
getInputCodeOp1L = ''
- for v in range(4):
+ for v in range(numRegs):
for p in range(4):
getInputCodeOp1L += '''
writeVecElem(&input[%(v)d], (XReg) AA64FpOp1P%(p)dV%(v)d_uw,
@@ -175,7 +175,7 @@ let {{
''' % { 'v' : v, 'p' : p }
getInputCodeOp1S = ''
- for v in range(4):
+ for v in range(numRegs):
for p in range(4):
getInputCodeOp1S += '''
writeVecElem(&input[%(v)d], (XReg) AA64FpOp1P%(p)dV%(v)dS_uw,
@@ -262,7 +262,8 @@ let {{
'''
iop = InstObjParams(name, Name, 'MicroNeonMixOp64',
- { 'code' : eCode }, ['IsMicroop'])
+ { 'code' : eCode, 'op_class' : 'No_OpClass' },
+ ['IsMicroop'])
header_output += MicroNeonMixDeclare64.subst(iop)
exec_output += MicroNeonMixExecute64.subst(iop)
@@ -323,7 +324,8 @@ let {{
''' % { 'v': v, 'p': p}
iop = InstObjParams(name, Name, 'MicroNeonMixOp64',
- { 'code' : eCode }, ['IsMicroop'])
+ { 'code' : eCode, 'op_class' : 'No_OpClass' },
+ ['IsMicroop'])
header_output += MicroNeonMixDeclare64.subst(iop)
exec_output += MicroNeonMixExecute64.subst(iop)
@@ -443,8 +445,14 @@ let {{
# Generate instructions
mkMemAccMicroOp('mem_neon_uop')
- mkMarshalMicroOp('deint_neon_uop', 'MicroDeintNeon64')
- mkMarshalMicroOp('int_neon_uop', 'MicroIntNeon64')
+ mkMarshalMicroOp('deint_neon_uop', 'MicroDeintNeon64_1Reg', numRegs=1)
+ mkMarshalMicroOp('deint_neon_uop', 'MicroDeintNeon64_2Reg', numRegs=2)
+ mkMarshalMicroOp('deint_neon_uop', 'MicroDeintNeon64_3Reg', numRegs=3)
+ mkMarshalMicroOp('deint_neon_uop', 'MicroDeintNeon64_4Reg', numRegs=4)
+ mkMarshalMicroOp('int_neon_uop', 'MicroIntNeon64_1Reg', numRegs=1)
+ mkMarshalMicroOp('int_neon_uop', 'MicroIntNeon64_2Reg', numRegs=2)
+ mkMarshalMicroOp('int_neon_uop', 'MicroIntNeon64_3Reg', numRegs=3)
+ mkMarshalMicroOp('int_neon_uop', 'MicroIntNeon64_4Reg', numRegs=4)
mkMarshalMicroOp('unpack_neon_uop', 'MicroUnpackNeon64')
mkMarshalMicroOp('pack_neon_uop', 'MicroPackNeon64')