@@ -18,16 +18,13 @@ declare i32 @llvm.abs.i32(i32, i1 immarg)
18
18
declare i64 @llvm.abs.i64 (i64 , i1 immarg)
19
19
declare i128 @llvm.abs.i128 (i128 , i1 immarg)
20
20
21
- ; FIXME: Sign extending the input to the input to the xor isn't needed and
22
- ; causes an extra srai.
23
21
define i8 @abs8 (i8 %x ) {
24
22
; RV32I-LABEL: abs8:
25
23
; RV32I: # %bb.0:
26
- ; RV32I-NEXT: slli a0, a0, 24
27
- ; RV32I-NEXT: srai a1, a0, 24
28
- ; RV32I-NEXT: srai a0, a0, 31
29
- ; RV32I-NEXT: xor a1, a1, a0
30
- ; RV32I-NEXT: sub a0, a1, a0
24
+ ; RV32I-NEXT: slli a1, a0, 24
25
+ ; RV32I-NEXT: srai a1, a1, 31
26
+ ; RV32I-NEXT: xor a0, a0, a1
27
+ ; RV32I-NEXT: sub a0, a0, a1
31
28
; RV32I-NEXT: ret
32
29
;
33
30
; RV32ZBB-LABEL: abs8:
@@ -39,20 +36,18 @@ define i8 @abs8(i8 %x) {
39
36
;
40
37
; RV32ZBT-LABEL: abs8:
41
38
; RV32ZBT: # %bb.0:
42
- ; RV32ZBT-NEXT: slli a0, a0, 24
43
- ; RV32ZBT-NEXT: srai a1, a0, 24
44
- ; RV32ZBT-NEXT: srai a0, a0, 31
45
- ; RV32ZBT-NEXT: xor a1, a1, a0
46
- ; RV32ZBT-NEXT: sub a0, a1, a0
39
+ ; RV32ZBT-NEXT: slli a1, a0, 24
40
+ ; RV32ZBT-NEXT: srai a1, a1, 31
41
+ ; RV32ZBT-NEXT: xor a0, a0, a1
42
+ ; RV32ZBT-NEXT: sub a0, a0, a1
47
43
; RV32ZBT-NEXT: ret
48
44
;
49
45
; RV64I-LABEL: abs8:
50
46
; RV64I: # %bb.0:
51
- ; RV64I-NEXT: slli a0, a0, 56
52
- ; RV64I-NEXT: srai a1, a0, 56
53
- ; RV64I-NEXT: srai a0, a0, 63
54
- ; RV64I-NEXT: xor a1, a1, a0
55
- ; RV64I-NEXT: sub a0, a1, a0
47
+ ; RV64I-NEXT: slli a1, a0, 56
48
+ ; RV64I-NEXT: srai a1, a1, 63
49
+ ; RV64I-NEXT: xor a0, a0, a1
50
+ ; RV64I-NEXT: sub a0, a0, a1
56
51
; RV64I-NEXT: ret
57
52
;
58
53
; RV64ZBB-LABEL: abs8:
@@ -64,26 +59,22 @@ define i8 @abs8(i8 %x) {
64
59
;
65
60
; RV64ZBT-LABEL: abs8:
66
61
; RV64ZBT: # %bb.0:
67
- ; RV64ZBT-NEXT: slli a0, a0, 56
68
- ; RV64ZBT-NEXT: srai a1, a0, 56
69
- ; RV64ZBT-NEXT: srai a0, a0, 63
70
- ; RV64ZBT-NEXT: xor a1, a1, a0
71
- ; RV64ZBT-NEXT: sub a0, a1, a0
62
+ ; RV64ZBT-NEXT: slli a1, a0, 56
63
+ ; RV64ZBT-NEXT: srai a1, a1, 63
64
+ ; RV64ZBT-NEXT: xor a0, a0, a1
65
+ ; RV64ZBT-NEXT: sub a0, a0, a1
72
66
; RV64ZBT-NEXT: ret
73
67
%abs = tail call i8 @llvm.abs.i8 (i8 %x , i1 true )
74
68
ret i8 %abs
75
69
}
76
70
77
- ; FIXME: Sign extending the input to the input to the xor isn't needed and
78
- ; causes an extra srai.
79
71
define i8 @select_abs8 (i8 %x ) {
80
72
; RV32I-LABEL: select_abs8:
81
73
; RV32I: # %bb.0:
82
- ; RV32I-NEXT: slli a0, a0, 24
83
- ; RV32I-NEXT: srai a1, a0, 24
84
- ; RV32I-NEXT: srai a0, a0, 31
85
- ; RV32I-NEXT: xor a1, a1, a0
86
- ; RV32I-NEXT: sub a0, a1, a0
74
+ ; RV32I-NEXT: slli a1, a0, 24
75
+ ; RV32I-NEXT: srai a1, a1, 31
76
+ ; RV32I-NEXT: xor a0, a0, a1
77
+ ; RV32I-NEXT: sub a0, a0, a1
87
78
; RV32I-NEXT: ret
88
79
;
89
80
; RV32ZBB-LABEL: select_abs8:
@@ -95,20 +86,18 @@ define i8 @select_abs8(i8 %x) {
95
86
;
96
87
; RV32ZBT-LABEL: select_abs8:
97
88
; RV32ZBT: # %bb.0:
98
- ; RV32ZBT-NEXT: slli a0, a0, 24
99
- ; RV32ZBT-NEXT: srai a1, a0, 24
100
- ; RV32ZBT-NEXT: srai a0, a0, 31
101
- ; RV32ZBT-NEXT: xor a1, a1, a0
102
- ; RV32ZBT-NEXT: sub a0, a1, a0
89
+ ; RV32ZBT-NEXT: slli a1, a0, 24
90
+ ; RV32ZBT-NEXT: srai a1, a1, 31
91
+ ; RV32ZBT-NEXT: xor a0, a0, a1
92
+ ; RV32ZBT-NEXT: sub a0, a0, a1
103
93
; RV32ZBT-NEXT: ret
104
94
;
105
95
; RV64I-LABEL: select_abs8:
106
96
; RV64I: # %bb.0:
107
- ; RV64I-NEXT: slli a0, a0, 56
108
- ; RV64I-NEXT: srai a1, a0, 56
109
- ; RV64I-NEXT: srai a0, a0, 63
110
- ; RV64I-NEXT: xor a1, a1, a0
111
- ; RV64I-NEXT: sub a0, a1, a0
97
+ ; RV64I-NEXT: slli a1, a0, 56
98
+ ; RV64I-NEXT: srai a1, a1, 63
99
+ ; RV64I-NEXT: xor a0, a0, a1
100
+ ; RV64I-NEXT: sub a0, a0, a1
112
101
; RV64I-NEXT: ret
113
102
;
114
103
; RV64ZBB-LABEL: select_abs8:
@@ -120,28 +109,24 @@ define i8 @select_abs8(i8 %x) {
120
109
;
121
110
; RV64ZBT-LABEL: select_abs8:
122
111
; RV64ZBT: # %bb.0:
123
- ; RV64ZBT-NEXT: slli a0, a0, 56
124
- ; RV64ZBT-NEXT: srai a1, a0, 56
125
- ; RV64ZBT-NEXT: srai a0, a0, 63
126
- ; RV64ZBT-NEXT: xor a1, a1, a0
127
- ; RV64ZBT-NEXT: sub a0, a1, a0
112
+ ; RV64ZBT-NEXT: slli a1, a0, 56
113
+ ; RV64ZBT-NEXT: srai a1, a1, 63
114
+ ; RV64ZBT-NEXT: xor a0, a0, a1
115
+ ; RV64ZBT-NEXT: sub a0, a0, a1
128
116
; RV64ZBT-NEXT: ret
129
117
%1 = icmp slt i8 %x , 0
130
118
%2 = sub nsw i8 0 , %x
131
119
%3 = select i1 %1 , i8 %2 , i8 %x
132
120
ret i8 %3
133
121
}
134
122
135
- ; FIXME: Sign extending the input to the input to the xor isn't needed and
136
- ; causes an extra srai.
137
123
define i16 @abs16 (i16 %x ) {
138
124
; RV32I-LABEL: abs16:
139
125
; RV32I: # %bb.0:
140
- ; RV32I-NEXT: slli a0, a0, 16
141
- ; RV32I-NEXT: srai a1, a0, 16
142
- ; RV32I-NEXT: srai a0, a0, 31
143
- ; RV32I-NEXT: xor a1, a1, a0
144
- ; RV32I-NEXT: sub a0, a1, a0
126
+ ; RV32I-NEXT: slli a1, a0, 16
127
+ ; RV32I-NEXT: srai a1, a1, 31
128
+ ; RV32I-NEXT: xor a0, a0, a1
129
+ ; RV32I-NEXT: sub a0, a0, a1
145
130
; RV32I-NEXT: ret
146
131
;
147
132
; RV32ZBB-LABEL: abs16:
@@ -153,20 +138,18 @@ define i16 @abs16(i16 %x) {
153
138
;
154
139
; RV32ZBT-LABEL: abs16:
155
140
; RV32ZBT: # %bb.0:
156
- ; RV32ZBT-NEXT: slli a0, a0, 16
157
- ; RV32ZBT-NEXT: srai a1, a0, 16
158
- ; RV32ZBT-NEXT: srai a0, a0, 31
159
- ; RV32ZBT-NEXT: xor a1, a1, a0
160
- ; RV32ZBT-NEXT: sub a0, a1, a0
141
+ ; RV32ZBT-NEXT: slli a1, a0, 16
142
+ ; RV32ZBT-NEXT: srai a1, a1, 31
143
+ ; RV32ZBT-NEXT: xor a0, a0, a1
144
+ ; RV32ZBT-NEXT: sub a0, a0, a1
161
145
; RV32ZBT-NEXT: ret
162
146
;
163
147
; RV64I-LABEL: abs16:
164
148
; RV64I: # %bb.0:
165
- ; RV64I-NEXT: slli a0, a0, 48
166
- ; RV64I-NEXT: srai a1, a0, 48
167
- ; RV64I-NEXT: srai a0, a0, 63
168
- ; RV64I-NEXT: xor a1, a1, a0
169
- ; RV64I-NEXT: sub a0, a1, a0
149
+ ; RV64I-NEXT: slli a1, a0, 48
150
+ ; RV64I-NEXT: srai a1, a1, 63
151
+ ; RV64I-NEXT: xor a0, a0, a1
152
+ ; RV64I-NEXT: sub a0, a0, a1
170
153
; RV64I-NEXT: ret
171
154
;
172
155
; RV64ZBB-LABEL: abs16:
@@ -178,26 +161,22 @@ define i16 @abs16(i16 %x) {
178
161
;
179
162
; RV64ZBT-LABEL: abs16:
180
163
; RV64ZBT: # %bb.0:
181
- ; RV64ZBT-NEXT: slli a0, a0, 48
182
- ; RV64ZBT-NEXT: srai a1, a0, 48
183
- ; RV64ZBT-NEXT: srai a0, a0, 63
184
- ; RV64ZBT-NEXT: xor a1, a1, a0
185
- ; RV64ZBT-NEXT: sub a0, a1, a0
164
+ ; RV64ZBT-NEXT: slli a1, a0, 48
165
+ ; RV64ZBT-NEXT: srai a1, a1, 63
166
+ ; RV64ZBT-NEXT: xor a0, a0, a1
167
+ ; RV64ZBT-NEXT: sub a0, a0, a1
186
168
; RV64ZBT-NEXT: ret
187
169
%abs = tail call i16 @llvm.abs.i16 (i16 %x , i1 true )
188
170
ret i16 %abs
189
171
}
190
172
191
- ; FIXME: Sign extending the input to the input to the xor isn't needed and
192
- ; causes an extra srai.
193
173
define i16 @select_abs16 (i16 %x ) {
194
174
; RV32I-LABEL: select_abs16:
195
175
; RV32I: # %bb.0:
196
- ; RV32I-NEXT: slli a0, a0, 16
197
- ; RV32I-NEXT: srai a1, a0, 16
198
- ; RV32I-NEXT: srai a0, a0, 31
199
- ; RV32I-NEXT: xor a1, a1, a0
200
- ; RV32I-NEXT: sub a0, a1, a0
176
+ ; RV32I-NEXT: slli a1, a0, 16
177
+ ; RV32I-NEXT: srai a1, a1, 31
178
+ ; RV32I-NEXT: xor a0, a0, a1
179
+ ; RV32I-NEXT: sub a0, a0, a1
201
180
; RV32I-NEXT: ret
202
181
;
203
182
; RV32ZBB-LABEL: select_abs16:
@@ -209,20 +188,18 @@ define i16 @select_abs16(i16 %x) {
209
188
;
210
189
; RV32ZBT-LABEL: select_abs16:
211
190
; RV32ZBT: # %bb.0:
212
- ; RV32ZBT-NEXT: slli a0, a0, 16
213
- ; RV32ZBT-NEXT: srai a1, a0, 16
214
- ; RV32ZBT-NEXT: srai a0, a0, 31
215
- ; RV32ZBT-NEXT: xor a1, a1, a0
216
- ; RV32ZBT-NEXT: sub a0, a1, a0
191
+ ; RV32ZBT-NEXT: slli a1, a0, 16
192
+ ; RV32ZBT-NEXT: srai a1, a1, 31
193
+ ; RV32ZBT-NEXT: xor a0, a0, a1
194
+ ; RV32ZBT-NEXT: sub a0, a0, a1
217
195
; RV32ZBT-NEXT: ret
218
196
;
219
197
; RV64I-LABEL: select_abs16:
220
198
; RV64I: # %bb.0:
221
- ; RV64I-NEXT: slli a0, a0, 48
222
- ; RV64I-NEXT: srai a1, a0, 48
223
- ; RV64I-NEXT: srai a0, a0, 63
224
- ; RV64I-NEXT: xor a1, a1, a0
225
- ; RV64I-NEXT: sub a0, a1, a0
199
+ ; RV64I-NEXT: slli a1, a0, 48
200
+ ; RV64I-NEXT: srai a1, a1, 63
201
+ ; RV64I-NEXT: xor a0, a0, a1
202
+ ; RV64I-NEXT: sub a0, a0, a1
226
203
; RV64I-NEXT: ret
227
204
;
228
205
; RV64ZBB-LABEL: select_abs16:
@@ -234,11 +211,10 @@ define i16 @select_abs16(i16 %x) {
234
211
;
235
212
; RV64ZBT-LABEL: select_abs16:
236
213
; RV64ZBT: # %bb.0:
237
- ; RV64ZBT-NEXT: slli a0, a0, 48
238
- ; RV64ZBT-NEXT: srai a1, a0, 48
239
- ; RV64ZBT-NEXT: srai a0, a0, 63
240
- ; RV64ZBT-NEXT: xor a1, a1, a0
241
- ; RV64ZBT-NEXT: sub a0, a1, a0
214
+ ; RV64ZBT-NEXT: slli a1, a0, 48
215
+ ; RV64ZBT-NEXT: srai a1, a1, 63
216
+ ; RV64ZBT-NEXT: xor a0, a0, a1
217
+ ; RV64ZBT-NEXT: sub a0, a0, a1
242
218
; RV64ZBT-NEXT: ret
243
219
%1 = icmp slt i16 %x , 0
244
220
%2 = sub nsw i16 0 , %x
0 commit comments