xref: /llvm-project/llvm/test/CodeGen/CSKY/base-i.ll (revision f40682a930d6812c930f90495933f9e3dfb9fcd3)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -csky-no-aliases -mattr=+e2 -mattr=+2e3 < %s -mtriple=csky | FileCheck %s
3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky | FileCheck %s --check-prefix=GENERIC
4
5define i32 @addRR(i32 %x, i32 %y) {
6; CHECK-LABEL: addRR:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    addu16 a0, a1
9; CHECK-NEXT:    rts16
10;
11; GENERIC-LABEL: addRR:
12; GENERIC:       # %bb.0: # %entry
13; GENERIC-NEXT:    .cfi_def_cfa_offset 0
14; GENERIC-NEXT:    subi16 sp, sp, 4
15; GENERIC-NEXT:    .cfi_def_cfa_offset 4
16; GENERIC-NEXT:    addu16 a0, a1, a0
17; GENERIC-NEXT:    addi16 sp, sp, 4
18; GENERIC-NEXT:    rts16
19entry:
20  %add = add nsw i32 %y, %x
21  ret i32 %add
22}
23
24define i32 @addRI(i32 %x) {
25; CHECK-LABEL: addRI:
26; CHECK:       # %bb.0: # %entry
27; CHECK-NEXT:    addi16 a0, 10
28; CHECK-NEXT:    rts16
29;
30; GENERIC-LABEL: addRI:
31; GENERIC:       # %bb.0: # %entry
32; GENERIC-NEXT:    .cfi_def_cfa_offset 0
33; GENERIC-NEXT:    subi16 sp, sp, 4
34; GENERIC-NEXT:    .cfi_def_cfa_offset 4
35; GENERIC-NEXT:    addi16 a0, 10
36; GENERIC-NEXT:    addi16 sp, sp, 4
37; GENERIC-NEXT:    rts16
38entry:
39  %add = add nsw i32 %x, 10
40  ret i32 %add
41}
42
43define i32 @addRI_256(i32 %x) {
44; CHECK-LABEL: addRI_256:
45; CHECK:       # %bb.0: # %entry
46; CHECK-NEXT:    addi16 a0, 256
47; CHECK-NEXT:    rts16
48;
49; GENERIC-LABEL: addRI_256:
50; GENERIC:       # %bb.0: # %entry
51; GENERIC-NEXT:    .cfi_def_cfa_offset 0
52; GENERIC-NEXT:    subi16 sp, sp, 4
53; GENERIC-NEXT:    .cfi_def_cfa_offset 4
54; GENERIC-NEXT:    addi16 a0, 256
55; GENERIC-NEXT:    addi16 sp, sp, 4
56; GENERIC-NEXT:    rts16
57entry:
58  %add = add nsw i32 %x, 256
59  ret i32 %add
60}
61
62define i32 @addRI_4096(i32 %x) {
63; CHECK-LABEL: addRI_4096:
64; CHECK:       # %bb.0: # %entry
65; CHECK-NEXT:    addi32 a0, a0, 4096
66; CHECK-NEXT:    rts16
67;
68; GENERIC-LABEL: addRI_4096:
69; GENERIC:       # %bb.0: # %entry
70; GENERIC-NEXT:    .cfi_def_cfa_offset 0
71; GENERIC-NEXT:    subi16 sp, sp, 4
72; GENERIC-NEXT:    .cfi_def_cfa_offset 4
73; GENERIC-NEXT:    movi16 a1, 0
74; GENERIC-NEXT:    lsli16 a2, a1, 24
75; GENERIC-NEXT:    lsli16 a3, a1, 16
76; GENERIC-NEXT:    or16 a3, a2
77; GENERIC-NEXT:    movi16 a2, 16
78; GENERIC-NEXT:    lsli16 a2, a2, 8
79; GENERIC-NEXT:    or16 a2, a3
80; GENERIC-NEXT:    or16 a2, a1
81; GENERIC-NEXT:    addu16 a0, a0, a2
82; GENERIC-NEXT:    addi16 sp, sp, 4
83; GENERIC-NEXT:    rts16
84entry:
85  %add = add nsw i32 %x, 4096
86  ret i32 %add
87}
88
89define i32 @addRI_X(i32 %x) {
90; CHECK-LABEL: addRI_X:
91; CHECK:       # %bb.0: # %entry
92; CHECK-NEXT:    movi32 a1, 4097
93; CHECK-NEXT:    addu16 a0, a1
94; CHECK-NEXT:    rts16
95;
96; GENERIC-LABEL: addRI_X:
97; GENERIC:       # %bb.0: # %entry
98; GENERIC-NEXT:    .cfi_def_cfa_offset 0
99; GENERIC-NEXT:    subi16 sp, sp, 4
100; GENERIC-NEXT:    .cfi_def_cfa_offset 4
101; GENERIC-NEXT:    movi16 a1, 0
102; GENERIC-NEXT:    lsli16 a2, a1, 24
103; GENERIC-NEXT:    lsli16 a1, a1, 16
104; GENERIC-NEXT:    or16 a1, a2
105; GENERIC-NEXT:    movi16 a2, 16
106; GENERIC-NEXT:    lsli16 a2, a2, 8
107; GENERIC-NEXT:    or16 a2, a1
108; GENERIC-NEXT:    movi16 a1, 1
109; GENERIC-NEXT:    or16 a1, a2
110; GENERIC-NEXT:    addu16 a0, a0, a1
111; GENERIC-NEXT:    addi16 sp, sp, 4
112; GENERIC-NEXT:    rts16
113entry:
114  %add = add nsw i32 %x, 4097
115  ret i32 %add
116}
117
118define i64 @ADD_LONG(i64 %x, i64 %y) {
119; CHECK-LABEL: ADD_LONG:
120; CHECK:       # %bb.0: # %entry
121; CHECK-NEXT:    clrc32
122; CHECK-NEXT:    addc32 a0, a2, a0
123; CHECK-NEXT:    addc32 a1, a3, a1
124; CHECK-NEXT:    rts16
125;
126; GENERIC-LABEL: ADD_LONG:
127; GENERIC:       # %bb.0: # %entry
128; GENERIC-NEXT:    .cfi_def_cfa_offset 0
129; GENERIC-NEXT:    subi16 sp, sp, 4
130; GENERIC-NEXT:    .cfi_def_cfa_offset 4
131; GENERIC-NEXT:    clrc16
132; GENERIC-NEXT:    addc16 a0, a2
133; GENERIC-NEXT:    addc16 a1, a3
134; GENERIC-NEXT:    addi16 sp, sp, 4
135; GENERIC-NEXT:    rts16
136entry:
137  %add = add nsw i64 %y, %x
138  ret i64 %add
139}
140
141define i64 @ADD_LONG_I(i64 %x) {
142; CHECK-LABEL: ADD_LONG_I:
143; CHECK:       # %bb.0: # %entry
144; CHECK-NEXT:    clrc32
145; CHECK-NEXT:    movi16 a2, 1
146; CHECK-NEXT:    addc16 a0, a2
147; CHECK-NEXT:    movi16 a2, 0
148; CHECK-NEXT:    addc16 a1, a2
149; CHECK-NEXT:    rts16
150;
151; GENERIC-LABEL: ADD_LONG_I:
152; GENERIC:       # %bb.0: # %entry
153; GENERIC-NEXT:    .cfi_def_cfa_offset 0
154; GENERIC-NEXT:    subi16 sp, sp, 4
155; GENERIC-NEXT:    .cfi_def_cfa_offset 4
156; GENERIC-NEXT:    clrc16
157; GENERIC-NEXT:    movi16 a2, 1
158; GENERIC-NEXT:    addc16 a0, a2
159; GENERIC-NEXT:    movi16 a2, 0
160; GENERIC-NEXT:    addc16 a1, a2
161; GENERIC-NEXT:    addi16 sp, sp, 4
162; GENERIC-NEXT:    rts16
163entry:
164  %add = add nsw i64 %x, 1
165  ret i64 %add
166}
167
168define i16 @ADD_SHORT(i16 %x, i16 %y) {
169; CHECK-LABEL: ADD_SHORT:
170; CHECK:       # %bb.0: # %entry
171; CHECK-NEXT:    addu16 a0, a1
172; CHECK-NEXT:    rts16
173;
174; GENERIC-LABEL: ADD_SHORT:
175; GENERIC:       # %bb.0: # %entry
176; GENERIC-NEXT:    .cfi_def_cfa_offset 0
177; GENERIC-NEXT:    subi16 sp, sp, 4
178; GENERIC-NEXT:    .cfi_def_cfa_offset 4
179; GENERIC-NEXT:    addu16 a0, a1, a0
180; GENERIC-NEXT:    addi16 sp, sp, 4
181; GENERIC-NEXT:    rts16
182entry:
183  %add = add nsw i16 %y, %x
184  ret i16 %add
185}
186
187define i16 @ADD_SHORT_I(i16 %x) {
188; CHECK-LABEL: ADD_SHORT_I:
189; CHECK:       # %bb.0: # %entry
190; CHECK-NEXT:    addi16 a0, a0, 1
191; CHECK-NEXT:    rts16
192;
193; GENERIC-LABEL: ADD_SHORT_I:
194; GENERIC:       # %bb.0: # %entry
195; GENERIC-NEXT:    .cfi_def_cfa_offset 0
196; GENERIC-NEXT:    subi16 sp, sp, 4
197; GENERIC-NEXT:    .cfi_def_cfa_offset 4
198; GENERIC-NEXT:    addi16 a0, 1
199; GENERIC-NEXT:    addi16 sp, sp, 4
200; GENERIC-NEXT:    rts16
201entry:
202  %add = add nsw i16 %x, 1
203  ret i16 %add
204}
205
206define i8 @ADD_CHAR(i8 %x, i8 %y) {
207; CHECK-LABEL: ADD_CHAR:
208; CHECK:       # %bb.0: # %entry
209; CHECK-NEXT:    addu16 a0, a1
210; CHECK-NEXT:    rts16
211;
212; GENERIC-LABEL: ADD_CHAR:
213; GENERIC:       # %bb.0: # %entry
214; GENERIC-NEXT:    .cfi_def_cfa_offset 0
215; GENERIC-NEXT:    subi16 sp, sp, 4
216; GENERIC-NEXT:    .cfi_def_cfa_offset 4
217; GENERIC-NEXT:    addu16 a0, a1, a0
218; GENERIC-NEXT:    addi16 sp, sp, 4
219; GENERIC-NEXT:    rts16
220entry:
221  %add = add nsw i8 %y, %x
222  ret i8 %add
223}
224
225define i8 @ADD_CHAR_I(i8 %x) {
226; CHECK-LABEL: ADD_CHAR_I:
227; CHECK:       # %bb.0: # %entry
228; CHECK-NEXT:    addi16 a0, a0, 1
229; CHECK-NEXT:    rts16
230;
231; GENERIC-LABEL: ADD_CHAR_I:
232; GENERIC:       # %bb.0: # %entry
233; GENERIC-NEXT:    .cfi_def_cfa_offset 0
234; GENERIC-NEXT:    subi16 sp, sp, 4
235; GENERIC-NEXT:    .cfi_def_cfa_offset 4
236; GENERIC-NEXT:    addi16 a0, 1
237; GENERIC-NEXT:    addi16 sp, sp, 4
238; GENERIC-NEXT:    rts16
239entry:
240  %add = add nsw i8 %x, 1
241  ret i8 %add
242}
243
244
245define i32 @subRR(i32 %x, i32 %y) {
246; CHECK-LABEL: subRR:
247; CHECK:       # %bb.0: # %entry
248; CHECK-NEXT:    subu16 a0, a1, a0
249; CHECK-NEXT:    rts16
250;
251; GENERIC-LABEL: subRR:
252; GENERIC:       # %bb.0: # %entry
253; GENERIC-NEXT:    .cfi_def_cfa_offset 0
254; GENERIC-NEXT:    subi16 sp, sp, 4
255; GENERIC-NEXT:    .cfi_def_cfa_offset 4
256; GENERIC-NEXT:    subu16 a0, a1, a0
257; GENERIC-NEXT:    addi16 sp, sp, 4
258; GENERIC-NEXT:    rts16
259entry:
260  %sub = sub nsw i32 %y, %x
261  ret i32 %sub
262}
263
264define i32 @subRI(i32 %x) {
265; CHECK-LABEL: subRI:
266; CHECK:       # %bb.0: # %entry
267; CHECK-NEXT:    subi16 a0, 10
268; CHECK-NEXT:    rts16
269;
270; GENERIC-LABEL: subRI:
271; GENERIC:       # %bb.0: # %entry
272; GENERIC-NEXT:    .cfi_def_cfa_offset 0
273; GENERIC-NEXT:    subi16 sp, sp, 4
274; GENERIC-NEXT:    .cfi_def_cfa_offset 4
275; GENERIC-NEXT:    subi16 a0, 10
276; GENERIC-NEXT:    addi16 sp, sp, 4
277; GENERIC-NEXT:    rts16
278entry:
279  %sub = sub nsw i32 %x, 10
280  ret i32 %sub
281}
282
283define i32 @subRI_256(i32 %x) {
284; CHECK-LABEL: subRI_256:
285; CHECK:       # %bb.0: # %entry
286; CHECK-NEXT:    subi16 a0, 256
287; CHECK-NEXT:    rts16
288;
289; GENERIC-LABEL: subRI_256:
290; GENERIC:       # %bb.0: # %entry
291; GENERIC-NEXT:    .cfi_def_cfa_offset 0
292; GENERIC-NEXT:    subi16 sp, sp, 4
293; GENERIC-NEXT:    .cfi_def_cfa_offset 4
294; GENERIC-NEXT:    subi16 a0, 256
295; GENERIC-NEXT:    addi16 sp, sp, 4
296; GENERIC-NEXT:    rts16
297entry:
298  %sub = sub nsw i32 %x, 256
299  ret i32 %sub
300}
301
302define i32 @subRI_4096(i32 %x) {
303; CHECK-LABEL: subRI_4096:
304; CHECK:       # %bb.0: # %entry
305; CHECK-NEXT:    subi32 a0, a0, 4096
306; CHECK-NEXT:    rts16
307;
308; GENERIC-LABEL: subRI_4096:
309; GENERIC:       # %bb.0: # %entry
310; GENERIC-NEXT:    .cfi_def_cfa_offset 0
311; GENERIC-NEXT:    subi16 sp, sp, 4
312; GENERIC-NEXT:    .cfi_def_cfa_offset 4
313; GENERIC-NEXT:    movi16 a1, 255
314; GENERIC-NEXT:    lsli16 a2, a1, 24
315; GENERIC-NEXT:    lsli16 a1, a1, 16
316; GENERIC-NEXT:    or16 a1, a2
317; GENERIC-NEXT:    movi16 a2, 240
318; GENERIC-NEXT:    lsli16 a2, a2, 8
319; GENERIC-NEXT:    or16 a2, a1
320; GENERIC-NEXT:    movi16 a1, 0
321; GENERIC-NEXT:    or16 a1, a2
322; GENERIC-NEXT:    addu16 a0, a0, a1
323; GENERIC-NEXT:    addi16 sp, sp, 4
324; GENERIC-NEXT:    rts16
325entry:
326  %sub = sub nsw i32 %x, 4096
327  ret i32 %sub
328}
329
330define i32 @subRI_X(i32 %x) {
331; CHECK-LABEL: subRI_X:
332; CHECK:       # %bb.0: # %entry
333; CHECK-NEXT:    movih32 a1, 65535
334; CHECK-NEXT:    ori32 a1, a1, 61439
335; CHECK-NEXT:    addu16 a0, a1
336; CHECK-NEXT:    rts16
337;
338; GENERIC-LABEL: subRI_X:
339; GENERIC:       # %bb.0: # %entry
340; GENERIC-NEXT:    .cfi_def_cfa_offset 0
341; GENERIC-NEXT:    subi16 sp, sp, 4
342; GENERIC-NEXT:    .cfi_def_cfa_offset 4
343; GENERIC-NEXT:    movi16 a1, 255
344; GENERIC-NEXT:    lsli16 a2, a1, 24
345; GENERIC-NEXT:    lsli16 a3, a1, 16
346; GENERIC-NEXT:    or16 a3, a2
347; GENERIC-NEXT:    movi16 a2, 239
348; GENERIC-NEXT:    lsli16 a2, a2, 8
349; GENERIC-NEXT:    or16 a2, a3
350; GENERIC-NEXT:    or16 a2, a1
351; GENERIC-NEXT:    addu16 a0, a0, a2
352; GENERIC-NEXT:    addi16 sp, sp, 4
353; GENERIC-NEXT:    rts16
354entry:
355  %sub = sub nsw i32 %x, 4097
356  ret i32 %sub
357}
358
359define i64 @SUB_LONG(i64 %x, i64 %y) {
360; CHECK-LABEL: SUB_LONG:
361; CHECK:       # %bb.0: # %entry
362; CHECK-NEXT:    setc32
363; CHECK-NEXT:    subc32 a0, a2, a0
364; CHECK-NEXT:    mvcv16 a2
365; CHECK-NEXT:    btsti16 a2, 0
366; CHECK-NEXT:    mvcv16 a2
367; CHECK-NEXT:    btsti16 a2, 0
368; CHECK-NEXT:    subc32 a1, a3, a1
369; CHECK-NEXT:    rts16
370;
371; GENERIC-LABEL: SUB_LONG:
372; GENERIC:       # %bb.0: # %entry
373; GENERIC-NEXT:    .cfi_def_cfa_offset 0
374; GENERIC-NEXT:    subi16 sp, sp, 4
375; GENERIC-NEXT:    .cfi_def_cfa_offset 4
376; GENERIC-NEXT:    setc16
377; GENERIC-NEXT:    subc16 a2, a0
378; GENERIC-NEXT:    mvcv16 a0
379; GENERIC-NEXT:    btsti16 a0, 0
380; GENERIC-NEXT:    mvcv16 a0
381; GENERIC-NEXT:    btsti16 a0, 0
382; GENERIC-NEXT:    subc16 a3, a1
383; GENERIC-NEXT:    mov16 a0, a2
384; GENERIC-NEXT:    mov16 a1, a3
385; GENERIC-NEXT:    addi16 sp, sp, 4
386; GENERIC-NEXT:    rts16
387entry:
388  %sub = sub nsw i64 %y, %x
389  ret i64 %sub
390}
391
392define i64 @SUB_LONG_I(i64 %x) {
393; CHECK-LABEL: SUB_LONG_I:
394; CHECK:       # %bb.0: # %entry
395; CHECK-NEXT:    clrc32
396; CHECK-NEXT:    movih32 a2, 65535
397; CHECK-NEXT:    ori32 a2, a2, 65535
398; CHECK-NEXT:    addc16 a0, a2
399; CHECK-NEXT:    addc16 a1, a2
400; CHECK-NEXT:    rts16
401;
402; GENERIC-LABEL: SUB_LONG_I:
403; GENERIC:       # %bb.0: # %entry
404; GENERIC-NEXT:    subi16 sp, sp, 4
405; GENERIC-NEXT:    .cfi_def_cfa_offset 4
406; GENERIC-NEXT:    st16.w l0, (sp, 0) # 4-byte Folded Spill
407; GENERIC-NEXT:    .cfi_offset l0, -4
408; GENERIC-NEXT:    subi16 sp, sp, 4
409; GENERIC-NEXT:    .cfi_def_cfa_offset 8
410; GENERIC-NEXT:    clrc16
411; GENERIC-NEXT:    movi16 a2, 255
412; GENERIC-NEXT:    lsli16 a3, a2, 24
413; GENERIC-NEXT:    lsli16 l0, a2, 16
414; GENERIC-NEXT:    or16 l0, a3
415; GENERIC-NEXT:    lsli16 a3, a2, 8
416; GENERIC-NEXT:    or16 a3, l0
417; GENERIC-NEXT:    or16 a3, a2
418; GENERIC-NEXT:    addc16 a0, a3
419; GENERIC-NEXT:    addc16 a1, a3
420; GENERIC-NEXT:    addi16 sp, sp, 4
421; GENERIC-NEXT:    ld16.w l0, (sp, 0) # 4-byte Folded Reload
422; GENERIC-NEXT:    addi16 sp, sp, 4
423; GENERIC-NEXT:    rts16
424entry:
425  %sub = sub nsw i64 %x, 1
426  ret i64 %sub
427}
428
429define i16 @SUB_SHORT(i16 %x, i16 %y) {
430; CHECK-LABEL: SUB_SHORT:
431; CHECK:       # %bb.0: # %entry
432; CHECK-NEXT:    subu16 a0, a1, a0
433; CHECK-NEXT:    rts16
434;
435; GENERIC-LABEL: SUB_SHORT:
436; GENERIC:       # %bb.0: # %entry
437; GENERIC-NEXT:    .cfi_def_cfa_offset 0
438; GENERIC-NEXT:    subi16 sp, sp, 4
439; GENERIC-NEXT:    .cfi_def_cfa_offset 4
440; GENERIC-NEXT:    subu16 a0, a1, a0
441; GENERIC-NEXT:    addi16 sp, sp, 4
442; GENERIC-NEXT:    rts16
443entry:
444  %sub = sub nsw i16 %y, %x
445  ret i16 %sub
446}
447
448define i16 @SUB_SHORT_I(i16 %x) {
449; CHECK-LABEL: SUB_SHORT_I:
450; CHECK:       # %bb.0: # %entry
451; CHECK-NEXT:    subi16 a0, a0, 1
452; CHECK-NEXT:    rts16
453;
454; GENERIC-LABEL: SUB_SHORT_I:
455; GENERIC:       # %bb.0: # %entry
456; GENERIC-NEXT:    .cfi_def_cfa_offset 0
457; GENERIC-NEXT:    subi16 sp, sp, 4
458; GENERIC-NEXT:    .cfi_def_cfa_offset 4
459; GENERIC-NEXT:    subi16 a0, 1
460; GENERIC-NEXT:    addi16 sp, sp, 4
461; GENERIC-NEXT:    rts16
462entry:
463  %sub = sub nsw i16 %x, 1
464  ret i16 %sub
465}
466
467define i8 @SUB_CHAR(i8 %x, i8 %y) {
468; CHECK-LABEL: SUB_CHAR:
469; CHECK:       # %bb.0: # %entry
470; CHECK-NEXT:    subu16 a0, a1, a0
471; CHECK-NEXT:    rts16
472;
473; GENERIC-LABEL: SUB_CHAR:
474; GENERIC:       # %bb.0: # %entry
475; GENERIC-NEXT:    .cfi_def_cfa_offset 0
476; GENERIC-NEXT:    subi16 sp, sp, 4
477; GENERIC-NEXT:    .cfi_def_cfa_offset 4
478; GENERIC-NEXT:    subu16 a0, a1, a0
479; GENERIC-NEXT:    addi16 sp, sp, 4
480; GENERIC-NEXT:    rts16
481entry:
482  %sub = sub nsw i8 %y, %x
483  ret i8 %sub
484}
485
486define i8 @SUB_CHAR_I(i8 %x) {
487; CHECK-LABEL: SUB_CHAR_I:
488; CHECK:       # %bb.0: # %entry
489; CHECK-NEXT:    subi16 a0, a0, 1
490; CHECK-NEXT:    rts16
491;
492; GENERIC-LABEL: SUB_CHAR_I:
493; GENERIC:       # %bb.0: # %entry
494; GENERIC-NEXT:    .cfi_def_cfa_offset 0
495; GENERIC-NEXT:    subi16 sp, sp, 4
496; GENERIC-NEXT:    .cfi_def_cfa_offset 4
497; GENERIC-NEXT:    subi16 a0, 1
498; GENERIC-NEXT:    addi16 sp, sp, 4
499; GENERIC-NEXT:    rts16
500entry:
501  %sub = sub nsw i8 %x, 1
502  ret i8 %sub
503}
504
505define i32 @mulRR(i32 %x, i32 %y) {
506; CHECK-LABEL: mulRR:
507; CHECK:       # %bb.0: # %entry
508; CHECK-NEXT:    mult16 a0, a1
509; CHECK-NEXT:    rts16
510;
511; GENERIC-LABEL: mulRR:
512; GENERIC:       # %bb.0: # %entry
513; GENERIC-NEXT:    .cfi_def_cfa_offset 0
514; GENERIC-NEXT:    subi16 sp, sp, 4
515; GENERIC-NEXT:    .cfi_def_cfa_offset 4
516; GENERIC-NEXT:    mult16 a0, a1
517; GENERIC-NEXT:    addi16 sp, sp, 4
518; GENERIC-NEXT:    rts16
519entry:
520  %mul = mul nsw i32 %y, %x
521  ret i32 %mul
522}
523
524define i32 @mulRI(i32 %x) {
525; CHECK-LABEL: mulRI:
526; CHECK:       # %bb.0: # %entry
527; CHECK-NEXT:    movi16 a1, 10
528; CHECK-NEXT:    mult16 a0, a1
529; CHECK-NEXT:    rts16
530;
531; GENERIC-LABEL: mulRI:
532; GENERIC:       # %bb.0: # %entry
533; GENERIC-NEXT:    .cfi_def_cfa_offset 0
534; GENERIC-NEXT:    subi16 sp, sp, 4
535; GENERIC-NEXT:    .cfi_def_cfa_offset 4
536; GENERIC-NEXT:    movi16 a1, 10
537; GENERIC-NEXT:    mult16 a0, a1
538; GENERIC-NEXT:    addi16 sp, sp, 4
539; GENERIC-NEXT:    rts16
540entry:
541  %mul = mul nsw i32 %x, 10
542  ret i32 %mul
543}
544
545define i32 @mulRI_X(i32 %x) {
546; CHECK-LABEL: mulRI_X:
547; CHECK:       # %bb.0: # %entry
548; CHECK-NEXT:    lsli16 a1, a0, 12
549; CHECK-NEXT:    addu16 a0, a1
550; CHECK-NEXT:    rts16
551;
552; GENERIC-LABEL: mulRI_X:
553; GENERIC:       # %bb.0: # %entry
554; GENERIC-NEXT:    .cfi_def_cfa_offset 0
555; GENERIC-NEXT:    subi16 sp, sp, 4
556; GENERIC-NEXT:    .cfi_def_cfa_offset 4
557; GENERIC-NEXT:    lsli16 a1, a0, 12
558; GENERIC-NEXT:    addu16 a0, a1, a0
559; GENERIC-NEXT:    addi16 sp, sp, 4
560; GENERIC-NEXT:    rts16
561entry:
562  %mul = mul nsw i32 %x, 4097
563  ret i32 %mul
564}
565
566define i16 @MUL_SHORT(i16 %x, i16 %y) {
567; CHECK-LABEL: MUL_SHORT:
568; CHECK:       # %bb.0: # %entry
569; CHECK-NEXT:    mult16 a0, a1
570; CHECK-NEXT:    rts16
571;
572; GENERIC-LABEL: MUL_SHORT:
573; GENERIC:       # %bb.0: # %entry
574; GENERIC-NEXT:    .cfi_def_cfa_offset 0
575; GENERIC-NEXT:    subi16 sp, sp, 4
576; GENERIC-NEXT:    .cfi_def_cfa_offset 4
577; GENERIC-NEXT:    mult16 a0, a1
578; GENERIC-NEXT:    addi16 sp, sp, 4
579; GENERIC-NEXT:    rts16
580entry:
581  %mul = mul nsw i16 %y, %x
582  ret i16 %mul
583}
584
585define i16 @MUL_SHORT_I(i16 %x) {
586; CHECK-LABEL: MUL_SHORT_I:
587; CHECK:       # %bb.0: # %entry
588; CHECK-NEXT:    ixh32 a0, a0, a0
589; CHECK-NEXT:    rts16
590;
591; GENERIC-LABEL: MUL_SHORT_I:
592; GENERIC:       # %bb.0: # %entry
593; GENERIC-NEXT:    .cfi_def_cfa_offset 0
594; GENERIC-NEXT:    subi16 sp, sp, 4
595; GENERIC-NEXT:    .cfi_def_cfa_offset 4
596; GENERIC-NEXT:    lsli16 a1, a0, 1
597; GENERIC-NEXT:    addu16 a0, a1, a0
598; GENERIC-NEXT:    addi16 sp, sp, 4
599; GENERIC-NEXT:    rts16
600entry:
601  %mul = mul nsw i16 %x, 3
602  ret i16 %mul
603}
604
605define i8 @MUL_CHAR(i8 %x, i8 %y) {
606; CHECK-LABEL: MUL_CHAR:
607; CHECK:       # %bb.0: # %entry
608; CHECK-NEXT:    mult16 a0, a1
609; CHECK-NEXT:    rts16
610;
611; GENERIC-LABEL: MUL_CHAR:
612; GENERIC:       # %bb.0: # %entry
613; GENERIC-NEXT:    .cfi_def_cfa_offset 0
614; GENERIC-NEXT:    subi16 sp, sp, 4
615; GENERIC-NEXT:    .cfi_def_cfa_offset 4
616; GENERIC-NEXT:    mult16 a0, a1
617; GENERIC-NEXT:    addi16 sp, sp, 4
618; GENERIC-NEXT:    rts16
619entry:
620  %mul = mul nsw i8 %y, %x
621  ret i8 %mul
622}
623
624define i8 @MUL_CHAR_I(i8 %x) {
625; CHECK-LABEL: MUL_CHAR_I:
626; CHECK:       # %bb.0: # %entry
627; CHECK-NEXT:    ixh32 a0, a0, a0
628; CHECK-NEXT:    movi16 a1, 0
629; CHECK-NEXT:    subu16 a0, a1, a0
630; CHECK-NEXT:    rts16
631;
632; GENERIC-LABEL: MUL_CHAR_I:
633; GENERIC:       # %bb.0: # %entry
634; GENERIC-NEXT:    .cfi_def_cfa_offset 0
635; GENERIC-NEXT:    subi16 sp, sp, 4
636; GENERIC-NEXT:    .cfi_def_cfa_offset 4
637; GENERIC-NEXT:    lsli16 a1, a0, 1
638; GENERIC-NEXT:    addu16 a0, a1, a0
639; GENERIC-NEXT:    movi16 a1, 0
640; GENERIC-NEXT:    subu16 a0, a1, a0
641; GENERIC-NEXT:    addi16 sp, sp, 4
642; GENERIC-NEXT:    rts16
643entry:
644  %mul = mul nsw i8 %x, -3
645  ret i8 %mul
646}
647
648define i32 @udivRR(i32 %x, i32 %y) {
649; CHECK-LABEL: udivRR:
650; CHECK:       # %bb.0: # %entry
651; CHECK-NEXT:    divu32 a0, a1, a0
652; CHECK-NEXT:    rts16
653;
654; GENERIC-LABEL: udivRR:
655; GENERIC:       # %bb.0: # %entry
656; GENERIC-NEXT:    subi16 sp, sp, 4
657; GENERIC-NEXT:    .cfi_def_cfa_offset 4
658; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
659; GENERIC-NEXT:    .cfi_offset lr, -4
660; GENERIC-NEXT:    subi16 sp, sp, 4
661; GENERIC-NEXT:    .cfi_def_cfa_offset 8
662; GENERIC-NEXT:    mov16 a2, a0
663; GENERIC-NEXT:    lrw32 a3, [.LCPI29_0]
664; GENERIC-NEXT:    mov16 a0, a1
665; GENERIC-NEXT:    mov16 a1, a2
666; GENERIC-NEXT:    jsr16 a3
667; GENERIC-NEXT:    addi16 sp, sp, 4
668; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
669; GENERIC-NEXT:    addi16 sp, sp, 4
670; GENERIC-NEXT:    rts16
671; GENERIC-NEXT:    .p2align 1
672; GENERIC-NEXT:  # %bb.1:
673; GENERIC-NEXT:    .p2align 2, 0x0
674; GENERIC-NEXT:  .LCPI29_0:
675; GENERIC-NEXT:    .long __udivsi3
676entry:
677  %udiv = udiv  i32 %y, %x
678  ret i32 %udiv
679}
680
681define i32 @udivRI(i32 %x) {
682; CHECK-LABEL: udivRI:
683; CHECK:       # %bb.0: # %entry
684; CHECK-NEXT:    movi16 a1, 10
685; CHECK-NEXT:    divu32 a0, a0, a1
686; CHECK-NEXT:    rts16
687;
688; GENERIC-LABEL: udivRI:
689; GENERIC:       # %bb.0: # %entry
690; GENERIC-NEXT:    subi16 sp, sp, 4
691; GENERIC-NEXT:    .cfi_def_cfa_offset 4
692; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
693; GENERIC-NEXT:    .cfi_offset lr, -4
694; GENERIC-NEXT:    subi16 sp, sp, 4
695; GENERIC-NEXT:    .cfi_def_cfa_offset 8
696; GENERIC-NEXT:    lrw32 a2, [.LCPI30_0]
697; GENERIC-NEXT:    movi16 a1, 10
698; GENERIC-NEXT:    jsr16 a2
699; GENERIC-NEXT:    addi16 sp, sp, 4
700; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
701; GENERIC-NEXT:    addi16 sp, sp, 4
702; GENERIC-NEXT:    rts16
703; GENERIC-NEXT:    .p2align 1
704; GENERIC-NEXT:  # %bb.1:
705; GENERIC-NEXT:    .p2align 2, 0x0
706; GENERIC-NEXT:  .LCPI30_0:
707; GENERIC-NEXT:    .long __udivsi3
708entry:
709  %udiv = udiv  i32 %x, 10
710  ret i32 %udiv
711}
712
713define i32 @udivRI_X(i32 %x) {
714; CHECK-LABEL: udivRI_X:
715; CHECK:       # %bb.0: # %entry
716; CHECK-NEXT:    movi32 a1, 4097
717; CHECK-NEXT:    divu32 a0, a0, a1
718; CHECK-NEXT:    rts16
719;
720; GENERIC-LABEL: udivRI_X:
721; GENERIC:       # %bb.0: # %entry
722; GENERIC-NEXT:    subi16 sp, sp, 4
723; GENERIC-NEXT:    .cfi_def_cfa_offset 4
724; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
725; GENERIC-NEXT:    .cfi_offset lr, -4
726; GENERIC-NEXT:    subi16 sp, sp, 4
727; GENERIC-NEXT:    .cfi_def_cfa_offset 8
728; GENERIC-NEXT:    movi16 a1, 0
729; GENERIC-NEXT:    lsli16 a2, a1, 24
730; GENERIC-NEXT:    lsli16 a1, a1, 16
731; GENERIC-NEXT:    or16 a1, a2
732; GENERIC-NEXT:    movi16 a2, 16
733; GENERIC-NEXT:    lsli16 a2, a2, 8
734; GENERIC-NEXT:    or16 a2, a1
735; GENERIC-NEXT:    movi16 a1, 1
736; GENERIC-NEXT:    or16 a1, a2
737; GENERIC-NEXT:    lrw32 a2, [.LCPI31_0]
738; GENERIC-NEXT:    jsr16 a2
739; GENERIC-NEXT:    addi16 sp, sp, 4
740; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
741; GENERIC-NEXT:    addi16 sp, sp, 4
742; GENERIC-NEXT:    rts16
743; GENERIC-NEXT:    .p2align 1
744; GENERIC-NEXT:  # %bb.1:
745; GENERIC-NEXT:    .p2align 2, 0x0
746; GENERIC-NEXT:  .LCPI31_0:
747; GENERIC-NEXT:    .long __udivsi3
748entry:
749  %udiv = udiv  i32 %x, 4097
750  ret i32 %udiv
751}
752
753define i16 @UDIV_SHORT(i16 %x, i16 %y) {
754; CHECK-LABEL: UDIV_SHORT:
755; CHECK:       # %bb.0: # %entry
756; CHECK-NEXT:    zexth16 a0, a0
757; CHECK-NEXT:    zexth16 a1, a1
758; CHECK-NEXT:    divu32 a0, a1, a0
759; CHECK-NEXT:    rts16
760;
761; GENERIC-LABEL: UDIV_SHORT:
762; GENERIC:       # %bb.0: # %entry
763; GENERIC-NEXT:    subi16 sp, sp, 8
764; GENERIC-NEXT:    .cfi_def_cfa_offset 8
765; GENERIC-NEXT:    st16.w l0, (sp, 4) # 4-byte Folded Spill
766; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
767; GENERIC-NEXT:    .cfi_offset l0, -4
768; GENERIC-NEXT:    .cfi_offset lr, -8
769; GENERIC-NEXT:    subi16 sp, sp, 4
770; GENERIC-NEXT:    .cfi_def_cfa_offset 12
771; GENERIC-NEXT:    mov16 a2, a1
772; GENERIC-NEXT:    movi16 a1, 0
773; GENERIC-NEXT:    lsli16 a3, a1, 24
774; GENERIC-NEXT:    lsli16 l0, a1, 16
775; GENERIC-NEXT:    or16 l0, a3
776; GENERIC-NEXT:    movi16 a3, 255
777; GENERIC-NEXT:    lsli16 a1, a3, 8
778; GENERIC-NEXT:    or16 a1, l0
779; GENERIC-NEXT:    or16 a1, a3
780; GENERIC-NEXT:    and16 a2, a1
781; GENERIC-NEXT:    and16 a1, a0
782; GENERIC-NEXT:    lrw32 a3, [.LCPI32_0]
783; GENERIC-NEXT:    mov16 a0, a2
784; GENERIC-NEXT:    jsr16 a3
785; GENERIC-NEXT:    addi16 sp, sp, 4
786; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
787; GENERIC-NEXT:    ld16.w l0, (sp, 4) # 4-byte Folded Reload
788; GENERIC-NEXT:    addi16 sp, sp, 8
789; GENERIC-NEXT:    rts16
790; GENERIC-NEXT:    .p2align 1
791; GENERIC-NEXT:  # %bb.1:
792; GENERIC-NEXT:    .p2align 2, 0x0
793; GENERIC-NEXT:  .LCPI32_0:
794; GENERIC-NEXT:    .long __udivsi3
795entry:
796  %udiv = udiv  i16 %y, %x
797  ret i16 %udiv
798}
799
800define i16 @UDIV_SHORT_I(i16 %x) {
801; CHECK-LABEL: UDIV_SHORT_I:
802; CHECK:       # %bb.0: # %entry
803; CHECK-NEXT:    zexth16 a0, a0
804; CHECK-NEXT:    movi32 a1, 43691
805; CHECK-NEXT:    mult16 a0, a1
806; CHECK-NEXT:    lsri16 a0, a0, 17
807; CHECK-NEXT:    rts16
808;
809; GENERIC-LABEL: UDIV_SHORT_I:
810; GENERIC:       # %bb.0: # %entry
811; GENERIC-NEXT:    .cfi_def_cfa_offset 0
812; GENERIC-NEXT:    subi16 sp, sp, 4
813; GENERIC-NEXT:    .cfi_def_cfa_offset 4
814; GENERIC-NEXT:    movi16 a1, 0
815; GENERIC-NEXT:    lsli16 a2, a1, 24
816; GENERIC-NEXT:    lsli16 a1, a1, 16
817; GENERIC-NEXT:    or16 a1, a2
818; GENERIC-NEXT:    movi16 a2, 255
819; GENERIC-NEXT:    lsli16 a3, a2, 8
820; GENERIC-NEXT:    or16 a3, a1
821; GENERIC-NEXT:    or16 a3, a2
822; GENERIC-NEXT:    and16 a3, a0
823; GENERIC-NEXT:    movi16 a0, 170
824; GENERIC-NEXT:    lsli16 a0, a0, 8
825; GENERIC-NEXT:    or16 a0, a1
826; GENERIC-NEXT:    movi16 a1, 171
827; GENERIC-NEXT:    or16 a1, a0
828; GENERIC-NEXT:    mult16 a1, a3
829; GENERIC-NEXT:    lsri16 a0, a1, 17
830; GENERIC-NEXT:    addi16 sp, sp, 4
831; GENERIC-NEXT:    rts16
832entry:
833  %udiv = udiv  i16 %x, 3
834  ret i16 %udiv
835}
836
837define i8 @UDIV_CHAR(i8 %x, i8 %y) {
838; CHECK-LABEL: UDIV_CHAR:
839; CHECK:       # %bb.0: # %entry
840; CHECK-NEXT:    zextb16 a0, a0
841; CHECK-NEXT:    zextb16 a1, a1
842; CHECK-NEXT:    divu32 a0, a1, a0
843; CHECK-NEXT:    rts16
844;
845; GENERIC-LABEL: UDIV_CHAR:
846; GENERIC:       # %bb.0: # %entry
847; GENERIC-NEXT:    subi16 sp, sp, 4
848; GENERIC-NEXT:    .cfi_def_cfa_offset 4
849; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
850; GENERIC-NEXT:    .cfi_offset lr, -4
851; GENERIC-NEXT:    subi16 sp, sp, 4
852; GENERIC-NEXT:    .cfi_def_cfa_offset 8
853; GENERIC-NEXT:    mov16 a2, a1
854; GENERIC-NEXT:    movi16 a1, 255
855; GENERIC-NEXT:    and16 a2, a1
856; GENERIC-NEXT:    and16 a1, a0
857; GENERIC-NEXT:    lrw32 a3, [.LCPI34_0]
858; GENERIC-NEXT:    mov16 a0, a2
859; GENERIC-NEXT:    jsr16 a3
860; GENERIC-NEXT:    addi16 sp, sp, 4
861; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
862; GENERIC-NEXT:    addi16 sp, sp, 4
863; GENERIC-NEXT:    rts16
864; GENERIC-NEXT:    .p2align 1
865; GENERIC-NEXT:  # %bb.1:
866; GENERIC-NEXT:    .p2align 2, 0x0
867; GENERIC-NEXT:  .LCPI34_0:
868; GENERIC-NEXT:    .long __udivsi3
869entry:
870  %udiv = udiv  i8 %y, %x
871  ret i8 %udiv
872}
873
874define i8 @UDIV_CHAR_I(i8 %x) {
875; CHECK-LABEL: UDIV_CHAR_I:
876; CHECK:       # %bb.0: # %entry
877; CHECK-NEXT:    zextb16 a0, a0
878; CHECK-NEXT:    movi16 a1, 171
879; CHECK-NEXT:    mult16 a0, a1
880; CHECK-NEXT:    lsri16 a0, a0, 9
881; CHECK-NEXT:    rts16
882;
883; GENERIC-LABEL: UDIV_CHAR_I:
884; GENERIC:       # %bb.0: # %entry
885; GENERIC-NEXT:    .cfi_def_cfa_offset 0
886; GENERIC-NEXT:    subi16 sp, sp, 4
887; GENERIC-NEXT:    .cfi_def_cfa_offset 4
888; GENERIC-NEXT:    movi16 a1, 255
889; GENERIC-NEXT:    and16 a1, a0
890; GENERIC-NEXT:    movi16 a0, 171
891; GENERIC-NEXT:    mult16 a0, a1
892; GENERIC-NEXT:    lsri16 a0, a0, 9
893; GENERIC-NEXT:    addi16 sp, sp, 4
894; GENERIC-NEXT:    rts16
895entry:
896  %udiv = udiv  i8 %x, 3
897  ret i8 %udiv
898}
899
900define i32 @sdivRR(i32 %x, i32 %y) {
901; CHECK-LABEL: sdivRR:
902; CHECK:       # %bb.0: # %entry
903; CHECK-NEXT:    divs32 a0, a1, a0
904; CHECK-NEXT:    rts16
905;
906; GENERIC-LABEL: sdivRR:
907; GENERIC:       # %bb.0: # %entry
908; GENERIC-NEXT:    subi16 sp, sp, 4
909; GENERIC-NEXT:    .cfi_def_cfa_offset 4
910; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
911; GENERIC-NEXT:    .cfi_offset lr, -4
912; GENERIC-NEXT:    subi16 sp, sp, 4
913; GENERIC-NEXT:    .cfi_def_cfa_offset 8
914; GENERIC-NEXT:    mov16 a2, a0
915; GENERIC-NEXT:    lrw32 a3, [.LCPI36_0]
916; GENERIC-NEXT:    mov16 a0, a1
917; GENERIC-NEXT:    mov16 a1, a2
918; GENERIC-NEXT:    jsr16 a3
919; GENERIC-NEXT:    addi16 sp, sp, 4
920; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
921; GENERIC-NEXT:    addi16 sp, sp, 4
922; GENERIC-NEXT:    rts16
923; GENERIC-NEXT:    .p2align 1
924; GENERIC-NEXT:  # %bb.1:
925; GENERIC-NEXT:    .p2align 2, 0x0
926; GENERIC-NEXT:  .LCPI36_0:
927; GENERIC-NEXT:    .long __divsi3
928entry:
929  %sdiv = sdiv  i32 %y, %x
930  ret i32 %sdiv
931}
932
933define i32 @sdivRI(i32 %x) {
934; CHECK-LABEL: sdivRI:
935; CHECK:       # %bb.0: # %entry
936; CHECK-NEXT:    movi16 a1, 10
937; CHECK-NEXT:    divs32 a0, a0, a1
938; CHECK-NEXT:    rts16
939;
940; GENERIC-LABEL: sdivRI:
941; GENERIC:       # %bb.0: # %entry
942; GENERIC-NEXT:    subi16 sp, sp, 4
943; GENERIC-NEXT:    .cfi_def_cfa_offset 4
944; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
945; GENERIC-NEXT:    .cfi_offset lr, -4
946; GENERIC-NEXT:    subi16 sp, sp, 4
947; GENERIC-NEXT:    .cfi_def_cfa_offset 8
948; GENERIC-NEXT:    lrw32 a2, [.LCPI37_0]
949; GENERIC-NEXT:    movi16 a1, 10
950; GENERIC-NEXT:    jsr16 a2
951; GENERIC-NEXT:    addi16 sp, sp, 4
952; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
953; GENERIC-NEXT:    addi16 sp, sp, 4
954; GENERIC-NEXT:    rts16
955; GENERIC-NEXT:    .p2align 1
956; GENERIC-NEXT:  # %bb.1:
957; GENERIC-NEXT:    .p2align 2, 0x0
958; GENERIC-NEXT:  .LCPI37_0:
959; GENERIC-NEXT:    .long __divsi3
960entry:
961  %sdiv = sdiv  i32 %x, 10
962  ret i32 %sdiv
963}
964
965define i32 @sdivRI_X(i32 %x) {
966; CHECK-LABEL: sdivRI_X:
967; CHECK:       # %bb.0: # %entry
968; CHECK-NEXT:    movi32 a1, 4097
969; CHECK-NEXT:    divs32 a0, a0, a1
970; CHECK-NEXT:    rts16
971;
972; GENERIC-LABEL: sdivRI_X:
973; GENERIC:       # %bb.0: # %entry
974; GENERIC-NEXT:    subi16 sp, sp, 4
975; GENERIC-NEXT:    .cfi_def_cfa_offset 4
976; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
977; GENERIC-NEXT:    .cfi_offset lr, -4
978; GENERIC-NEXT:    subi16 sp, sp, 4
979; GENERIC-NEXT:    .cfi_def_cfa_offset 8
980; GENERIC-NEXT:    movi16 a1, 0
981; GENERIC-NEXT:    lsli16 a2, a1, 24
982; GENERIC-NEXT:    lsli16 a1, a1, 16
983; GENERIC-NEXT:    or16 a1, a2
984; GENERIC-NEXT:    movi16 a2, 16
985; GENERIC-NEXT:    lsli16 a2, a2, 8
986; GENERIC-NEXT:    or16 a2, a1
987; GENERIC-NEXT:    movi16 a1, 1
988; GENERIC-NEXT:    or16 a1, a2
989; GENERIC-NEXT:    lrw32 a2, [.LCPI38_0]
990; GENERIC-NEXT:    jsr16 a2
991; GENERIC-NEXT:    addi16 sp, sp, 4
992; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
993; GENERIC-NEXT:    addi16 sp, sp, 4
994; GENERIC-NEXT:    rts16
995; GENERIC-NEXT:    .p2align 1
996; GENERIC-NEXT:  # %bb.1:
997; GENERIC-NEXT:    .p2align 2, 0x0
998; GENERIC-NEXT:  .LCPI38_0:
999; GENERIC-NEXT:    .long __divsi3
1000entry:
1001  %sdiv = sdiv  i32 %x, 4097
1002  ret i32 %sdiv
1003}
1004
1005define i16 @SDIV_SHORT(i16 %x, i16 %y) {
1006; CHECK-LABEL: SDIV_SHORT:
1007; CHECK:       # %bb.0: # %entry
1008; CHECK-NEXT:    sexth16 a0, a0
1009; CHECK-NEXT:    sexth16 a1, a1
1010; CHECK-NEXT:    divs32 a0, a1, a0
1011; CHECK-NEXT:    rts16
1012;
1013; GENERIC-LABEL: SDIV_SHORT:
1014; GENERIC:       # %bb.0: # %entry
1015; GENERIC-NEXT:    subi16 sp, sp, 4
1016; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1017; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
1018; GENERIC-NEXT:    .cfi_offset lr, -4
1019; GENERIC-NEXT:    subi16 sp, sp, 4
1020; GENERIC-NEXT:    .cfi_def_cfa_offset 8
1021; GENERIC-NEXT:    sexth16 a2, a1
1022; GENERIC-NEXT:    sexth16 a1, a0
1023; GENERIC-NEXT:    lrw32 a3, [.LCPI39_0]
1024; GENERIC-NEXT:    mov16 a0, a2
1025; GENERIC-NEXT:    jsr16 a3
1026; GENERIC-NEXT:    addi16 sp, sp, 4
1027; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
1028; GENERIC-NEXT:    addi16 sp, sp, 4
1029; GENERIC-NEXT:    rts16
1030; GENERIC-NEXT:    .p2align 1
1031; GENERIC-NEXT:  # %bb.1:
1032; GENERIC-NEXT:    .p2align 2, 0x0
1033; GENERIC-NEXT:  .LCPI39_0:
1034; GENERIC-NEXT:    .long __divsi3
1035entry:
1036  %sdiv = sdiv  i16 %y, %x
1037  ret i16 %sdiv
1038}
1039
1040define i16 @SDIV_SHORT_I(i16 %x) {
1041; CHECK-LABEL: SDIV_SHORT_I:
1042; CHECK:       # %bb.0: # %entry
1043; CHECK-NEXT:    sexth16 a0, a0
1044; CHECK-NEXT:    movi32 a1, 21846
1045; CHECK-NEXT:    mult16 a0, a1
1046; CHECK-NEXT:    lsri16 a1, a0, 31
1047; CHECK-NEXT:    lsri16 a0, a0, 16
1048; CHECK-NEXT:    addu16 a0, a1
1049; CHECK-NEXT:    rts16
1050;
1051; GENERIC-LABEL: SDIV_SHORT_I:
1052; GENERIC:       # %bb.0: # %entry
1053; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1054; GENERIC-NEXT:    subi16 sp, sp, 4
1055; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1056; GENERIC-NEXT:    sexth16 a0, a0
1057; GENERIC-NEXT:    movi16 a1, 0
1058; GENERIC-NEXT:    lsli16 a2, a1, 24
1059; GENERIC-NEXT:    lsli16 a1, a1, 16
1060; GENERIC-NEXT:    or16 a1, a2
1061; GENERIC-NEXT:    movi16 a2, 85
1062; GENERIC-NEXT:    lsli16 a2, a2, 8
1063; GENERIC-NEXT:    or16 a2, a1
1064; GENERIC-NEXT:    movi16 a1, 86
1065; GENERIC-NEXT:    or16 a1, a2
1066; GENERIC-NEXT:    mult16 a1, a0
1067; GENERIC-NEXT:    lsri16 a0, a1, 31
1068; GENERIC-NEXT:    lsri16 a1, a1, 16
1069; GENERIC-NEXT:    addu16 a0, a1, a0
1070; GENERIC-NEXT:    addi16 sp, sp, 4
1071; GENERIC-NEXT:    rts16
1072entry:
1073  %sdiv = sdiv  i16 %x, 3
1074  ret i16 %sdiv
1075}
1076
1077define i8 @SDIV_CHAR(i8 %x, i8 %y) {
1078; CHECK-LABEL: SDIV_CHAR:
1079; CHECK:       # %bb.0: # %entry
1080; CHECK-NEXT:    sextb16 a0, a0
1081; CHECK-NEXT:    sextb16 a1, a1
1082; CHECK-NEXT:    divs32 a0, a1, a0
1083; CHECK-NEXT:    rts16
1084;
1085; GENERIC-LABEL: SDIV_CHAR:
1086; GENERIC:       # %bb.0: # %entry
1087; GENERIC-NEXT:    subi16 sp, sp, 4
1088; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1089; GENERIC-NEXT:    st32.w lr, (sp, 0) # 4-byte Folded Spill
1090; GENERIC-NEXT:    .cfi_offset lr, -4
1091; GENERIC-NEXT:    subi16 sp, sp, 4
1092; GENERIC-NEXT:    .cfi_def_cfa_offset 8
1093; GENERIC-NEXT:    sextb16 a2, a1
1094; GENERIC-NEXT:    sextb16 a1, a0
1095; GENERIC-NEXT:    lrw32 a3, [.LCPI41_0]
1096; GENERIC-NEXT:    mov16 a0, a2
1097; GENERIC-NEXT:    jsr16 a3
1098; GENERIC-NEXT:    addi16 sp, sp, 4
1099; GENERIC-NEXT:    ld32.w lr, (sp, 0) # 4-byte Folded Reload
1100; GENERIC-NEXT:    addi16 sp, sp, 4
1101; GENERIC-NEXT:    rts16
1102; GENERIC-NEXT:    .p2align 1
1103; GENERIC-NEXT:  # %bb.1:
1104; GENERIC-NEXT:    .p2align 2, 0x0
1105; GENERIC-NEXT:  .LCPI41_0:
1106; GENERIC-NEXT:    .long __divsi3
1107entry:
1108  %sdiv = sdiv  i8 %y, %x
1109  ret i8 %sdiv
1110}
1111
1112define i8 @SDIV_CHAR_I(i8 %x) {
1113; CHECK-LABEL: SDIV_CHAR_I:
1114; CHECK:       # %bb.0: # %entry
1115; CHECK-NEXT:    sextb16 a1, a0
1116; CHECK-NEXT:    movi16 a2, 85
1117; CHECK-NEXT:    mult16 a1, a2
1118; CHECK-NEXT:    lsri16 a1, a1, 8
1119; CHECK-NEXT:    subu16 a0, a1, a0
1120; CHECK-NEXT:    andi32 a1, a0, 128
1121; CHECK-NEXT:    lsri16 a1, a1, 7
1122; CHECK-NEXT:    sextb16 a0, a0
1123; CHECK-NEXT:    asri16 a0, a0, 1
1124; CHECK-NEXT:    addu16 a0, a1
1125; CHECK-NEXT:    rts16
1126;
1127; GENERIC-LABEL: SDIV_CHAR_I:
1128; GENERIC:       # %bb.0: # %entry
1129; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1130; GENERIC-NEXT:    subi16 sp, sp, 4
1131; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1132; GENERIC-NEXT:    sextb16 a1, a0
1133; GENERIC-NEXT:    movi16 a2, 85
1134; GENERIC-NEXT:    mult16 a2, a1
1135; GENERIC-NEXT:    lsri16 a1, a2, 8
1136; GENERIC-NEXT:    subu16 a0, a1, a0
1137; GENERIC-NEXT:    movi16 a1, 128
1138; GENERIC-NEXT:    and16 a1, a0
1139; GENERIC-NEXT:    lsri16 a1, a1, 7
1140; GENERIC-NEXT:    sextb16 a0, a0
1141; GENERIC-NEXT:    asri16 a0, a0, 1
1142; GENERIC-NEXT:    addu16 a0, a0, a1
1143; GENERIC-NEXT:    addi16 sp, sp, 4
1144; GENERIC-NEXT:    rts16
1145entry:
1146  %sdiv = sdiv  i8 %x, -3
1147  ret i8 %sdiv
1148}
1149
1150define i32 @shlRR(i32 %x, i32 %y) {
1151; CHECK-LABEL: shlRR:
1152; CHECK:       # %bb.0: # %entry
1153; CHECK-NEXT:    lsl32 a0, a1, a0
1154; CHECK-NEXT:    rts16
1155;
1156; GENERIC-LABEL: shlRR:
1157; GENERIC:       # %bb.0: # %entry
1158; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1159; GENERIC-NEXT:    subi16 sp, sp, 4
1160; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1161; GENERIC-NEXT:    lsl16 a1, a0
1162; GENERIC-NEXT:    mov16 a0, a1
1163; GENERIC-NEXT:    addi16 sp, sp, 4
1164; GENERIC-NEXT:    rts16
1165entry:
1166  %shl = shl nsw i32 %y, %x
1167  ret i32 %shl
1168}
1169
1170define i32 @shlRI(i32 %x) {
1171; CHECK-LABEL: shlRI:
1172; CHECK:       # %bb.0: # %entry
1173; CHECK-NEXT:    lsli16 a0, a0, 10
1174; CHECK-NEXT:    rts16
1175;
1176; GENERIC-LABEL: shlRI:
1177; GENERIC:       # %bb.0: # %entry
1178; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1179; GENERIC-NEXT:    subi16 sp, sp, 4
1180; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1181; GENERIC-NEXT:    lsli16 a0, a0, 10
1182; GENERIC-NEXT:    addi16 sp, sp, 4
1183; GENERIC-NEXT:    rts16
1184entry:
1185  %shl = shl nsw i32 %x, 10
1186  ret i32 %shl
1187}
1188
1189
1190define i64 @SHL_LONG_I(i64 %x) {
1191; CHECK-LABEL: SHL_LONG_I:
1192; CHECK:       # %bb.0: # %entry
1193; CHECK-NEXT:    lsri16 a2, a0, 25
1194; CHECK-NEXT:    lsli16 a1, a1, 7
1195; CHECK-NEXT:    or16 a1, a2
1196; CHECK-NEXT:    lsli16 a0, a0, 7
1197; CHECK-NEXT:    rts16
1198;
1199; GENERIC-LABEL: SHL_LONG_I:
1200; GENERIC:       # %bb.0: # %entry
1201; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1202; GENERIC-NEXT:    subi16 sp, sp, 4
1203; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1204; GENERIC-NEXT:    lsri16 a2, a0, 25
1205; GENERIC-NEXT:    lsli16 a1, a1, 7
1206; GENERIC-NEXT:    or16 a1, a2
1207; GENERIC-NEXT:    lsli16 a0, a0, 7
1208; GENERIC-NEXT:    addi16 sp, sp, 4
1209; GENERIC-NEXT:    rts16
1210entry:
1211  %shl = shl nsw i64 %x, 7
1212  ret i64 %shl
1213}
1214
1215define i16 @SHL_SHORT(i16 %x, i16 %y) {
1216; CHECK-LABEL: SHL_SHORT:
1217; CHECK:       # %bb.0: # %entry
1218; CHECK-NEXT:    zexth16 a0, a0
1219; CHECK-NEXT:    lsl32 a0, a1, a0
1220; CHECK-NEXT:    rts16
1221;
1222; GENERIC-LABEL: SHL_SHORT:
1223; GENERIC:       # %bb.0: # %entry
1224; GENERIC-NEXT:    subi16 sp, sp, 4
1225; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1226; GENERIC-NEXT:    st16.w l0, (sp, 0) # 4-byte Folded Spill
1227; GENERIC-NEXT:    .cfi_offset l0, -4
1228; GENERIC-NEXT:    subi16 sp, sp, 4
1229; GENERIC-NEXT:    .cfi_def_cfa_offset 8
1230; GENERIC-NEXT:    movi16 a2, 0
1231; GENERIC-NEXT:    lsli16 a3, a2, 24
1232; GENERIC-NEXT:    lsli16 a2, a2, 16
1233; GENERIC-NEXT:    or16 a2, a3
1234; GENERIC-NEXT:    movi16 a3, 255
1235; GENERIC-NEXT:    lsli16 l0, a3, 8
1236; GENERIC-NEXT:    or16 l0, a2
1237; GENERIC-NEXT:    or16 l0, a3
1238; GENERIC-NEXT:    and16 l0, a0
1239; GENERIC-NEXT:    lsl16 a1, l0
1240; GENERIC-NEXT:    mov16 a0, a1
1241; GENERIC-NEXT:    addi16 sp, sp, 4
1242; GENERIC-NEXT:    ld16.w l0, (sp, 0) # 4-byte Folded Reload
1243; GENERIC-NEXT:    addi16 sp, sp, 4
1244; GENERIC-NEXT:    rts16
1245entry:
1246  %shl = shl nsw i16 %y, %x
1247  ret i16 %shl
1248}
1249
1250define i16 @SHL_SHORT_I(i16 %x) {
1251; CHECK-LABEL: SHL_SHORT_I:
1252; CHECK:       # %bb.0: # %entry
1253; CHECK-NEXT:    lsli16 a0, a0, 1
1254; CHECK-NEXT:    rts16
1255;
1256; GENERIC-LABEL: SHL_SHORT_I:
1257; GENERIC:       # %bb.0: # %entry
1258; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1259; GENERIC-NEXT:    subi16 sp, sp, 4
1260; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1261; GENERIC-NEXT:    lsli16 a0, a0, 1
1262; GENERIC-NEXT:    addi16 sp, sp, 4
1263; GENERIC-NEXT:    rts16
1264entry:
1265  %shl = shl nsw i16 %x, 1
1266  ret i16 %shl
1267}
1268
1269define i8 @SHL_CHAR(i8 %x, i8 %y) {
1270; CHECK-LABEL: SHL_CHAR:
1271; CHECK:       # %bb.0: # %entry
1272; CHECK-NEXT:    zextb16 a0, a0
1273; CHECK-NEXT:    lsl32 a0, a1, a0
1274; CHECK-NEXT:    rts16
1275;
1276; GENERIC-LABEL: SHL_CHAR:
1277; GENERIC:       # %bb.0: # %entry
1278; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1279; GENERIC-NEXT:    subi16 sp, sp, 4
1280; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1281; GENERIC-NEXT:    movi16 a2, 255
1282; GENERIC-NEXT:    and16 a2, a0
1283; GENERIC-NEXT:    lsl16 a1, a2
1284; GENERIC-NEXT:    mov16 a0, a1
1285; GENERIC-NEXT:    addi16 sp, sp, 4
1286; GENERIC-NEXT:    rts16
1287entry:
1288  %shl = shl nsw i8 %y, %x
1289  ret i8 %shl
1290}
1291
1292define i8 @SHL_CHAR_I(i8 %x) {
1293; CHECK-LABEL: SHL_CHAR_I:
1294; CHECK:       # %bb.0: # %entry
1295; CHECK-NEXT:    lsli16 a0, a0, 1
1296; CHECK-NEXT:    rts16
1297;
1298; GENERIC-LABEL: SHL_CHAR_I:
1299; GENERIC:       # %bb.0: # %entry
1300; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1301; GENERIC-NEXT:    subi16 sp, sp, 4
1302; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1303; GENERIC-NEXT:    lsli16 a0, a0, 1
1304; GENERIC-NEXT:    addi16 sp, sp, 4
1305; GENERIC-NEXT:    rts16
1306entry:
1307  %shl = shl nsw i8 %x, 1
1308  ret i8 %shl
1309}
1310
1311define i32 @andRR(i32 %x, i32 %y) {
1312; CHECK-LABEL: andRR:
1313; CHECK:       # %bb.0: # %entry
1314; CHECK-NEXT:    and16 a0, a1
1315; CHECK-NEXT:    rts16
1316;
1317; GENERIC-LABEL: andRR:
1318; GENERIC:       # %bb.0: # %entry
1319; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1320; GENERIC-NEXT:    subi16 sp, sp, 4
1321; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1322; GENERIC-NEXT:    and16 a0, a1
1323; GENERIC-NEXT:    addi16 sp, sp, 4
1324; GENERIC-NEXT:    rts16
1325entry:
1326  %and = and  i32 %y, %x
1327  ret i32 %and
1328}
1329
1330define i32 @andRI(i32 %x) {
1331; CHECK-LABEL: andRI:
1332; CHECK:       # %bb.0: # %entry
1333; CHECK-NEXT:    andi32 a0, a0, 10
1334; CHECK-NEXT:    rts16
1335;
1336; GENERIC-LABEL: andRI:
1337; GENERIC:       # %bb.0: # %entry
1338; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1339; GENERIC-NEXT:    subi16 sp, sp, 4
1340; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1341; GENERIC-NEXT:    movi16 a1, 10
1342; GENERIC-NEXT:    and16 a0, a1
1343; GENERIC-NEXT:    addi16 sp, sp, 4
1344; GENERIC-NEXT:    rts16
1345entry:
1346  %and = and  i32 %x, 10
1347  ret i32 %and
1348}
1349
1350define i32 @andRI_X(i32 %x) {
1351; CHECK-LABEL: andRI_X:
1352; CHECK:       # %bb.0: # %entry
1353; CHECK-NEXT:    movi32 a1, 4097
1354; CHECK-NEXT:    and16 a0, a1
1355; CHECK-NEXT:    rts16
1356;
1357; GENERIC-LABEL: andRI_X:
1358; GENERIC:       # %bb.0: # %entry
1359; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1360; GENERIC-NEXT:    subi16 sp, sp, 4
1361; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1362; GENERIC-NEXT:    movi16 a1, 0
1363; GENERIC-NEXT:    lsli16 a2, a1, 24
1364; GENERIC-NEXT:    lsli16 a1, a1, 16
1365; GENERIC-NEXT:    or16 a1, a2
1366; GENERIC-NEXT:    movi16 a2, 16
1367; GENERIC-NEXT:    lsli16 a2, a2, 8
1368; GENERIC-NEXT:    or16 a2, a1
1369; GENERIC-NEXT:    movi16 a1, 1
1370; GENERIC-NEXT:    or16 a1, a2
1371; GENERIC-NEXT:    and16 a0, a1
1372; GENERIC-NEXT:    addi16 sp, sp, 4
1373; GENERIC-NEXT:    rts16
1374entry:
1375  %and = and  i32 %x, 4097
1376  ret i32 %and
1377}
1378
1379define i64 @AND_LONG(i64 %x, i64 %y) {
1380; CHECK-LABEL: AND_LONG:
1381; CHECK:       # %bb.0: # %entry
1382; CHECK-NEXT:    and16 a0, a2
1383; CHECK-NEXT:    and16 a1, a3
1384; CHECK-NEXT:    rts16
1385;
1386; GENERIC-LABEL: AND_LONG:
1387; GENERIC:       # %bb.0: # %entry
1388; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1389; GENERIC-NEXT:    subi16 sp, sp, 4
1390; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1391; GENERIC-NEXT:    and16 a0, a2
1392; GENERIC-NEXT:    and16 a1, a3
1393; GENERIC-NEXT:    addi16 sp, sp, 4
1394; GENERIC-NEXT:    rts16
1395entry:
1396  %and = and  i64 %y, %x
1397  ret i64 %and
1398}
1399
1400define i64 @AND_LONG_I(i64 %x) {
1401; CHECK-LABEL: AND_LONG_I:
1402; CHECK:       # %bb.0: # %entry
1403; CHECK-NEXT:    andi32 a0, a0, 1
1404; CHECK-NEXT:    movi16 a1, 0
1405; CHECK-NEXT:    rts16
1406;
1407; GENERIC-LABEL: AND_LONG_I:
1408; GENERIC:       # %bb.0: # %entry
1409; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1410; GENERIC-NEXT:    subi16 sp, sp, 4
1411; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1412; GENERIC-NEXT:    movi16 a1, 1
1413; GENERIC-NEXT:    and16 a0, a1
1414; GENERIC-NEXT:    movi16 a1, 0
1415; GENERIC-NEXT:    addi16 sp, sp, 4
1416; GENERIC-NEXT:    rts16
1417entry:
1418  %and = and  i64 %x, 1
1419  ret i64 %and
1420}
1421
1422define i16 @AND_SHORT(i16 %x, i16 %y) {
1423; CHECK-LABEL: AND_SHORT:
1424; CHECK:       # %bb.0: # %entry
1425; CHECK-NEXT:    and16 a0, a1
1426; CHECK-NEXT:    rts16
1427;
1428; GENERIC-LABEL: AND_SHORT:
1429; GENERIC:       # %bb.0: # %entry
1430; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1431; GENERIC-NEXT:    subi16 sp, sp, 4
1432; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1433; GENERIC-NEXT:    and16 a0, a1
1434; GENERIC-NEXT:    addi16 sp, sp, 4
1435; GENERIC-NEXT:    rts16
1436entry:
1437  %and = and  i16 %y, %x
1438  ret i16 %and
1439}
1440
1441define i16 @AND_SHORT_I(i16 %x) {
1442; CHECK-LABEL: AND_SHORT_I:
1443; CHECK:       # %bb.0: # %entry
1444; CHECK-NEXT:    andi32 a0, a0, 1
1445; CHECK-NEXT:    rts16
1446;
1447; GENERIC-LABEL: AND_SHORT_I:
1448; GENERIC:       # %bb.0: # %entry
1449; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1450; GENERIC-NEXT:    subi16 sp, sp, 4
1451; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1452; GENERIC-NEXT:    movi16 a1, 1
1453; GENERIC-NEXT:    and16 a0, a1
1454; GENERIC-NEXT:    addi16 sp, sp, 4
1455; GENERIC-NEXT:    rts16
1456entry:
1457  %and = and  i16 %x, 1
1458  ret i16 %and
1459}
1460
1461define i8 @AND_CHAR(i8 %x, i8 %y) {
1462; CHECK-LABEL: AND_CHAR:
1463; CHECK:       # %bb.0: # %entry
1464; CHECK-NEXT:    and16 a0, a1
1465; CHECK-NEXT:    rts16
1466;
1467; GENERIC-LABEL: AND_CHAR:
1468; GENERIC:       # %bb.0: # %entry
1469; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1470; GENERIC-NEXT:    subi16 sp, sp, 4
1471; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1472; GENERIC-NEXT:    and16 a0, a1
1473; GENERIC-NEXT:    addi16 sp, sp, 4
1474; GENERIC-NEXT:    rts16
1475entry:
1476  %and = and  i8 %y, %x
1477  ret i8 %and
1478}
1479
1480define i8 @AND_CHAR_I(i8 %x) {
1481; CHECK-LABEL: AND_CHAR_I:
1482; CHECK:       # %bb.0: # %entry
1483; CHECK-NEXT:    andi32 a0, a0, 1
1484; CHECK-NEXT:    rts16
1485;
1486; GENERIC-LABEL: AND_CHAR_I:
1487; GENERIC:       # %bb.0: # %entry
1488; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1489; GENERIC-NEXT:    subi16 sp, sp, 4
1490; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1491; GENERIC-NEXT:    movi16 a1, 1
1492; GENERIC-NEXT:    and16 a0, a1
1493; GENERIC-NEXT:    addi16 sp, sp, 4
1494; GENERIC-NEXT:    rts16
1495entry:
1496  %and = and  i8 %x, 1
1497  ret i8 %and
1498}
1499
1500define i32 @ashrRR(i32 %x, i32 %y) {
1501; CHECK-LABEL: ashrRR:
1502; CHECK:       # %bb.0: # %entry
1503; CHECK-NEXT:    asr32 a0, a1, a0
1504; CHECK-NEXT:    rts16
1505;
1506; GENERIC-LABEL: ashrRR:
1507; GENERIC:       # %bb.0: # %entry
1508; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1509; GENERIC-NEXT:    subi16 sp, sp, 4
1510; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1511; GENERIC-NEXT:    asr16 a1, a0
1512; GENERIC-NEXT:    mov16 a0, a1
1513; GENERIC-NEXT:    addi16 sp, sp, 4
1514; GENERIC-NEXT:    rts16
1515entry:
1516  %ashr = ashr  i32 %y, %x
1517  ret i32 %ashr
1518}
1519
1520define i32 @ashrRI(i32 %x) {
1521; CHECK-LABEL: ashrRI:
1522; CHECK:       # %bb.0: # %entry
1523; CHECK-NEXT:    asri16 a0, a0, 10
1524; CHECK-NEXT:    rts16
1525;
1526; GENERIC-LABEL: ashrRI:
1527; GENERIC:       # %bb.0: # %entry
1528; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1529; GENERIC-NEXT:    subi16 sp, sp, 4
1530; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1531; GENERIC-NEXT:    asri16 a0, a0, 10
1532; GENERIC-NEXT:    addi16 sp, sp, 4
1533; GENERIC-NEXT:    rts16
1534entry:
1535  %ashr = ashr  i32 %x, 10
1536  ret i32 %ashr
1537}
1538
1539
1540define i64 @ASHR_LONG_I(i64 %x) {
1541; CHECK-LABEL: ASHR_LONG_I:
1542; CHECK:       # %bb.0: # %entry
1543; CHECK-NEXT:    lsli16 a2, a1, 25
1544; CHECK-NEXT:    lsri16 a0, a0, 7
1545; CHECK-NEXT:    or16 a0, a2
1546; CHECK-NEXT:    asri16 a1, a1, 7
1547; CHECK-NEXT:    rts16
1548;
1549; GENERIC-LABEL: ASHR_LONG_I:
1550; GENERIC:       # %bb.0: # %entry
1551; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1552; GENERIC-NEXT:    subi16 sp, sp, 4
1553; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1554; GENERIC-NEXT:    lsli16 a2, a1, 25
1555; GENERIC-NEXT:    lsri16 a0, a0, 7
1556; GENERIC-NEXT:    or16 a0, a2
1557; GENERIC-NEXT:    asri16 a1, a1, 7
1558; GENERIC-NEXT:    addi16 sp, sp, 4
1559; GENERIC-NEXT:    rts16
1560entry:
1561  %ashr = ashr  i64 %x, 7
1562  ret i64 %ashr
1563}
1564
1565define i16 @ASHR_SHORT(i16 %x, i16 %y) {
1566; CHECK-LABEL: ASHR_SHORT:
1567; CHECK:       # %bb.0: # %entry
1568; CHECK-NEXT:    sexth16 a1, a1
1569; CHECK-NEXT:    zexth16 a0, a0
1570; CHECK-NEXT:    asr32 a0, a1, a0
1571; CHECK-NEXT:    rts16
1572;
1573; GENERIC-LABEL: ASHR_SHORT:
1574; GENERIC:       # %bb.0: # %entry
1575; GENERIC-NEXT:    subi16 sp, sp, 4
1576; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1577; GENERIC-NEXT:    st16.w l0, (sp, 0) # 4-byte Folded Spill
1578; GENERIC-NEXT:    .cfi_offset l0, -4
1579; GENERIC-NEXT:    subi16 sp, sp, 4
1580; GENERIC-NEXT:    .cfi_def_cfa_offset 8
1581; GENERIC-NEXT:    sexth16 a1, a1
1582; GENERIC-NEXT:    movi16 a2, 0
1583; GENERIC-NEXT:    lsli16 a3, a2, 24
1584; GENERIC-NEXT:    lsli16 a2, a2, 16
1585; GENERIC-NEXT:    or16 a2, a3
1586; GENERIC-NEXT:    movi16 a3, 255
1587; GENERIC-NEXT:    lsli16 l0, a3, 8
1588; GENERIC-NEXT:    or16 l0, a2
1589; GENERIC-NEXT:    or16 l0, a3
1590; GENERIC-NEXT:    and16 l0, a0
1591; GENERIC-NEXT:    asr16 a1, l0
1592; GENERIC-NEXT:    mov16 a0, a1
1593; GENERIC-NEXT:    addi16 sp, sp, 4
1594; GENERIC-NEXT:    ld16.w l0, (sp, 0) # 4-byte Folded Reload
1595; GENERIC-NEXT:    addi16 sp, sp, 4
1596; GENERIC-NEXT:    rts16
1597entry:
1598  %ashr = ashr  i16 %y, %x
1599  ret i16 %ashr
1600}
1601
1602define i16 @ASHR_SHORT_I(i16 %x) {
1603; CHECK-LABEL: ASHR_SHORT_I:
1604; CHECK:       # %bb.0: # %entry
1605; CHECK-NEXT:    sexth16 a0, a0
1606; CHECK-NEXT:    asri16 a0, a0, 1
1607; CHECK-NEXT:    rts16
1608;
1609; GENERIC-LABEL: ASHR_SHORT_I:
1610; GENERIC:       # %bb.0: # %entry
1611; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1612; GENERIC-NEXT:    subi16 sp, sp, 4
1613; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1614; GENERIC-NEXT:    sexth16 a0, a0
1615; GENERIC-NEXT:    asri16 a0, a0, 1
1616; GENERIC-NEXT:    addi16 sp, sp, 4
1617; GENERIC-NEXT:    rts16
1618entry:
1619  %ashr = ashr  i16 %x, 1
1620  ret i16 %ashr
1621}
1622
1623define i8 @ASHR_CHAR(i8 %x, i8 %y) {
1624; CHECK-LABEL: ASHR_CHAR:
1625; CHECK:       # %bb.0: # %entry
1626; CHECK-NEXT:    sextb16 a1, a1
1627; CHECK-NEXT:    zextb16 a0, a0
1628; CHECK-NEXT:    asr32 a0, a1, a0
1629; CHECK-NEXT:    rts16
1630;
1631; GENERIC-LABEL: ASHR_CHAR:
1632; GENERIC:       # %bb.0: # %entry
1633; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1634; GENERIC-NEXT:    subi16 sp, sp, 4
1635; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1636; GENERIC-NEXT:    sextb16 a1, a1
1637; GENERIC-NEXT:    movi16 a2, 255
1638; GENERIC-NEXT:    and16 a2, a0
1639; GENERIC-NEXT:    asr16 a1, a2
1640; GENERIC-NEXT:    mov16 a0, a1
1641; GENERIC-NEXT:    addi16 sp, sp, 4
1642; GENERIC-NEXT:    rts16
1643entry:
1644  %ashr = ashr  i8 %y, %x
1645  ret i8 %ashr
1646}
1647
1648define i8 @ASHR_CHAR_I(i8 %x) {
1649; CHECK-LABEL: ASHR_CHAR_I:
1650; CHECK:       # %bb.0: # %entry
1651; CHECK-NEXT:    sextb16 a0, a0
1652; CHECK-NEXT:    asri16 a0, a0, 1
1653; CHECK-NEXT:    rts16
1654;
1655; GENERIC-LABEL: ASHR_CHAR_I:
1656; GENERIC:       # %bb.0: # %entry
1657; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1658; GENERIC-NEXT:    subi16 sp, sp, 4
1659; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1660; GENERIC-NEXT:    sextb16 a0, a0
1661; GENERIC-NEXT:    asri16 a0, a0, 1
1662; GENERIC-NEXT:    addi16 sp, sp, 4
1663; GENERIC-NEXT:    rts16
1664entry:
1665  %ashr = ashr  i8 %x, 1
1666  ret i8 %ashr
1667}
1668
1669
1670define i32 @lshrRR(i32 %x, i32 %y) {
1671; CHECK-LABEL: lshrRR:
1672; CHECK:       # %bb.0: # %entry
1673; CHECK-NEXT:    lsr32 a0, a1, a0
1674; CHECK-NEXT:    rts16
1675;
1676; GENERIC-LABEL: lshrRR:
1677; GENERIC:       # %bb.0: # %entry
1678; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1679; GENERIC-NEXT:    subi16 sp, sp, 4
1680; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1681; GENERIC-NEXT:    lsr16 a1, a0
1682; GENERIC-NEXT:    mov16 a0, a1
1683; GENERIC-NEXT:    addi16 sp, sp, 4
1684; GENERIC-NEXT:    rts16
1685entry:
1686  %lshr = lshr  i32 %y, %x
1687  ret i32 %lshr
1688}
1689
1690define i32 @lshrRI(i32 %x) {
1691; CHECK-LABEL: lshrRI:
1692; CHECK:       # %bb.0: # %entry
1693; CHECK-NEXT:    lsri16 a0, a0, 10
1694; CHECK-NEXT:    rts16
1695;
1696; GENERIC-LABEL: lshrRI:
1697; GENERIC:       # %bb.0: # %entry
1698; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1699; GENERIC-NEXT:    subi16 sp, sp, 4
1700; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1701; GENERIC-NEXT:    lsri16 a0, a0, 10
1702; GENERIC-NEXT:    addi16 sp, sp, 4
1703; GENERIC-NEXT:    rts16
1704entry:
1705  %lshr = lshr  i32 %x, 10
1706  ret i32 %lshr
1707}
1708
1709define i64 @LSHR_LONG_I(i64 %x) {
1710; CHECK-LABEL: LSHR_LONG_I:
1711; CHECK:       # %bb.0: # %entry
1712; CHECK-NEXT:    lsli16 a2, a1, 25
1713; CHECK-NEXT:    lsri16 a0, a0, 7
1714; CHECK-NEXT:    or16 a0, a2
1715; CHECK-NEXT:    lsri16 a1, a1, 7
1716; CHECK-NEXT:    rts16
1717;
1718; GENERIC-LABEL: LSHR_LONG_I:
1719; GENERIC:       # %bb.0: # %entry
1720; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1721; GENERIC-NEXT:    subi16 sp, sp, 4
1722; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1723; GENERIC-NEXT:    lsli16 a2, a1, 25
1724; GENERIC-NEXT:    lsri16 a0, a0, 7
1725; GENERIC-NEXT:    or16 a0, a2
1726; GENERIC-NEXT:    lsri16 a1, a1, 7
1727; GENERIC-NEXT:    addi16 sp, sp, 4
1728; GENERIC-NEXT:    rts16
1729entry:
1730  %lshr = lshr  i64 %x, 7
1731  ret i64 %lshr
1732}
1733
1734define i16 @LSHR_SHORT(i16 %x, i16 %y) {
1735; CHECK-LABEL: LSHR_SHORT:
1736; CHECK:       # %bb.0: # %entry
1737; CHECK-NEXT:    zexth16 a1, a1
1738; CHECK-NEXT:    zexth16 a0, a0
1739; CHECK-NEXT:    lsr32 a0, a1, a0
1740; CHECK-NEXT:    rts16
1741;
1742; GENERIC-LABEL: LSHR_SHORT:
1743; GENERIC:       # %bb.0: # %entry
1744; GENERIC-NEXT:    subi16 sp, sp, 4
1745; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1746; GENERIC-NEXT:    st16.w l0, (sp, 0) # 4-byte Folded Spill
1747; GENERIC-NEXT:    .cfi_offset l0, -4
1748; GENERIC-NEXT:    subi16 sp, sp, 4
1749; GENERIC-NEXT:    .cfi_def_cfa_offset 8
1750; GENERIC-NEXT:    movi16 a2, 0
1751; GENERIC-NEXT:    lsli16 a3, a2, 24
1752; GENERIC-NEXT:    lsli16 a2, a2, 16
1753; GENERIC-NEXT:    or16 a2, a3
1754; GENERIC-NEXT:    movi16 a3, 255
1755; GENERIC-NEXT:    lsli16 l0, a3, 8
1756; GENERIC-NEXT:    or16 l0, a2
1757; GENERIC-NEXT:    or16 l0, a3
1758; GENERIC-NEXT:    and16 a1, l0
1759; GENERIC-NEXT:    and16 l0, a0
1760; GENERIC-NEXT:    lsr16 a1, l0
1761; GENERIC-NEXT:    mov16 a0, a1
1762; GENERIC-NEXT:    addi16 sp, sp, 4
1763; GENERIC-NEXT:    ld16.w l0, (sp, 0) # 4-byte Folded Reload
1764; GENERIC-NEXT:    addi16 sp, sp, 4
1765; GENERIC-NEXT:    rts16
1766entry:
1767  %lshr = lshr  i16 %y, %x
1768  ret i16 %lshr
1769}
1770
1771define i16 @LSHR_SHORT_I(i16 %x) {
1772; CHECK-LABEL: LSHR_SHORT_I:
1773; CHECK:       # %bb.0: # %entry
1774; CHECK-NEXT:    movi32 a1, 65534
1775; CHECK-NEXT:    and16 a0, a1
1776; CHECK-NEXT:    lsri16 a0, a0, 1
1777; CHECK-NEXT:    rts16
1778;
1779; GENERIC-LABEL: LSHR_SHORT_I:
1780; GENERIC:       # %bb.0: # %entry
1781; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1782; GENERIC-NEXT:    subi16 sp, sp, 4
1783; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1784; GENERIC-NEXT:    movi16 a1, 0
1785; GENERIC-NEXT:    lsli16 a2, a1, 24
1786; GENERIC-NEXT:    lsli16 a1, a1, 16
1787; GENERIC-NEXT:    or16 a1, a2
1788; GENERIC-NEXT:    movi16 a2, 255
1789; GENERIC-NEXT:    lsli16 a2, a2, 8
1790; GENERIC-NEXT:    or16 a2, a1
1791; GENERIC-NEXT:    movi16 a1, 254
1792; GENERIC-NEXT:    or16 a1, a2
1793; GENERIC-NEXT:    and16 a1, a0
1794; GENERIC-NEXT:    lsri16 a0, a1, 1
1795; GENERIC-NEXT:    addi16 sp, sp, 4
1796; GENERIC-NEXT:    rts16
1797entry:
1798  %lshr = lshr  i16 %x, 1
1799  ret i16 %lshr
1800}
1801
1802define i8 @LSHR_CHAR(i8 %x, i8 %y) {
1803; CHECK-LABEL: LSHR_CHAR:
1804; CHECK:       # %bb.0: # %entry
1805; CHECK-NEXT:    zextb16 a1, a1
1806; CHECK-NEXT:    zextb16 a0, a0
1807; CHECK-NEXT:    lsr32 a0, a1, a0
1808; CHECK-NEXT:    rts16
1809;
1810; GENERIC-LABEL: LSHR_CHAR:
1811; GENERIC:       # %bb.0: # %entry
1812; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1813; GENERIC-NEXT:    subi16 sp, sp, 4
1814; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1815; GENERIC-NEXT:    movi16 a2, 255
1816; GENERIC-NEXT:    and16 a1, a2
1817; GENERIC-NEXT:    and16 a0, a2
1818; GENERIC-NEXT:    lsr16 a1, a0
1819; GENERIC-NEXT:    mov16 a0, a1
1820; GENERIC-NEXT:    addi16 sp, sp, 4
1821; GENERIC-NEXT:    rts16
1822entry:
1823  %lshr = lshr  i8 %y, %x
1824  ret i8 %lshr
1825}
1826
1827define i8 @LSHR_CHAR_I(i8 %x) {
1828; CHECK-LABEL: LSHR_CHAR_I:
1829; CHECK:       # %bb.0: # %entry
1830; CHECK-NEXT:    andi32 a0, a0, 254
1831; CHECK-NEXT:    lsri16 a0, a0, 1
1832; CHECK-NEXT:    rts16
1833;
1834; GENERIC-LABEL: LSHR_CHAR_I:
1835; GENERIC:       # %bb.0: # %entry
1836; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1837; GENERIC-NEXT:    subi16 sp, sp, 4
1838; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1839; GENERIC-NEXT:    movi16 a1, 254
1840; GENERIC-NEXT:    and16 a1, a0
1841; GENERIC-NEXT:    lsri16 a0, a1, 1
1842; GENERIC-NEXT:    addi16 sp, sp, 4
1843; GENERIC-NEXT:    rts16
1844entry:
1845  %lshr = lshr  i8 %x, 1
1846  ret i8 %lshr
1847}
1848
1849define i1 @LSHR_BIT(i1 %x, i1 %y) {
1850; CHECK-LABEL: LSHR_BIT:
1851; CHECK:       # %bb.0: # %entry
1852; CHECK-NEXT:    mov16 a0, a1
1853; CHECK-NEXT:    rts16
1854;
1855; GENERIC-LABEL: LSHR_BIT:
1856; GENERIC:       # %bb.0: # %entry
1857; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1858; GENERIC-NEXT:    subi16 sp, sp, 4
1859; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1860; GENERIC-NEXT:    mov16 a0, a1
1861; GENERIC-NEXT:    addi16 sp, sp, 4
1862; GENERIC-NEXT:    rts16
1863entry:
1864  %lshr = lshr  i1 %y, %x
1865  ret i1 %lshr
1866}
1867
1868define i1 @LSHR_BIT_I(i1 %x) {
1869; CHECK-LABEL: LSHR_BIT_I:
1870; CHECK:       # %bb.0: # %entry
1871; CHECK-NEXT:    rts16
1872;
1873; GENERIC-LABEL: LSHR_BIT_I:
1874; GENERIC:       # %bb.0: # %entry
1875; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1876; GENERIC-NEXT:    subi16 sp, sp, 4
1877; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1878; GENERIC-NEXT:    addi16 sp, sp, 4
1879; GENERIC-NEXT:    rts16
1880entry:
1881  %lshr = lshr  i1 %x, 1
1882  ret i1 %lshr
1883}
1884
1885define i32 @orRR(i32 %x, i32 %y) {
1886; CHECK-LABEL: orRR:
1887; CHECK:       # %bb.0: # %entry
1888; CHECK-NEXT:    or16 a0, a1
1889; CHECK-NEXT:    rts16
1890;
1891; GENERIC-LABEL: orRR:
1892; GENERIC:       # %bb.0: # %entry
1893; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1894; GENERIC-NEXT:    subi16 sp, sp, 4
1895; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1896; GENERIC-NEXT:    or16 a0, a1
1897; GENERIC-NEXT:    addi16 sp, sp, 4
1898; GENERIC-NEXT:    rts16
1899entry:
1900  %or = or  i32 %y, %x
1901  ret i32 %or
1902}
1903
1904define i32 @orRI(i32 %x) {
1905; CHECK-LABEL: orRI:
1906; CHECK:       # %bb.0: # %entry
1907; CHECK-NEXT:    ori32 a0, a0, 10
1908; CHECK-NEXT:    rts16
1909;
1910; GENERIC-LABEL: orRI:
1911; GENERIC:       # %bb.0: # %entry
1912; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1913; GENERIC-NEXT:    subi16 sp, sp, 4
1914; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1915; GENERIC-NEXT:    movi16 a1, 10
1916; GENERIC-NEXT:    or16 a0, a1
1917; GENERIC-NEXT:    addi16 sp, sp, 4
1918; GENERIC-NEXT:    rts16
1919entry:
1920  %or = or  i32 %x, 10
1921  ret i32 %or
1922}
1923
1924define i32 @orRI_X(i32 %x) {
1925; CHECK-LABEL: orRI_X:
1926; CHECK:       # %bb.0: # %entry
1927; CHECK-NEXT:    ori32 a0, a0, 4097
1928; CHECK-NEXT:    rts16
1929;
1930; GENERIC-LABEL: orRI_X:
1931; GENERIC:       # %bb.0: # %entry
1932; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1933; GENERIC-NEXT:    subi16 sp, sp, 4
1934; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1935; GENERIC-NEXT:    movi16 a1, 0
1936; GENERIC-NEXT:    lsli16 a2, a1, 24
1937; GENERIC-NEXT:    lsli16 a1, a1, 16
1938; GENERIC-NEXT:    or16 a1, a2
1939; GENERIC-NEXT:    movi16 a2, 16
1940; GENERIC-NEXT:    lsli16 a2, a2, 8
1941; GENERIC-NEXT:    or16 a2, a1
1942; GENERIC-NEXT:    movi16 a1, 1
1943; GENERIC-NEXT:    or16 a1, a2
1944; GENERIC-NEXT:    or16 a0, a1
1945; GENERIC-NEXT:    addi16 sp, sp, 4
1946; GENERIC-NEXT:    rts16
1947entry:
1948  %or = or  i32 %x, 4097
1949  ret i32 %or
1950}
1951
1952define i64 @OR_LONG(i64 %x, i64 %y) {
1953; CHECK-LABEL: OR_LONG:
1954; CHECK:       # %bb.0: # %entry
1955; CHECK-NEXT:    or16 a0, a2
1956; CHECK-NEXT:    or16 a1, a3
1957; CHECK-NEXT:    rts16
1958;
1959; GENERIC-LABEL: OR_LONG:
1960; GENERIC:       # %bb.0: # %entry
1961; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1962; GENERIC-NEXT:    subi16 sp, sp, 4
1963; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1964; GENERIC-NEXT:    or16 a0, a2
1965; GENERIC-NEXT:    or16 a1, a3
1966; GENERIC-NEXT:    addi16 sp, sp, 4
1967; GENERIC-NEXT:    rts16
1968entry:
1969  %or = or  i64 %y, %x
1970  ret i64 %or
1971}
1972
1973define i64 @OR_LONG_I(i64 %x) {
1974; CHECK-LABEL: OR_LONG_I:
1975; CHECK:       # %bb.0: # %entry
1976; CHECK-NEXT:    ori32 a0, a0, 1
1977; CHECK-NEXT:    rts16
1978;
1979; GENERIC-LABEL: OR_LONG_I:
1980; GENERIC:       # %bb.0: # %entry
1981; GENERIC-NEXT:    .cfi_def_cfa_offset 0
1982; GENERIC-NEXT:    subi16 sp, sp, 4
1983; GENERIC-NEXT:    .cfi_def_cfa_offset 4
1984; GENERIC-NEXT:    movi16 a2, 1
1985; GENERIC-NEXT:    or16 a0, a2
1986; GENERIC-NEXT:    addi16 sp, sp, 4
1987; GENERIC-NEXT:    rts16
1988entry:
1989  %or = or  i64 %x, 1
1990  ret i64 %or
1991}
1992
1993define i16 @OR_SHORT(i16 %x, i16 %y) {
1994; CHECK-LABEL: OR_SHORT:
1995; CHECK:       # %bb.0: # %entry
1996; CHECK-NEXT:    or16 a0, a1
1997; CHECK-NEXT:    rts16
1998;
1999; GENERIC-LABEL: OR_SHORT:
2000; GENERIC:       # %bb.0: # %entry
2001; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2002; GENERIC-NEXT:    subi16 sp, sp, 4
2003; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2004; GENERIC-NEXT:    or16 a0, a1
2005; GENERIC-NEXT:    addi16 sp, sp, 4
2006; GENERIC-NEXT:    rts16
2007entry:
2008  %or = or  i16 %y, %x
2009  ret i16 %or
2010}
2011
2012define i16 @OR_SHORT_I(i16 %x) {
2013; CHECK-LABEL: OR_SHORT_I:
2014; CHECK:       # %bb.0: # %entry
2015; CHECK-NEXT:    ori32 a0, a0, 1
2016; CHECK-NEXT:    rts16
2017;
2018; GENERIC-LABEL: OR_SHORT_I:
2019; GENERIC:       # %bb.0: # %entry
2020; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2021; GENERIC-NEXT:    subi16 sp, sp, 4
2022; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2023; GENERIC-NEXT:    movi16 a1, 1
2024; GENERIC-NEXT:    or16 a0, a1
2025; GENERIC-NEXT:    addi16 sp, sp, 4
2026; GENERIC-NEXT:    rts16
2027entry:
2028  %or = or  i16 %x, 1
2029  ret i16 %or
2030}
2031
2032define i8 @OR_CHAR(i8 %x, i8 %y) {
2033; CHECK-LABEL: OR_CHAR:
2034; CHECK:       # %bb.0: # %entry
2035; CHECK-NEXT:    or16 a0, a1
2036; CHECK-NEXT:    rts16
2037;
2038; GENERIC-LABEL: OR_CHAR:
2039; GENERIC:       # %bb.0: # %entry
2040; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2041; GENERIC-NEXT:    subi16 sp, sp, 4
2042; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2043; GENERIC-NEXT:    or16 a0, a1
2044; GENERIC-NEXT:    addi16 sp, sp, 4
2045; GENERIC-NEXT:    rts16
2046entry:
2047  %or = or  i8 %y, %x
2048  ret i8 %or
2049}
2050
2051define i8 @OR_CHAR_I(i8 %x) {
2052; CHECK-LABEL: OR_CHAR_I:
2053; CHECK:       # %bb.0: # %entry
2054; CHECK-NEXT:    ori32 a0, a0, 1
2055; CHECK-NEXT:    rts16
2056;
2057; GENERIC-LABEL: OR_CHAR_I:
2058; GENERIC:       # %bb.0: # %entry
2059; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2060; GENERIC-NEXT:    subi16 sp, sp, 4
2061; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2062; GENERIC-NEXT:    movi16 a1, 1
2063; GENERIC-NEXT:    or16 a0, a1
2064; GENERIC-NEXT:    addi16 sp, sp, 4
2065; GENERIC-NEXT:    rts16
2066entry:
2067  %or = or  i8 %x, 1
2068  ret i8 %or
2069}
2070
2071
2072define i32 @xorRR(i32 %x, i32 %y) {
2073; CHECK-LABEL: xorRR:
2074; CHECK:       # %bb.0: # %entry
2075; CHECK-NEXT:    xor16 a0, a1
2076; CHECK-NEXT:    rts16
2077;
2078; GENERIC-LABEL: xorRR:
2079; GENERIC:       # %bb.0: # %entry
2080; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2081; GENERIC-NEXT:    subi16 sp, sp, 4
2082; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2083; GENERIC-NEXT:    xor16 a0, a1
2084; GENERIC-NEXT:    addi16 sp, sp, 4
2085; GENERIC-NEXT:    rts16
2086entry:
2087  %xor = xor  i32 %y, %x
2088  ret i32 %xor
2089}
2090
2091define i32 @xorRI(i32 %x) {
2092; CHECK-LABEL: xorRI:
2093; CHECK:       # %bb.0: # %entry
2094; CHECK-NEXT:    xori32 a0, a0, 10
2095; CHECK-NEXT:    rts16
2096;
2097; GENERIC-LABEL: xorRI:
2098; GENERIC:       # %bb.0: # %entry
2099; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2100; GENERIC-NEXT:    subi16 sp, sp, 4
2101; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2102; GENERIC-NEXT:    movi16 a1, 10
2103; GENERIC-NEXT:    xor16 a0, a1
2104; GENERIC-NEXT:    addi16 sp, sp, 4
2105; GENERIC-NEXT:    rts16
2106entry:
2107  %xor = xor  i32 %x, 10
2108  ret i32 %xor
2109}
2110
2111define i32 @xorRI_X(i32 %x) {
2112; CHECK-LABEL: xorRI_X:
2113; CHECK:       # %bb.0: # %entry
2114; CHECK-NEXT:    movi32 a1, 4097
2115; CHECK-NEXT:    xor16 a0, a1
2116; CHECK-NEXT:    rts16
2117;
2118; GENERIC-LABEL: xorRI_X:
2119; GENERIC:       # %bb.0: # %entry
2120; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2121; GENERIC-NEXT:    subi16 sp, sp, 4
2122; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2123; GENERIC-NEXT:    movi16 a1, 0
2124; GENERIC-NEXT:    lsli16 a2, a1, 24
2125; GENERIC-NEXT:    lsli16 a1, a1, 16
2126; GENERIC-NEXT:    or16 a1, a2
2127; GENERIC-NEXT:    movi16 a2, 16
2128; GENERIC-NEXT:    lsli16 a2, a2, 8
2129; GENERIC-NEXT:    or16 a2, a1
2130; GENERIC-NEXT:    movi16 a1, 1
2131; GENERIC-NEXT:    or16 a1, a2
2132; GENERIC-NEXT:    xor16 a0, a1
2133; GENERIC-NEXT:    addi16 sp, sp, 4
2134; GENERIC-NEXT:    rts16
2135entry:
2136  %xor = xor  i32 %x, 4097
2137  ret i32 %xor
2138}
2139
2140define i64 @XOR_LONG(i64 %x, i64 %y) {
2141; CHECK-LABEL: XOR_LONG:
2142; CHECK:       # %bb.0: # %entry
2143; CHECK-NEXT:    xor16 a0, a2
2144; CHECK-NEXT:    xor16 a1, a3
2145; CHECK-NEXT:    rts16
2146;
2147; GENERIC-LABEL: XOR_LONG:
2148; GENERIC:       # %bb.0: # %entry
2149; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2150; GENERIC-NEXT:    subi16 sp, sp, 4
2151; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2152; GENERIC-NEXT:    xor16 a0, a2
2153; GENERIC-NEXT:    xor16 a1, a3
2154; GENERIC-NEXT:    addi16 sp, sp, 4
2155; GENERIC-NEXT:    rts16
2156entry:
2157  %xor = xor  i64 %y, %x
2158  ret i64 %xor
2159}
2160
2161define i64 @XOR_LONG_I(i64 %x) {
2162; CHECK-LABEL: XOR_LONG_I:
2163; CHECK:       # %bb.0: # %entry
2164; CHECK-NEXT:    xori32 a0, a0, 1
2165; CHECK-NEXT:    rts16
2166;
2167; GENERIC-LABEL: XOR_LONG_I:
2168; GENERIC:       # %bb.0: # %entry
2169; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2170; GENERIC-NEXT:    subi16 sp, sp, 4
2171; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2172; GENERIC-NEXT:    movi16 a2, 1
2173; GENERIC-NEXT:    xor16 a0, a2
2174; GENERIC-NEXT:    addi16 sp, sp, 4
2175; GENERIC-NEXT:    rts16
2176entry:
2177  %xor = xor  i64 %x, 1
2178  ret i64 %xor
2179}
2180
2181define i16 @XOR_SHORT(i16 %x, i16 %y) {
2182; CHECK-LABEL: XOR_SHORT:
2183; CHECK:       # %bb.0: # %entry
2184; CHECK-NEXT:    xor16 a0, a1
2185; CHECK-NEXT:    rts16
2186;
2187; GENERIC-LABEL: XOR_SHORT:
2188; GENERIC:       # %bb.0: # %entry
2189; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2190; GENERIC-NEXT:    subi16 sp, sp, 4
2191; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2192; GENERIC-NEXT:    xor16 a0, a1
2193; GENERIC-NEXT:    addi16 sp, sp, 4
2194; GENERIC-NEXT:    rts16
2195entry:
2196  %xor = xor  i16 %y, %x
2197  ret i16 %xor
2198}
2199
2200define i16 @XOR_SHORT_I(i16 %x) {
2201; CHECK-LABEL: XOR_SHORT_I:
2202; CHECK:       # %bb.0: # %entry
2203; CHECK-NEXT:    xori32 a0, a0, 1
2204; CHECK-NEXT:    rts16
2205;
2206; GENERIC-LABEL: XOR_SHORT_I:
2207; GENERIC:       # %bb.0: # %entry
2208; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2209; GENERIC-NEXT:    subi16 sp, sp, 4
2210; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2211; GENERIC-NEXT:    movi16 a1, 1
2212; GENERIC-NEXT:    xor16 a0, a1
2213; GENERIC-NEXT:    addi16 sp, sp, 4
2214; GENERIC-NEXT:    rts16
2215entry:
2216  %xor = xor  i16 %x, 1
2217  ret i16 %xor
2218}
2219
2220define i8 @XOR_CHAR(i8 %x, i8 %y) {
2221; CHECK-LABEL: XOR_CHAR:
2222; CHECK:       # %bb.0: # %entry
2223; CHECK-NEXT:    xor16 a0, a1
2224; CHECK-NEXT:    rts16
2225;
2226; GENERIC-LABEL: XOR_CHAR:
2227; GENERIC:       # %bb.0: # %entry
2228; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2229; GENERIC-NEXT:    subi16 sp, sp, 4
2230; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2231; GENERIC-NEXT:    xor16 a0, a1
2232; GENERIC-NEXT:    addi16 sp, sp, 4
2233; GENERIC-NEXT:    rts16
2234entry:
2235  %xor = xor  i8 %y, %x
2236  ret i8 %xor
2237}
2238
2239define i8 @XOR_CHAR_I(i8 %x) {
2240; CHECK-LABEL: XOR_CHAR_I:
2241; CHECK:       # %bb.0: # %entry
2242; CHECK-NEXT:    xori32 a0, a0, 1
2243; CHECK-NEXT:    rts16
2244;
2245; GENERIC-LABEL: XOR_CHAR_I:
2246; GENERIC:       # %bb.0: # %entry
2247; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2248; GENERIC-NEXT:    subi16 sp, sp, 4
2249; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2250; GENERIC-NEXT:    movi16 a1, 1
2251; GENERIC-NEXT:    xor16 a0, a1
2252; GENERIC-NEXT:    addi16 sp, sp, 4
2253; GENERIC-NEXT:    rts16
2254entry:
2255  %xor = xor  i8 %x, 1
2256  ret i8 %xor
2257}
2258
2259; i64 --> i32/i16/i8/i1
2260define i32 @truncR_i64_0(i64 %x) {
2261; CHECK-LABEL: truncR_i64_0:
2262; CHECK:       # %bb.0: # %entry
2263; CHECK-NEXT:    rts16
2264;
2265; GENERIC-LABEL: truncR_i64_0:
2266; GENERIC:       # %bb.0: # %entry
2267; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2268; GENERIC-NEXT:    subi16 sp, sp, 4
2269; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2270; GENERIC-NEXT:    addi16 sp, sp, 4
2271; GENERIC-NEXT:    rts16
2272entry:
2273  %trunc = trunc i64 %x to i32
2274  ret i32 %trunc
2275}
2276
2277define i16 @truncR_i64_1(i64 %x) {
2278; CHECK-LABEL: truncR_i64_1:
2279; CHECK:       # %bb.0: # %entry
2280; CHECK-NEXT:    rts16
2281;
2282; GENERIC-LABEL: truncR_i64_1:
2283; GENERIC:       # %bb.0: # %entry
2284; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2285; GENERIC-NEXT:    subi16 sp, sp, 4
2286; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2287; GENERIC-NEXT:    addi16 sp, sp, 4
2288; GENERIC-NEXT:    rts16
2289entry:
2290  %trunc = trunc i64 %x to i16
2291  ret i16 %trunc
2292}
2293
2294define i8 @truncR_i64_2(i64 %x) {
2295; CHECK-LABEL: truncR_i64_2:
2296; CHECK:       # %bb.0: # %entry
2297; CHECK-NEXT:    rts16
2298;
2299; GENERIC-LABEL: truncR_i64_2:
2300; GENERIC:       # %bb.0: # %entry
2301; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2302; GENERIC-NEXT:    subi16 sp, sp, 4
2303; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2304; GENERIC-NEXT:    addi16 sp, sp, 4
2305; GENERIC-NEXT:    rts16
2306entry:
2307  %trunc = trunc i64 %x to i8
2308  ret i8 %trunc
2309}
2310
2311define i1 @truncR_i64_3(i64 %x) {
2312; CHECK-LABEL: truncR_i64_3:
2313; CHECK:       # %bb.0: # %entry
2314; CHECK-NEXT:    rts16
2315;
2316; GENERIC-LABEL: truncR_i64_3:
2317; GENERIC:       # %bb.0: # %entry
2318; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2319; GENERIC-NEXT:    subi16 sp, sp, 4
2320; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2321; GENERIC-NEXT:    addi16 sp, sp, 4
2322; GENERIC-NEXT:    rts16
2323entry:
2324  %trunc = trunc i64 %x to i1
2325  ret i1 %trunc
2326}
2327
2328
2329; i32 --> i16/i8/i1
2330define i16 @truncR_i32_1(i32 %x) {
2331; CHECK-LABEL: truncR_i32_1:
2332; CHECK:       # %bb.0: # %entry
2333; CHECK-NEXT:    rts16
2334;
2335; GENERIC-LABEL: truncR_i32_1:
2336; GENERIC:       # %bb.0: # %entry
2337; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2338; GENERIC-NEXT:    subi16 sp, sp, 4
2339; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2340; GENERIC-NEXT:    addi16 sp, sp, 4
2341; GENERIC-NEXT:    rts16
2342entry:
2343  %trunc = trunc i32 %x to i16
2344  ret i16 %trunc
2345}
2346
2347define i8 @truncR_i32_2(i32 %x) {
2348; CHECK-LABEL: truncR_i32_2:
2349; CHECK:       # %bb.0: # %entry
2350; CHECK-NEXT:    rts16
2351;
2352; GENERIC-LABEL: truncR_i32_2:
2353; GENERIC:       # %bb.0: # %entry
2354; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2355; GENERIC-NEXT:    subi16 sp, sp, 4
2356; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2357; GENERIC-NEXT:    addi16 sp, sp, 4
2358; GENERIC-NEXT:    rts16
2359entry:
2360  %trunc = trunc i32 %x to i8
2361  ret i8 %trunc
2362}
2363
2364define i1 @truncR_i32_3(i32 %x) {
2365; CHECK-LABEL: truncR_i32_3:
2366; CHECK:       # %bb.0: # %entry
2367; CHECK-NEXT:    rts16
2368;
2369; GENERIC-LABEL: truncR_i32_3:
2370; GENERIC:       # %bb.0: # %entry
2371; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2372; GENERIC-NEXT:    subi16 sp, sp, 4
2373; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2374; GENERIC-NEXT:    addi16 sp, sp, 4
2375; GENERIC-NEXT:    rts16
2376entry:
2377  %trunc = trunc i32 %x to i1
2378  ret i1 %trunc
2379}
2380
2381; i16 --> i8/i1
2382define i8 @truncR_i16_2(i16 %x) {
2383; CHECK-LABEL: truncR_i16_2:
2384; CHECK:       # %bb.0: # %entry
2385; CHECK-NEXT:    rts16
2386;
2387; GENERIC-LABEL: truncR_i16_2:
2388; GENERIC:       # %bb.0: # %entry
2389; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2390; GENERIC-NEXT:    subi16 sp, sp, 4
2391; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2392; GENERIC-NEXT:    addi16 sp, sp, 4
2393; GENERIC-NEXT:    rts16
2394entry:
2395  %trunc = trunc i16 %x to i8
2396  ret i8 %trunc
2397}
2398
2399define i1 @truncR_i16_3(i16 %x) {
2400; CHECK-LABEL: truncR_i16_3:
2401; CHECK:       # %bb.0: # %entry
2402; CHECK-NEXT:    rts16
2403;
2404; GENERIC-LABEL: truncR_i16_3:
2405; GENERIC:       # %bb.0: # %entry
2406; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2407; GENERIC-NEXT:    subi16 sp, sp, 4
2408; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2409; GENERIC-NEXT:    addi16 sp, sp, 4
2410; GENERIC-NEXT:    rts16
2411entry:
2412  %trunc = trunc i16 %x to i1
2413  ret i1 %trunc
2414}
2415
2416
2417;i8 --> i1
2418define i1 @truncR_i8_3(i8 %x) {
2419; CHECK-LABEL: truncR_i8_3:
2420; CHECK:       # %bb.0: # %entry
2421; CHECK-NEXT:    rts16
2422;
2423; GENERIC-LABEL: truncR_i8_3:
2424; GENERIC:       # %bb.0: # %entry
2425; GENERIC-NEXT:    .cfi_def_cfa_offset 0
2426; GENERIC-NEXT:    subi16 sp, sp, 4
2427; GENERIC-NEXT:    .cfi_def_cfa_offset 4
2428; GENERIC-NEXT:    addi16 sp, sp, 4
2429; GENERIC-NEXT:    rts16
2430entry:
2431  %trunc = trunc i8 %x to i1
2432  ret i1 %trunc
2433}
2434