arch-arm: Added SVE LAST[AB] (SIMD&FP scalar) instructions.
Change-Id: I103288209f11a18018dd1a98b64fb5ae6ed7e892
Signed-off-by: Giacomo Gabrielli <giacomo.gabrielli@arm.com>
diff --git a/src/arch/arm/isa/formats/sve_2nd_level.isa b/src/arch/arm/isa/formats/sve_2nd_level.isa
index 7d48b0f..4f6c209 100644
--- a/src/arch/arm/isa/formats/sve_2nd_level.isa
+++ b/src/arch/arm/isa/formats/sve_2nd_level.isa
@@ -1218,7 +1218,18 @@
break;
case 0x1:
if (!b13) {
- // sve_int_perm_last_v
+ uint8_t AB = bits(machInst, 16);
+ uint8_t size = bits(machInst, 23, 22);
+ IntRegIndex pg = (IntRegIndex)(uint8_t) bits(machInst, 12, 10);
+ IntRegIndex zn = (IntRegIndex)(uint8_t) bits(machInst, 9, 5);
+ IntRegIndex vd = (IntRegIndex)(uint8_t) bits(machInst, 4, 0);
+ if (!AB) {
+ return decodeSveUnaryPredU<SveLastaf>(size,
+ machInst, vd, zn, pg);
+ } else {
+ return decodeSveUnaryPredU<SveLastbf>(size,
+ machInst, vd, zn, pg);
+ }
}
break;
case 0x4:
diff --git a/src/arch/arm/isa/insts/sve.isa b/src/arch/arm/isa/insts/sve.isa
index 7d5075f..cced13f 100644
--- a/src/arch/arm/isa/insts/sve.isa
+++ b/src/arch/arm/isa/insts/sve.isa
@@ -3867,7 +3867,9 @@
destElem = AA64FpOp1_x[last];'''
sveSelectInst('lasta', 'Lasta', 'SimdAluOp', unsignedTypes, lastaCode,
isCond = False)
- # TODO: LASTA (SIMD&FP scalar)
+ # LASTA (SIMD&FP scalar)
+ sveSelectInst('lasta', 'Lastaf', 'SimdAluOp', unsignedTypes, lastaCode,
+ isCond = False, destType = DstRegType.SimdFpScalar)
# LASTB (scalar)
lastbCode = '''
if (last < 0) {
@@ -3876,7 +3878,9 @@
destElem = AA64FpOp1_x[last];'''
sveSelectInst('lastb', 'Lastb', 'SimdAluOp', unsignedTypes, lastbCode,
isCond = False)
- # TODO: LASTB (SIMD&FP scalar)
+ # LASTB (SIMD&FP scalar)
+ sveSelectInst('lastb', 'Lastbf', 'SimdAluOp', unsignedTypes, lastbCode,
+ isCond = False, destType = DstRegType.SimdFpScalar)
# LSL (immediate, predicated)
lslCode = '''
if (srcElem2 == 0) {