Skip to content

Commit f585bc0

Browse files
committed
AArch64/SIMD: Add negative decoding tests for invalid sizes
Various NEON instructions have a 2-bit size parameter but are only valid for the values {0b00, 0b01, 0b10}. Notably, this is the case for all SIMD integer multiplication instructions. For those instructions, `simulator_iclasses.ml` previously listed only the valid encodings. This would test that the functional description of valid encodings was correct, but it would not test that the architecture and the model agreed on them being invalid. This commit relaxes the encoding patterns in `simulator_iclasses.ml` so that invalid size encodings are considered as well. A similar change may be possible for immediates required to be non-zero, but the architecture is not clear on what decoding does with them: It says `SEE(asimdimm)` rather than `UNDEF`. Those are therefore not touched for now. Signed-off-by: Hanno Becker <[email protected]>
1 parent 4ee6cb4 commit f585bc0

File tree

1 file changed

+26
-61
lines changed

1 file changed

+26
-61
lines changed

arm/proofs/simulator_iclasses.ml

+26-61
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,7 @@ let iclasses =
109109

110110
(****** NEON INSTRUCTIONS *****)
111111
(*** ADD ***)
112-
"01001110xx1xxxxx100001xxxxxxxxxx"; (* 128 bits *)
113-
"000011100x1xxxxx100001xxxxxxxxxx"; (* 64 bits, size=0 or 1 *)
114-
"00001110101xxxxx100001xxxxxxxxxx"; (* 64 bits, size=2 *)
112+
"0x001110xx1xxxxx100001xxxxxxxxxx";
115113

116114
(*** AND ***)
117115
"0x001110001xxxxx000111xxxxxxxxxx";
@@ -160,9 +158,7 @@ let iclasses =
160158
"0x101111xxxxxxxx0100x0xxxxxxxxxx";
161159

162160
(*** MLS (vector) ***)
163-
"0x101110001xxxxx100101xxxxxxxxxx"; (* .b *)
164-
"0x101110011xxxxx100101xxxxxxxxxx"; (* .h *)
165-
"0x101110101xxxxx100101xxxxxxxxxx"; (* .s *)
161+
"0x101110xx1xxxxx100101xxxxxxxxxx";
166162

167163
(*** MOVI ***)
168164
"0110111100000xxx111001xxxxxxxxxx"; (* q=1, cmode=1110 *)
@@ -173,16 +169,13 @@ let iclasses =
173169
"0x001111xxxxxxxx1000x0xxxxxxxxxx";
174170

175171
(*** MUL (vector) ***)
176-
"0x001110001xxxxx100111xxxxxxxxxx"; (* .b *)
177-
"0x001110011xxxxx100111xxxxxxxxxx"; (* .h *)
178-
"0x001110101xxxxx100111xxxxxxxxxx"; (* .s *)
172+
"0x001110xx1xxxxx100111xxxxxxxxxx";
179173

180174
(*** ORR ***)
181175
"0x001110101xxxxx000111xxxxxxxxxx";
182176

183177
(*** REV64 ***)
184-
"010011100x100000000010xxxxxxxxxx"; (* .h, .b *)
185-
"0100111010100000000010xxxxxxxxxx"; (* .s *)
178+
"01001110xx100000000010xxxxxxxxxx";
186179

187180
(*** SHA256 Intrinsics ***)
188181
(*** SHA256H ***)
@@ -221,47 +214,33 @@ let iclasses =
221214
"0000111100001xxx100001xxxxxxxxxx"; (* q=0, immh!=0 *)
222215

223216
(*** SMLAL ***)
224-
"000011100x1xxxxx100000xxxxxxxxxx"; (* src: .b, .h *)
225-
"00001110101xxxxx100000xxxxxxxxxx"; (* src: .s *)
217+
"00001110xx1xxxxx100000xxxxxxxxxx";
226218

