Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/42387 )
Change subject: arch-arm: Simplify the "mult" SIMD instructions with a
BitUnion.
......................................................................
arch-arm: Simplify the "mult" SIMD instructions with a BitUnion.
These instructions go through a lot of effort to extract bitfields, sign
extend them, and cast things to an appropriate type/size.
Instead, we can define a BitUnion which has the appropriate ranges of
bits predefined, and take advantage of the fact that every bitfield
returns its value as either a uint64_t if it's unsigned, or an int64_t
if it's signed.
Also, stop setting resTemp if it's not going to be used to set condition
codes or used as an intermediate in calculating the destination
registers.
Change-Id: Ia511aa74c823fad48080de4fbf77791c0cb3309d
---
M src/arch/arm/isa/insts/mult.isa
M src/arch/arm/isa/operands.isa
M src/arch/arm/registers.hh
3 files changed, 179 insertions(+), 256 deletions(-)
diff --git a/src/arch/arm/isa/insts/mult.isa
b/src/arch/arm/isa/insts/mult.isa
index 77a2f70..f01ddb5 100644
--- a/src/arch/arm/isa/insts/mult.isa
+++ b/src/arch/arm/isa/insts/mult.isa
@@ -127,260 +127,165 @@
def buildMult4InstUnCc(mnem, code, flagType = "logic"):
buildMultInst(mnem, False, True, 4, code, flagType)
- buildMult4Inst ("mla", "Reg0 = resTemp = Reg1 * Reg2 + Reg3;")
- buildMult4InstUnCc("mls", "Reg0 = resTemp = Reg3 - Reg1 * Reg2;")
- buildMult3Inst ("mul", "Reg0 = resTemp = Reg1 * Reg2;")
- buildMult4InstCc ("smlabb", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2_sw, 15, 0)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlabt", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2_sw, 31, 16)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlatb", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2_sw, 15, 0)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlatt", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2_sw, 31, 16)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlad", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 31, 16)) +
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 15, 0)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smladx", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 15, 0)) +
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 31, 16)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4Inst ("smlal", '''resTemp = sext<32>(Reg2) *
sext<32>(Reg3) +
- (int64_t)((Reg1_ud << 32) |
Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''', "llbit")
- buildMult4InstUnCc("smlalbb", '''resTemp = sext<16>(bits(Reg2, 15, 0))
*
- sext<16>(bits(Reg3, 15, 0))
+
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smlalbt", '''resTemp = sext<16>(bits(Reg2, 15, 0))
*
- sext<16>(bits(Reg3, 31,
16)) +
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smlaltb", '''resTemp = sext<16>(bits(Reg2, 31,
16)) *
- sext<16>(bits(Reg3, 15, 0))
+
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smlaltt", '''resTemp = sext<16>(bits(Reg2, 31,
16)) *
- sext<16>(bits(Reg3, 31,
16)) +
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smlald", '''resTemp =
- sext<16>(bits(Reg2, 31, 16)) *
- sext<16>(bits(Reg3, 31, 16)) +
- sext<16>(bits(Reg2, 15, 0)) *
- sext<16>(bits(Reg3, 15, 0)) +
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smlaldx", '''resTemp =
- sext<16>(bits(Reg2, 31, 16)) *
- sext<16>(bits(Reg3, 15, 0)) +
- sext<16>(bits(Reg2, 15, 0)) *
- sext<16>(bits(Reg3, 31, 16)) +
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstCc ("smlawb", '''Reg0 = resTemp =
- (Reg1_sw *
- sext<16>(bits(Reg2, 15, 0)) +
- ((int64_t)Reg3_sw << 16)) >> 16;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlawt", '''Reg0 = resTemp =
- (Reg1_sw *
- sext<16>(bits(Reg2, 31, 16)) +
- ((int64_t)Reg3_sw << 16)) >> 16;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlsd", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 15, 0)) -
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 31, 16)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstCc ("smlsdx", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 31, 16)) -
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 15, 0)) +
- Reg3_sw;
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult4InstUnCc("smlsld", '''resTemp =
- sext<16>(bits(Reg2, 15, 0)) *
- sext<16>(bits(Reg3, 15, 0)) -
- sext<16>(bits(Reg2, 31, 16)) *
- sext<16>(bits(Reg3, 31, 16)) +
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smlsldx", '''resTemp =
- sext<16>(bits(Reg2, 15, 0)) *
- sext<16>(bits(Reg3, 31, 16)) -
- sext<16>(bits(Reg2, 31, 16)) *
- sext<16>(bits(Reg3, 15, 0)) +
- (int64_t)((Reg1_ud << 32) |
- Reg0_ud);
- Reg0_ud = (uint32_t)resTemp;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- ''')
- buildMult4InstUnCc("smmla", '''Reg0 = resTemp =
- ((int64_t)(Reg3_ud << 32) +
- (int64_t)Reg1_sw *
- (int64_t)Reg2_sw) >> 32;
- ''')
- buildMult4InstUnCc("smmlar", '''Reg0 = resTemp =
- ((int64_t)(Reg3_ud << 32) +
- (int64_t)Reg1_sw *
- (int64_t)Reg2_sw +
- ULL(0x80000000)) >> 32;
- ''')
- buildMult4InstUnCc("smmls", '''Reg0 = resTemp =
- ((int64_t)(Reg3_ud << 32) -
- (int64_t)Reg1_sw *
- (int64_t)Reg2_sw) >> 32;
- ''')
- buildMult4InstUnCc("smmlsr", '''Reg0 = resTemp =
- ((int64_t)(Reg3_ud << 32) -
- (int64_t)Reg1_sw *
- (int64_t)Reg2_sw +
- ULL(0x80000000)) >> 32;
- ''')
- buildMult3InstUnCc("smmul", '''Reg0 = resTemp =
- ((int64_t)Reg1_sw *
- (int64_t)Reg2_sw) >> 32;
- ''')
- buildMult3InstUnCc("smmulr", '''Reg0 = resTemp =
- ((int64_t)Reg1_sw *
- (int64_t)Reg2_sw +
- ULL(0x80000000)) >> 32;
- ''')
- buildMult3InstCc ("smuad", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 15, 0)) +
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 31, 16));
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult3InstCc ("smuadx", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 31, 16)) +
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 15, 0));
- resTemp = bits(resTemp, 32) !=
- bits(resTemp, 31);
- ''', "overflow")
- buildMult3InstUnCc("smulbb", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 15, 0));
- ''')
- buildMult3InstUnCc("smulbt", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 31, 16));
- ''')
- buildMult3InstUnCc("smultb", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 15, 0));
- ''')
- buildMult3InstUnCc("smultt", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 31, 16));
- ''')
- buildMult4Inst ("smull", '''resTemp = (int64_t)Reg2_sw *
- (int64_t)Reg3_sw;
- Reg1 = (int32_t)(resTemp >> 32);
- Reg0 = (int32_t)resTemp;
- ''', "llbit")
- buildMult3InstUnCc("smulwb", '''Reg0 = resTemp =
- (Reg1_sw *
- sext<16>(bits(Reg2, 15, 0))) >>
16;
- ''')
- buildMult3InstUnCc("smulwt", '''Reg0 = resTemp =
- (Reg1_sw *
- sext<16>(bits(Reg2, 31, 16))) >>
16;
- ''')
- buildMult3InstUnCc("smusd", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 15, 0)) -
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 31, 16));
- ''')
- buildMult3InstUnCc("smusdx", '''Reg0 = resTemp =
- sext<16>(bits(Reg1, 15, 0)) *
- sext<16>(bits(Reg2, 31, 16)) -
- sext<16>(bits(Reg1, 31, 16)) *
- sext<16>(bits(Reg2, 15, 0));
- ''')
- buildMult4InstUnCc("umaal", '''resTemp = Reg2_ud * Reg3_ud +
- Reg0_ud + Reg1_ud;
- Reg1_ud = (uint32_t)(resTemp >> 32);
- Reg0_ud = (uint32_t)resTemp;
- ''')
- buildMult4Inst ("umlal", '''resTemp = Reg2_ud * Reg3_ud + Reg0_ud +
- (Reg1_ud << 32);
- Reg1_ud = (uint32_t)(resTemp >> 32);
- Reg0_ud = (uint32_t)resTemp;
- ''', "llbit")
- buildMult4Inst ("umull", '''resTemp = Reg2_ud * Reg3_ud;
- Reg1 = (uint32_t)(resTemp >> 32);
- Reg0 = (uint32_t)resTemp;
- ''', "llbit")
+ buildMult4Inst("mla", "Reg0 = resTemp = Reg1 * Reg2 + Reg3;")
+ buildMult4InstUnCc("mls", "Reg0 = Reg3 - Reg1 * Reg2;")
+ buildMult3Inst("mul", "Reg0 = resTemp = Reg1 * Reg2;")
+ buildMult4InstCc("smlabb", '''
+ Simd0 = resTemp = Simd1.sh0 * Simd2.sh0 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlabt", '''
+ Simd0 = resTemp = Simd1.sh0 * Simd2.sh1 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlatb", '''
+ Simd0 = resTemp = Simd1.sh1 * Simd2.sh0 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlatt", '''
+ Simd0 = resTemp = Simd1.sh1 * Simd2.sh1 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlad", '''
+ Simd0 = resTemp = Simd1.sh1 * Simd2.sh1 +
+ Simd1.sh0 * Simd2.sh0 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smladx", '''
+ Simd0 = resTemp = Simd1.sh1 * Simd2.sh0 +
+ Simd1.sh0 * Simd2.sh1 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4Inst("smlal", '''
+ resTemp = Simd2.sw * Simd3.sw +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''', "llbit")
+ buildMult4InstUnCc("smlalbb", '''
+ resTemp = Simd2.sh0 * Simd3.sh0 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smlalbt", '''
+ resTemp = Simd2.sh0 * Simd3.sh1 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smlaltb", '''
+ resTemp = Simd2.sh1 * Simd3.sh0 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smlaltt", '''
+ resTemp = Simd2.sh1 * Simd3.sh1 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smlald", '''
+ resTemp = Simd2.sh1 * Simd3.sh1 + Simd2.sh0 * Simd3.sh0 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smlaldx", '''
+ resTemp = Simd2.sh1 * Simd3.sh0 + Simd2.sh0 * Simd3.sh1 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstCc("smlawb", '''
+ resTemp = Simd1.sw * Simd2.sh0 + (Simd3.sw << 16);
+ Simd0 = resTemp = resTemp >> 16;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlawt", '''
+ resTemp = Simd1.sw * Simd2.sh1 + (Simd3.sw << 16);
+ Simd0 = resTemp = resTemp >> 16;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlsd", '''
+ Simd0 = resTemp = Simd1.sh0 * Simd2.sh0 -
+ Simd1.sh1 * Simd2.sh1 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstCc("smlsdx", '''
+ Simd0 = resTemp = Simd1.sh0 * Simd2.sh1 -
+ Simd1.sh1 * Simd2.sh0 + Simd3.sw;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult4InstUnCc("smlsld", '''
+ resTemp = Simd2.sh0 * Simd3.sh0 - Simd2.sh1 * Simd3.sh1 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smlsldx", '''
+ resTemp = Simd2.sh0 * Simd3.sh1 - Simd2.sh1 * Simd3.sh0 +
+ (int64_t)((Simd1.uw << 32) | Simd0.uw);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4InstUnCc("smmla", '''
+ Simd0 = Simd3.sw + ((Simd1.sw * Simd2.sw) >> 32);
+ ''')
+ buildMult4InstUnCc("smmlar", '''
+ Simd0 = Simd3.sw + ((Simd1.sw * Simd2.sw + (0x1ULL << 31)) >>
32);
+ ''')
+ buildMult4InstUnCc("smmls", '''
+ Simd0 = Simd3.sw - ((Simd1.sw * Simd2.sw) >> 32);
+ ''')
+ buildMult4InstUnCc("smmlsr", '''
+ Simd0 = Simd3.sw - ((Simd1.sw * Simd2.sw + (0x1ULL << 31)) >>
32);
+ ''')
+ buildMult3InstUnCc("smmul", '''
+ Simd0 = (Simd1.sw * Simd2.sw) >> 32;
+ ''')
+ buildMult3InstUnCc("smmulr", '''
+ Simd0 = (Simd1.sw * Simd2.sw + (0x1ULL << 31)) >> 32;
+ ''')
+ buildMult3InstCc("smuad", '''
+ Simd0 = resTemp = Simd1.sh0 * Simd2.sh0 + Simd1.sh1 *
Simd2.sh1;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult3InstCc("smuadx", '''
+ Simd0 = resTemp = Simd1.sh0 * Simd2.sh1 + Simd1.sh1 *
Simd2.sh0;
+ resTemp = bits(resTemp, 32) != bits(resTemp, 31);
+ ''', "overflow")
+ buildMult3InstUnCc("smulbb", '''Simd0 = Simd1.sh0 * Simd2.sh0;''')
+ buildMult3InstUnCc("smulbt", '''Simd0 = Simd1.sh0 * Simd2.sh1;''')
+ buildMult3InstUnCc("smultb", '''Simd0 = Simd1.sh1 * Simd2.sh0;''')
+ buildMult3InstUnCc("smultt", '''Simd0 = Simd1.sh1 * Simd2.sh1;''')
+ buildMult4Inst("smull", '''
+ resTemp = Simd2.sw * Simd3.sw;
+ Simd0 = (int32_t)resTemp;
+ Simd1 = (int32_t)(resTemp >> 32);
+ ''', "llbit")
+ buildMult3InstUnCc("smulwb", '''Simd0 = (Simd1.sw * Simd2.sh0) >>
16;''')
+ buildMult3InstUnCc("smulwt", '''Simd0 = (Simd1.sw * Simd2.sh1) >>
16;''')
+ buildMult3InstUnCc("smusd", '''
+ Simd0 = Simd1.sh0 * Simd2.sh0 - Simd1.sh1 * Simd2.sh1;
+ ''')
+ buildMult3InstUnCc("smusdx", '''
+ Simd0 = Simd1.sh0 * Simd2.sh1 - Simd1.sh1 * Simd2.sh0;
+ ''')
+ buildMult4InstUnCc("umaal", '''
+ resTemp = Simd2.uw * Simd3.uw + Simd0.uw + Simd1.uw;
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''')
+ buildMult4Inst("umlal", '''
+ resTemp = Simd2.uw * Simd3.uw + Simd0.uw + (Simd1.uw << 32);
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''', "llbit")
+ buildMult4Inst("umull", '''
+ resTemp = Simd2.uw * Simd3.uw;
+ Simd0 = (uint32_t)resTemp;
+ Simd1 = (uint32_t)(resTemp >> 32);
+ ''', "llbit")
}};
diff --git a/src/arch/arm/isa/operands.isa b/src/arch/arm/isa/operands.isa
index f50144e..724d8d2 100644
--- a/src/arch/arm/isa/operands.isa
+++ b/src/arch/arm/isa/operands.isa
@@ -46,6 +46,7 @@
'uw' : 'uint32_t',
'sd' : 'int64_t',
'ud' : 'uint64_t',
+ 'simd' : 'ArmISA::IntSimdReg',
'sq' : '__int128_t',
'uq' : '__uint128_t',
'tud' : 'std::array<uint64_t, 2>',
@@ -147,6 +148,10 @@
return ('IntReg', 'uw', idx, 'IsInteger', srtNormal,
maybePCRead, maybePCWrite)
+ def simdReg(idx):
+ return ('IntReg', 'simd', idx, 'IsInteger', srtNormal,
+ maybePCRead, maybePCWrite)
+
def intReg64(idx):
return ('IntReg', 'ud', idx, 'IsInteger', srtNormal,
aarch64Read, aarch64Write)
@@ -228,6 +233,10 @@
'Reg1': intReg('reg1'),
'Reg2': intReg('reg2'),
'Reg3': intReg('reg3'),
+ 'Simd0': simdReg('reg0'),
+ 'Simd1': simdReg('reg1'),
+ 'Simd2': simdReg('reg2'),
+ 'Simd3': simdReg('reg3'),
#Fixed index integer reg operands
'SpMode': intRegNPC('intRegInMode((OperatingMode)regMode, INTREG_SP)'),
diff --git a/src/arch/arm/registers.hh b/src/arch/arm/registers.hh
index 0955906..1ff5a3b 100644
--- a/src/arch/arm/registers.hh
+++ b/src/arch/arm/registers.hh
@@ -51,6 +51,15 @@
namespace ArmISA
{
+BitUnion32(IntSimdReg)
+ Bitfield<31, 16> uh1;
+ Bitfield<15, 0> uh0;
+ SignedBitfield<31, 16> sh1;
+ SignedBitfield<15, 0> sh0;
+ Bitfield<31, 0> uw;
+ SignedBitfield<31, 0> sw;
+EndBitUnion(IntSimdReg)
+
// Number of VecElem per Vector Register considering only pre-SVE
// Advanced SIMD registers.
constexpr unsigned NumVecElemPerNeonVecReg = 4;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/42387
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Ia511aa74c823fad48080de4fbf77791c0cb3309d
Gerrit-Change-Number: 42387
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s