xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/and.ll (revision 718331f55529469586c99a55e4b382a1c7485842)
1ed078c48SWANG Xuerui; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
29d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
39d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4709e4ad0SWeining Lu
5709e4ad0SWeining Lu;; Exercise the 'and' LLVM IR: https://llvm.org/docs/LangRef.html#and-instruction
6709e4ad0SWeining Lu
7709e4ad0SWeining Ludefine i1 @and_i1(i1 %a, i1 %b) {
8709e4ad0SWeining Lu; LA32-LABEL: and_i1:
9709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
10709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
11ed078c48SWANG Xuerui; LA32-NEXT:    ret
12709e4ad0SWeining Lu;
13709e4ad0SWeining Lu; LA64-LABEL: and_i1:
14709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
15709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
16ed078c48SWANG Xuerui; LA64-NEXT:    ret
17709e4ad0SWeining Luentry:
18709e4ad0SWeining Lu  %r = and i1 %a, %b
19709e4ad0SWeining Lu  ret i1 %r
20709e4ad0SWeining Lu}
21709e4ad0SWeining Lu
22709e4ad0SWeining Ludefine i8 @and_i8(i8 %a, i8 %b) {
23709e4ad0SWeining Lu; LA32-LABEL: and_i8:
24709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
25709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
26ed078c48SWANG Xuerui; LA32-NEXT:    ret
27709e4ad0SWeining Lu;
28709e4ad0SWeining Lu; LA64-LABEL: and_i8:
29709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
30709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
31ed078c48SWANG Xuerui; LA64-NEXT:    ret
32709e4ad0SWeining Luentry:
33709e4ad0SWeining Lu  %r = and i8 %a, %b
34709e4ad0SWeining Lu  ret i8 %r
35709e4ad0SWeining Lu}
36709e4ad0SWeining Lu
37709e4ad0SWeining Ludefine i16 @and_i16(i16 %a, i16 %b) {
38709e4ad0SWeining Lu; LA32-LABEL: and_i16:
39709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
40709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
41ed078c48SWANG Xuerui; LA32-NEXT:    ret
42709e4ad0SWeining Lu;
43709e4ad0SWeining Lu; LA64-LABEL: and_i16:
44709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
45709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
46ed078c48SWANG Xuerui; LA64-NEXT:    ret
47709e4ad0SWeining Luentry:
48709e4ad0SWeining Lu  %r = and i16 %a, %b
49709e4ad0SWeining Lu  ret i16 %r
50709e4ad0SWeining Lu}
51709e4ad0SWeining Lu
52709e4ad0SWeining Ludefine i32 @and_i32(i32 %a, i32 %b) {
53709e4ad0SWeining Lu; LA32-LABEL: and_i32:
54709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
55709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
56ed078c48SWANG Xuerui; LA32-NEXT:    ret
57709e4ad0SWeining Lu;
58709e4ad0SWeining Lu; LA64-LABEL: and_i32:
59709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
60709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
61ed078c48SWANG Xuerui; LA64-NEXT:    ret
62709e4ad0SWeining Luentry:
63709e4ad0SWeining Lu  %r = and i32 %a, %b
64709e4ad0SWeining Lu  ret i32 %r
65709e4ad0SWeining Lu}
66709e4ad0SWeining Lu
67709e4ad0SWeining Ludefine i64 @and_i64(i64 %a, i64 %b) {
68709e4ad0SWeining Lu; LA32-LABEL: and_i64:
69709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
70709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a2
71709e4ad0SWeining Lu; LA32-NEXT:    and $a1, $a1, $a3
72ed078c48SWANG Xuerui; LA32-NEXT:    ret
73709e4ad0SWeining Lu;
74709e4ad0SWeining Lu; LA64-LABEL: and_i64:
75709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
76709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
77ed078c48SWANG Xuerui; LA64-NEXT:    ret
78709e4ad0SWeining Luentry:
79709e4ad0SWeining Lu  %r = and i64 %a, %b
80709e4ad0SWeining Lu  ret i64 %r
81709e4ad0SWeining Lu}
82709e4ad0SWeining Lu
83709e4ad0SWeining Ludefine i1 @and_i1_0(i1 %b) {
84709e4ad0SWeining Lu; LA32-LABEL: and_i1_0:
85709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
86709e4ad0SWeining Lu; LA32-NEXT:    move $a0, $zero
87ed078c48SWANG Xuerui; LA32-NEXT:    ret
88709e4ad0SWeining Lu;
89709e4ad0SWeining Lu; LA64-LABEL: and_i1_0:
90709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
91709e4ad0SWeining Lu; LA64-NEXT:    move $a0, $zero
92ed078c48SWANG Xuerui; LA64-NEXT:    ret
93709e4ad0SWeining Luentry:
94709e4ad0SWeining Lu  %r = and i1 4, %b
95709e4ad0SWeining Lu  ret i1 %r
96709e4ad0SWeining Lu}
97709e4ad0SWeining Lu
98709e4ad0SWeining Ludefine i1 @and_i1_5(i1 %b) {
99709e4ad0SWeining Lu; LA32-LABEL: and_i1_5:
100709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
101ed078c48SWANG Xuerui; LA32-NEXT:    ret
102709e4ad0SWeining Lu;
103709e4ad0SWeining Lu; LA64-LABEL: and_i1_5:
104709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
105ed078c48SWANG Xuerui; LA64-NEXT:    ret
106709e4ad0SWeining Luentry:
107709e4ad0SWeining Lu  %r = and i1 5, %b
108709e4ad0SWeining Lu  ret i1 %r
109709e4ad0SWeining Lu}
110709e4ad0SWeining Lu
111709e4ad0SWeining Ludefine i8 @and_i8_5(i8 %b) {
112709e4ad0SWeining Lu; LA32-LABEL: and_i8_5:
113709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
114709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 5
115ed078c48SWANG Xuerui; LA32-NEXT:    ret
116709e4ad0SWeining Lu;
117709e4ad0SWeining Lu; LA64-LABEL: and_i8_5:
118709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
119709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 5
120ed078c48SWANG Xuerui; LA64-NEXT:    ret
121709e4ad0SWeining Luentry:
122709e4ad0SWeining Lu  %r = and i8 5, %b
123709e4ad0SWeining Lu  ret i8 %r
124709e4ad0SWeining Lu}
125709e4ad0SWeining Lu
126709e4ad0SWeining Ludefine i8 @and_i8_257(i8 %b) {
127709e4ad0SWeining Lu; LA32-LABEL: and_i8_257:
128709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
129709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 1
130ed078c48SWANG Xuerui; LA32-NEXT:    ret
131709e4ad0SWeining Lu;
132709e4ad0SWeining Lu; LA64-LABEL: and_i8_257:
133709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
134709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 1
135ed078c48SWANG Xuerui; LA64-NEXT:    ret
136709e4ad0SWeining Luentry:
137709e4ad0SWeining Lu  %r = and i8 257, %b
138709e4ad0SWeining Lu  ret i8 %r
139709e4ad0SWeining Lu}
140709e4ad0SWeining Lu
141709e4ad0SWeining Ludefine i16 @and_i16_5(i16 %b) {
142709e4ad0SWeining Lu; LA32-LABEL: and_i16_5:
143709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
144709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 5
145ed078c48SWANG Xuerui; LA32-NEXT:    ret
146709e4ad0SWeining Lu;
147709e4ad0SWeining Lu; LA64-LABEL: and_i16_5:
148709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
149709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 5
150ed078c48SWANG Xuerui; LA64-NEXT:    ret
151709e4ad0SWeining Luentry:
152709e4ad0SWeining Lu  %r = and i16 5, %b
153709e4ad0SWeining Lu  ret i16 %r
154709e4ad0SWeining Lu}
155709e4ad0SWeining Lu
156709e4ad0SWeining Ludefine i16 @and_i16_0x1000(i16 %b) {
157709e4ad0SWeining Lu; LA32-LABEL: and_i16_0x1000:
158709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
159709e4ad0SWeining Lu; LA32-NEXT:    lu12i.w $a1, 1
160709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
161ed078c48SWANG Xuerui; LA32-NEXT:    ret
162709e4ad0SWeining Lu;
163709e4ad0SWeining Lu; LA64-LABEL: and_i16_0x1000:
164709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
165709e4ad0SWeining Lu; LA64-NEXT:    lu12i.w $a1, 1
166709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
167ed078c48SWANG Xuerui; LA64-NEXT:    ret
168709e4ad0SWeining Luentry:
169709e4ad0SWeining Lu  %r = and i16 4096, %b
170709e4ad0SWeining Lu  ret i16 %r
171709e4ad0SWeining Lu}
172709e4ad0SWeining Lu
173709e4ad0SWeining Ludefine i16 @and_i16_0x10001(i16 %b) {
174709e4ad0SWeining Lu; LA32-LABEL: and_i16_0x10001:
175709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
176709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 1
177ed078c48SWANG Xuerui; LA32-NEXT:    ret
178709e4ad0SWeining Lu;
179709e4ad0SWeining Lu; LA64-LABEL: and_i16_0x10001:
180709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
181709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 1
182ed078c48SWANG Xuerui; LA64-NEXT:    ret
183709e4ad0SWeining Luentry:
184709e4ad0SWeining Lu  %r = and i16 65537, %b
185709e4ad0SWeining Lu  ret i16 %r
186709e4ad0SWeining Lu}
187709e4ad0SWeining Lu
188709e4ad0SWeining Ludefine i32 @and_i32_5(i32 %b) {
189709e4ad0SWeining Lu; LA32-LABEL: and_i32_5:
190709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
191709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 5
192ed078c48SWANG Xuerui; LA32-NEXT:    ret
193709e4ad0SWeining Lu;
194709e4ad0SWeining Lu; LA64-LABEL: and_i32_5:
195709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
196709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 5
197ed078c48SWANG Xuerui; LA64-NEXT:    ret
198709e4ad0SWeining Luentry:
199709e4ad0SWeining Lu  %r = and i32 5, %b
200709e4ad0SWeining Lu  ret i32 %r
201709e4ad0SWeining Lu}
202709e4ad0SWeining Lu
203709e4ad0SWeining Ludefine i32 @and_i32_0x1000(i32 %b) {
204709e4ad0SWeining Lu; LA32-LABEL: and_i32_0x1000:
205709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
206709e4ad0SWeining Lu; LA32-NEXT:    lu12i.w $a1, 1
207709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
208ed078c48SWANG Xuerui; LA32-NEXT:    ret
209709e4ad0SWeining Lu;
210709e4ad0SWeining Lu; LA64-LABEL: and_i32_0x1000:
211709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
212709e4ad0SWeining Lu; LA64-NEXT:    lu12i.w $a1, 1
213709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
214ed078c48SWANG Xuerui; LA64-NEXT:    ret
215709e4ad0SWeining Luentry:
216709e4ad0SWeining Lu  %r = and i32 4096, %b
217709e4ad0SWeining Lu  ret i32 %r
218709e4ad0SWeining Lu}
219709e4ad0SWeining Lu
220709e4ad0SWeining Ludefine i32 @and_i32_0x100000001(i32 %b) {
221709e4ad0SWeining Lu; LA32-LABEL: and_i32_0x100000001:
222709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
223709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 1
224ed078c48SWANG Xuerui; LA32-NEXT:    ret
225709e4ad0SWeining Lu;
226709e4ad0SWeining Lu; LA64-LABEL: and_i32_0x100000001:
227709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
228709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 1
229ed078c48SWANG Xuerui; LA64-NEXT:    ret
230709e4ad0SWeining Luentry:
231709e4ad0SWeining Lu  %r = and i32 4294967297, %b
232709e4ad0SWeining Lu  ret i32 %r
233709e4ad0SWeining Lu}
234709e4ad0SWeining Lu
235709e4ad0SWeining Ludefine i64 @and_i64_5(i64 %b) {
236709e4ad0SWeining Lu; LA32-LABEL: and_i64_5:
237709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
238709e4ad0SWeining Lu; LA32-NEXT:    andi $a0, $a0, 5
239709e4ad0SWeining Lu; LA32-NEXT:    move $a1, $zero
240ed078c48SWANG Xuerui; LA32-NEXT:    ret
241709e4ad0SWeining Lu;
242709e4ad0SWeining Lu; LA64-LABEL: and_i64_5:
243709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
244709e4ad0SWeining Lu; LA64-NEXT:    andi $a0, $a0, 5
245ed078c48SWANG Xuerui; LA64-NEXT:    ret
246709e4ad0SWeining Luentry:
247709e4ad0SWeining Lu  %r = and i64 5, %b
248709e4ad0SWeining Lu  ret i64 %r
249709e4ad0SWeining Lu}
250709e4ad0SWeining Lu
251709e4ad0SWeining Ludefine i64 @and_i64_0x1000(i64 %b) {
252709e4ad0SWeining Lu; LA32-LABEL: and_i64_0x1000:
253709e4ad0SWeining Lu; LA32:       # %bb.0: # %entry
254709e4ad0SWeining Lu; LA32-NEXT:    lu12i.w $a1, 1
255709e4ad0SWeining Lu; LA32-NEXT:    and $a0, $a0, $a1
256709e4ad0SWeining Lu; LA32-NEXT:    move $a1, $zero
257ed078c48SWANG Xuerui; LA32-NEXT:    ret
258709e4ad0SWeining Lu;
259709e4ad0SWeining Lu; LA64-LABEL: and_i64_0x1000:
260709e4ad0SWeining Lu; LA64:       # %bb.0: # %entry
261709e4ad0SWeining Lu; LA64-NEXT:    lu12i.w $a1, 1
262709e4ad0SWeining Lu; LA64-NEXT:    and $a0, $a0, $a1
263ed078c48SWANG Xuerui; LA64-NEXT:    ret
264709e4ad0SWeining Luentry:
265709e4ad0SWeining Lu  %r = and i64 4096, %b
266709e4ad0SWeining Lu  ret i64 %r
267709e4ad0SWeining Lu}
268d726c753SBen Shi
269d726c753SBen Shidefine signext i32 @and_i32_0xfff0(i32 %a) {
270d726c753SBen Shi; LA32-LABEL: and_i32_0xfff0:
271d726c753SBen Shi; LA32:       # %bb.0:
27296dcd8cbSBen Shi; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 4
27396dcd8cbSBen Shi; LA32-NEXT:    slli.w $a0, $a0, 4
274d726c753SBen Shi; LA32-NEXT:    ret
275d726c753SBen Shi;
276d726c753SBen Shi; LA64-LABEL: and_i32_0xfff0:
277d726c753SBen Shi; LA64:       # %bb.0:
27896dcd8cbSBen Shi; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 4
27996dcd8cbSBen Shi; LA64-NEXT:    slli.d $a0, $a0, 4
280d726c753SBen Shi; LA64-NEXT:    ret
281d726c753SBen Shi  %b = and i32 %a, 65520
282d726c753SBen Shi  ret i32 %b
283d726c753SBen Shi}
284d726c753SBen Shi
285d726c753SBen Shidefine signext i32 @and_i32_0xfff0_twice(i32 %a, i32 %b) {
286d726c753SBen Shi; LA32-LABEL: and_i32_0xfff0_twice:
287d726c753SBen Shi; LA32:       # %bb.0:
28896dcd8cbSBen Shi; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 4
28996dcd8cbSBen Shi; LA32-NEXT:    slli.w $a0, $a0, 4
290a5c90e48Swanglei; LA32-NEXT:    bstrpick.w $a1, $a1, 15, 4
291a5c90e48Swanglei; LA32-NEXT:    slli.w $a1, $a1, 4
292d726c753SBen Shi; LA32-NEXT:    sub.w $a0, $a0, $a1
293d726c753SBen Shi; LA32-NEXT:    ret
294d726c753SBen Shi;
295d726c753SBen Shi; LA64-LABEL: and_i32_0xfff0_twice:
296d726c753SBen Shi; LA64:       # %bb.0:
29796dcd8cbSBen Shi; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 4
29896dcd8cbSBen Shi; LA64-NEXT:    slli.d $a0, $a0, 4
299a5c90e48Swanglei; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 4
300a5c90e48Swanglei; LA64-NEXT:    slli.d $a1, $a1, 4
301d726c753SBen Shi; LA64-NEXT:    sub.d $a0, $a0, $a1
302d726c753SBen Shi; LA64-NEXT:    ret
303d726c753SBen Shi  %c = and i32 %a, 65520
304d726c753SBen Shi  %d = and i32 %b, 65520
305d726c753SBen Shi  %e = sub i32 %c, %d
306d726c753SBen Shi  ret i32 %e
307d726c753SBen Shi}
308d726c753SBen Shi
309d726c753SBen Shidefine i64 @and_i64_0xfff0(i64 %a) {
310d726c753SBen Shi; LA32-LABEL: and_i64_0xfff0:
311d726c753SBen Shi; LA32:       # %bb.0:
31296dcd8cbSBen Shi; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 4
31396dcd8cbSBen Shi; LA32-NEXT:    slli.w $a0, $a0, 4
314d726c753SBen Shi; LA32-NEXT:    move $a1, $zero
315d726c753SBen Shi; LA32-NEXT:    ret
316d726c753SBen Shi;
317d726c753SBen Shi; LA64-LABEL: and_i64_0xfff0:
318d726c753SBen Shi; LA64:       # %bb.0:
31996dcd8cbSBen Shi; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 4
32096dcd8cbSBen Shi; LA64-NEXT:    slli.d $a0, $a0, 4
321d726c753SBen Shi; LA64-NEXT:    ret
322d726c753SBen Shi  %b = and i64 %a, 65520
323d726c753SBen Shi  ret i64 %b
324d726c753SBen Shi}
325d726c753SBen Shi
326d726c753SBen Shidefine i64 @and_i64_0xfff0_twice(i64 %a, i64 %b) {
327d726c753SBen Shi; LA32-LABEL: and_i64_0xfff0_twice:
328d726c753SBen Shi; LA32:       # %bb.0:
32996dcd8cbSBen Shi; LA32-NEXT:    bstrpick.w $a0, $a0, 15, 4
330a5c90e48Swanglei; LA32-NEXT:    slli.w $a1, $a0, 4
331a5c90e48Swanglei; LA32-NEXT:    bstrpick.w $a0, $a2, 15, 4
33296dcd8cbSBen Shi; LA32-NEXT:    slli.w $a2, $a0, 4
333a5c90e48Swanglei; LA32-NEXT:    sub.w $a0, $a1, $a2
334a5c90e48Swanglei; LA32-NEXT:    sltu $a1, $a1, $a2
335d726c753SBen Shi; LA32-NEXT:    sub.w $a1, $zero, $a1
336d726c753SBen Shi; LA32-NEXT:    ret
337d726c753SBen Shi;
338d726c753SBen Shi; LA64-LABEL: and_i64_0xfff0_twice:
339d726c753SBen Shi; LA64:       # %bb.0:
34096dcd8cbSBen Shi; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 4
34196dcd8cbSBen Shi; LA64-NEXT:    slli.d $a0, $a0, 4
342a5c90e48Swanglei; LA64-NEXT:    bstrpick.d $a1, $a1, 15, 4
343a5c90e48Swanglei; LA64-NEXT:    slli.d $a1, $a1, 4
344d726c753SBen Shi; LA64-NEXT:    sub.d $a0, $a0, $a1
345d726c753SBen Shi; LA64-NEXT:    ret
346d726c753SBen Shi  %c = and i64 %a, 65520
347d726c753SBen Shi  %d = and i64 %b, 65520
348d726c753SBen Shi  %e = sub i64 %c, %d
349d726c753SBen Shi  ret i64 %e
350d726c753SBen Shi}
351d726c753SBen Shi
352d726c753SBen Shi;; This case is not optimized to `bstrpick + slli`,
353d726c753SBen Shi;; since the immediate 1044480 can be composed via
354d726c753SBen Shi;; a single `lu12i.w $rx, 255`.
355d726c753SBen Shidefine i64 @and_i64_0xff000(i64 %a) {
356d726c753SBen Shi; LA32-LABEL: and_i64_0xff000:
357d726c753SBen Shi; LA32:       # %bb.0:
358d726c753SBen Shi; LA32-NEXT:    lu12i.w $a1, 255
359d726c753SBen Shi; LA32-NEXT:    and $a0, $a0, $a1
360d726c753SBen Shi; LA32-NEXT:    move $a1, $zero
361d726c753SBen Shi; LA32-NEXT:    ret
362d726c753SBen Shi;
363d726c753SBen Shi; LA64-LABEL: and_i64_0xff000:
364d726c753SBen Shi; LA64:       # %bb.0:
365d726c753SBen Shi; LA64-NEXT:    lu12i.w $a1, 255
366d726c753SBen Shi; LA64-NEXT:    and $a0, $a0, $a1
367d726c753SBen Shi; LA64-NEXT:    ret
368d726c753SBen Shi  %b = and i64 %a, 1044480
369d726c753SBen Shi  ret i64 %b
370d726c753SBen Shi}
371d726c753SBen Shi
372d726c753SBen Shidefine i64 @and_i64_minus_2048(i64 %a) {
373d726c753SBen Shi; LA32-LABEL: and_i64_minus_2048:
374d726c753SBen Shi; LA32:       # %bb.0:
37526021577SWeining Lu; LA32-NEXT:    bstrins.w $a0, $zero, 10, 0
376d726c753SBen Shi; LA32-NEXT:    ret
377d726c753SBen Shi;
378d726c753SBen Shi; LA64-LABEL: and_i64_minus_2048:
379d726c753SBen Shi; LA64:       # %bb.0:
38026021577SWeining Lu; LA64-NEXT:    bstrins.d $a0, $zero, 10, 0
381d726c753SBen Shi; LA64-NEXT:    ret
382d726c753SBen Shi  %b = and i64 %a, -2048
383d726c753SBen Shi  ret i64 %b
384d726c753SBen Shi}
385d726c753SBen Shi
386d726c753SBen Shi;; This case is not optimized to `bstrpick + slli`,
387d726c753SBen Shi;; since the immediate 0xfff0 has more than 2 uses.
388d726c753SBen Shidefine i64 @and_i64_0xfff0_multiple_times(i64 %a, i64 %b, i64 %c) {
389d726c753SBen Shi; LA32-LABEL: and_i64_0xfff0_multiple_times:
390d726c753SBen Shi; LA32:       # %bb.0:
391d726c753SBen Shi; LA32-NEXT:    lu12i.w $a1, 15
392d726c753SBen Shi; LA32-NEXT:    ori $a1, $a1, 4080
393a5c90e48Swanglei; LA32-NEXT:    and $a0, $a0, $a1
394a5c90e48Swanglei; LA32-NEXT:    and $a2, $a2, $a1
395a5c90e48Swanglei; LA32-NEXT:    and $a3, $a4, $a1
396a5c90e48Swanglei; LA32-NEXT:    sltu $a1, $a0, $a2
397d726c753SBen Shi; LA32-NEXT:    sub.w $a1, $zero, $a1
398a5c90e48Swanglei; LA32-NEXT:    sub.w $a0, $a0, $a2
399a5c90e48Swanglei; LA32-NEXT:    mul.w $a2, $a2, $a3
400a5c90e48Swanglei; LA32-NEXT:    xor $a0, $a0, $a2
401d726c753SBen Shi; LA32-NEXT:    ret
402d726c753SBen Shi;
403d726c753SBen Shi; LA64-LABEL: and_i64_0xfff0_multiple_times:
404d726c753SBen Shi; LA64:       # %bb.0:
405d726c753SBen Shi; LA64-NEXT:    lu12i.w $a3, 15
406d726c753SBen Shi; LA64-NEXT:    ori $a3, $a3, 4080
407d726c753SBen Shi; LA64-NEXT:    and $a0, $a0, $a3
408d726c753SBen Shi; LA64-NEXT:    and $a1, $a1, $a3
409a5c90e48Swanglei; LA64-NEXT:    and $a2, $a2, $a3
410d726c753SBen Shi; LA64-NEXT:    sub.d $a0, $a0, $a1
411a5c90e48Swanglei; LA64-NEXT:    mul.d $a1, $a1, $a2
412a5c90e48Swanglei; LA64-NEXT:    xor $a0, $a0, $a1
413d726c753SBen Shi; LA64-NEXT:    ret
414d726c753SBen Shi  %d = and i64 %a, 65520
415d726c753SBen Shi  %e = and i64 %b, 65520
416d726c753SBen Shi  %f = and i64 %c, 65520
417d726c753SBen Shi  %g = sub i64 %d, %e
418d726c753SBen Shi  %h = mul i64 %e, %f
419d726c753SBen Shi  %i = xor i64 %g, %h
420d726c753SBen Shi  ret i64 %i
421d726c753SBen Shi}
422c100f35fSWANG Rui
42373a2eecbSWeining Ludefine i64 @and_i64_0xffffffffff00ffff(i64 %a) {
42473a2eecbSWeining Lu; LA32-LABEL: and_i64_0xffffffffff00ffff:
42573a2eecbSWeining Lu; LA32:       # %bb.0:
42626021577SWeining Lu; LA32-NEXT:    bstrins.w $a0, $zero, 23, 16
42773a2eecbSWeining Lu; LA32-NEXT:    ret
42873a2eecbSWeining Lu;
42973a2eecbSWeining Lu; LA64-LABEL: and_i64_0xffffffffff00ffff:
43073a2eecbSWeining Lu; LA64:       # %bb.0:
43126021577SWeining Lu; LA64-NEXT:    bstrins.d $a0, $zero, 23, 16
43273a2eecbSWeining Lu; LA64-NEXT:    ret
43373a2eecbSWeining Lu  %b = and i64 %a, 18446744073692839935
43473a2eecbSWeining Lu  ret i64 %b
43573a2eecbSWeining Lu}
43673a2eecbSWeining Lu
437c100f35fSWANG Ruidefine i32 @and_add_lsr(i32 %x, i32 %y) {
438c100f35fSWANG Rui; LA32-LABEL: and_add_lsr:
439c100f35fSWANG Rui; LA32:       # %bb.0:
44042dccf9cSWANG Rui; LA32-NEXT:    addi.w $a0, $a0, -1
441c100f35fSWANG Rui; LA32-NEXT:    srli.w $a1, $a1, 20
442c100f35fSWANG Rui; LA32-NEXT:    and $a0, $a1, $a0
443c100f35fSWANG Rui; LA32-NEXT:    ret
444c100f35fSWANG Rui;
445c100f35fSWANG Rui; LA64-LABEL: and_add_lsr:
446c100f35fSWANG Rui; LA64:       # %bb.0:
447*718331f5Shev; LA64-NEXT:    addi.w $a0, $a0, -1
448c100f35fSWANG Rui; LA64-NEXT:    bstrpick.d $a1, $a1, 31, 20
449c100f35fSWANG Rui; LA64-NEXT:    and $a0, $a1, $a0
450c100f35fSWANG Rui; LA64-NEXT:    ret
451c100f35fSWANG Rui  %1 = add i32 %x, 4095
452c100f35fSWANG Rui  %2 = lshr i32 %y, 20
453c100f35fSWANG Rui  %r = and i32 %2, %1
454c100f35fSWANG Rui  ret i32 %r
455c100f35fSWANG Rui}
456