Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 3095ea4

Browse files
committed
[AArch64][SVE] Asm: Support for saturing ADD/SUB instructions.
The variants added are: signed Saturating ADD/SUB (immediate) e.g. sqadd z0.h, z0.h, #42 unsigned Saturating ADD/SUB (immediate) e.g. uqadd z0.h, z0.h, #42 signed Saturating ADD/SUB (vectors) e.g. sqadd z0.h, z0.h, z1.h unsigned Saturating ADD/SUB (vectors) e.g. uqadd z0.h, z0.h, z1.h git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336186 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent c95c8c8 commit 3095ea4

File tree

9 files changed

+828
-0
lines changed

9 files changed

+828
-0
lines changed

lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
let Predicates = [HasSVE] in {
1515
defm ADD_ZZZ : sve_int_bin_cons_arit_0<0b000, "add">;
1616
defm SUB_ZZZ : sve_int_bin_cons_arit_0<0b001, "sub">;
17+
defm SQADD_ZZZ : sve_int_bin_cons_arit_0<0b100, "sqadd">;
18+
defm UQADD_ZZZ : sve_int_bin_cons_arit_0<0b101, "uqadd">;
19+
defm SQSUB_ZZZ : sve_int_bin_cons_arit_0<0b110, "sqsub">;
20+
defm UQSUB_ZZZ : sve_int_bin_cons_arit_0<0b111, "uqsub">;
1721

1822
def AND_ZZZ : sve_int_bin_cons_log<0b00, "and">;
1923
def ORR_ZZZ : sve_int_bin_cons_log<0b01, "orr">;
@@ -30,6 +34,10 @@ let Predicates = [HasSVE] in {
3034

3135
defm ADD_ZI : sve_int_arith_imm0<0b000, "add">;
3236
defm SUB_ZI : sve_int_arith_imm0<0b001, "sub">;
37+
defm SQADD_ZI : sve_int_arith_imm0<0b100, "sqadd">;
38+
defm UQADD_ZI : sve_int_arith_imm0<0b101, "uqadd">;
39+
defm SQSUB_ZI : sve_int_arith_imm0<0b110, "sqsub">;
40+
defm UQSUB_ZI : sve_int_arith_imm0<0b111, "uqsub">;
3341

3442
defm ORR_ZI : sve_int_log_imm<0b00, "orr", "orn">;
3543
defm EOR_ZI : sve_int_log_imm<0b01, "eor", "eon">;
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve 2>&1 < %s| FileCheck %s
2+
3+
// Register z32 does not exist.
4+
sqadd z22.h, z10.h, z32.h
5+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
6+
// CHECK-NEXT: sqadd z22.h, z10.h, z32.h
7+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
8+
9+
// Invalid element kind.
10+
sqadd z20.h, z2.h, z31.x
11+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid vector kind qualifier
12+
// CHECK-NEXT: sqadd z20.h, z2.h, z31.x
13+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
14+
15+
// Element size specifiers should match.
16+
sqadd z27.h, z11.h, z27.b
17+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
18+
// CHECK-NEXT: sqadd z27.h, z11.h, z27.b
19+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
20+
21+
22+
// --------------------------------------------------------------------------//
23+
// Invalid immediates
24+
25+
sqadd z0.b, z0.b, #0, lsl #8 // #0, lsl #8 is not valid for .b
26+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
27+
// CHECK-NEXT: sqadd z0.b, z0.b, #0, lsl #8
28+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
29+
30+
sqadd z0.b, z0.b, #-1
31+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
32+
// CHECK-NEXT: sqadd z0.b, z0.b, #-1
33+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
34+
35+
sqadd z0.b, z0.b, #1, lsl #8
36+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
37+
// CHECK-NEXT: sqadd z0.b, z0.b, #1, lsl #8
38+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
39+
40+
sqadd z0.b, z0.b, #256
41+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
42+
// CHECK-NEXT: sqadd z0.b, z0.b, #256
43+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
44+
45+
sqadd z0.h, z0.h, #-1
46+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
47+
// CHECK-NEXT: sqadd z0.h, z0.h, #-1
48+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
49+
50+
sqadd z0.h, z0.h, #256, lsl #8
51+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
52+
// CHECK-NEXT: sqadd z0.h, z0.h, #256, lsl #8
53+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
54+
55+
sqadd z0.h, z0.h, #65536
56+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
57+
// CHECK-NEXT: sqadd z0.h, z0.h, #65536
58+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
59+
60+
sqadd z0.s, z0.s, #-1
61+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
62+
// CHECK-NEXT: sqadd z0.s, z0.s, #-1
63+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
64+
65+
sqadd z0.s, z0.s, #256, lsl #8
66+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
67+
// CHECK-NEXT: sqadd z0.s, z0.s, #256, lsl #8
68+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
69+
70+
sqadd z0.s, z0.s, #65536
71+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
72+
// CHECK-NEXT: sqadd z0.s, z0.s, #65536
73+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
74+
75+
sqadd z0.d, z0.d, #-1
76+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
77+
// CHECK-NEXT: sqadd z0.d, z0.d, #-1
78+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
79+
80+
sqadd z0.d, z0.d, #256, lsl #8
81+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
82+
// CHECK-NEXT: sqadd z0.d, z0.d, #256, lsl #8
83+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
84+
85+
sqadd z0.d, z0.d, #65536
86+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
87+
// CHECK-NEXT: sqadd z0.d, z0.d, #65536
88+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

test/MC/AArch64/SVE/sqadd.s

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve < %s \
2+
// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
3+
// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
4+
// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
5+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
6+
// RUN: | llvm-objdump -d -mattr=+sve - | FileCheck %s --check-prefix=CHECK-INST
7+
// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sve < %s \
8+
// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
9+
10+
11+
sqadd z0.b, z0.b, z0.b
12+
// CHECK-INST: sqadd z0.b, z0.b, z0.b
13+
// CHECK-ENCODING: [0x00,0x10,0x20,0x04]
14+
// CHECK-ERROR: instruction requires: sve
15+
// CHECK-UNKNOWN: 00 10 20 04 <unknown>
16+
17+
sqadd z0.h, z0.h, z0.h
18+
// CHECK-INST: sqadd z0.h, z0.h, z0.h
19+
// CHECK-ENCODING: [0x00,0x10,0x60,0x04]
20+
// CHECK-ERROR: instruction requires: sve
21+
// CHECK-UNKNOWN: 00 10 60 04 <unknown>
22+
23+
sqadd z0.s, z0.s, z0.s
24+
// CHECK-INST: sqadd z0.s, z0.s, z0.s
25+
// CHECK-ENCODING: [0x00,0x10,0xa0,0x04]
26+
// CHECK-ERROR: instruction requires: sve
27+
// CHECK-UNKNOWN: 00 10 a0 04 <unknown>
28+
29+
sqadd z0.d, z0.d, z0.d
30+
// CHECK-INST: sqadd z0.d, z0.d, z0.d
31+
// CHECK-ENCODING: [0x00,0x10,0xe0,0x04]
32+
// CHECK-ERROR: instruction requires: sve
33+
// CHECK-UNKNOWN: 00 10 e0 04 <unknown>
34+
35+
sqadd z0.b, z0.b, #0
36+
// CHECK-INST: sqadd z0.b, z0.b, #0
37+
// CHECK-ENCODING: [0x00,0xc0,0x24,0x25]
38+
// CHECK-ERROR: instruction requires: sve
39+
// CHECK-UNKNOWN: 00 c0 24 25 <unknown>
40+
41+
sqadd z31.b, z31.b, #255
42+
// CHECK-INST: sqadd z31.b, z31.b, #255
43+
// CHECK-ENCODING: [0xff,0xdf,0x24,0x25]
44+
// CHECK-ERROR: instruction requires: sve
45+
// CHECK-UNKNOWN: ff df 24 25 <unknown>
46+
47+
sqadd z0.h, z0.h, #0
48+
// CHECK-INST: sqadd z0.h, z0.h, #0
49+
// CHECK-ENCODING: [0x00,0xc0,0x64,0x25]
50+
// CHECK-ERROR: instruction requires: sve
51+
// CHECK-UNKNOWN: 00 c0 64 25 <unknown>
52+
53+
sqadd z0.h, z0.h, #0, lsl #8
54+
// CHECK-INST: sqadd z0.h, z0.h, #0, lsl #8
55+
// CHECK-ENCODING: [0x00,0xe0,0x64,0x25]
56+
// CHECK-ERROR: instruction requires: sve
57+
// CHECK-UNKNOWN: 00 e0 64 25 <unknown>
58+
59+
sqadd z31.h, z31.h, #255, lsl #8
60+
// CHECK-INST: sqadd z31.h, z31.h, #65280
61+
// CHECK-ENCODING: [0xff,0xff,0x64,0x25]
62+
// CHECK-ERROR: instruction requires: sve
63+
// CHECK-UNKNOWN: ff ff 64 25 <unknown>
64+
65+
sqadd z31.h, z31.h, #65280
66+
// CHECK-INST: sqadd z31.h, z31.h, #65280
67+
// CHECK-ENCODING: [0xff,0xff,0x64,0x25]
68+
// CHECK-ERROR: instruction requires: sve
69+
// CHECK-UNKNOWN: ff ff 64 25 <unknown>
70+
71+
sqadd z0.s, z0.s, #0
72+
// CHECK-INST: sqadd z0.s, z0.s, #0
73+
// CHECK-ENCODING: [0x00,0xc0,0xa4,0x25]
74+
// CHECK-ERROR: instruction requires: sve
75+
// CHECK-UNKNOWN: 00 c0 a4 25 <unknown>
76+
77+
sqadd z0.s, z0.s, #0, lsl #8
78+
// CHECK-INST: sqadd z0.s, z0.s, #0, lsl #8
79+
// CHECK-ENCODING: [0x00,0xe0,0xa4,0x25]
80+
// CHECK-ERROR: instruction requires: sve
81+
// CHECK-UNKNOWN: 00 e0 a4 25 <unknown>
82+
83+
sqadd z31.s, z31.s, #255, lsl #8
84+
// CHECK-INST: sqadd z31.s, z31.s, #65280
85+
// CHECK-ENCODING: [0xff,0xff,0xa4,0x25]
86+
// CHECK-ERROR: instruction requires: sve
87+
// CHECK-UNKNOWN: ff ff a4 25 <unknown>
88+
89+
sqadd z31.s, z31.s, #65280
90+
// CHECK-INST: sqadd z31.s, z31.s, #65280
91+
// CHECK-ENCODING: [0xff,0xff,0xa4,0x25]
92+
// CHECK-ERROR: instruction requires: sve
93+
// CHECK-UNKNOWN: ff ff a4 25 <unknown>
94+
95+
sqadd z0.d, z0.d, #0
96+
// CHECK-INST: sqadd z0.d, z0.d, #0
97+
// CHECK-ENCODING: [0x00,0xc0,0xe4,0x25]
98+
// CHECK-ERROR: instruction requires: sve
99+
// CHECK-UNKNOWN: 00 c0 e4 25 <unknown>
100+
101+
sqadd z0.d, z0.d, #0, lsl #8
102+
// CHECK-INST: sqadd z0.d, z0.d, #0, lsl #8
103+
// CHECK-ENCODING: [0x00,0xe0,0xe4,0x25]
104+
// CHECK-ERROR: instruction requires: sve
105+
// CHECK-UNKNOWN: 00 e0 e4 25 <unknown>
106+
107+
sqadd z31.d, z31.d, #255, lsl #8
108+
// CHECK-INST: sqadd z31.d, z31.d, #65280
109+
// CHECK-ENCODING: [0xff,0xff,0xe4,0x25]
110+
// CHECK-ERROR: instruction requires: sve
111+
// CHECK-UNKNOWN: ff ff e4 25 <unknown>
112+
113+
sqadd z31.d, z31.d, #65280
114+
// CHECK-INST: sqadd z31.d, z31.d, #65280
115+
// CHECK-ENCODING: [0xff,0xff,0xe4,0x25]
116+
// CHECK-ERROR: instruction requires: sve
117+
// CHECK-UNKNOWN: ff ff e4 25 <unknown>
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve 2>&1 < %s| FileCheck %s
2+
3+
// Register z32 does not exist.
4+
sqsub z22.h, z10.h, z32.h
5+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
6+
// CHECK-NEXT: sqsub z22.h, z10.h, z32.h
7+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
8+
9+
// Invalid element kind.
10+
sqsub z20.h, z2.h, z31.x
11+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid vector kind qualifier
12+
// CHECK-NEXT: sqsub z20.h, z2.h, z31.x
13+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
14+
15+
// Element size specifiers should match.
16+
sqsub z27.h, z11.h, z27.b
17+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
18+
// CHECK-NEXT: sqsub z27.h, z11.h, z27.b
19+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
20+
21+
22+
// --------------------------------------------------------------------------//
23+
// Invalid immediates
24+
25+
sqsub z0.b, z0.b, #0, lsl #8 // #0, lsl #8 is not valid for .b
26+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
27+
// CHECK-NEXT: sqsub z0.b, z0.b, #0, lsl #8
28+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
29+
30+
sqsub z0.b, z0.b, #-1
31+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
32+
// CHECK-NEXT: sqsub z0.b, z0.b, #-1
33+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
34+
35+
sqsub z0.b, z0.b, #1, lsl #8
36+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
37+
// CHECK-NEXT: sqsub z0.b, z0.b, #1, lsl #8
38+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
39+
40+
sqsub z0.b, z0.b, #256
41+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] with a shift amount of 0
42+
// CHECK-NEXT: sqsub z0.b, z0.b, #256
43+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
44+
45+
sqsub z0.h, z0.h, #-1
46+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
47+
// CHECK-NEXT: sqsub z0.h, z0.h, #-1
48+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
49+
50+
sqsub z0.h, z0.h, #256, lsl #8
51+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
52+
// CHECK-NEXT: sqsub z0.h, z0.h, #256, lsl #8
53+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
54+
55+
sqsub z0.h, z0.h, #65536
56+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
57+
// CHECK-NEXT: sqsub z0.h, z0.h, #65536
58+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
59+
60+
sqsub z0.s, z0.s, #-1
61+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
62+
// CHECK-NEXT: sqsub z0.s, z0.s, #-1
63+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
64+
65+
sqsub z0.s, z0.s, #256, lsl #8
66+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
67+
// CHECK-NEXT: sqsub z0.s, z0.s, #256, lsl #8
68+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
69+
70+
sqsub z0.s, z0.s, #65536
71+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
72+
// CHECK-NEXT: sqsub z0.s, z0.s, #65536
73+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
74+
75+
sqsub z0.d, z0.d, #-1
76+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
77+
// CHECK-NEXT: sqsub z0.d, z0.d, #-1
78+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
79+
80+
sqsub z0.d, z0.d, #256, lsl #8
81+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
82+
// CHECK-NEXT: sqsub z0.d, z0.d, #256, lsl #8
83+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
84+
85+
sqsub z0.d, z0.d, #65536
86+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 255] or a multiple of 256 in range [256, 65280]
87+
// CHECK-NEXT: sqsub z0.d, z0.d, #65536
88+
// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:

0 commit comments

Comments
 (0)