[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / ARM / GlobalISel / arm-instruction-select-combos.mir
blobc2561ade8de137287cbe42219933bacd0ff09200
1 # RUN: llc -O0 -mtriple arm-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
2 --- |
3   define void @test_mla() #0 { ret void }
4   define void @test_mla_commutative() #0 { ret void }
5   define void @test_mla_v5() #1 { ret void }
7   define void @test_mls() #2 { ret void }
8   define void @test_no_mls() { ret void }
10   define void @test_bicrr() { ret void }
11   define void @test_bicrr_commutative() { ret void }
13   define void @test_bicri() { ret void }
14   define void @test_bicri_commutative_xor() { ret void }
15   define void @test_bicri_commutative_and() { ret void }
16   define void @test_bicri_commutative_both() { ret void }
18   define void @test_movti16_0xffff() #2 { ret void }
20   define void @test_vnmuls() #3 { ret void }
21   define void @test_vnmuls_reassociate() #3 { ret void }
22   define void @test_vnmuld() #3 { ret void }
24   define void @test_vfnmas() #4 { ret void }
25   define void @test_vfnmad() #4 { ret void }
27   define void @test_vfmss() #4 { ret void }
28   define void @test_vfmsd() #4 { ret void }
30   define void @test_vfnmss() #4 { ret void }
32   define void @test_bfc() #2 { ret void }
33   define void @test_no_bfc_bad_mask() #2 { ret void }
35   attributes #0 = { "target-features"="+v6" }
36   attributes #1 = { "target-features"="-v6" }
37   attributes #2 = { "target-features"="+v6t2" }
38   attributes #3 = { "target-features"="+vfp2" }
39   attributes #4 = { "target-features"="+vfp4" }
40 ...
41 ---
42 name:            test_mla
43 # CHECK-LABEL: name: test_mla
44 legalized:       true
45 regBankSelected: true
46 selected:        false
47 # CHECK: selected: true
48 registers:
49   - { id: 0, class: gprb }
50   - { id: 1, class: gprb }
51   - { id: 2, class: gprb }
52   - { id: 3, class: gprb }
53   - { id: 4, class: gprb }
54 body:             |
55   bb.0:
56     liveins: $r0, $r1, $r2
58     %0(s32) = COPY $r0
59     %1(s32) = COPY $r1
60     %2(s32) = COPY $r2
61     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
62     ; CHECK: [[VREGY:%[0-9]+]]:gprnopc = COPY $r1
63     ; CHECK: [[VREGZ:%[0-9]+]]:gprnopc = COPY $r2
65     %3(s32) = G_MUL %0, %1
66     %4(s32) = G_ADD %3, %2
67     ; CHECK: [[VREGR:%[0-9]+]]:gprnopc = MLA [[VREGX]], [[VREGY]], [[VREGZ]], 14, $noreg, $noreg
69     $r0 = COPY %4(s32)
70     ; CHECK: $r0 = COPY [[VREGR]]
72     BX_RET 14, $noreg, implicit $r0
73     ; CHECK: BX_RET 14, $noreg, implicit $r0
74 ...
75 ---
76 name:            test_mla_commutative
77 # CHECK-LABEL: name: test_mla_commutative
78 legalized:       true
79 regBankSelected: true
80 selected:        false
81 # CHECK: selected: true
82 registers:
83   - { id: 0, class: gprb }
84   - { id: 1, class: gprb }
85   - { id: 2, class: gprb }
86   - { id: 3, class: gprb }
87   - { id: 4, class: gprb }
88 body:             |
89   bb.0:
90     liveins: $r0, $r1, $r2
92     %0(s32) = COPY $r0
93     %1(s32) = COPY $r1
94     %2(s32) = COPY $r2
95     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
96     ; CHECK: [[VREGY:%[0-9]+]]:gprnopc = COPY $r1
97     ; CHECK: [[VREGZ:%[0-9]+]]:gprnopc = COPY $r2
99     %3(s32) = G_MUL %0, %1
100     %4(s32) = G_ADD %2, %3
101     ; CHECK: [[VREGR:%[0-9]+]]:gprnopc = MLA [[VREGX]], [[VREGY]], [[VREGZ]], 14, $noreg, $noreg
103     $r0 = COPY %4(s32)
104     ; CHECK: $r0 = COPY [[VREGR]]
106     BX_RET 14, $noreg, implicit $r0
107     ; CHECK: BX_RET 14, $noreg, implicit $r0
110 name:            test_mla_v5
111 # CHECK-LABEL: name: test_mla_v5
112 legalized:       true
113 regBankSelected: true
114 selected:        false
115 # CHECK: selected: true
116 registers:
117   - { id: 0, class: gprb }
118   - { id: 1, class: gprb }
119   - { id: 2, class: gprb }
120   - { id: 3, class: gprb }
121   - { id: 4, class: gprb }
122 body:             |
123   bb.0:
124     liveins: $r0, $r1, $r2
126     %0(s32) = COPY $r0
127     %1(s32) = COPY $r1
128     %2(s32) = COPY $r2
129     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
130     ; CHECK: [[VREGY:%[0-9]+]]:gprnopc = COPY $r1
131     ; CHECK: [[VREGZ:%[0-9]+]]:gprnopc = COPY $r2
133     %3(s32) = G_MUL %0, %1
134     %4(s32) = G_ADD %3, %2
135     ; CHECK: [[VREGR:%[0-9]+]]:gprnopc = MLAv5 [[VREGX]], [[VREGY]], [[VREGZ]], 14, $noreg, $noreg
137     $r0 = COPY %4(s32)
138     ; CHECK: $r0 = COPY [[VREGR]]
140     BX_RET 14, $noreg, implicit $r0
141     ; CHECK: BX_RET 14, $noreg, implicit $r0
144 name:            test_mls
145 # CHECK-LABEL: name: test_mls
146 legalized:       true
147 regBankSelected: true
148 selected:        false
149 # CHECK: selected: true
150 registers:
151   - { id: 0, class: gprb }
152   - { id: 1, class: gprb }
153   - { id: 2, class: gprb }
154   - { id: 3, class: gprb }
155   - { id: 4, class: gprb }
156 body:             |
157   bb.0:
158     liveins: $r0, $r1, $r2
160     %0(s32) = COPY $r0
161     %1(s32) = COPY $r1
162     %2(s32) = COPY $r2
163     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
164     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
165     ; CHECK: [[VREGZ:%[0-9]+]]:gpr = COPY $r2
167     %3(s32) = G_MUL %0, %1
168     %4(s32) = G_SUB %2, %3
169     ; CHECK: [[VREGR:%[0-9]+]]:gpr = MLS [[VREGX]], [[VREGY]], [[VREGZ]], 14, $noreg
171     $r0 = COPY %4(s32)
172     ; CHECK: $r0 = COPY [[VREGR]]
174     BX_RET 14, $noreg, implicit $r0
175     ; CHECK: BX_RET 14, $noreg, implicit $r0
178 name:            test_no_mls
179 # CHECK-LABEL: name: test_no_mls
180 legalized:       true
181 regBankSelected: true
182 selected:        false
183 # CHECK: selected: true
184 registers:
185   - { id: 0, class: gprb }
186   - { id: 1, class: gprb }
187   - { id: 2, class: gprb }
188   - { id: 3, class: gprb }
189   - { id: 4, class: gprb }
190 body:             |
191   bb.0:
192     liveins: $r0, $r1, $r2
194     %0(s32) = COPY $r0
195     %1(s32) = COPY $r1
196     %2(s32) = COPY $r2
197     ; CHECK: [[VREGX:%[0-9]+]]:gprnopc = COPY $r0
198     ; CHECK: [[VREGY:%[0-9]+]]:gprnopc = COPY $r1
199     ; CHECK: [[VREGZ:%[0-9]+]]:gpr = COPY $r2
201     %3(s32) = G_MUL %0, %1
202     %4(s32) = G_SUB %2, %3
203     ; CHECK: [[VREGM:%[0-9]+]]:gprnopc = MULv5 [[VREGX]], [[VREGY]], 14, $noreg, $noreg
204     ; CHECK: [[VREGR:%[0-9]+]]:gpr = SUBrr [[VREGZ]], [[VREGM]], 14, $noreg, $noreg
206     $r0 = COPY %4(s32)
207     ; CHECK: $r0 = COPY [[VREGR]]
209     BX_RET 14, $noreg, implicit $r0
210     ; CHECK: BX_RET 14, $noreg, implicit $r0
213 name:            test_bicrr
214 # CHECK-LABEL: name: test_bicrr
215 legalized:       true
216 regBankSelected: true
217 selected:        false
218 # CHECK: selected: true
219 registers:
220   - { id: 0, class: gprb }
221   - { id: 1, class: gprb }
222   - { id: 2, class: gprb }
223   - { id: 3, class: gprb }
224   - { id: 4, class: gprb }
225 body:             |
226   bb.0:
227     liveins: $r0, $r1
229     %0(s32) = COPY $r0
230     %1(s32) = COPY $r1
231     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
232     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
234     %2(s32) = G_CONSTANT i32 -1
235     %3(s32) = G_XOR %1, %2
236     %4(s32) = G_AND %0, %3
237     ; CHECK: [[VREGR:%[0-9]+]]:gpr = BICrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
239     $r0 = COPY %4(s32)
240     ; CHECK: $r0 = COPY [[VREGR]]
242     BX_RET 14, $noreg, implicit $r0
243     ; CHECK: BX_RET 14, $noreg, implicit $r0
246 name:            test_bicrr_commutative
247 # CHECK-LABEL: name: test_bicrr_commutative
248 legalized:       true
249 regBankSelected: true
250 selected:        false
251 # CHECK: selected: true
252 registers:
253   - { id: 0, class: gprb }
254   - { id: 1, class: gprb }
255   - { id: 2, class: gprb }
256   - { id: 3, class: gprb }
257   - { id: 4, class: gprb }
258 body:             |
259   bb.0:
260     liveins: $r0, $r1
262     %0(s32) = COPY $r0
263     %1(s32) = COPY $r1
264     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
265     ; CHECK: [[VREGY:%[0-9]+]]:gpr = COPY $r1
267     %2(s32) = G_CONSTANT i32 -1
268     %3(s32) = G_XOR %1, %2
269     %4(s32) = G_AND %3, %0
270     ; CHECK: [[VREGR:%[0-9]+]]:gpr = BICrr [[VREGX]], [[VREGY]], 14, $noreg, $noreg
272     $r0 = COPY %4(s32)
273     ; CHECK: $r0 = COPY [[VREGR]]
275     BX_RET 14, $noreg, implicit $r0
276     ; CHECK: BX_RET 14, $noreg, implicit $r0
279 name:            test_bicri
280 # CHECK-LABEL: name: test_bicri
281 legalized:       true
282 regBankSelected: true
283 selected:        false
284 # CHECK: selected: true
285 registers:
286   - { id: 0, class: gprb }
287   - { id: 1, class: gprb }
288   - { id: 2, class: gprb }
289   - { id: 3, class: gprb }
290   - { id: 4, class: gprb }
291 body:             |
292   bb.0:
293     liveins: $r0
295     %0(s32) = COPY $r0
296     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
298     ; This test and the following ones are a bit contrived, since they use a
299     ; G_XOR that can be constant-folded. They exist mostly to validate the
300     ; TableGen pattern that defines BICri. We also have a pattern for matching a
301     ; G_AND with a G_CONSTANT operand directly, which is the more common case,
302     ; but that will be covered by different tests.
303     %1(s32) = G_CONSTANT i32 192
305     %2(s32) = G_CONSTANT i32 -1
306     %3(s32) = G_XOR %1, %2
307     %4(s32) = G_AND %0, %3
308     ; CHECK: [[VREGR:%[0-9]+]]:gpr = BICri [[VREGX]], 192, 14, $noreg, $noreg
310     $r0 = COPY %4(s32)
311     ; CHECK: $r0 = COPY [[VREGR]]
313     BX_RET 14, $noreg, implicit $r0
314     ; CHECK: BX_RET 14, $noreg, implicit $r0
317 name:            test_bicri_commutative_xor
318 # CHECK-LABEL: name: test_bicri_commutative_xor
319 legalized:       true
320 regBankSelected: true
321 selected:        false
322 # CHECK: selected: true
323 registers:
324   - { id: 0, class: gprb }
325   - { id: 1, class: gprb }
326   - { id: 2, class: gprb }
327   - { id: 3, class: gprb }
328   - { id: 4, class: gprb }
329 body:             |
330   bb.0:
331     liveins: $r0
333     %0(s32) = COPY $r0
334     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
336     %1(s32) = G_CONSTANT i32 192
338     %2(s32) = G_CONSTANT i32 -1
339     %3(s32) = G_XOR %2, %1
340     %4(s32) = G_AND %0, %3
341     ; CHECK: [[VREGR:%[0-9]+]]:gpr = BICri [[VREGX]], 192, 14, $noreg, $noreg
343     $r0 = COPY %4(s32)
344     ; CHECK: $r0 = COPY [[VREGR]]
346     BX_RET 14, $noreg, implicit $r0
347     ; CHECK: BX_RET 14, $noreg, implicit $r0
350 name:            test_bicri_commutative_and
351 # CHECK-LABEL: name: test_bicri_commutative_and
352 legalized:       true
353 regBankSelected: true
354 selected:        false
355 # CHECK: selected: true
356 registers:
357   - { id: 0, class: gprb }
358   - { id: 1, class: gprb }
359   - { id: 2, class: gprb }
360   - { id: 3, class: gprb }
361   - { id: 4, class: gprb }
362 body:             |
363   bb.0:
364     liveins: $r0
366     %0(s32) = COPY $r0
367     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
369     %1(s32) = G_CONSTANT i32 192
371     %2(s32) = G_CONSTANT i32 -1
372     %3(s32) = G_XOR %1, %2
373     %4(s32) = G_AND %3, %0
374     ; CHECK: [[VREGR:%[0-9]+]]:gpr = BICri [[VREGX]], 192, 14, $noreg, $noreg
376     $r0 = COPY %4(s32)
377     ; CHECK: $r0 = COPY [[VREGR]]
379     BX_RET 14, $noreg, implicit $r0
380     ; CHECK: BX_RET 14, $noreg, implicit $r0
383 name:            test_bicri_commutative_both
384 # CHECK-LABEL: name: test_bicri_commutative_both
385 legalized:       true
386 regBankSelected: true
387 selected:        false
388 # CHECK: selected: true
389 registers:
390   - { id: 0, class: gprb }
391   - { id: 1, class: gprb }
392   - { id: 2, class: gprb }
393   - { id: 3, class: gprb }
394   - { id: 4, class: gprb }
395 body:             |
396   bb.0:
397     liveins: $r0
399     %0(s32) = COPY $r0
400     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
402     %1(s32) = G_CONSTANT i32 192
404     %2(s32) = G_CONSTANT i32 -1
405     %3(s32) = G_XOR %2, %1
406     %4(s32) = G_AND %3, %0
407     ; CHECK: [[VREGR:%[0-9]+]]:gpr = BICri [[VREGX]], 192, 14, $noreg, $noreg
409     $r0 = COPY %4(s32)
410     ; CHECK: $r0 = COPY [[VREGR]]
412     BX_RET 14, $noreg, implicit $r0
413     ; CHECK: BX_RET 14, $noreg, implicit $r0
416 name:            test_movti16_0xffff
417 # CHECK-LABEL: name: test_movti16_0xffff
418 legalized:       true
419 regBankSelected: true
420 selected:        false
421 # CHECK: selected: true
422 registers:
423   - { id: 0, class: gprb }
424   - { id: 1, class: gprb }
425   - { id: 2, class: gprb }
426 body:             |
427   bb.0:
428     liveins: $r0
430     %0(s32) = COPY $r0
431     ; CHECK: [[VREGX:%[0-9]+]]:gpr = COPY $r0
433     %1(s32) = G_CONSTANT i32 4294901760 ; 0xFFFF0000
435     %2(s32) = G_OR %0, %1
436     ; CHECK: [[VREGR:%[0-9]+]]:gprnopc = MOVTi16 [[VREGX]], 65535, 14, $noreg
438     $r0 = COPY %2(s32)
439     ; CHECK: $r0 = COPY [[VREGR]]
441     BX_RET 14, $noreg, implicit $r0
442     ; CHECK: BX_RET 14, $noreg, implicit $r0
445 name:            test_vnmuls
446 # CHECK-LABEL: name: test_vnmuls
447 legalized:       true
448 regBankSelected: true
449 selected:        false
450 # CHECK: selected: true
451 registers:
452   - { id: 0, class: fprb }
453   - { id: 1, class: fprb }
454   - { id: 2, class: fprb }
455   - { id: 3, class: fprb }
456 body:             |
457   bb.0:
458     liveins: $s0, $s1
460     %0(s32) = COPY $s0
461     %1(s32) = COPY $s1
462     ; CHECK-DAG: [[VREGX:%[0-9]+]]:spr = COPY $s0
463     ; CHECK-DAG: [[VREGY:%[0-9]+]]:spr = COPY $s1
465     %2(s32) = G_FMUL %0, %1
466     %3(s32) = G_FNEG %2
467     ; CHECK: [[VREGR:%[0-9]+]]:spr = VNMULS [[VREGX]], [[VREGY]], 14, $noreg
469     $s0 = COPY %3(s32)
470     ; CHECK: $s0 = COPY [[VREGR]]
472     BX_RET 14, $noreg, implicit $s0
473     ; CHECK: BX_RET 14, $noreg, implicit $s0
476 name:            test_vnmuls_reassociate
477 # CHECK-LABEL: name: test_vnmuls_reassociate
478 legalized:       true
479 regBankSelected: true
480 selected:        false
481 # CHECK: selected: true
482 registers:
483   - { id: 0, class: fprb }
484   - { id: 1, class: fprb }
485   - { id: 2, class: fprb }
486   - { id: 3, class: fprb }
487 body:             |
488   bb.0:
489     liveins: $s0, $s1
491     %0(s32) = COPY $s0
492     %1(s32) = COPY $s1
493     ; CHECK-DAG: [[VREGX:%[0-9]+]]:spr = COPY $s0
494     ; CHECK-DAG: [[VREGY:%[0-9]+]]:spr = COPY $s1
496     %2(s32) = G_FNEG %0
497     %3(s32) = G_FMUL %1, %2
498     ; CHECK: [[VREGR:%[0-9]+]]:spr = VNMULS [[VREGX]], [[VREGY]], 14, $noreg
500     $s0 = COPY %3(s32)
501     ; CHECK: $s0 = COPY [[VREGR]]
503     BX_RET 14, $noreg, implicit $s0
504     ; CHECK: BX_RET 14, $noreg, implicit $s0
507 name:            test_vnmuld
508 # CHECK-LABEL: name: test_vnmuld
509 legalized:       true
510 regBankSelected: true
511 selected:        false
512 # CHECK: selected: true
513 registers:
514   - { id: 0, class: fprb }
515   - { id: 1, class: fprb }
516   - { id: 2, class: fprb }
517   - { id: 3, class: fprb }
518 body:             |
519   bb.0:
520     liveins: $d0, $d1
522     %0(s64) = COPY $d0
523     %1(s64) = COPY $d1
524     ; CHECK-DAG: [[VREGX:%[0-9]+]]:dpr = COPY $d0
525     ; CHECK-DAG: [[VREGY:%[0-9]+]]:dpr = COPY $d1
527     %2(s64) = G_FMUL %0, %1
528     %3(s64) = G_FNEG %2
529     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VNMULD [[VREGX]], [[VREGY]], 14, $noreg
531     $d0 = COPY %3(s64)
532     ; CHECK: $d0 = COPY [[VREGR]]
534     BX_RET 14, $noreg, implicit $d0
535     ; CHECK: BX_RET 14, $noreg, implicit $d0
538 name:            test_vfnmas
539 # CHECK-LABEL: name: test_vfnmas
540 legalized:       true
541 regBankSelected: true
542 selected:        false
543 # CHECK: selected: true
544 registers:
545   - { id: 0, class: fprb }
546   - { id: 1, class: fprb }
547   - { id: 2, class: fprb }
548   - { id: 3, class: fprb }
549   - { id: 4, class: fprb }
550 body:             |
551   bb.0:
552     liveins: $s0, $s1, $s2
554     %0(s32) = COPY $s0
555     %1(s32) = COPY $s1
556     %2(s32) = COPY $s2
557     ; CHECK-DAG: [[VREGX:%[0-9]+]]:spr = COPY $s0
558     ; CHECK-DAG: [[VREGY:%[0-9]+]]:spr = COPY $s1
559     ; CHECK-DAG: [[VREGZ:%[0-9]+]]:spr = COPY $s2
561     %3(s32) = G_FMA %0, %1, %2
562     %4(s32) = G_FNEG %3
563     ; CHECK: [[VREGR:%[0-9]+]]:spr = VFNMAS [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
565     $s0 = COPY %4(s32)
566     ; CHECK: $s0 = COPY [[VREGR]]
568     BX_RET 14, $noreg, implicit $s0
569     ; CHECK: BX_RET 14, $noreg, implicit $s0
572 name:            test_vfnmad
573 # CHECK-LABEL: name: test_vfnmad
574 legalized:       true
575 regBankSelected: true
576 selected:        false
577 # CHECK: selected: true
578 registers:
579   - { id: 0, class: fprb }
580   - { id: 1, class: fprb }
581   - { id: 2, class: fprb }
582   - { id: 3, class: fprb }
583   - { id: 4, class: fprb }
584   - { id: 5, class: fprb }
585 body:             |
586   bb.0:
587     liveins: $d0, $d1, $d2
589     %0(s64) = COPY $d0
590     %1(s64) = COPY $d1
591     %2(s64) = COPY $d2
592     ; CHECK-DAG: [[VREGX:%[0-9]+]]:dpr = COPY $d0
593     ; CHECK-DAG: [[VREGY:%[0-9]+]]:dpr = COPY $d1
594     ; CHECK-DAG: [[VREGZ:%[0-9]+]]:dpr = COPY $d2
596     %3(s64) = G_FNEG %0
597     %4(s64) = G_FNEG %2
598     %5(s64) = G_FMA %3, %1, %4
599     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VFNMAD [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
601     $d0 = COPY %5(s64)
602     ; CHECK: $d0 = COPY [[VREGR]]
604     BX_RET 14, $noreg, implicit $d0
605     ; CHECK: BX_RET 14, $noreg, implicit $d0
608 name:            test_vfmss
609 # CHECK-LABEL: name: test_vfmss
610 legalized:       true
611 regBankSelected: true
612 selected:        false
613 # CHECK: selected: true
614 registers:
615   - { id: 0, class: fprb }
616   - { id: 1, class: fprb }
617   - { id: 2, class: fprb }
618   - { id: 3, class: fprb }
619   - { id: 4, class: fprb }
620 body:             |
621   bb.0:
622     liveins: $s0, $s1, $s2
624     %0(s32) = COPY $s0
625     %1(s32) = COPY $s1
626     %2(s32) = COPY $s2
627     ; CHECK-DAG: [[VREGX:%[0-9]+]]:spr = COPY $s0
628     ; CHECK-DAG: [[VREGY:%[0-9]+]]:spr = COPY $s1
629     ; CHECK-DAG: [[VREGZ:%[0-9]+]]:spr = COPY $s2
631     %3(s32) = G_FNEG %0
632     %4(s32) = G_FMA %3, %1, %2
633     ; CHECK: [[VREGR:%[0-9]+]]:spr = VFMSS [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
635     $s0 = COPY %4(s32)
636     ; CHECK: $s0 = COPY [[VREGR]]
638     BX_RET 14, $noreg, implicit $s0
639     ; CHECK: BX_RET 14, $noreg, implicit $s0
642 name:            test_vfmsd
643 # CHECK-LABEL: name: test_vfmsd
644 legalized:       true
645 regBankSelected: true
646 selected:        false
647 # CHECK: selected: true
648 registers:
649   - { id: 0, class: fprb }
650   - { id: 1, class: fprb }
651   - { id: 2, class: fprb }
652   - { id: 3, class: fprb }
653   - { id: 4, class: fprb }
654 body:             |
655   bb.0:
656     liveins: $d0, $d1, $d2
658     %0(s64) = COPY $d0
659     %1(s64) = COPY $d1
660     %2(s64) = COPY $d2
661     ; CHECK-DAG: [[VREGX:%[0-9]+]]:dpr = COPY $d0
662     ; CHECK-DAG: [[VREGY:%[0-9]+]]:dpr = COPY $d1
663     ; CHECK-DAG: [[VREGZ:%[0-9]+]]:dpr = COPY $d2
665     %3(s64) = G_FNEG %1
666     %4(s64) = G_FMA %0, %3, %2
667     ; CHECK: [[VREGR:%[0-9]+]]:dpr = VFMSD [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
669     $d0 = COPY %4(s64)
670     ; CHECK: $d0 = COPY [[VREGR]]
672     BX_RET 14, $noreg, implicit $d0
673     ; CHECK: BX_RET 14, $noreg, implicit $d0
676 name:            test_vfnmss
677 # CHECK-LABEL: name: test_vfnmss
678 legalized:       true
679 regBankSelected: true
680 selected:        false
681 # CHECK: selected: true
682 registers:
683   - { id: 0, class: fprb }
684   - { id: 1, class: fprb }
685   - { id: 2, class: fprb }
686   - { id: 3, class: fprb }
687   - { id: 4, class: fprb }
688 body:             |
689   bb.0:
690     liveins: $s0, $s1, $s2
692     %0(s32) = COPY $s0
693     %1(s32) = COPY $s1
694     %2(s32) = COPY $s2
695     ; CHECK-DAG: [[VREGX:%[0-9]+]]:spr = COPY $s0
696     ; CHECK-DAG: [[VREGY:%[0-9]+]]:spr = COPY $s1
697     ; CHECK-DAG: [[VREGZ:%[0-9]+]]:spr = COPY $s2
699     %3(s32) = G_FNEG %2
700     %4(s32) = G_FMA %0, %1, %3
701     ; CHECK: [[VREGR:%[0-9]+]]:spr = VFNMSS [[VREGZ]], [[VREGX]], [[VREGY]], 14, $noreg
703     $s0 = COPY %4(s32)
704     ; CHECK: $s0 = COPY [[VREGR]]
706     BX_RET 14, $noreg, implicit $s0
707     ; CHECK: BX_RET 14, $noreg, implicit $s0
710 name:            test_bfc
711 # CHECK-LABEL: name: test_bfc
712 legalized:       true
713 regBankSelected: true
714 selected:        false
715 # CHECK: selected: true
716 registers:
717   - { id: 0, class: gprb }
718   - { id: 1, class: gprb }
719   - { id: 2, class: gprb }
720 body:             |
721   bb.0:
722     liveins: $r0
724     %0(s32) = COPY $r0
725     %1(s32) = G_CONSTANT i32 -65529 ; 0xFFFF0007
726     %2(s32) = G_AND %0, %1
727     ; CHECK: [[RS:%[0-9]+]]:gpr = COPY $r0
728     ; CHECK: [[RD:%[0-9]+]]:gpr = BFC [[RS]], -65529, 14, $noreg
730     $r0 = COPY %2(s32)
731     ; CHECK: $r0 = COPY [[RD]]
733     BX_RET 14, $noreg, implicit $r0
734     ; CHECK: BX_RET 14, $noreg, implicit $r0
737 name:            test_no_bfc_bad_mask
738 # CHECK-LABEL: name: test_no_bfc_bad_mask
739 legalized:       true
740 regBankSelected: true
741 selected:        false
742 # CHECK: selected: true
743 registers:
744   - { id: 0, class: gprb }
745   - { id: 1, class: gprb }
746   - { id: 2, class: gprb }
747 body:             |
748   bb.0:
749     liveins: $r0
751     %0(s32) = COPY $r0
752     %1(s32) = G_CONSTANT i32 6 ; 0x00000006
753     %2(s32) = G_AND %0, %1
754     ; CHECK: [[RS:%[0-9]+]]:gpr = COPY $r0
755     ; CHECK-NOT: BFC
757     $r0 = COPY %2(s32)
758     ; CHECK: $r0 = COPY [[RD]]
760     BX_RET 14, $noreg, implicit $r0
761     ; CHECK: BX_RET 14, $noreg, implicit $r0