227219
(*** SMLAL2 ***)
228-
"010011100x1xxxxx100000xxxxxxxxxx"; (* src: .b, .h *)
229-
"01001110101xxxxx100000xxxxxxxxxx"; (* src: .s *)
220+
"01001110xx1xxxxx100000xxxxxxxxxx";
230221

231222
(*** SMLSL ***)
232-
"000011100x1xxxxx101000xxxxxxxxxx"; (* src: .b, .h *)
233-
"00001110101xxxxx101000xxxxxxxxxx"; (* src: .s *)
223+
"00001110xx1xxxxx101000xxxxxxxxxx";
234224

235225
(*** SMLSL2 ***)
236-
"010011100x1xxxxx101000xxxxxxxxxx"; (* src: .b, .h *)
237-
"01001110101xxxxx101000xxxxxxxxxx"; (* src: .s *)
226+
"01001110xx1xxxxx101000xxxxxxxxxx";
238227

239228
(*** SMULL ***)
240-
"000011100x1xxxxx110000xxxxxxxxxx"; (* size!=11 *)
241-
"00001110101xxxxx110000xxxxxxxxxx"; (* size!=11 *)
229+
"00001110xx1xxxxx110000xxxxxxxxxx";
242230

243231
(*** SMULL2 ***)
244-
"010011100x1xxxxx110000xxxxxxxxxx"; (* size!=11 *)
245-
"01001110101xxxxx110000xxxxxxxxxx"; (* size!=11 *)
232+
"01001110xx1xxxxx110000xxxxxxxxxx";
246233

247-
(*** SQDMULH (by element; focus on defined sizes) ***)
248-
"0x00111101xxxxxx1100x0xxxxxxxxxx";
249-
"0x00111110xxxxxx1100x0xxxxxxxxxx";
234+
(*** SQDMULH ***)
250235
"0x001111xxxxxxxx1100x0xxxxxxxxxx";
251236

252-
(*** SQDMULH (vector; focus on defined sizes) ***)
253-
"0x001110011xxxxx101101xxxxxxxxxx";
254-
"0x001110101xxxxx101101xxxxxxxxxx";
237+
(*** SQDMULH (vector) ***)
255238
"0x001110xx1xxxxx101101xxxxxxxxxx";
256239

257-
(*** SQRDMULH (by element; focus on defined sizes) ***)
258-
"0x00111101xxxxxx1101x0xxxxxxxxxx";
259-
"0x00111110xxxxxx1101x0xxxxxxxxxx";
240+
(*** SQRDMULH (by element) ***)
260241
"0x001111xxxxxxxx1101x0xxxxxxxxxx";
261242

262-
(*** SQRDMULH (vector; focus on defined sizes) ***)
263-
"0x101110011xxxxx101101xxxxxxxxxx";
264-
"0x101110101xxxxx101101xxxxxxxxxx";
243+
(*** SQRDMULH (vector) ***)
265244
"0x101110xx1xxxxx101101xxxxxxxxxx";
266245

267246
(*** SRSHR (make sure immh is nonzero) ***)
@@ -289,16 +268,13 @@ let iclasses =
289268
"0x10111100001xxx010001xxxxxxxxxx"; (* immh!=0 *)
290269

291270
(*** SUB ***)
292-
"01101110xx1xxxxx100001xxxxxxxxxx"; (* 128 bits *)
293-
"001011100x1xxxxx100001xxxxxxxxxx"; (* 64 bits, size=0 or 1 *)
294-
"00101110101xxxxx100001xxxxxxxxxx"; (* 64 bits, size=2 *)
271+
"0x101110xx1xxxxx100001xxxxxxxxxx";
295272

296273
(*** TRN1 and TRN2 ***)
297274
"0x001110xx0xxxxx0x1010xxxxxxxxxx";
298275

299276
(*** UADDLP ***)
300-
"011011100x100000001010xxxxxxxxxx"; (* src: .b, .h *)
301-
"0110111010100000001010xxxxxxxxxx"; (* src: .s *)
277+
"01101110xx100000001010xxxxxxxxxx";
302278

