1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
3
4;; Exercise the bare integers 'select' LLVM IR: https://llvm.org/docs/LangRef.html#select-instruction
5
6define i1 @bare_select_i1(i1 %a, i1 %b, i1 %c) {
7; LA32-LABEL: bare_select_i1:
8; LA32:       # %bb.0:
9; LA32-NEXT:    andi $a0, $a0, 1
10; LA32-NEXT:    masknez $a2, $a2, $a0
11; LA32-NEXT:    maskeqz $a0, $a1, $a0
12; LA32-NEXT:    or $a0, $a0, $a2
13; LA32-NEXT:    jirl $zero, $ra, 0
14;
15; LA64-LABEL: bare_select_i1:
16; LA64:       # %bb.0:
17; LA64-NEXT:    andi $a0, $a0, 1
18; LA64-NEXT:    masknez $a2, $a2, $a0
19; LA64-NEXT:    maskeqz $a0, $a1, $a0
20; LA64-NEXT:    or $a0, $a0, $a2
21; LA64-NEXT:    jirl $zero, $ra, 0
22  %res = select i1 %a, i1 %b, i1 %c
23  ret i1 %res
24}
25
26define i8 @bare_select_i8(i1 %a, i8 %b, i8 %c) {
27; LA32-LABEL: bare_select_i8:
28; LA32:       # %bb.0:
29; LA32-NEXT:    andi $a0, $a0, 1
30; LA32-NEXT:    masknez $a2, $a2, $a0
31; LA32-NEXT:    maskeqz $a0, $a1, $a0
32; LA32-NEXT:    or $a0, $a0, $a2
33; LA32-NEXT:    jirl $zero, $ra, 0
34;
35; LA64-LABEL: bare_select_i8:
36; LA64:       # %bb.0:
37; LA64-NEXT:    andi $a0, $a0, 1
38; LA64-NEXT:    masknez $a2, $a2, $a0
39; LA64-NEXT:    maskeqz $a0, $a1, $a0
40; LA64-NEXT:    or $a0, $a0, $a2
41; LA64-NEXT:    jirl $zero, $ra, 0
42  %res = select i1 %a, i8 %b, i8 %c
43  ret i8 %res
44}
45
46define i16 @bare_select_i16(i1 %a, i16 %b, i16 %c) {
47; LA32-LABEL: bare_select_i16:
48; LA32:       # %bb.0:
49; LA32-NEXT:    andi $a0, $a0, 1
50; LA32-NEXT:    masknez $a2, $a2, $a0
51; LA32-NEXT:    maskeqz $a0, $a1, $a0
52; LA32-NEXT:    or $a0, $a0, $a2
53; LA32-NEXT:    jirl $zero, $ra, 0
54;
55; LA64-LABEL: bare_select_i16:
56; LA64:       # %bb.0:
57; LA64-NEXT:    andi $a0, $a0, 1
58; LA64-NEXT:    masknez $a2, $a2, $a0
59; LA64-NEXT:    maskeqz $a0, $a1, $a0
60; LA64-NEXT:    or $a0, $a0, $a2
61; LA64-NEXT:    jirl $zero, $ra, 0
62  %res = select i1 %a, i16 %b, i16 %c
63  ret i16 %res
64}
65
66define i32 @bare_select_i32(i1 %a, i32 %b, i32 %c) {
67; LA32-LABEL: bare_select_i32:
68; LA32:       # %bb.0:
69; LA32-NEXT:    andi $a0, $a0, 1
70; LA32-NEXT:    masknez $a2, $a2, $a0
71; LA32-NEXT:    maskeqz $a0, $a1, $a0
72; LA32-NEXT:    or $a0, $a0, $a2
73; LA32-NEXT:    jirl $zero, $ra, 0
74;
75; LA64-LABEL: bare_select_i32:
76; LA64:       # %bb.0:
77; LA64-NEXT:    andi $a0, $a0, 1
78; LA64-NEXT:    masknez $a2, $a2, $a0
79; LA64-NEXT:    maskeqz $a0, $a1, $a0
80; LA64-NEXT:    or $a0, $a0, $a2
81; LA64-NEXT:    jirl $zero, $ra, 0
82  %res = select i1 %a, i32 %b, i32 %c
83  ret i32 %res
84}
85
86define i64 @bare_select_i64(i1 %a, i64 %b, i64 %c) {
87; LA32-LABEL: bare_select_i64:
88; LA32:       # %bb.0:
89; LA32-NEXT:    andi $a5, $a0, 1
90; LA32-NEXT:    masknez $a0, $a3, $a5
91; LA32-NEXT:    maskeqz $a1, $a1, $a5
92; LA32-NEXT:    or $a0, $a1, $a0
93; LA32-NEXT:    masknez $a1, $a4, $a5
94; LA32-NEXT:    maskeqz $a2, $a2, $a5
95; LA32-NEXT:    or $a1, $a2, $a1
96; LA32-NEXT:    jirl $zero, $ra, 0
97;
98; LA64-LABEL: bare_select_i64:
99; LA64:       # %bb.0:
100; LA64-NEXT:    andi $a0, $a0, 1
101; LA64-NEXT:    masknez $a2, $a2, $a0
102; LA64-NEXT:    maskeqz $a0, $a1, $a0
103; LA64-NEXT:    or $a0, $a0, $a2
104; LA64-NEXT:    jirl $zero, $ra, 0
105  %res = select i1 %a, i64 %b, i64 %c
106  ret i64 %res
107}
108