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