xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/select-bare-int.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5;; Exercise the bare integers 'select' LLVM IR: https://llvm.org/docs/LangRef.html#select-instruction
6
7define i1 @bare_select_i1(i1 %a, i1 %b, i1 %c) {
8; LA32-LABEL: bare_select_i1:
9; LA32:       # %bb.0:
10; LA32-NEXT:    andi $a0, $a0, 1
11; LA32-NEXT:    masknez $a2, $a2, $a0
12; LA32-NEXT:    maskeqz $a0, $a1, $a0
13; LA32-NEXT:    or $a0, $a0, $a2
14; LA32-NEXT:    ret
15;
16; LA64-LABEL: bare_select_i1:
17; LA64:       # %bb.0:
18; LA64-NEXT:    andi $a0, $a0, 1
19; LA64-NEXT:    masknez $a2, $a2, $a0
20; LA64-NEXT:    maskeqz $a0, $a1, $a0
21; LA64-NEXT:    or $a0, $a0, $a2
22; LA64-NEXT:    ret
23  %res = select i1 %a, i1 %b, i1 %c
24  ret i1 %res
25}
26
27define i8 @bare_select_i8(i1 %a, i8 %b, i8 %c) {
28; LA32-LABEL: bare_select_i8:
29; LA32:       # %bb.0:
30; LA32-NEXT:    andi $a0, $a0, 1
31; LA32-NEXT:    masknez $a2, $a2, $a0
32; LA32-NEXT:    maskeqz $a0, $a1, $a0
33; LA32-NEXT:    or $a0, $a0, $a2
34; LA32-NEXT:    ret
35;
36; LA64-LABEL: bare_select_i8:
37; LA64:       # %bb.0:
38; LA64-NEXT:    andi $a0, $a0, 1
39; LA64-NEXT:    masknez $a2, $a2, $a0
40; LA64-NEXT:    maskeqz $a0, $a1, $a0
41; LA64-NEXT:    or $a0, $a0, $a2
42; LA64-NEXT:    ret
43  %res = select i1 %a, i8 %b, i8 %c
44  ret i8 %res
45}
46
47define i16 @bare_select_i16(i1 %a, i16 %b, i16 %c) {
48; LA32-LABEL: bare_select_i16:
49; LA32:       # %bb.0:
50; LA32-NEXT:    andi $a0, $a0, 1
51; LA32-NEXT:    masknez $a2, $a2, $a0
52; LA32-NEXT:    maskeqz $a0, $a1, $a0
53; LA32-NEXT:    or $a0, $a0, $a2
54; LA32-NEXT:    ret
55;
56; LA64-LABEL: bare_select_i16:
57; LA64:       # %bb.0:
58; LA64-NEXT:    andi $a0, $a0, 1
59; LA64-NEXT:    masknez $a2, $a2, $a0
60; LA64-NEXT:    maskeqz $a0, $a1, $a0
61; LA64-NEXT:    or $a0, $a0, $a2
62; LA64-NEXT:    ret
63  %res = select i1 %a, i16 %b, i16 %c
64  ret i16 %res
65}
66
67define i32 @bare_select_i32(i1 %a, i32 %b, i32 %c) {
68; LA32-LABEL: bare_select_i32:
69; LA32:       # %bb.0:
70; LA32-NEXT:    andi $a0, $a0, 1
71; LA32-NEXT:    masknez $a2, $a2, $a0
72; LA32-NEXT:    maskeqz $a0, $a1, $a0
73; LA32-NEXT:    or $a0, $a0, $a2
74; LA32-NEXT:    ret
75;
76; LA64-LABEL: bare_select_i32:
77; LA64:       # %bb.0:
78; LA64-NEXT:    andi $a0, $a0, 1
79; LA64-NEXT:    masknez $a2, $a2, $a0
80; LA64-NEXT:    maskeqz $a0, $a1, $a0
81; LA64-NEXT:    or $a0, $a0, $a2
82; LA64-NEXT:    ret
83  %res = select i1 %a, i32 %b, i32 %c
84  ret i32 %res
85}
86
87define i64 @bare_select_i64(i1 %a, i64 %b, i64 %c) {
88; LA32-LABEL: bare_select_i64:
89; LA32:       # %bb.0:
90; LA32-NEXT:    andi $a5, $a0, 1
91; LA32-NEXT:    masknez $a0, $a3, $a5
92; LA32-NEXT:    maskeqz $a1, $a1, $a5
93; LA32-NEXT:    or $a0, $a1, $a0
94; LA32-NEXT:    masknez $a1, $a4, $a5
95; LA32-NEXT:    maskeqz $a2, $a2, $a5
96; LA32-NEXT:    or $a1, $a2, $a1
97; LA32-NEXT:    ret
98;
99; LA64-LABEL: bare_select_i64:
100; LA64:       # %bb.0:
101; LA64-NEXT:    andi $a0, $a0, 1
102; LA64-NEXT:    masknez $a2, $a2, $a0
103; LA64-NEXT:    maskeqz $a0, $a1, $a0
104; LA64-NEXT:    or $a0, $a0, $a2
105; LA64-NEXT:    ret
106  %res = select i1 %a, i64 %b, i64 %c
107  ret i64 %res
108}
109
110define i16 @bare_select_zero_i16(i1 %a, i16 %b) {
111; LA32-LABEL: bare_select_zero_i16:
112; LA32:       # %bb.0:
113; LA32-NEXT:    andi $a0, $a0, 1
114; LA32-NEXT:    masknez	$a0, $a1, $a0
115; LA32-NEXT:    ret
116;
117; LA64-LABEL: bare_select_zero_i16:
118; LA64:       # %bb.0:
119; LA64-NEXT:    andi $a0, $a0, 1
120; LA64-NEXT:    masknez	$a0, $a1, $a0
121; LA64-NEXT:    ret
122  %res = select i1 %a, i16 0, i16 %b
123  ret i16 %res
124}
125
126define i32 @bare_select_zero_i32(i1 %a, i32 %b) {
127; LA32-LABEL: bare_select_zero_i32:
128; LA32:       # %bb.0:
129; LA32-NEXT:    andi $a0, $a0, 1
130; LA32-NEXT:    maskeqz $a0, $a1, $a0
131; LA32-NEXT:    ret
132;
133; LA64-LABEL: bare_select_zero_i32:
134; LA64:       # %bb.0:
135; LA64-NEXT:    andi $a0, $a0, 1
136; LA64-NEXT:    maskeqz $a0, $a1, $a0
137; LA64-NEXT:    ret
138  %res = select i1 %a, i32 %b, i32 0
139  ret i32 %res
140}
141