Skip to content

Commit 6de4009

Browse files
authored
Fix BFM in ARM Primus Lisp semantics. (#1555)
* fixes BFM, constrains `make-eBFM` by width, and removes bad cases - correctly extracts and concatenates according to register width - eBFM on 32-bit registers should calculate indices relative to the 32-bit width - operations on Wn registers should zero upper bits - special cases in `if` branches were unreachable, so removed - tweaks extract 0 to cast-low.
1 parent 1484777 commit 6de4009

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

plugins/arm/semantics/aarch64-logical.lisp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,12 @@
4646
(defmacro make-eBFM (set cast xd xr ir is)
4747
"(make-BFM cast xd xr ir is) implements bitfield move instructions
4848
accepting either a W or X register, with cast being an unsigned or signed cast."
49-
(let ((rs (word)))
49+
(let ((rs (word-width xd)))
5050
(if (< is ir)
51-
(if (and (/= is (- rs 1)) (= (+ is 1) ir))
52-
(set xd (lshift xr (- rs ir)))
53-
(set xd (lshift
54-
(cast rs (extract is 0 xr))
55-
(- rs ir))))
56-
(if (= is (- rs 1))
57-
(set xd (rshift xr ir))
58-
(set xd (cast rs (extract is ir xr)))))))
51+
(set xd (lshift
52+
(cast rs (cast-low (+1 is) xr))
53+
(- rs ir)))
54+
(set xd (cast rs (extract is ir xr))))))
5955

6056
(defun UBFMXri (xd xr ir is)
6157
(make-eBFM set$ cast-unsigned xd xr ir is))
@@ -70,14 +66,17 @@
7066
(make-eBFM setw cast-signed xd xr ir is))
7167

7268
(defmacro BFM (set rd rn r s)
73-
(if (>= s r)
74-
(set rd (concat (cast-high (+1 (- s r)) rd)
75-
(if (= r 0)
76-
(cast-low (+1 s) rn)
77-
(extract s r rn))))
78-
(set rd (concat
79-
(cast-low (+1 s) rn)
80-
(cast-low r rd)))))
69+
(let ((size (word-width rd)))
70+
(if (>= s r)
71+
(set rd (concat
72+
(cast-high (- size (+1 (- s r))) rd)
73+
(if (= r 0)
74+
(cast-low (+1 s) rn)
75+
(extract s r rn))))
76+
(set rd (concat
77+
(cast-high (- r s) rd)
78+
(cast-low (+1 s) rn)
79+
(cast-low (-1 (- size r)) rd))))))
8180

8281
(defun BFMXri (_ xd xr ir is)
8382
(BFM set$ xd xr ir is))

0 commit comments

Comments
 (0)