11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2- ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
2+ ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+ ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI
34
45define i32 @fold_urem_positive_odd (i32 %x ) {
56; CHECK-LABEL: fold_urem_positive_odd:
@@ -18,37 +19,54 @@ define i32 @fold_urem_positive_odd(i32 %x) {
1819 ret i32 %1
1920}
2021
21-
2222define i32 @fold_urem_positive_even (i32 %x ) {
23- ; CHECK-LABEL: fold_urem_positive_even:
24- ; CHECK: // %bb.0:
25- ; CHECK-NEXT: mov w8, #16323 // =0x3fc3
26- ; CHECK-NEXT: mov w9, #1060 // =0x424
27- ; CHECK-NEXT: movk w8, #63310, lsl #16
28- ; CHECK-NEXT: umull x8, w0, w8
29- ; CHECK-NEXT: lsr x8, x8, #42
30- ; CHECK-NEXT: msub w0, w8, w9, w0
31- ; CHECK-NEXT: ret
23+ ; CHECK-SD-LABEL: fold_urem_positive_even:
24+ ; CHECK-SD: // %bb.0:
25+ ; CHECK-SD-NEXT: mov w8, #16323 // =0x3fc3
26+ ; CHECK-SD-NEXT: mov w9, #1060 // =0x424
27+ ; CHECK-SD-NEXT: movk w8, #63310, lsl #16
28+ ; CHECK-SD-NEXT: umull x8, w0, w8
29+ ; CHECK-SD-NEXT: lsr x8, x8, #42
30+ ; CHECK-SD-NEXT: msub w0, w8, w9, w0
31+ ; CHECK-SD-NEXT: ret
32+ ;
33+ ; CHECK-GI-LABEL: fold_urem_positive_even:
34+ ; CHECK-GI: // %bb.0:
35+ ; CHECK-GI-NEXT: mov w8, #16323 // =0x3fc3
36+ ; CHECK-GI-NEXT: mov w9, #1060 // =0x424
37+ ; CHECK-GI-NEXT: movk w8, #63310, lsl #16
38+ ; CHECK-GI-NEXT: umull x8, w0, w8
39+ ; CHECK-GI-NEXT: lsr x8, x8, #32
40+ ; CHECK-GI-NEXT: lsr w8, w8, #10
41+ ; CHECK-GI-NEXT: msub w0, w8, w9, w0
42+ ; CHECK-GI-NEXT: ret
3243 %1 = urem i32 %x , 1060
3344 ret i32 %1
3445}
3546
36-
3747; Don't fold if we can combine urem with udiv.
3848define i32 @combine_urem_udiv (i32 %x ) {
39- ; CHECK-LABEL: combine_urem_udiv:
40- ; CHECK: // %bb.0:
41- ; CHECK-NEXT: mov w8, #8969 // =0x2309
42- ; CHECK-NEXT: movk w8, #22765, lsl #16
43- ; CHECK-NEXT: umull x8, w0, w8
44- ; CHECK-NEXT: lsr x8, x8, #32
45- ; CHECK-NEXT: sub w9, w0, w8
46- ; CHECK-NEXT: add w8, w8, w9, lsr #1
47- ; CHECK-NEXT: mov w9, #95 // =0x5f
48- ; CHECK-NEXT: lsr w8, w8, #6
49- ; CHECK-NEXT: msub w9, w8, w9, w0
50- ; CHECK-NEXT: add w0, w9, w8
51- ; CHECK-NEXT: ret
49+ ; CHECK-SD-LABEL: combine_urem_udiv:
50+ ; CHECK-SD: // %bb.0:
51+ ; CHECK-SD-NEXT: mov w8, #8969 // =0x2309
52+ ; CHECK-SD-NEXT: movk w8, #22765, lsl #16
53+ ; CHECK-SD-NEXT: umull x8, w0, w8
54+ ; CHECK-SD-NEXT: lsr x8, x8, #32
55+ ; CHECK-SD-NEXT: sub w9, w0, w8
56+ ; CHECK-SD-NEXT: add w8, w8, w9, lsr #1
57+ ; CHECK-SD-NEXT: mov w9, #95 // =0x5f
58+ ; CHECK-SD-NEXT: lsr w8, w8, #6
59+ ; CHECK-SD-NEXT: msub w9, w8, w9, w0
60+ ; CHECK-SD-NEXT: add w0, w9, w8
61+ ; CHECK-SD-NEXT: ret
62+ ;
63+ ; CHECK-GI-LABEL: combine_urem_udiv:
64+ ; CHECK-GI: // %bb.0:
65+ ; CHECK-GI-NEXT: mov w8, #95 // =0x5f
66+ ; CHECK-GI-NEXT: udiv w9, w0, w8
67+ ; CHECK-GI-NEXT: msub w8, w9, w8, w0
68+ ; CHECK-GI-NEXT: add w0, w8, w9
69+ ; CHECK-GI-NEXT: ret
5270 %1 = urem i32 %x , 95
5371 %2 = udiv i32 %x , 95
5472 %3 = add i32 %1 , %2
0 commit comments