303279
(*** UMOV (.d, .s) ***)
304280
"01001110000x1000001111xxxxxxxxxx";
@@ -308,28 +284,22 @@ let iclasses =
308284
"10011011101xxxxxxxxxxxxxxxxxxxxx";
309285

310286
(*** UMLAL ***)
311-
"001011100x1xxxxx100000xxxxxxxxxx"; (* src: .b, .h *)
312-
"00101110101xxxxx100000xxxxxxxxxx"; (* src: .s *)
287+
"00101110xx1xxxxx100000xxxxxxxxxx";
313288

314289
(*** UMLAL2 ***)
315-
"011011100x1xxxxx100000xxxxxxxxxx"; (* src: .b, .h *)
316-
"01101110101xxxxx100000xxxxxxxxxx"; (* src: .s *)
290+
"01101110xx1xxxxx100000xxxxxxxxxx";
317291

318292
(*** UMLSL ***)
319-
"001011100x1xxxxx101000xxxxxxxxxx"; (* src: .b, .h *)
320-
"00101110101xxxxx101000xxxxxxxxxx"; (* src: .s *)
293+
"00101110xx1xxxxx101000xxxxxxxxxx";
321294

322295
(*** UMLSL2 ***)
323-
"011011100x1xxxxx101000xxxxxxxxxx"; (* src: .b, .h *)
324-
"01101110101xxxxx101000xxxxxxxxxx"; (* src: .s *)
296+
"01101110xx1xxxxx101000xxxxxxxxxx";
325297

326298
(*** UMULL ***)
327-
"001011100x1xxxxx110000xxxxxxxxxx"; (* size!=11 *)
328-
"00101110101xxxxx110000xxxxxxxxxx"; (* size!=11 *)
299+
"00101110xx1xxxxx110000xxxxxxxxxx";
329300

330301
(*** UMULL2 ***)
331-
"011011100x1xxxxx110000xxxxxxxxxx"; (* size!=11 *)
332-
"01101110101xxxxx110000xxxxxxxxxx"; (* size!=11 *)
302+
"01101110xx1xxxxx110000xxxxxxxxxx";
333303

334304
(*** USHR (make sure immh is nonzero) ***)
335305
"0x10111101xxxxxx000001xxxxxxxxxx";
@@ -350,21 +320,16 @@ let iclasses =
350320
"01001110xx0xxxxx000110xxxxxxxxxx";
351321

352322
(*** UZP2 ***)
353-
"01001110xx0xxxxx010110xxxxxxxxxx"; (* q=1 *)
323+
"01001110xx0xxxxx010110xxxxxxxxxx";
354324

355325
(*** XTN ***)
356-
"000011100x100001001010xxxxxxxxxx"; (* size!=11 *)
357-
"0000111010100001001010xxxxxxxxxx"; (* size!=11 *)
326+
"00001110xx100001001010xxxxxxxxxx";
358327

359328
(*** ZIP1 ***)
360-
"01001110xx0xxxxx001110xxxxxxxxxx"; (* q=1 *)
361-
"000011100x0xxxxx001110xxxxxxxxxx"; (* q=0, size!=3 *)
362-
"00001110100xxxxx001110xxxxxxxxxx"; (* q=0, size!=3 *)
329+
"0x001110xx0xxxxx001110xxxxxxxxxx";
363330

364331
(*** ZIP2 ***)
365-
"01001110xx0xxxxx011110xxxxxxxxxx"; (* q=1 *)
366-
"000011100x0xxxxx011110xxxxxxxxxx"; (* q=0, size!=3 *)
367-
"00001110100xxxxx011110xxxxxxxxxx"; (* q=0, size!=3 *)
332+
"0x001110xx0xxxxx011110xxxxxxxxxx";
368333

369334
(*** EOR3 ***)
370335
"11001110000xxxxx0xxxxxxxxxxxxxxx";

0 commit comments

Comments
 (0)