aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2021-06-07 17:30:55 +0100
committerPeter Maydell <peter.maydell@linaro.org>2021-06-07 17:30:55 +0100
commitf6004bd0d848006449f181fe77da317323f056d1 (patch)
tree1fd90c7bf7eb409258432f157c2732892dd06b45
parent97f95fe008f0d2cd0ac45fcfec7ca259924e59f7 (diff)
target/arm: Implement MVE LCTP
Implement the MVE LCTP instruction. We put its decode and implementation with the other low-overhead-branch insns because although it is only present if MVE is implemented it is logically in the same group as the other LOB insns. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--target/arm/t32.decode2
-rw-r--r--target/arm/translate.c24
2 files changed, 26 insertions, 0 deletions
diff --git a/target/arm/t32.decode b/target/arm/t32.decode
index 8b2c487fa7..087e514e0a 100644
--- a/target/arm/t32.decode
+++ b/target/arm/t32.decode
@@ -674,5 +674,7 @@ BL 1111 0. .......... 11.1 ............ @branch24
DLS 1111 0 0000 100 rn:4 1110 0000 0000 0001
WLS 1111 0 0000 100 rn:4 1100 . .......... 1 imm=%lob_imm
LE 1111 0 0000 0 f:1 0 1111 1100 . .......... 1 imm=%lob_imm
+
+ LCTP 1111 0 0000 000 1111 1110 0000 0000 0001
]
}
diff --git a/target/arm/translate.c b/target/arm/translate.c
index 1a7a32c1be..2f6c012f67 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -8192,6 +8192,30 @@ static bool trans_LE(DisasContext *s, arg_LE *a)
return true;
}
+static bool trans_LCTP(DisasContext *s, arg_LCTP *a)
+{
+ /*
+ * M-profile Loop Clear with Tail Predication. Since our implementation
+ * doesn't cache branch information, all we need to do is reset
+ * FPSCR.LTPSIZE to 4.
+ */
+ TCGv_i32 ltpsize;
+
+ if (!dc_isar_feature(aa32_lob, s) ||
+ !dc_isar_feature(aa32_mve, s)) {
+ return false;
+ }
+
+ if (!vfp_access_check(s)) {
+ return true;
+ }
+
+ ltpsize = tcg_const_i32(4);
+ store_cpu_field(ltpsize, v7m.ltpsize);
+ return true;
+}
+
+
static bool op_tbranch(DisasContext *s, arg_tbranch *a, bool half)
{
TCGv_i32 addr, tmp;