xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/select-bitfield-insert.ll (revision db158c7c830807caeeb0691739c41f1d522029e9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -o - -verify-machineinstrs -global-isel=1 -global-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,GISEL
3; RUN: llc < %s -o - -verify-machineinstrs -global-isel=0 | FileCheck %s --check-prefixes=CHECK,SDAG
4
5target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6target triple = "arm64-apple-ios14.5.0"
7
8define i32 @bfi_w_31(i32 %in1, i32 %in2) {
9; CHECK-LABEL: bfi_w_31:
10; CHECK:       ; %bb.0: ; %bb
11; CHECK-NEXT:    bfi w1, w0, #31, #1
12; CHECK-NEXT:    mov w0, w1
13; CHECK-NEXT:    ret
14bb:
15  %tmp3 = shl i32 %in1, 31
16  %tmp4 = and i32 %in2, 2147483647
17  %out = or i32 %tmp3, %tmp4
18  ret i32 %out
19}
20
21define i32 @bfi_w_8(i32 %in1, i32 %in2) {
22; CHECK-LABEL: bfi_w_8:
23; CHECK:       ; %bb.0: ; %bb
24; CHECK-NEXT:    bfi w1, w0, #8, #24
25; CHECK-NEXT:    mov w0, w1
26; CHECK-NEXT:    ret
27bb:
28  %tmp3 = shl i32 %in1, 8
29  %tmp4 = and i32 %in2, 255
30  %out = or i32 %tmp3, %tmp4
31  ret i32 %out
32}
33
34define i32 @bfi_w_1(i32 %in1, i32 %in2) {
35; CHECK-LABEL: bfi_w_1:
36; CHECK:       ; %bb.0: ; %bb
37; CHECK-NEXT:    bfi w1, w0, #1, #31
38; CHECK-NEXT:    mov w0, w1
39; CHECK-NEXT:    ret
40bb:
41  %tmp3 = shl i32 %in1, 1
42  %tmp4 = and i32 %in2, 1
43  %out = or i32 %tmp3, %tmp4
44  ret i32 %out
45}
46
47define i64 @bfi_x_63(i64 %in1, i64 %in2) {
48; CHECK-LABEL: bfi_x_63:
49; CHECK:       ; %bb.0: ; %bb
50; CHECK-NEXT:    bfi x1, x0, #63, #1
51; CHECK-NEXT:    mov x0, x1
52; CHECK-NEXT:    ret
53bb:
54  %tmp3 = shl i64 %in1, 63
55  %tmp4 = and i64 %in2, 9223372036854775807
56  %out = or i64 %tmp3, %tmp4
57  ret i64 %out
58}
59
60define i64 @bfi_x_31(i64 %in1, i64 %in2) {
61; CHECK-LABEL: bfi_x_31:
62; CHECK:       ; %bb.0: ; %bb
63; CHECK-NEXT:    bfi x1, x0, #31, #33
64; CHECK-NEXT:    mov x0, x1
65; CHECK-NEXT:    ret
66bb:
67  %tmp3 = shl i64 %in1, 31
68  %tmp4 = and i64 %in2, 2147483647
69  %out = or i64 %tmp3, %tmp4
70  ret i64 %out
71}
72
73define i64 @bfi_x_8(i64 %in1, i64 %in2) {
74; CHECK-LABEL: bfi_x_8:
75; CHECK:       ; %bb.0: ; %bb
76; CHECK-NEXT:    bfi x1, x0, #8, #56
77; CHECK-NEXT:    mov x0, x1
78; CHECK-NEXT:    ret
79bb:
80  %tmp3 = shl i64 %in1, 8
81  %tmp4 = and i64 %in2, 255
82  %out = or i64 %tmp3, %tmp4
83  ret i64 %out
84}
85
86define i64 @bfi_x_1(i64 %in1, i64 %in2) {
87; CHECK-LABEL: bfi_x_1:
88; CHECK:       ; %bb.0: ; %bb
89; CHECK-NEXT:    bfi x1, x0, #1, #63
90; CHECK-NEXT:    mov x0, x1
91; CHECK-NEXT:    ret
92bb:
93  %tmp3 = shl i64 %in1, 1
94  %tmp4 = and i64 %in2, 1
95  %out = or i64 %tmp3, %tmp4
96  ret i64 %out
97}
98
99define i64 @bfi_x_1_swapped(i64 %in1, i64 %in2) {
100; CHECK-LABEL: bfi_x_1_swapped:
101; CHECK:       ; %bb.0: ; %bb
102; CHECK-NEXT:    bfi x1, x0, #1, #63
103; CHECK-NEXT:    mov x0, x1
104; CHECK-NEXT:    ret
105bb:
106  %tmp3 = shl i64 %in1, 1
107  %tmp4 = and i64 %in2, 1
108  %out = or i64 %tmp4, %tmp3
109  ret i64 %out
110}
111
112define i64 @extra_use1(i64 %in1, i64 %in2, ptr %p) {
113; GISEL-LABEL: extra_use1:
114; GISEL:       ; %bb.0: ; %bb
115; GISEL-NEXT:    lsl x8, x0, #1
116; GISEL-NEXT:    and x9, x1, #0x1
117; GISEL-NEXT:    orr x0, x8, x9
118; GISEL-NEXT:    str x8, [x2]
119; GISEL-NEXT:    ret
120;
121; SDAG-LABEL: extra_use1:
122; SDAG:       ; %bb.0: ; %bb
123; SDAG-NEXT:    bfi x1, x0, #1, #63
124; SDAG-NEXT:    lsl x8, x0, #1
125; SDAG-NEXT:    mov x0, x1
126; SDAG-NEXT:    str x8, [x2]
127; SDAG-NEXT:    ret
128bb:
129  %tmp3 = shl i64 %in1, 1
130  %tmp4 = and i64 %in2, 1
131  %out = or i64 %tmp3, %tmp4
132  store i64 %tmp3, ptr %p
133  ret i64 %out
134}
135
136define i64 @extra_use2(i64 %in1, i64 %in2, ptr %p) {
137; GISEL-LABEL: extra_use2:
138; GISEL:       ; %bb.0: ; %bb
139; GISEL-NEXT:    and x8, x1, #0x1
140; GISEL-NEXT:    orr x0, x8, x0, lsl #1
141; GISEL-NEXT:    str x8, [x2]
142; GISEL-NEXT:    ret
143;
144; SDAG-LABEL: extra_use2:
145; SDAG:       ; %bb.0: ; %bb
146; SDAG-NEXT:    and x8, x1, #0x1
147; SDAG-NEXT:    bfi x1, x0, #1, #63
148; SDAG-NEXT:    str x8, [x2]
149; SDAG-NEXT:    mov x0, x1
150; SDAG-NEXT:    ret
151bb:
152  %tmp3 = shl i64 %in1, 1
153  %tmp4 = and i64 %in2, 1
154  %out = or i64 %tmp3, %tmp4
155  store i64 %tmp4, ptr %p
156  ret i64 %out
157}
158