comparison test/CodeGen/Mips/llvm-ir/ashr.ll @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
comparison
equal deleted inserted replaced
133:c60214abe0e8 134:3a76565eade5
1 ; RUN: llc < %s -march=mips -mcpu=mips2 -relocation-model=pic | FileCheck %s \ 1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: -check-prefixes=ALL,GP32,M2 2 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips2 -relocation-model=pic | FileCheck %s \
3 ; RUN: llc < %s -march=mips -mcpu=mips32 -relocation-model=pic | FileCheck %s \ 3 ; RUN: -check-prefix=MIPS
4 ; RUN: -check-prefixes=ALL,GP32,32R1-R5 4 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32 -relocation-model=pic | FileCheck %s \
5 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -relocation-model=pic | FileCheck %s \ 5 ; RUN: -check-prefix=MIPS32
6 ; RUN: -check-prefixes=ALL,GP32,32R1-R5 6 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r2 -relocation-model=pic | FileCheck %s \
7 ; RUN: llc < %s -march=mips -mcpu=mips32r3 -relocation-model=pic | FileCheck %s \ 7 ; RUN: -check-prefix=32R2
8 ; RUN: -check-prefixes=ALL,GP32,32R1-R5 8 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r3 -relocation-model=pic | FileCheck %s \
9 ; RUN: llc < %s -march=mips -mcpu=mips32r5 -relocation-model=pic | FileCheck %s \ 9 ; RUN: -check-prefix=32R2
10 ; RUN: -check-prefixes=ALL,GP32,32R1-R5 10 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r5 -relocation-model=pic | FileCheck %s \
11 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -relocation-model=pic | FileCheck %s \ 11 ; RUN: -check-prefix=32R2
12 ; RUN: -check-prefixes=ALL,GP32,32R6 12 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r6 -relocation-model=pic | FileCheck %s \
13 ; RUN: llc < %s -march=mips64 -mcpu=mips3 -relocation-model=pic | FileCheck %s \ 13 ; RUN: -check-prefix=32R6
14 ; RUN: -check-prefixes=ALL,GP64,M3 14 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips3 -relocation-model=pic | FileCheck %s \
15 ; RUN: llc < %s -march=mips64 -mcpu=mips4 -relocation-model=pic | FileCheck %s \ 15 ; RUN: -check-prefix=MIPS3
16 ; RUN: -check-prefixes=ALL,GP64,GP64-NOT-R6 16 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips4 -relocation-model=pic | FileCheck %s \
17 ; RUN: llc < %s -march=mips64 -mcpu=mips64 -relocation-model=pic | FileCheck %s \ 17 ; RUN: -check-prefix=MIPS64
18 ; RUN: -check-prefixes=ALL,GP64,GP64-NOT-R6 18 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips64 -relocation-model=pic | FileCheck %s \
19 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 -relocation-model=pic | FileCheck %s \ 19 ; RUN: -check-prefix=MIPS64
20 ; RUN: -check-prefixes=ALL,GP64,GP64-NOT-R6 20 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r2 -relocation-model=pic | FileCheck %s \
21 ; RUN: llc < %s -march=mips64 -mcpu=mips64r3 -relocation-model=pic | FileCheck %s \ 21 ; RUN: -check-prefix=MIPS64R2
22 ; RUN: -check-prefixes=ALL,GP64,GP64-NOT-R6 22 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r3 -relocation-model=pic | FileCheck %s \
23 ; RUN: llc < %s -march=mips64 -mcpu=mips64r5 -relocation-model=pic | FileCheck %s \ 23 ; RUN: -check-prefix=MIPS64R2
24 ; RUN: -check-prefixes=ALL,GP64,GP64-NOT-R6 24 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r5 -relocation-model=pic | FileCheck %s \
25 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 -relocation-model=pic | FileCheck %s \ 25 ; RUN: -check-prefix=MIPS64R2
26 ; RUN: -check-prefixes=ALL,GP64,64R6 26 ; RUN: llc < %s -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r6 -relocation-model=pic | FileCheck %s \
27 ; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips -relocation-model=pic | FileCheck %s \ 27 ; RUN: -check-prefix=MIPS64R6
28 ; RUN: -check-prefixes=ALL,MM,MMR3 28 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r3 -mattr=+micromips -relocation-model=pic | FileCheck %s \
29 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips -relocation-model=pic | FileCheck %s \ 29 ; RUN: -check-prefix=MMR3
30 ; RUN: -check-prefixes=ALL,MM,MMR6 30 ; RUN: llc < %s -mtriple=mips-unknown-linux-gnu -mcpu=mips32r6 -mattr=+micromips -relocation-model=pic | FileCheck %s \
31 ; RUN: -check-prefix=MMR6
31 32
32 define signext i1 @ashr_i1(i1 signext %a, i1 signext %b) { 33 define signext i1 @ashr_i1(i1 signext %a, i1 signext %b) {
34 ; MIPS-LABEL: ashr_i1:
35 ; MIPS: # %bb.0: # %entry
36 ; MIPS-NEXT: jr $ra
37 ; MIPS-NEXT: move $2, $4
38 ;
39 ; MIPS32-LABEL: ashr_i1:
40 ; MIPS32: # %bb.0: # %entry
41 ; MIPS32-NEXT: jr $ra
42 ; MIPS32-NEXT: move $2, $4
43 ;
44 ; 32R2-LABEL: ashr_i1:
45 ; 32R2: # %bb.0: # %entry
46 ; 32R2-NEXT: jr $ra
47 ; 32R2-NEXT: move $2, $4
48 ;
49 ; 32R6-LABEL: ashr_i1:
50 ; 32R6: # %bb.0: # %entry
51 ; 32R6-NEXT: jr $ra
52 ; 32R6-NEXT: move $2, $4
53 ;
54 ; MIPS3-LABEL: ashr_i1:
55 ; MIPS3: # %bb.0: # %entry
56 ; MIPS3-NEXT: jr $ra
57 ; MIPS3-NEXT: move $2, $4
58 ;
59 ; MIPS64-LABEL: ashr_i1:
60 ; MIPS64: # %bb.0: # %entry
61 ; MIPS64-NEXT: jr $ra
62 ; MIPS64-NEXT: move $2, $4
63 ;
64 ; MIPS64R2-LABEL: ashr_i1:
65 ; MIPS64R2: # %bb.0: # %entry
66 ; MIPS64R2-NEXT: jr $ra
67 ; MIPS64R2-NEXT: move $2, $4
68 ;
69 ; MIPS64R6-LABEL: ashr_i1:
70 ; MIPS64R6: # %bb.0: # %entry
71 ; MIPS64R6-NEXT: jr $ra
72 ; MIPS64R6-NEXT: move $2, $4
73 ;
74 ; MMR3-LABEL: ashr_i1:
75 ; MMR3: # %bb.0: # %entry
76 ; MMR3-NEXT: move $2, $4
77 ; MMR3-NEXT: jrc $ra
78 ;
79 ; MMR6-LABEL: ashr_i1:
80 ; MMR6: # %bb.0: # %entry
81 ; MMR6-NEXT: move $2, $4
82 ; MMR6-NEXT: jrc $ra
33 entry: 83 entry:
34 ; ALL-LABEL: ashr_i1:
35
36 ; ALL: move $2, $4
37
38 %r = ashr i1 %a, %b 84 %r = ashr i1 %a, %b
39 ret i1 %r 85 ret i1 %r
40 } 86 }
41 87
42 define signext i8 @ashr_i8(i8 signext %a, i8 signext %b) { 88 define signext i8 @ashr_i8(i8 signext %a, i8 signext %b) {
89 ; MIPS-LABEL: ashr_i8:
90 ; MIPS: # %bb.0: # %entry
91 ; MIPS-NEXT: andi $1, $5, 255
92 ; MIPS-NEXT: jr $ra
93 ; MIPS-NEXT: srav $2, $4, $1
94 ;
95 ; MIPS32-LABEL: ashr_i8:
96 ; MIPS32: # %bb.0: # %entry
97 ; MIPS32-NEXT: andi $1, $5, 255
98 ; MIPS32-NEXT: jr $ra
99 ; MIPS32-NEXT: srav $2, $4, $1
100 ;
101 ; 32R2-LABEL: ashr_i8:
102 ; 32R2: # %bb.0: # %entry
103 ; 32R2-NEXT: andi $1, $5, 255
104 ; 32R2-NEXT: jr $ra
105 ; 32R2-NEXT: srav $2, $4, $1
106 ;
107 ; 32R6-LABEL: ashr_i8:
108 ; 32R6: # %bb.0: # %entry
109 ; 32R6-NEXT: andi $1, $5, 255
110 ; 32R6-NEXT: jr $ra
111 ; 32R6-NEXT: srav $2, $4, $1
112 ;
113 ; MIPS3-LABEL: ashr_i8:
114 ; MIPS3: # %bb.0: # %entry
115 ; MIPS3-NEXT: andi $1, $5, 255
116 ; MIPS3-NEXT: jr $ra
117 ; MIPS3-NEXT: srav $2, $4, $1
118 ;
119 ; MIPS64-LABEL: ashr_i8:
120 ; MIPS64: # %bb.0: # %entry
121 ; MIPS64-NEXT: andi $1, $5, 255
122 ; MIPS64-NEXT: jr $ra
123 ; MIPS64-NEXT: srav $2, $4, $1
124 ;
125 ; MIPS64R2-LABEL: ashr_i8:
126 ; MIPS64R2: # %bb.0: # %entry
127 ; MIPS64R2-NEXT: andi $1, $5, 255
128 ; MIPS64R2-NEXT: jr $ra
129 ; MIPS64R2-NEXT: srav $2, $4, $1
130 ;
131 ; MIPS64R6-LABEL: ashr_i8:
132 ; MIPS64R6: # %bb.0: # %entry
133 ; MIPS64R6-NEXT: andi $1, $5, 255
134 ; MIPS64R6-NEXT: jr $ra
135 ; MIPS64R6-NEXT: srav $2, $4, $1
136 ;
137 ; MMR3-LABEL: ashr_i8:
138 ; MMR3: # %bb.0: # %entry
139 ; MMR3-NEXT: andi16 $2, $5, 255
140 ; MMR3-NEXT: jr $ra
141 ; MMR3-NEXT: srav $2, $4, $2
142 ;
143 ; MMR6-LABEL: ashr_i8:
144 ; MMR6: # %bb.0: # %entry
145 ; MMR6-NEXT: andi16 $2, $5, 255
146 ; MMR6-NEXT: srav $2, $4, $2
147 ; MMR6-NEXT: jrc $ra
43 entry: 148 entry:
44 ; ALL-LABEL: ashr_i8:
45
46 ; FIXME: The andi instruction is redundant. 149 ; FIXME: The andi instruction is redundant.
47 ; GP32: andi $[[T0:[0-9]+]], $5, 255
48 ; GP64: andi $[[T0:[0-9]+]], $5, 255
49 ; MM: andi16 $[[T0:[0-9]+]], $5, 255
50 ; ALL: srav $2, $4, $[[T0]]
51
52 %r = ashr i8 %a, %b 150 %r = ashr i8 %a, %b
53 ret i8 %r 151 ret i8 %r
54 } 152 }
55 153
56 define signext i16 @ashr_i16(i16 signext %a, i16 signext %b) { 154 define signext i16 @ashr_i16(i16 signext %a, i16 signext %b) {
155 ; MIPS-LABEL: ashr_i16:
156 ; MIPS: # %bb.0: # %entry
157 ; MIPS-NEXT: andi $1, $5, 65535
158 ; MIPS-NEXT: jr $ra
159 ; MIPS-NEXT: srav $2, $4, $1
160 ;
161 ; MIPS32-LABEL: ashr_i16:
162 ; MIPS32: # %bb.0: # %entry
163 ; MIPS32-NEXT: andi $1, $5, 65535
164 ; MIPS32-NEXT: jr $ra
165 ; MIPS32-NEXT: srav $2, $4, $1
166 ;
167 ; 32R2-LABEL: ashr_i16:
168 ; 32R2: # %bb.0: # %entry
169 ; 32R2-NEXT: andi $1, $5, 65535
170 ; 32R2-NEXT: jr $ra
171 ; 32R2-NEXT: srav $2, $4, $1
172 ;
173 ; 32R6-LABEL: ashr_i16:
174 ; 32R6: # %bb.0: # %entry
175 ; 32R6-NEXT: andi $1, $5, 65535
176 ; 32R6-NEXT: jr $ra
177 ; 32R6-NEXT: srav $2, $4, $1
178 ;
179 ; MIPS3-LABEL: ashr_i16:
180 ; MIPS3: # %bb.0: # %entry
181 ; MIPS3-NEXT: andi $1, $5, 65535
182 ; MIPS3-NEXT: jr $ra
183 ; MIPS3-NEXT: srav $2, $4, $1
184 ;
185 ; MIPS64-LABEL: ashr_i16:
186 ; MIPS64: # %bb.0: # %entry
187 ; MIPS64-NEXT: andi $1, $5, 65535
188 ; MIPS64-NEXT: jr $ra
189 ; MIPS64-NEXT: srav $2, $4, $1
190 ;
191 ; MIPS64R2-LABEL: ashr_i16:
192 ; MIPS64R2: # %bb.0: # %entry
193 ; MIPS64R2-NEXT: andi $1, $5, 65535
194 ; MIPS64R2-NEXT: jr $ra
195 ; MIPS64R2-NEXT: srav $2, $4, $1
196 ;
197 ; MIPS64R6-LABEL: ashr_i16:
198 ; MIPS64R6: # %bb.0: # %entry
199 ; MIPS64R6-NEXT: andi $1, $5, 65535
200 ; MIPS64R6-NEXT: jr $ra
201 ; MIPS64R6-NEXT: srav $2, $4, $1
202 ;
203 ; MMR3-LABEL: ashr_i16:
204 ; MMR3: # %bb.0: # %entry
205 ; MMR3-NEXT: andi16 $2, $5, 65535
206 ; MMR3-NEXT: jr $ra
207 ; MMR3-NEXT: srav $2, $4, $2
208 ;
209 ; MMR6-LABEL: ashr_i16:
210 ; MMR6: # %bb.0: # %entry
211 ; MMR6-NEXT: andi16 $2, $5, 65535
212 ; MMR6-NEXT: srav $2, $4, $2
213 ; MMR6-NEXT: jrc $ra
57 entry: 214 entry:
58 ; ALL-LABEL: ashr_i16:
59
60 ; FIXME: The andi instruction is redundant. 215 ; FIXME: The andi instruction is redundant.
61 ; GP32: andi $[[T0:[0-9]+]], $5, 65535
62 ; GP64: andi $[[T0:[0-9]+]], $5, 65535
63 ; MM: andi16 $[[T0:[0-9]+]], $5, 65535
64 ; ALL: srav $2, $4, $[[T0]]
65
66 %r = ashr i16 %a, %b 216 %r = ashr i16 %a, %b
67 ret i16 %r 217 ret i16 %r
68 } 218 }
69 219
70 define signext i32 @ashr_i32(i32 signext %a, i32 signext %b) { 220 define signext i32 @ashr_i32(i32 signext %a, i32 signext %b) {
221 ; MIPS-LABEL: ashr_i32:
222 ; MIPS: # %bb.0: # %entry
223 ; MIPS-NEXT: jr $ra
224 ; MIPS-NEXT: srav $2, $4, $5
225 ;
226 ; MIPS32-LABEL: ashr_i32:
227 ; MIPS32: # %bb.0: # %entry
228 ; MIPS32-NEXT: jr $ra
229 ; MIPS32-NEXT: srav $2, $4, $5
230 ;
231 ; 32R2-LABEL: ashr_i32:
232 ; 32R2: # %bb.0: # %entry
233 ; 32R2-NEXT: jr $ra
234 ; 32R2-NEXT: srav $2, $4, $5
235 ;
236 ; 32R6-LABEL: ashr_i32:
237 ; 32R6: # %bb.0: # %entry
238 ; 32R6-NEXT: jr $ra
239 ; 32R6-NEXT: srav $2, $4, $5
240 ;
241 ; MIPS3-LABEL: ashr_i32:
242 ; MIPS3: # %bb.0: # %entry
243 ; MIPS3-NEXT: jr $ra
244 ; MIPS3-NEXT: srav $2, $4, $5
245 ;
246 ; MIPS64-LABEL: ashr_i32:
247 ; MIPS64: # %bb.0: # %entry
248 ; MIPS64-NEXT: jr $ra
249 ; MIPS64-NEXT: srav $2, $4, $5
250 ;
251 ; MIPS64R2-LABEL: ashr_i32:
252 ; MIPS64R2: # %bb.0: # %entry
253 ; MIPS64R2-NEXT: jr $ra
254 ; MIPS64R2-NEXT: srav $2, $4, $5
255 ;
256 ; MIPS64R6-LABEL: ashr_i32:
257 ; MIPS64R6: # %bb.0: # %entry
258 ; MIPS64R6-NEXT: jr $ra
259 ; MIPS64R6-NEXT: srav $2, $4, $5
260 ;
261 ; MMR3-LABEL: ashr_i32:
262 ; MMR3: # %bb.0: # %entry
263 ; MMR3-NEXT: jr $ra
264 ; MMR3-NEXT: srav $2, $4, $5
265 ;
266 ; MMR6-LABEL: ashr_i32:
267 ; MMR6: # %bb.0: # %entry
268 ; MMR6-NEXT: srav $2, $4, $5
269 ; MMR6-NEXT: jrc $ra
71 entry: 270 entry:
72 ; ALL-LABEL: ashr_i32:
73
74 ; ALL: srav $2, $4, $5
75
76 %r = ashr i32 %a, %b 271 %r = ashr i32 %a, %b
77 ret i32 %r 272 ret i32 %r
78 } 273 }
79 274
80 define signext i64 @ashr_i64(i64 signext %a, i64 signext %b) { 275 define signext i64 @ashr_i64(i64 signext %a, i64 signext %b) {
276 ; MIPS-LABEL: ashr_i64:
277 ; MIPS: # %bb.0: # %entry
278 ; MIPS-NEXT: srav $2, $4, $7
279 ; MIPS-NEXT: andi $6, $7, 32
280 ; MIPS-NEXT: beqz $6, $BB4_3
281 ; MIPS-NEXT: move $3, $2
282 ; MIPS-NEXT: # %bb.1: # %entry
283 ; MIPS-NEXT: bnez $6, $BB4_4
284 ; MIPS-NEXT: nop
285 ; MIPS-NEXT: $BB4_2: # %entry
286 ; MIPS-NEXT: jr $ra
287 ; MIPS-NEXT: nop
288 ; MIPS-NEXT: $BB4_3: # %entry
289 ; MIPS-NEXT: srlv $1, $5, $7
290 ; MIPS-NEXT: not $3, $7
291 ; MIPS-NEXT: sll $5, $4, 1
292 ; MIPS-NEXT: sllv $3, $5, $3
293 ; MIPS-NEXT: beqz $6, $BB4_2
294 ; MIPS-NEXT: or $3, $3, $1
295 ; MIPS-NEXT: $BB4_4:
296 ; MIPS-NEXT: jr $ra
297 ; MIPS-NEXT: sra $2, $4, 31
298 ;
299 ; MIPS32-LABEL: ashr_i64:
300 ; MIPS32: # %bb.0: # %entry
301 ; MIPS32-NEXT: srlv $1, $5, $7
302 ; MIPS32-NEXT: not $2, $7
303 ; MIPS32-NEXT: sll $3, $4, 1
304 ; MIPS32-NEXT: sllv $2, $3, $2
305 ; MIPS32-NEXT: or $3, $2, $1
306 ; MIPS32-NEXT: srav $2, $4, $7
307 ; MIPS32-NEXT: andi $1, $7, 32
308 ; MIPS32-NEXT: movn $3, $2, $1
309 ; MIPS32-NEXT: sra $4, $4, 31
310 ; MIPS32-NEXT: jr $ra
311 ; MIPS32-NEXT: movn $2, $4, $1
312 ;
313 ; 32R2-LABEL: ashr_i64:
314 ; 32R2: # %bb.0: # %entry
315 ; 32R2-NEXT: srlv $1, $5, $7
316 ; 32R2-NEXT: not $2, $7
317 ; 32R2-NEXT: sll $3, $4, 1
318 ; 32R2-NEXT: sllv $2, $3, $2
319 ; 32R2-NEXT: or $3, $2, $1
320 ; 32R2-NEXT: srav $2, $4, $7
321 ; 32R2-NEXT: andi $1, $7, 32
322 ; 32R2-NEXT: movn $3, $2, $1
323 ; 32R2-NEXT: sra $4, $4, 31
324 ; 32R2-NEXT: jr $ra
325 ; 32R2-NEXT: movn $2, $4, $1
326 ;
327 ; 32R6-LABEL: ashr_i64:
328 ; 32R6: # %bb.0: # %entry
329 ; 32R6-NEXT: srav $1, $4, $7
330 ; 32R6-NEXT: andi $3, $7, 32
331 ; 32R6-NEXT: seleqz $2, $1, $3
332 ; 32R6-NEXT: sra $6, $4, 31
333 ; 32R6-NEXT: selnez $6, $6, $3
334 ; 32R6-NEXT: or $2, $6, $2
335 ; 32R6-NEXT: srlv $5, $5, $7
336 ; 32R6-NEXT: not $6, $7
337 ; 32R6-NEXT: sll $4, $4, 1
338 ; 32R6-NEXT: sllv $4, $4, $6
339 ; 32R6-NEXT: or $4, $4, $5
340 ; 32R6-NEXT: seleqz $4, $4, $3
341 ; 32R6-NEXT: selnez $1, $1, $3
342 ; 32R6-NEXT: jr $ra
343 ; 32R6-NEXT: or $3, $1, $4
344 ;
345 ; MIPS3-LABEL: ashr_i64:
346 ; MIPS3: # %bb.0: # %entry
347 ; MIPS3-NEXT: jr $ra
348 ; MIPS3-NEXT: dsrav $2, $4, $5
349 ;
350 ; MIPS64-LABEL: ashr_i64:
351 ; MIPS64: # %bb.0: # %entry
352 ; MIPS64-NEXT: jr $ra
353 ; MIPS64-NEXT: dsrav $2, $4, $5
354 ;
355 ; MIPS64R2-LABEL: ashr_i64:
356 ; MIPS64R2: # %bb.0: # %entry
357 ; MIPS64R2-NEXT: jr $ra
358 ; MIPS64R2-NEXT: dsrav $2, $4, $5
359 ;
360 ; MIPS64R6-LABEL: ashr_i64:
361 ; MIPS64R6: # %bb.0: # %entry
362 ; MIPS64R6-NEXT: jr $ra
363 ; MIPS64R6-NEXT: dsrav $2, $4, $5
364 ;
365 ; MMR3-LABEL: ashr_i64:
366 ; MMR3: # %bb.0: # %entry
367 ; MMR3-NEXT: srlv $2, $5, $7
368 ; MMR3-NEXT: not16 $3, $7
369 ; MMR3-NEXT: sll16 $5, $4, 1
370 ; MMR3-NEXT: sllv $3, $5, $3
371 ; MMR3-NEXT: or16 $3, $2
372 ; MMR3-NEXT: srav $2, $4, $7
373 ; MMR3-NEXT: andi16 $5, $7, 32
374 ; MMR3-NEXT: movn $3, $2, $5
375 ; MMR3-NEXT: sra $1, $4, 31
376 ; MMR3-NEXT: jr $ra
377 ; MMR3-NEXT: movn $2, $1, $5
378 ;
379 ; MMR6-LABEL: ashr_i64:
380 ; MMR6: # %bb.0: # %entry
381 ; MMR6-NEXT: srav $1, $4, $7
382 ; MMR6-NEXT: andi16 $3, $7, 32
383 ; MMR6-NEXT: seleqz $2, $1, $3
384 ; MMR6-NEXT: sra $6, $4, 31
385 ; MMR6-NEXT: selnez $6, $6, $3
386 ; MMR6-NEXT: or $2, $6, $2
387 ; MMR6-NEXT: srlv $5, $5, $7
388 ; MMR6-NEXT: not16 $6, $7
389 ; MMR6-NEXT: sll16 $4, $4, 1
390 ; MMR6-NEXT: sllv $4, $4, $6
391 ; MMR6-NEXT: or $4, $4, $5
392 ; MMR6-NEXT: seleqz $4, $4, $3
393 ; MMR6-NEXT: selnez $1, $1, $3
394 ; MMR6-NEXT: or $3, $1, $4
395 ; MMR6-NEXT: jrc $ra
81 entry: 396 entry:
82 ; ALL-LABEL: ashr_i64:
83
84 ; M2: srav $[[T0:[0-9]+]], $4, $7
85 ; M2: andi $[[T1:[0-9]+]], $7, 32
86 ; M2: beqz $[[T1]], $[[BB0:BB[0-9_]+]]
87 ; M2: move $3, $[[T0]]
88 ; M2: bnez $[[T1]], $[[BB1:BB[0-9_]+]]
89 ; M2: nop
90 ; M2: $[[EXIT:BB[0-9_]+]]:
91 ; M2: jr $ra
92 ; M2: nop
93 ; M2: $[[BB0]]:
94 ; M2: srlv $[[T2:[0-9]+]], $5, $7
95 ; M2: not $[[T3:[0-9]+]], $7
96 ; M2: sll $[[T4:[0-9]+]], $4, 1
97 ; M2: sllv $[[T5:[0-9]+]], $[[T4]], $[[T3]]
98 ; M2: beqz $[[T1]], $[[EXIT]]
99 ; M2: or $3, $[[T3]], $[[T2]]
100 ; M2: $[[BB1]]:
101 ; M2: jr $ra
102 ; M2: sra $2, $4, 31
103
104 ; 32R1-R5: srlv $[[T0:[0-9]+]], $5, $7
105 ; 32R1-R5: not $[[T1:[0-9]+]], $7
106 ; 32R1-R5: sll $[[T2:[0-9]+]], $4, 1
107 ; 32R1-R5: sllv $[[T3:[0-9]+]], $[[T2]], $[[T1]]
108 ; 32R1-R5: or $3, $[[T3]], $[[T0]]
109 ; 32R1-R5: srav $[[T4:[0-9]+]], $4, $7
110 ; 32R1-R5: andi $[[T5:[0-9]+]], $7, 32
111 ; 32R1-R5: movn $3, $[[T4]], $[[T5]]
112 ; 32R1-R5: sra $4, $4, 31
113 ; 32R1-R5: jr $ra
114 ; 32R1-R5: movn $2, $4, $[[T5]]
115
116 ; 32R6: srav $[[T0:[0-9]+]], $4, $7
117 ; 32R6: andi $[[T1:[0-9]+]], $7, 32
118 ; 32R6: seleqz $[[T2:[0-9]+]], $[[T0]], $[[T1]]
119 ; 32R6: sra $[[T3:[0-9]+]], $4, 31
120 ; 32R6: selnez $[[T4:[0-9]+]], $[[T3]], $[[T1]]
121 ; 32R6: or $[[T5:[0-9]+]], $[[T4]], $[[T2]]
122 ; 32R6: srlv $[[T6:[0-9]+]], $5, $7
123 ; 32R6: not $[[T7:[0-9]+]], $7
124 ; 32R6: sll $[[T8:[0-9]+]], $4, 1
125 ; 32R6: sllv $[[T9:[0-9]+]], $[[T8]], $[[T7]]
126 ; 32R6: or $[[T10:[0-9]+]], $[[T9]], $[[T6]]
127 ; 32R6: seleqz $[[T11:[0-9]+]], $[[T10]], $[[T1]]
128 ; 32R6: selnez $[[T12:[0-9]+]], $[[T0]], $[[T1]]
129 ; 32R6: jr $ra
130 ; 32R6: or $3, $[[T0]], $[[T11]]
131
132 ; GP64: dsrav $2, $4, $5
133
134 ; MMR3: srlv $[[T0:[0-9]+]], $5, $7
135 ; MMR3: not16 $[[T1:[0-9]+]], $7
136 ; MMR3: sll16 $[[T2:[0-9]+]], $4, 1
137 ; MMR3: sllv $[[T3:[0-9]+]], $[[T2]], $[[T1]]
138 ; MMR3: or16 $[[T4:[0-9]+]], $[[T0]]
139 ; MMR3: srav $[[T5:[0-9]+]], $4, $7
140 ; MMR3: andi16 $[[T6:[0-9]+]], $7, 32
141 ; MMR3: movn $[[T7:[0-9]+]], $[[T5]], $[[T6]]
142 ; MMR3: sra $[[T8:[0-9]+]], $4, 31
143 ; MMR3: movn $2, $[[T8]], $[[T6]]
144
145 ; MMR6: srav $[[T0:[0-9]+]], $4, $7
146 ; MMR6: andi16 $[[T1:[0-9]+]], $7, 32
147 ; MMR6: seleqz $[[T2:[0-9]+]], $[[T0]], $[[T1]]
148 ; MMR6: sra $[[T3:[0-9]+]], $4, 31
149 ; MMR6: selnez $[[T4:[0-9]+]], $[[T3]], $[[T1]]
150 ; MMR6: or $[[T5:[0-9]+]], $[[T4]], $[[T2]]
151 ; MMR6: srlv $[[T6:[0-9]+]], $5, $7
152 ; MMR6: not16 $[[T7:[0-9]+]], $7
153 ; MMR6: sll16 $[[T8:[0-9]+]], $4, 1
154 ; MMR6: sllv $[[T9:[0-9]+]], $[[T8]], $[[T7]]
155 ; MMR6: or16 $[[T10:[0-9]+]], $[[T6]]
156 ; MMR6: seleqz $[[T11:[0-9]+]], $[[T10]], $[[T1]]
157 ; MMR6: selnez $[[T12:[0-9]+]], $[[T0]], $[[T1]]
158 ; MMR6: or $3, $[[T12]], $[[T11]]
159
160 %r = ashr i64 %a, %b 397 %r = ashr i64 %a, %b
161 ret i64 %r 398 ret i64 %r
162 } 399 }
163 400
164 define signext i128 @ashr_i128(i128 signext %a, i128 signext %b) { 401 define signext i128 @ashr_i128(i128 signext %a, i128 signext %b) {
402 ; MIPS-LABEL: ashr_i128:
403 ; MIPS: # %bb.0: # %entry
404 ; MIPS-NEXT: addiu $sp, $sp, -8
405 ; MIPS-NEXT: .cfi_def_cfa_offset 8
406 ; MIPS-NEXT: sw $17, 4($sp) # 4-byte Folded Spill
407 ; MIPS-NEXT: sw $16, 0($sp) # 4-byte Folded Spill
408 ; MIPS-NEXT: .cfi_offset 17, -4
409 ; MIPS-NEXT: .cfi_offset 16, -8
410 ; MIPS-NEXT: lw $25, 36($sp)
411 ; MIPS-NEXT: addiu $1, $zero, 64
412 ; MIPS-NEXT: subu $11, $1, $25
413 ; MIPS-NEXT: sllv $9, $5, $11
414 ; MIPS-NEXT: andi $13, $11, 32
415 ; MIPS-NEXT: addiu $2, $zero, 0
416 ; MIPS-NEXT: bnez $13, $BB5_2
417 ; MIPS-NEXT: addiu $3, $zero, 0
418 ; MIPS-NEXT: # %bb.1: # %entry
419 ; MIPS-NEXT: move $3, $9
420 ; MIPS-NEXT: $BB5_2: # %entry
421 ; MIPS-NEXT: not $gp, $25
422 ; MIPS-NEXT: srlv $12, $6, $25
423 ; MIPS-NEXT: andi $8, $25, 32
424 ; MIPS-NEXT: bnez $8, $BB5_4
425 ; MIPS-NEXT: move $15, $12
426 ; MIPS-NEXT: # %bb.3: # %entry
427 ; MIPS-NEXT: srlv $1, $7, $25
428 ; MIPS-NEXT: sll $10, $6, 1
429 ; MIPS-NEXT: sllv $10, $10, $gp
430 ; MIPS-NEXT: or $15, $10, $1
431 ; MIPS-NEXT: $BB5_4: # %entry
432 ; MIPS-NEXT: addiu $10, $25, -64
433 ; MIPS-NEXT: sll $17, $4, 1
434 ; MIPS-NEXT: srav $14, $4, $10
435 ; MIPS-NEXT: andi $24, $10, 32
436 ; MIPS-NEXT: bnez $24, $BB5_6
437 ; MIPS-NEXT: move $16, $14
438 ; MIPS-NEXT: # %bb.5: # %entry
439 ; MIPS-NEXT: srlv $1, $5, $10
440 ; MIPS-NEXT: not $10, $10
441 ; MIPS-NEXT: sllv $10, $17, $10
442 ; MIPS-NEXT: or $16, $10, $1
443 ; MIPS-NEXT: $BB5_6: # %entry
444 ; MIPS-NEXT: sltiu $10, $25, 64
445 ; MIPS-NEXT: beqz $10, $BB5_8
446 ; MIPS-NEXT: nop
447 ; MIPS-NEXT: # %bb.7:
448 ; MIPS-NEXT: or $16, $15, $3
449 ; MIPS-NEXT: $BB5_8: # %entry
450 ; MIPS-NEXT: srav $15, $4, $25
451 ; MIPS-NEXT: beqz $8, $BB5_20
452 ; MIPS-NEXT: move $3, $15
453 ; MIPS-NEXT: # %bb.9: # %entry
454 ; MIPS-NEXT: sltiu $gp, $25, 1
455 ; MIPS-NEXT: beqz $gp, $BB5_21
456 ; MIPS-NEXT: nop
457 ; MIPS-NEXT: $BB5_10: # %entry
458 ; MIPS-NEXT: beqz $10, $BB5_22
459 ; MIPS-NEXT: sra $25, $4, 31
460 ; MIPS-NEXT: $BB5_11: # %entry
461 ; MIPS-NEXT: beqz $13, $BB5_23
462 ; MIPS-NEXT: nop
463 ; MIPS-NEXT: $BB5_12: # %entry
464 ; MIPS-NEXT: beqz $8, $BB5_24
465 ; MIPS-NEXT: nop
466 ; MIPS-NEXT: $BB5_13: # %entry
467 ; MIPS-NEXT: beqz $24, $BB5_25
468 ; MIPS-NEXT: move $4, $25
469 ; MIPS-NEXT: $BB5_14: # %entry
470 ; MIPS-NEXT: bnez $10, $BB5_26
471 ; MIPS-NEXT: nop
472 ; MIPS-NEXT: $BB5_15: # %entry
473 ; MIPS-NEXT: beqz $gp, $BB5_27
474 ; MIPS-NEXT: nop
475 ; MIPS-NEXT: $BB5_16: # %entry
476 ; MIPS-NEXT: beqz $8, $BB5_28
477 ; MIPS-NEXT: move $2, $25
478 ; MIPS-NEXT: $BB5_17: # %entry
479 ; MIPS-NEXT: bnez $10, $BB5_19
480 ; MIPS-NEXT: nop
481 ; MIPS-NEXT: $BB5_18: # %entry
482 ; MIPS-NEXT: move $2, $25
483 ; MIPS-NEXT: $BB5_19: # %entry
484 ; MIPS-NEXT: move $4, $6
485 ; MIPS-NEXT: move $5, $7
486 ; MIPS-NEXT: lw $16, 0($sp) # 4-byte Folded Reload
487 ; MIPS-NEXT: lw $17, 4($sp) # 4-byte Folded Reload
488 ; MIPS-NEXT: jr $ra
489 ; MIPS-NEXT: addiu $sp, $sp, 8
490 ; MIPS-NEXT: $BB5_20: # %entry
491 ; MIPS-NEXT: srlv $1, $5, $25
492 ; MIPS-NEXT: sllv $3, $17, $gp
493 ; MIPS-NEXT: sltiu $gp, $25, 1
494 ; MIPS-NEXT: bnez $gp, $BB5_10
495 ; MIPS-NEXT: or $3, $3, $1
496 ; MIPS-NEXT: $BB5_21: # %entry
497 ; MIPS-NEXT: move $7, $16
498 ; MIPS-NEXT: bnez $10, $BB5_11
499 ; MIPS-NEXT: sra $25, $4, 31
500 ; MIPS-NEXT: $BB5_22: # %entry
501 ; MIPS-NEXT: bnez $13, $BB5_12
502 ; MIPS-NEXT: move $3, $25
503 ; MIPS-NEXT: $BB5_23: # %entry
504 ; MIPS-NEXT: not $1, $11
505 ; MIPS-NEXT: srl $5, $5, 1
506 ; MIPS-NEXT: sllv $4, $4, $11
507 ; MIPS-NEXT: srlv $1, $5, $1
508 ; MIPS-NEXT: bnez $8, $BB5_13
509 ; MIPS-NEXT: or $9, $4, $1
510 ; MIPS-NEXT: $BB5_24: # %entry
511 ; MIPS-NEXT: move $2, $12
512 ; MIPS-NEXT: bnez $24, $BB5_14
513 ; MIPS-NEXT: move $4, $25
514 ; MIPS-NEXT: $BB5_25: # %entry
515 ; MIPS-NEXT: beqz $10, $BB5_15
516 ; MIPS-NEXT: move $4, $14
517 ; MIPS-NEXT: $BB5_26:
518 ; MIPS-NEXT: bnez $gp, $BB5_16
519 ; MIPS-NEXT: or $4, $2, $9
520 ; MIPS-NEXT: $BB5_27: # %entry
521 ; MIPS-NEXT: move $6, $4
522 ; MIPS-NEXT: bnez $8, $BB5_17
523 ; MIPS-NEXT: move $2, $25
524 ; MIPS-NEXT: $BB5_28: # %entry
525 ; MIPS-NEXT: bnez $10, $BB5_19
526 ; MIPS-NEXT: move $2, $15
527 ; MIPS-NEXT: # %bb.29: # %entry
528 ; MIPS-NEXT: b $BB5_18
529 ; MIPS-NEXT: nop
530 ;
531 ; MIPS32-LABEL: ashr_i128:
532 ; MIPS32: # %bb.0: # %entry
533 ; MIPS32-NEXT: lw $9, 28($sp)
534 ; MIPS32-NEXT: srlv $1, $7, $9
535 ; MIPS32-NEXT: not $2, $9
536 ; MIPS32-NEXT: sll $3, $6, 1
537 ; MIPS32-NEXT: sllv $3, $3, $2
538 ; MIPS32-NEXT: addiu $8, $zero, 64
539 ; MIPS32-NEXT: or $1, $3, $1
540 ; MIPS32-NEXT: srlv $10, $6, $9
541 ; MIPS32-NEXT: subu $3, $8, $9
542 ; MIPS32-NEXT: sllv $11, $5, $3
543 ; MIPS32-NEXT: andi $12, $3, 32
544 ; MIPS32-NEXT: andi $13, $9, 32
545 ; MIPS32-NEXT: move $8, $11
546 ; MIPS32-NEXT: movn $8, $zero, $12
547 ; MIPS32-NEXT: movn $1, $10, $13
548 ; MIPS32-NEXT: addiu $14, $9, -64
549 ; MIPS32-NEXT: srlv $15, $5, $14
550 ; MIPS32-NEXT: sll $24, $4, 1
551 ; MIPS32-NEXT: not $25, $14
552 ; MIPS32-NEXT: sllv $25, $24, $25
553 ; MIPS32-NEXT: or $gp, $1, $8
554 ; MIPS32-NEXT: or $1, $25, $15
555 ; MIPS32-NEXT: srav $8, $4, $14
556 ; MIPS32-NEXT: andi $14, $14, 32
557 ; MIPS32-NEXT: movn $1, $8, $14
558 ; MIPS32-NEXT: sllv $15, $4, $3
559 ; MIPS32-NEXT: not $3, $3
560 ; MIPS32-NEXT: srl $25, $5, 1
561 ; MIPS32-NEXT: srlv $3, $25, $3
562 ; MIPS32-NEXT: sltiu $25, $9, 64
563 ; MIPS32-NEXT: movn $1, $gp, $25
564 ; MIPS32-NEXT: or $15, $15, $3
565 ; MIPS32-NEXT: srlv $3, $5, $9
566 ; MIPS32-NEXT: sllv $2, $24, $2
567 ; MIPS32-NEXT: or $5, $2, $3
568 ; MIPS32-NEXT: srav $24, $4, $9
569 ; MIPS32-NEXT: movn $5, $24, $13
570 ; MIPS32-NEXT: sra $2, $4, 31
571 ; MIPS32-NEXT: movz $1, $7, $9
572 ; MIPS32-NEXT: move $3, $2
573 ; MIPS32-NEXT: movn $3, $5, $25
574 ; MIPS32-NEXT: movn $15, $11, $12
575 ; MIPS32-NEXT: movn $10, $zero, $13
576 ; MIPS32-NEXT: or $4, $10, $15
577 ; MIPS32-NEXT: movn $8, $2, $14
578 ; MIPS32-NEXT: movn $8, $4, $25
579 ; MIPS32-NEXT: movz $8, $6, $9
580 ; MIPS32-NEXT: movn $24, $2, $13
581 ; MIPS32-NEXT: movn $2, $24, $25
582 ; MIPS32-NEXT: move $4, $8
583 ; MIPS32-NEXT: jr $ra
584 ; MIPS32-NEXT: move $5, $1
585 ;
586 ; 32R2-LABEL: ashr_i128:
587 ; 32R2: # %bb.0: # %entry
588 ; 32R2-NEXT: lw $9, 28($sp)
589 ; 32R2-NEXT: srlv $1, $7, $9
590 ; 32R2-NEXT: not $2, $9
591 ; 32R2-NEXT: sll $3, $6, 1
592 ; 32R2-NEXT: sllv $3, $3, $2
593 ; 32R2-NEXT: addiu $8, $zero, 64
594 ; 32R2-NEXT: or $1, $3, $1
595 ; 32R2-NEXT: srlv $10, $6, $9
596 ; 32R2-NEXT: subu $3, $8, $9
597 ; 32R2-NEXT: sllv $11, $5, $3
598 ; 32R2-NEXT: andi $12, $3, 32
599 ; 32R2-NEXT: andi $13, $9, 32
600 ; 32R2-NEXT: move $8, $11
601 ; 32R2-NEXT: movn $8, $zero, $12
602 ; 32R2-NEXT: movn $1, $10, $13
603 ; 32R2-NEXT: addiu $14, $9, -64
604 ; 32R2-NEXT: srlv $15, $5, $14
605 ; 32R2-NEXT: sll $24, $4, 1
606 ; 32R2-NEXT: not $25, $14
607 ; 32R2-NEXT: sllv $25, $24, $25
608 ; 32R2-NEXT: or $gp, $1, $8
609 ; 32R2-NEXT: or $1, $25, $15
610 ; 32R2-NEXT: srav $8, $4, $14
611 ; 32R2-NEXT: andi $14, $14, 32
612 ; 32R2-NEXT: movn $1, $8, $14
613 ; 32R2-NEXT: sllv $15, $4, $3
614 ; 32R2-NEXT: not $3, $3
615 ; 32R2-NEXT: srl $25, $5, 1
616 ; 32R2-NEXT: srlv $3, $25, $3
617 ; 32R2-NEXT: sltiu $25, $9, 64
618 ; 32R2-NEXT: movn $1, $gp, $25
619 ; 32R2-NEXT: or $15, $15, $3
620 ; 32R2-NEXT: srlv $3, $5, $9
621 ; 32R2-NEXT: sllv $2, $24, $2
622 ; 32R2-NEXT: or $5, $2, $3
623 ; 32R2-NEXT: srav $24, $4, $9
624 ; 32R2-NEXT: movn $5, $24, $13
625 ; 32R2-NEXT: sra $2, $4, 31
626 ; 32R2-NEXT: movz $1, $7, $9
627 ; 32R2-NEXT: move $3, $2
628 ; 32R2-NEXT: movn $3, $5, $25
629 ; 32R2-NEXT: movn $15, $11, $12
630 ; 32R2-NEXT: movn $10, $zero, $13
631 ; 32R2-NEXT: or $4, $10, $15
632 ; 32R2-NEXT: movn $8, $2, $14
633 ; 32R2-NEXT: movn $8, $4, $25
634 ; 32R2-NEXT: movz $8, $6, $9
635 ; 32R2-NEXT: movn $24, $2, $13
636 ; 32R2-NEXT: movn $2, $24, $25
637 ; 32R2-NEXT: move $4, $8
638 ; 32R2-NEXT: jr $ra
639 ; 32R2-NEXT: move $5, $1
640 ;
641 ; 32R6-LABEL: ashr_i128:
642 ; 32R6: # %bb.0: # %entry
643 ; 32R6-NEXT: lw $3, 28($sp)
644 ; 32R6-NEXT: addiu $1, $zero, 64
645 ; 32R6-NEXT: subu $1, $1, $3
646 ; 32R6-NEXT: sllv $2, $5, $1
647 ; 32R6-NEXT: andi $8, $1, 32
648 ; 32R6-NEXT: selnez $9, $2, $8
649 ; 32R6-NEXT: sllv $10, $4, $1
650 ; 32R6-NEXT: not $1, $1
651 ; 32R6-NEXT: srl $11, $5, 1
652 ; 32R6-NEXT: srlv $1, $11, $1
653 ; 32R6-NEXT: or $1, $10, $1
654 ; 32R6-NEXT: seleqz $1, $1, $8
655 ; 32R6-NEXT: or $1, $9, $1
656 ; 32R6-NEXT: srlv $9, $7, $3
657 ; 32R6-NEXT: not $10, $3
658 ; 32R6-NEXT: sll $11, $6, 1
659 ; 32R6-NEXT: sllv $11, $11, $10
660 ; 32R6-NEXT: or $9, $11, $9
661 ; 32R6-NEXT: andi $11, $3, 32
662 ; 32R6-NEXT: seleqz $9, $9, $11
663 ; 32R6-NEXT: srlv $12, $6, $3
664 ; 32R6-NEXT: selnez $13, $12, $11
665 ; 32R6-NEXT: seleqz $12, $12, $11
666 ; 32R6-NEXT: or $1, $12, $1
667 ; 32R6-NEXT: seleqz $2, $2, $8
668 ; 32R6-NEXT: or $8, $13, $9
669 ; 32R6-NEXT: addiu $9, $3, -64
670 ; 32R6-NEXT: srlv $12, $5, $9
671 ; 32R6-NEXT: sll $13, $4, 1
672 ; 32R6-NEXT: not $14, $9
673 ; 32R6-NEXT: sllv $14, $13, $14
674 ; 32R6-NEXT: sltiu $15, $3, 64
675 ; 32R6-NEXT: or $2, $8, $2
676 ; 32R6-NEXT: selnez $1, $1, $15
677 ; 32R6-NEXT: or $8, $14, $12
678 ; 32R6-NEXT: srav $12, $4, $9
679 ; 32R6-NEXT: andi $9, $9, 32
680 ; 32R6-NEXT: seleqz $14, $12, $9
681 ; 32R6-NEXT: sra $24, $4, 31
682 ; 32R6-NEXT: selnez $25, $24, $9
683 ; 32R6-NEXT: seleqz $8, $8, $9
684 ; 32R6-NEXT: or $14, $25, $14
685 ; 32R6-NEXT: seleqz $14, $14, $15
686 ; 32R6-NEXT: selnez $9, $12, $9
687 ; 32R6-NEXT: seleqz $12, $24, $15
688 ; 32R6-NEXT: or $1, $1, $14
689 ; 32R6-NEXT: selnez $14, $1, $3
690 ; 32R6-NEXT: selnez $1, $2, $15
691 ; 32R6-NEXT: or $2, $9, $8
692 ; 32R6-NEXT: srav $8, $4, $3
693 ; 32R6-NEXT: seleqz $4, $8, $11
694 ; 32R6-NEXT: selnez $9, $24, $11
695 ; 32R6-NEXT: or $4, $9, $4
696 ; 32R6-NEXT: selnez $9, $4, $15
697 ; 32R6-NEXT: seleqz $2, $2, $15
698 ; 32R6-NEXT: seleqz $4, $6, $3
699 ; 32R6-NEXT: seleqz $6, $7, $3
700 ; 32R6-NEXT: or $1, $1, $2
701 ; 32R6-NEXT: selnez $1, $1, $3
702 ; 32R6-NEXT: or $1, $6, $1
703 ; 32R6-NEXT: or $4, $4, $14
704 ; 32R6-NEXT: or $2, $9, $12
705 ; 32R6-NEXT: srlv $3, $5, $3
706 ; 32R6-NEXT: sllv $5, $13, $10
707 ; 32R6-NEXT: or $3, $5, $3
708 ; 32R6-NEXT: seleqz $3, $3, $11
709 ; 32R6-NEXT: selnez $5, $8, $11
710 ; 32R6-NEXT: or $3, $5, $3
711 ; 32R6-NEXT: selnez $3, $3, $15
712 ; 32R6-NEXT: or $3, $3, $12
713 ; 32R6-NEXT: jr $ra
714 ; 32R6-NEXT: move $5, $1
715 ;
716 ; MIPS3-LABEL: ashr_i128:
717 ; MIPS3: # %bb.0: # %entry
718 ; MIPS3-NEXT: sll $8, $7, 0
719 ; MIPS3-NEXT: dsrav $2, $4, $7
720 ; MIPS3-NEXT: andi $6, $8, 64
721 ; MIPS3-NEXT: beqz $6, .LBB5_3
722 ; MIPS3-NEXT: move $3, $2
723 ; MIPS3-NEXT: # %bb.1: # %entry
724 ; MIPS3-NEXT: bnez $6, .LBB5_4
725 ; MIPS3-NEXT: nop
726 ; MIPS3-NEXT: .LBB5_2: # %entry
727 ; MIPS3-NEXT: jr $ra
728 ; MIPS3-NEXT: nop
729 ; MIPS3-NEXT: .LBB5_3: # %entry
730 ; MIPS3-NEXT: dsrlv $1, $5, $7
731 ; MIPS3-NEXT: dsll $3, $4, 1
732 ; MIPS3-NEXT: not $5, $8
733 ; MIPS3-NEXT: dsllv $3, $3, $5
734 ; MIPS3-NEXT: beqz $6, .LBB5_2
735 ; MIPS3-NEXT: or $3, $3, $1
736 ; MIPS3-NEXT: .LBB5_4:
737 ; MIPS3-NEXT: jr $ra
738 ; MIPS3-NEXT: dsra $2, $4, 63
739 ;
740 ; MIPS64-LABEL: ashr_i128:
741 ; MIPS64: # %bb.0: # %entry
742 ; MIPS64-NEXT: dsrlv $1, $5, $7
743 ; MIPS64-NEXT: dsll $2, $4, 1
744 ; MIPS64-NEXT: sll $5, $7, 0
745 ; MIPS64-NEXT: not $3, $5
746 ; MIPS64-NEXT: dsllv $2, $2, $3
747 ; MIPS64-NEXT: or $3, $2, $1
748 ; MIPS64-NEXT: dsrav $2, $4, $7
749 ; MIPS64-NEXT: andi $1, $5, 64
750 ; MIPS64-NEXT: movn $3, $2, $1
751 ; MIPS64-NEXT: dsra $4, $4, 63
752 ; MIPS64-NEXT: jr $ra
753 ; MIPS64-NEXT: movn $2, $4, $1
754 ;
755 ; MIPS64R2-LABEL: ashr_i128:
756 ; MIPS64R2: # %bb.0: # %entry
757 ; MIPS64R2-NEXT: dsrlv $1, $5, $7
758 ; MIPS64R2-NEXT: dsll $2, $4, 1
759 ; MIPS64R2-NEXT: sll $5, $7, 0
760 ; MIPS64R2-NEXT: not $3, $5
761 ; MIPS64R2-NEXT: dsllv $2, $2, $3
762 ; MIPS64R2-NEXT: or $3, $2, $1
763 ; MIPS64R2-NEXT: dsrav $2, $4, $7
764 ; MIPS64R2-NEXT: andi $1, $5, 64
765 ; MIPS64R2-NEXT: movn $3, $2, $1
766 ; MIPS64R2-NEXT: dsra $4, $4, 63
767 ; MIPS64R2-NEXT: jr $ra
768 ; MIPS64R2-NEXT: movn $2, $4, $1
769 ;
770 ; MIPS64R6-LABEL: ashr_i128:
771 ; MIPS64R6: # %bb.0: # %entry
772 ; MIPS64R6-NEXT: dsrav $1, $4, $7
773 ; MIPS64R6-NEXT: sll $3, $7, 0
774 ; MIPS64R6-NEXT: andi $2, $3, 64
775 ; MIPS64R6-NEXT: sll $6, $2, 0
776 ; MIPS64R6-NEXT: seleqz $2, $1, $6
777 ; MIPS64R6-NEXT: dsra $8, $4, 63
778 ; MIPS64R6-NEXT: selnez $8, $8, $6
779 ; MIPS64R6-NEXT: or $2, $8, $2
780 ; MIPS64R6-NEXT: dsrlv $5, $5, $7
781 ; MIPS64R6-NEXT: dsll $4, $4, 1
782 ; MIPS64R6-NEXT: not $3, $3
783 ; MIPS64R6-NEXT: dsllv $3, $4, $3
784 ; MIPS64R6-NEXT: or $3, $3, $5
785 ; MIPS64R6-NEXT: seleqz $3, $3, $6
786 ; MIPS64R6-NEXT: selnez $1, $1, $6
787 ; MIPS64R6-NEXT: jr $ra
788 ; MIPS64R6-NEXT: or $3, $1, $3
789 ;
790 ; MMR3-LABEL: ashr_i128:
791 ; MMR3: # %bb.0: # %entry
792 ; MMR3-NEXT: addiusp -48
793 ; MMR3-NEXT: .cfi_def_cfa_offset 48
794 ; MMR3-NEXT: sw $17, 44($sp) # 4-byte Folded Spill
795 ; MMR3-NEXT: sw $16, 40($sp) # 4-byte Folded Spill
796 ; MMR3-NEXT: .cfi_offset 17, -4
797 ; MMR3-NEXT: .cfi_offset 16, -8
798 ; MMR3-NEXT: move $8, $7
799 ; MMR3-NEXT: sw $6, 32($sp) # 4-byte Folded Spill
800 ; MMR3-NEXT: sw $5, 36($sp) # 4-byte Folded Spill
801 ; MMR3-NEXT: sw $4, 8($sp) # 4-byte Folded Spill
802 ; MMR3-NEXT: lw $16, 76($sp)
803 ; MMR3-NEXT: srlv $4, $7, $16
804 ; MMR3-NEXT: not16 $3, $16
805 ; MMR3-NEXT: sw $3, 24($sp) # 4-byte Folded Spill
806 ; MMR3-NEXT: sll16 $2, $6, 1
807 ; MMR3-NEXT: sllv $3, $2, $3
808 ; MMR3-NEXT: li16 $2, 64
809 ; MMR3-NEXT: or16 $3, $4
810 ; MMR3-NEXT: srlv $6, $6, $16
811 ; MMR3-NEXT: sw $6, 12($sp) # 4-byte Folded Spill
812 ; MMR3-NEXT: subu16 $7, $2, $16
813 ; MMR3-NEXT: sllv $9, $5, $7
814 ; MMR3-NEXT: andi16 $2, $7, 32
815 ; MMR3-NEXT: sw $2, 28($sp) # 4-byte Folded Spill
816 ; MMR3-NEXT: andi16 $5, $16, 32
817 ; MMR3-NEXT: sw $5, 16($sp) # 4-byte Folded Spill
818 ; MMR3-NEXT: move $4, $9
819 ; MMR3-NEXT: li16 $17, 0
820 ; MMR3-NEXT: movn $4, $17, $2
821 ; MMR3-NEXT: movn $3, $6, $5
822 ; MMR3-NEXT: addiu $2, $16, -64
823 ; MMR3-NEXT: lw $5, 36($sp) # 4-byte Folded Reload
824 ; MMR3-NEXT: srlv $5, $5, $2
825 ; MMR3-NEXT: sw $5, 20($sp) # 4-byte Folded Spill
826 ; MMR3-NEXT: lw $17, 8($sp) # 4-byte Folded Reload
827 ; MMR3-NEXT: sll16 $6, $17, 1
828 ; MMR3-NEXT: sw $6, 4($sp) # 4-byte Folded Spill
829 ; MMR3-NEXT: not16 $5, $2
830 ; MMR3-NEXT: sllv $5, $6, $5
831 ; MMR3-NEXT: or16 $3, $4
832 ; MMR3-NEXT: lw $4, 20($sp) # 4-byte Folded Reload
833 ; MMR3-NEXT: or16 $5, $4
834 ; MMR3-NEXT: srav $1, $17, $2
835 ; MMR3-NEXT: andi16 $2, $2, 32
836 ; MMR3-NEXT: sw $2, 20($sp) # 4-byte Folded Spill
837 ; MMR3-NEXT: movn $5, $1, $2
838 ; MMR3-NEXT: sllv $2, $17, $7
839 ; MMR3-NEXT: not16 $4, $7
840 ; MMR3-NEXT: lw $7, 36($sp) # 4-byte Folded Reload
841 ; MMR3-NEXT: srl16 $6, $7, 1
842 ; MMR3-NEXT: srlv $6, $6, $4
843 ; MMR3-NEXT: sltiu $10, $16, 64
844 ; MMR3-NEXT: movn $5, $3, $10
845 ; MMR3-NEXT: or16 $6, $2
846 ; MMR3-NEXT: srlv $2, $7, $16
847 ; MMR3-NEXT: lw $3, 24($sp) # 4-byte Folded Reload
848 ; MMR3-NEXT: lw $4, 4($sp) # 4-byte Folded Reload
849 ; MMR3-NEXT: sllv $3, $4, $3
850 ; MMR3-NEXT: or16 $3, $2
851 ; MMR3-NEXT: srav $11, $17, $16
852 ; MMR3-NEXT: lw $4, 16($sp) # 4-byte Folded Reload
853 ; MMR3-NEXT: movn $3, $11, $4
854 ; MMR3-NEXT: sra $2, $17, 31
855 ; MMR3-NEXT: movz $5, $8, $16
856 ; MMR3-NEXT: move $8, $2
857 ; MMR3-NEXT: movn $8, $3, $10
858 ; MMR3-NEXT: lw $3, 28($sp) # 4-byte Folded Reload
859 ; MMR3-NEXT: movn $6, $9, $3
860 ; MMR3-NEXT: li16 $3, 0
861 ; MMR3-NEXT: lw $7, 12($sp) # 4-byte Folded Reload
862 ; MMR3-NEXT: movn $7, $3, $4
863 ; MMR3-NEXT: or16 $7, $6
864 ; MMR3-NEXT: lw $3, 20($sp) # 4-byte Folded Reload
865 ; MMR3-NEXT: movn $1, $2, $3
866 ; MMR3-NEXT: movn $1, $7, $10
867 ; MMR3-NEXT: lw $3, 32($sp) # 4-byte Folded Reload
868 ; MMR3-NEXT: movz $1, $3, $16
869 ; MMR3-NEXT: movn $11, $2, $4
870 ; MMR3-NEXT: movn $2, $11, $10
871 ; MMR3-NEXT: move $3, $8
872 ; MMR3-NEXT: move $4, $1
873 ; MMR3-NEXT: lw $16, 40($sp) # 4-byte Folded Reload
874 ; MMR3-NEXT: lw $17, 44($sp) # 4-byte Folded Reload
875 ; MMR3-NEXT: addiusp 48
876 ; MMR3-NEXT: jrc $ra
877 ;
878 ; MMR6-LABEL: ashr_i128:
879 ; MMR6: # %bb.0: # %entry
880 ; MMR6-NEXT: addiu $sp, $sp, -16
881 ; MMR6-NEXT: .cfi_def_cfa_offset 16
882 ; MMR6-NEXT: sw $17, 12($sp) # 4-byte Folded Spill
883 ; MMR6-NEXT: sw $16, 8($sp) # 4-byte Folded Spill
884 ; MMR6-NEXT: .cfi_offset 17, -4
885 ; MMR6-NEXT: .cfi_offset 16, -8
886 ; MMR6-NEXT: move $1, $7
887 ; MMR6-NEXT: lw $3, 44($sp)
888 ; MMR6-NEXT: li16 $2, 64
889 ; MMR6-NEXT: subu16 $7, $2, $3
890 ; MMR6-NEXT: sllv $8, $5, $7
891 ; MMR6-NEXT: andi16 $2, $7, 32
892 ; MMR6-NEXT: selnez $9, $8, $2
893 ; MMR6-NEXT: sllv $10, $4, $7
894 ; MMR6-NEXT: not16 $7, $7
895 ; MMR6-NEXT: srl16 $16, $5, 1
896 ; MMR6-NEXT: srlv $7, $16, $7
897 ; MMR6-NEXT: or $7, $10, $7
898 ; MMR6-NEXT: seleqz $7, $7, $2
899 ; MMR6-NEXT: or $7, $9, $7
900 ; MMR6-NEXT: srlv $9, $1, $3
901 ; MMR6-NEXT: not16 $16, $3
902 ; MMR6-NEXT: sw $16, 4($sp) # 4-byte Folded Spill
903 ; MMR6-NEXT: sll16 $17, $6, 1
904 ; MMR6-NEXT: sllv $10, $17, $16
905 ; MMR6-NEXT: or $9, $10, $9
906 ; MMR6-NEXT: andi16 $17, $3, 32
907 ; MMR6-NEXT: seleqz $9, $9, $17
908 ; MMR6-NEXT: srlv $10, $6, $3
909 ; MMR6-NEXT: selnez $11, $10, $17
910 ; MMR6-NEXT: seleqz $10, $10, $17
911 ; MMR6-NEXT: or $10, $10, $7
912 ; MMR6-NEXT: seleqz $12, $8, $2
913 ; MMR6-NEXT: or $8, $11, $9
914 ; MMR6-NEXT: addiu $2, $3, -64
915 ; MMR6-NEXT: srlv $9, $5, $2
916 ; MMR6-NEXT: sll16 $7, $4, 1
917 ; MMR6-NEXT: not16 $16, $2
918 ; MMR6-NEXT: sllv $11, $7, $16
919 ; MMR6-NEXT: sltiu $13, $3, 64
920 ; MMR6-NEXT: or $8, $8, $12
921 ; MMR6-NEXT: selnez $10, $10, $13
922 ; MMR6-NEXT: or $9, $11, $9
923 ; MMR6-NEXT: srav $11, $4, $2
924 ; MMR6-NEXT: andi16 $2, $2, 32
925 ; MMR6-NEXT: seleqz $12, $11, $2
926 ; MMR6-NEXT: sra $14, $4, 31
927 ; MMR6-NEXT: selnez $15, $14, $2
928 ; MMR6-NEXT: seleqz $9, $9, $2
929 ; MMR6-NEXT: or $12, $15, $12
930 ; MMR6-NEXT: seleqz $12, $12, $13
931 ; MMR6-NEXT: selnez $2, $11, $2
932 ; MMR6-NEXT: seleqz $11, $14, $13
933 ; MMR6-NEXT: or $10, $10, $12
934 ; MMR6-NEXT: selnez $10, $10, $3
935 ; MMR6-NEXT: selnez $8, $8, $13
936 ; MMR6-NEXT: or $2, $2, $9
937 ; MMR6-NEXT: srav $9, $4, $3
938 ; MMR6-NEXT: seleqz $4, $9, $17
939 ; MMR6-NEXT: selnez $12, $14, $17
940 ; MMR6-NEXT: or $4, $12, $4
941 ; MMR6-NEXT: selnez $12, $4, $13
942 ; MMR6-NEXT: seleqz $2, $2, $13
943 ; MMR6-NEXT: seleqz $4, $6, $3
944 ; MMR6-NEXT: seleqz $1, $1, $3
945 ; MMR6-NEXT: or $2, $8, $2
946 ; MMR6-NEXT: selnez $2, $2, $3
947 ; MMR6-NEXT: or $1, $1, $2
948 ; MMR6-NEXT: or $4, $4, $10
949 ; MMR6-NEXT: or $2, $12, $11
950 ; MMR6-NEXT: srlv $3, $5, $3
951 ; MMR6-NEXT: lw $5, 4($sp) # 4-byte Folded Reload
952 ; MMR6-NEXT: sllv $5, $7, $5
953 ; MMR6-NEXT: or $3, $5, $3
954 ; MMR6-NEXT: seleqz $3, $3, $17
955 ; MMR6-NEXT: selnez $5, $9, $17
956 ; MMR6-NEXT: or $3, $5, $3
957 ; MMR6-NEXT: selnez $3, $3, $13
958 ; MMR6-NEXT: or $3, $3, $11
959 ; MMR6-NEXT: move $5, $1
960 ; MMR6-NEXT: lw $16, 8($sp) # 4-byte Folded Reload
961 ; MMR6-NEXT: lw $17, 12($sp) # 4-byte Folded Reload
962 ; MMR6-NEXT: addiu $sp, $sp, 16
963 ; MMR6-NEXT: jrc $ra
165 entry: 964 entry:
166 ; ALL-LABEL: ashr_i128: 965 ; o32 shouldn't use TImode helpers.
167 966 ; GP32-NOT: lw $25, %call16(__ashrti3)($gp)
168 ; o32 shouldn't use TImode helpers. 967 ; MM-NOT: lw $25, %call16(__ashrti3)($2)
169 ; GP32-NOT: lw $25, %call16(__ashrti3)($gp)
170 ; MM-NOT: lw $25, %call16(__ashrti3)($2)
171
172 ; M3: sll $[[T0:[0-9]+]], $7, 0
173 ; M3: dsrav $[[T1:[0-9]+]], $4, $7
174 ; M3: andi $[[T2:[0-9]+]], $[[T0]], 64
175 ; M3: beqz $[[T3:[0-9]+]], [[BB0:.LBB[0-9_]+]]
176 ; M3: move $3, $[[T1]]
177 ; M3: bnez $[[T3]], [[BB1:.LBB[0-9_]+]]
178 ; M3: nop
179 ; M3: [[EXIT:.LBB[0-9_]+]]:
180 ; M3: jr $ra
181 ; M3: nop
182 ; M3: [[BB0]]:
183 ; M3: dsrlv $[[T4:[0-9]+]], $5, $7
184 ; M3: dsll $[[T5:[0-9]+]], $4, 1
185 ; M3: not $[[T6:[0-9]+]], $[[T0]]
186 ; M3: dsllv $[[T7:[0-9]+]], $[[T5]], $[[T6]]
187 ; M3: beqz $[[T3]], [[EXIT]]
188 ; M3: or $3, $[[T7]], $[[T4]]
189 ; M3: [[BB1]]:
190 ; M3: jr $ra
191 ; M3: dsra $2, $4, 63
192
193 ; GP64-NOT-R6: dsrlv $[[T0:[0-9]+]], $5, $7
194 ; GP64-NOT-R6: dsll $[[T1:[0-9]+]], $4, 1
195 ; GP64-NOT-R6: sll $[[T2:[0-9]+]], $7, 0
196 ; GP64-NOT-R6: not $[[T3:[0-9]+]], $[[T2]]
197 ; GP64-NOT-R6: dsllv $[[T4:[0-9]+]], $[[T1]], $[[T3]]
198 ; GP64-NOT-R6: or $3, $[[T4]], $[[T0]]
199 ; GP64-NOT-R6: dsrav $2, $4, $7
200 ; GP64-NOT-R6: andi $[[T5:[0-9]+]], $[[T2]], 64
201 ; GP64-NOT-R6: movn $3, $2, $[[T5]]
202 ; GP64-NOT-R6: dsra $[[T6:[0-9]+]], $4, 63
203 ; GP64-NOT-R6: jr $ra
204 ; GP64-NOT-R6: movn $2, $[[T6]], $[[T5]]
205
206 ; 64R6: dsrav $[[T0:[0-9]+]], $4, $7
207 ; 64R6: sll $[[T1:[0-9]+]], $7, 0
208 ; 64R6: andi $[[T2:[0-9]+]], $[[T1]], 64
209 ; 64R6: sll $[[T3:[0-9]+]], $[[T2]], 0
210 ; 64R6: seleqz $[[T4:[0-9]+]], $[[T0]], $[[T3]]
211 ; 64R6: dsra $[[T5:[0-9]+]], $4, 63
212 ; 64R6: selnez $[[T6:[0-9]+]], $[[T5]], $[[T3]]
213 ; 64R6: or $2, $[[T6]], $[[T4]]
214 ; 64R6: dsrlv $[[T7:[0-9]+]], $5, $7
215 ; 64R6: dsll $[[T8:[0-9]+]], $4, 1
216 ; 64R6: not $[[T9:[0-9]+]], $[[T1]]
217 ; 64R6: dsllv $[[T10:[0-9]+]], $[[T8]], $[[T9]]
218 ; 64R6: or $[[T11:[0-9]+]], $[[T10]], $[[T7]]
219 ; 64R6: seleqz $[[T12:[0-9]+]], $[[T11]], $[[T3]]
220 ; 64R6: selnez $[[T13:[0-9]+]], $[[T0]], $[[T3]]
221 ; 64R6: jr $ra
222 ; 64R6: or $3, $[[T13]], $[[T12]]
223 968
224 %r = ashr i128 %a, %b 969 %r = ashr i128 %a, %b
225 ret i128 %r 970 ret i128 %r
226 } 971 }