xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/cmov.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips     -mcpu=mips32                 -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,32-CMOV
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips     -mcpu=mips32 -regalloc=basic -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,32-CMOV
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips     -mcpu=mips32r2               -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,32-CMOV
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips     -mcpu=mips32r6               -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,32-CMP
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips4                  -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,64-CMOV
6*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64                 -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,64-CMOV
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64r6               -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,64-CMP
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker@i1 = global [3 x i32] [i32 1, i32 2, i32 3], align 4
10*9880d681SAndroid Build Coastguard Worker@i3 = common global i32* null, align 4
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: cmov1:
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  lw $[[R0:[0-9]+]], %got(i3)
15*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(i1)
16*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  movn $[[R0]], $[[R1]], $4
17*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  lw $2, 0($[[R0]])
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   lw $[[R0:[0-9]+]], %got(i3)
20*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(i1)
21*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R1]], $4
22*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R0]], $4
23*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
24*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   lw $2, 0($[[T2]])
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  ldr $[[R0:[0-9]+]]
27*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  ld $[[R1:[0-9]+]], %got_disp(i1)
28*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  movn $[[R0]], $[[R1]], $4
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   ld $[[R0:[0-9]+]], %got_disp(i3)(
31*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got_disp(i1)
32*9880d681SAndroid Build Coastguard Worker; FIXME: This sll works around an implementation detail in the code generator
33*9880d681SAndroid Build Coastguard Worker;        (setcc's result is i32 so bits 32-63 are undefined). It's not really
34*9880d681SAndroid Build Coastguard Worker;        needed.
35*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   sll $[[CC:[0-9]+]], $4, 0
36*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R1]], $[[CC]]
37*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R0]], $[[CC]]
38*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
39*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   ld $2, 0($[[T2]])
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine i32* @cmov1(i32 signext %s) nounwind readonly {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %s, 0
44*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32*, i32** @i3, align 4
45*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %tobool, i32* getelementptr inbounds ([3 x i32], [3 x i32]* @i1, i32 0, i32 0), i32* %tmp1
46*9880d681SAndroid Build Coastguard Worker  ret i32* %cond
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker@c = global i32 1, align 4
50*9880d681SAndroid Build Coastguard Worker@d = global i32 0, align 4
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: cmov2:
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(d)
55*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got(c)
56*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  movn  $[[R1]], $[[R0]], $4
57*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  lw $2, 0($[[R0]])
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got(d)
60*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got(c)
61*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R0]], $4
62*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R1]], $4
63*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
64*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   lw $2, 0($[[T2]])
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got_disp(d)
67*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      daddiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got_disp(c)
68*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      movn  $[[R1]], $[[R0]], $4
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, %got_disp(d)
71*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   daddiu $[[R0:[0-9]+]], ${{[0-9]+}}, %got_disp(c)
72*9880d681SAndroid Build Coastguard Worker; FIXME: This sll works around an implementation detail in the code generator
73*9880d681SAndroid Build Coastguard Worker;        (setcc's result is i32 so bits 32-63 are undefined). It's not really
74*9880d681SAndroid Build Coastguard Worker;        needed.
75*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   sll $[[CC:[0-9]+]], $4, 0
76*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   selnez $[[T0:[0-9]+]], $[[R0]], $[[CC]]
77*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   seleqz $[[T1:[0-9]+]], $[[R1]], $[[CC]]
78*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   or $[[T2:[0-9]+]], $[[T0]], $[[T1]]
79*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   lw $2, 0($[[T2]])
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine i32 @cmov2(i32 signext %s) nounwind readonly {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %s, 0
84*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @c, align 4
85*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* @d, align 4
86*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %tobool, i32 %tmp1, i32 %tmp2
87*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: cmov3:
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; We won't check the result register since we can't know if the move is first
93*9880d681SAndroid Build Coastguard Worker; or last. We do know it will be either one of two registers so we can at least
94*9880d681SAndroid Build Coastguard Worker; check that.
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; 32-CMOV:      xori $[[R0:[0-9]+]], $4, 234
97*9880d681SAndroid Build Coastguard Worker; 32-CMOV:      movz ${{[26]}}, $5, $[[R0]]
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   xori $[[CC:[0-9]+]], $4, 234
100*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[T0:[0-9]+]], $5, $[[CC]]
101*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[T1:[0-9]+]], $6, $[[CC]]
102*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   or $2, $[[T0]], $[[T1]]
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      xori $[[R0:[0-9]+]], $4, 234
105*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      movz ${{[26]}}, $5, $[[R0]]
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   xori $[[CC:[0-9]+]], $4, 234
108*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   seleqz $[[T0:[0-9]+]], $5, $[[CC]]
109*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   selnez $[[T1:[0-9]+]], $6, $[[CC]]
110*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   or $2, $[[T0]], $[[T1]]
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine i32 @cmov3(i32 signext %a, i32 signext %b, i32 signext %c) nounwind readnone {
113*9880d681SAndroid Build Coastguard Workerentry:
114*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, 234
115*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 %b, i32 %c
116*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: cmov3_ne:
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; We won't check the result register since we can't know if the move is first
122*9880d681SAndroid Build Coastguard Worker; or last. We do know it will be either one of two registers so we can at least
123*9880d681SAndroid Build Coastguard Worker; check that.
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; FIXME: Use xori instead of addiu+xor.
126*9880d681SAndroid Build Coastguard Worker; 32-CMOV:      addiu $[[R0:[0-9]+]], $zero, 234
127*9880d681SAndroid Build Coastguard Worker; 32-CMOV:      xor $[[R1:[0-9]+]], $4, $[[R0]]
128*9880d681SAndroid Build Coastguard Worker; 32-CMOV:      movn ${{[26]}}, $5, $[[R1]]
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   xori $[[CC:[0-9]+]], $4, 234
131*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[T0:[0-9]+]], $5, $[[CC]]
132*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[T1:[0-9]+]], $6, $[[CC]]
133*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   or $2, $[[T0]], $[[T1]]
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; FIXME: Use xori instead of addiu+xor.
136*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      addiu $[[R0:[0-9]+]], $zero, 234
137*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      xor $[[R1:[0-9]+]], $4, $[[R0]]
138*9880d681SAndroid Build Coastguard Worker; 64-CMOV:      movn ${{[26]}}, $5, $[[R1]]
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   xori $[[CC:[0-9]+]], $4, 234
141*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   selnez $[[T0:[0-9]+]], $5, $[[CC]]
142*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   seleqz $[[T1:[0-9]+]], $6, $[[CC]]
143*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:   or $2, $[[T0]], $[[T1]]
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine i32 @cmov3_ne(i32 signext %a, i32 signext %b, i32 signext %c) nounwind readnone {
146*9880d681SAndroid Build Coastguard Workerentry:
147*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %a, 234
148*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 %b, i32 %c
149*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: cmov4:
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; We won't check the result register since we can't know if the move is first
155*9880d681SAndroid Build Coastguard Worker; or last. We do know it will be one of two registers so we can at least check
156*9880d681SAndroid Build Coastguard Worker; that.
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: xori $[[R0:[0-9]+]], $4, 234
159*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: lw $[[R1:2]], 16($sp)
160*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: lw $[[R2:3]], 20($sp)
161*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movz $[[R1]], $6, $[[R0]]
162*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movz $[[R2]], $7, $[[R0]]
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  xori $[[R0:[0-9]+]], $4, 234
165*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  lw $[[R1:[0-9]+]], 16($sp)
166*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  lw $[[R2:[0-9]+]], 20($sp)
167*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $6, $[[R0]]
168*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $7, $[[R0]]
169*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T2:[0-9]+]], $[[R1]], $[[R0]]
170*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T3:[0-9]+]], $[[R2]], $[[R0]]
171*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T2]]
172*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $3, $[[T1]], $[[T3]]
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker; 64-CMOV: xori $[[R0:[0-9]+]], $4, 234
175*9880d681SAndroid Build Coastguard Worker; 64-CMOV: movz ${{[26]}}, $5, $[[R0]]
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  xori $[[R0:[0-9]+]], $4, 234
178*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $5, $[[R0]]
179*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $6, $[[R0]]
180*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Workerdefine i64 @cmov4(i32 signext %a, i64 %b, i64 %c) nounwind readnone {
183*9880d681SAndroid Build Coastguard Workerentry:
184*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, 234
185*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 %b, i64 %c
186*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: cmov4_ne:
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; We won't check the result register since we can't know if the move is first
192*9880d681SAndroid Build Coastguard Worker; or last. We do know it will be one of two registers so we can at least check
193*9880d681SAndroid Build Coastguard Worker; that.
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; FIXME: Use xori instead of addiu+xor.
196*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[R0:[0-9]+]], $zero, 234
197*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: xor $[[R1:[0-9]+]], $4, $[[R0]]
198*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: lw $[[R2:2]], 16($sp)
199*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: lw $[[R3:3]], 20($sp)
200*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movn $[[R2]], $6, $[[R1]]
201*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movn $[[R3]], $7, $[[R1]]
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  xori $[[R0:[0-9]+]], $4, 234
204*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  lw $[[R1:[0-9]+]], 16($sp)
205*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  lw $[[R2:[0-9]+]], 20($sp)
206*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $6, $[[R0]]
207*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $7, $[[R0]]
208*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T2:[0-9]+]], $[[R1]], $[[R0]]
209*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T3:[0-9]+]], $[[R2]], $[[R0]]
210*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T2]]
211*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $3, $[[T1]], $[[T3]]
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker; FIXME: Use xori instead of addiu+xor.
214*9880d681SAndroid Build Coastguard Worker; 64-CMOV: addiu $[[R0:[0-9]+]], $zero, 234
215*9880d681SAndroid Build Coastguard Worker; 64-CMOV: xor $[[R1:[0-9]+]], $4, $[[R0]]
216*9880d681SAndroid Build Coastguard Worker; 64-CMOV: movn ${{[26]}}, $5, $[[R1]]
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  xori $[[R0:[0-9]+]], $4, 234
219*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $5, $[[R0]]
220*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $6, $[[R0]]
221*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdefine i64 @cmov4_ne(i32 signext %a, i64 %b, i64 %c) nounwind readnone {
224*9880d681SAndroid Build Coastguard Workerentry:
225*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %a, 234
226*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i64 %b, i64 %c
227*9880d681SAndroid Build Coastguard Worker  ret i64 %cond
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; slti and conditional move.
231*9880d681SAndroid Build Coastguard Worker;
232*9880d681SAndroid Build Coastguard Worker; Check that, pattern
233*9880d681SAndroid Build Coastguard Worker;  (select (setgt a, N), t, f)
234*9880d681SAndroid Build Coastguard Worker; turns into
235*9880d681SAndroid Build Coastguard Worker;  (movz t, (setlt a, N + 1), f)
236*9880d681SAndroid Build Coastguard Worker; if N + 1 fits in 16-bit.
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti0:
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
241*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
242*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: slti $[[R0:[0-9]+]], $4, 32767
243*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
246*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
247*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  slti $[[R0:[0-9]+]], $4, 32767
248*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
249*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
250*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
251*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
254*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
255*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slti $[[R0:[0-9]+]], $4, 32767
256*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
259*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
260*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, 32767
261*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
262*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
263*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
264*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine i32 @slti0(i32 signext %a) {
267*9880d681SAndroid Build Coastguard Workerentry:
268*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %a, 32766
269*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 3, i32 5
270*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
271*9880d681SAndroid Build Coastguard Worker}
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti1:
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
276*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
277*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
278*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
279*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
282*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
283*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I32767:[0-9]+]], $zero, 32767
284*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  slt $[[R0:[0-9]+]], $[[I32767]], $4
285*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
286*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
287*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
288*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
291*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
292*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
293*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
294*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
297*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
298*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[R1:[0-9]+]], $zero, 32767
299*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[R1]], $4
300*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
301*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
302*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
303*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerdefine i32 @slti1(i32 signext %a) {
306*9880d681SAndroid Build Coastguard Workerentry:
307*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %a, 32767
308*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 7, i32 5
309*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
310*9880d681SAndroid Build Coastguard Worker}
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti2:
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
315*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
316*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: slti $[[R0:[0-9]+]], $4, -32768
317*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
320*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
321*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  slti $[[R0:[0-9]+]], $4, -32768
322*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
323*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
324*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
325*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
328*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
329*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slti $[[R0:[0-9]+]], $4, -32768
330*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
333*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
334*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, -32768
335*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
336*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
337*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
338*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerdefine i32 @slti2(i32 signext %a) {
341*9880d681SAndroid Build Coastguard Workerentry:
342*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %a, -32769
343*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 3, i32 5
344*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
345*9880d681SAndroid Build Coastguard Worker}
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti3:
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
350*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
351*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
352*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
353*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
354*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
357*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
358*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
359*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
360*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  slt $[[R0:[0-9]+]], $[[I32767]], $4
361*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
362*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
363*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
364*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
367*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
368*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
369*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
370*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
371*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
374*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
375*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
376*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
377*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[IMM]], $4
378*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
379*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
380*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
381*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerdefine i32 @slti3(i32 signext %a) {
384*9880d681SAndroid Build Coastguard Workerentry:
385*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %a, -32770
386*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 3, i32 5
387*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker; 64-bit patterns.
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti64_0:
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  slt $[[CC:[0-9]+]], $zero, $4
395*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[I32766:[0-9]+]], $zero, 32766
396*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  sltu $[[R1:[0-9]+]], $[[I32766]], $5
397*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  movz $[[CC:[0-9]+]], $[[R1]], $4
398*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
399*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[I4:3]], $zero, 4
400*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  movn $[[I4]], $[[I5]], $[[CC]]
401*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $2, $zero, 0
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   slt $[[CC0:[0-9]+]], $zero, $4
404*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[I32766:[0-9]+]], $zero, 32766
405*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   sltu $[[CC1:[0-9]+]], $[[I32766]], $5
406*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[CC2:[0-9]+]], $[[CC0]], $4
407*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[CC3:[0-9]+]], $[[CC1]], $4
408*9880d681SAndroid Build Coastguard Worker; 32-CMP:       or $[[CC:[0-9]+]], $[[CC3]], $[[CC2]]
409*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[I5:[0-9]+]], $zero, 5
410*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[I4:[0-9]+]], $zero, 4
411*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[T0:[0-9]+]], $[[I4]], $[[CC]]
412*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[T1:[0-9]+]], $[[I5]], $[[CC]]
413*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   or $3, $[[T1]], $[[T0]]
414*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $2, $zero, 0
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
417*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  addiu $[[I4:2]], $zero, 4
418*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  slti $[[R0:[0-9]+]], $4, 32767
419*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  movz $[[I4]], $[[I5]], $[[R0]]
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
422*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I4:[0-9]+]], $zero, 4
423*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, 32767
424*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by adding/subtracting the result of slti
425*9880d681SAndroid Build Coastguard Worker;        to/from one of the constants.
426*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I5]], $[[R0]]
427*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I4]], $[[R0]]
428*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Workerdefine i64 @slti64_0(i64 %a) {
431*9880d681SAndroid Build Coastguard Workerentry:
432*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %a, 32766
433*9880d681SAndroid Build Coastguard Worker  %conv = select i1 %cmp, i64 5, i64 4
434*9880d681SAndroid Build Coastguard Worker  ret i64 %conv
435*9880d681SAndroid Build Coastguard Worker}
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti64_1:
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  slt $[[CC:[0-9]+]], $zero, $4
440*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[I32766:[0-9]+]], $zero, 32767
441*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  sltu $[[R1:[0-9]+]], $[[I32766]], $5
442*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  movz $[[CC:[0-9]+]], $[[R1]], $4
443*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
444*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $[[I4:3]], $zero, 4
445*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  movn $[[I4]], $[[I5]], $[[CC]]
446*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG:  addiu $2, $zero, 0
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   slt $[[CC0:[0-9]+]], $zero, $4
449*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[I32766:[0-9]+]], $zero, 32767
450*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   sltu $[[CC1:[0-9]+]], $[[I32766]], $5
451*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[CC2:[0-9]+]], $[[CC0]], $4
452*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[CC3:[0-9]+]], $[[CC1]], $4
453*9880d681SAndroid Build Coastguard Worker; 32-CMP:       or $[[CC:[0-9]+]], $[[CC3]], $[[CC2]]
454*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[I5:[0-9]+]], $zero, 5
455*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $[[I4:[0-9]+]], $zero, 4
456*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   seleqz $[[T0:[0-9]+]], $[[I4]], $[[CC]]
457*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   selnez $[[T1:[0-9]+]], $[[I5]], $[[CC]]
458*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   or $3, $[[T1]], $[[T0]]
459*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:   addiu $2, $zero, 0
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: daddiu $[[I5:[0-9]+]], $zero, 5
462*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: daddiu $[[I4:2]], $zero, 4
463*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: daddiu $[[R1:[0-9]+]], $zero, 32767
464*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
465*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movn $[[I4]], $[[I5]], $[[R0]]
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  daddiu $[[I5:[0-9]+]], $zero, 5
468*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  daddiu $[[I4:2]], $zero, 4
469*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  daddiu $[[R1:[0-9]+]], $zero, 32767
470*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[R1]], $4
471*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
472*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I5]], $[[R0]]
473*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I4]], $[[R0]]
474*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Workerdefine i64 @slti64_1(i64 %a) {
477*9880d681SAndroid Build Coastguard Workerentry:
478*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %a, 32767
479*9880d681SAndroid Build Coastguard Worker  %conv = select i1 %cmp, i64 5, i64 4
480*9880d681SAndroid Build Coastguard Worker  ret i64 %conv
481*9880d681SAndroid Build Coastguard Worker}
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti64_2:
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker; FIXME: The 32-bit versions of this test are too complicated to reasonably
486*9880d681SAndroid Build Coastguard Worker;        match at the moment. They do show some missing optimizations though
487*9880d681SAndroid Build Coastguard Worker;        such as:
488*9880d681SAndroid Build Coastguard Worker;           (movz $a, $b, (neg $c)) -> (movn $a, $b, $c)
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
491*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  addiu $[[I4:2]], $zero, 4
492*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  slti $[[R0:[0-9]+]], $4, -32768
493*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG:  movz $[[I4]], $[[I3]], $[[R0]]
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
496*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I4:[0-9]+]], $zero, 4
497*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slti $[[R0:[0-9]+]], $4, -32768
498*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by adding/subtracting the result of slti
499*9880d681SAndroid Build Coastguard Worker;        to/from one of the constants.
500*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
501*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I4]], $[[R0]]
502*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Workerdefine i64 @slti64_2(i64 %a) {
505*9880d681SAndroid Build Coastguard Workerentry:
506*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %a, -32769
507*9880d681SAndroid Build Coastguard Worker  %conv = select i1 %cmp, i64 3, i64 4
508*9880d681SAndroid Build Coastguard Worker  ret i64 %conv
509*9880d681SAndroid Build Coastguard Worker}
510*9880d681SAndroid Build Coastguard Worker
511*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti64_3:
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker; FIXME: The 32-bit versions of this test are too complicated to reasonably
514*9880d681SAndroid Build Coastguard Worker;        match at the moment. They do show some missing optimizations though
515*9880d681SAndroid Build Coastguard Worker;        such as:
516*9880d681SAndroid Build Coastguard Worker;           (movz $a, $b, (neg $c)) -> (movn $a, $b, $c)
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: daddiu $[[I5:[0-9]+]], $zero, 5
519*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: daddiu $[[I4:2]], $zero, 4
520*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, 32766
521*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slt $[[R0:[0-9]+]], $[[R1]], $4
522*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movn $[[I4]], $[[I5]], $[[R0]]
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  daddiu $[[I4:[0-9]+]], $zero, 4
525*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  daddiu $[[I5:2]], $zero, 5
526*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  daddiu $[[R1:[0-9]+]], ${{[0-9]+}}, 32766
527*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slt $[[R0:[0-9]+]], $[[R1]], $4
528*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
529*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I4]], $[[R0]]
530*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
531*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T1]], $[[T0]]
532*9880d681SAndroid Build Coastguard Worker
533*9880d681SAndroid Build Coastguard Workerdefine i64 @slti64_3(i64 %a) {
534*9880d681SAndroid Build Coastguard Workerentry:
535*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i64 %a, -32770
536*9880d681SAndroid Build Coastguard Worker  %conv = select i1 %cmp, i64 5, i64 4
537*9880d681SAndroid Build Coastguard Worker  ret i64 %conv
538*9880d681SAndroid Build Coastguard Worker}
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker; sltiu instructions.
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sltiu0:
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
545*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
546*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, 32767
547*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
550*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
551*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, 32767
552*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
553*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
554*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
555*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
558*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
559*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, 32767
560*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
563*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
564*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, 32767
565*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
566*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
567*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
568*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Workerdefine i32 @sltiu0(i32 signext %a) {
571*9880d681SAndroid Build Coastguard Workerentry:
572*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %a, 32766
573*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 3, i32 5
574*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
575*9880d681SAndroid Build Coastguard Worker}
576*9880d681SAndroid Build Coastguard Worker
577*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sltiu1:
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
580*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
581*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
582*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
583*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
584*9880d681SAndroid Build Coastguard Worker
585*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
586*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
587*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I32767:[0-9]+]], $zero, 32767
588*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[I32767]], $4
589*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
590*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
591*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
592*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
593*9880d681SAndroid Build Coastguard Worker
594*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I7:[0-9]+]], $zero, 7
595*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
596*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[R1:[0-9]+]], $zero, 32767
597*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
598*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movn $[[I5]], $[[I7]], $[[R0]]
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I7:[0-9]+]], $zero, 7
601*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
602*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[R1:[0-9]+]], $zero, 32767
603*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[R1]], $4
604*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
605*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I7]], $[[R0]]
606*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
607*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
608*9880d681SAndroid Build Coastguard Worker
609*9880d681SAndroid Build Coastguard Workerdefine i32 @sltiu1(i32 signext %a) {
610*9880d681SAndroid Build Coastguard Workerentry:
611*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %a, 32767
612*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 7, i32 5
613*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
614*9880d681SAndroid Build Coastguard Worker}
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sltiu2:
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
619*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
620*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, -32768
621*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
622*9880d681SAndroid Build Coastguard Worker
623*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
624*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
625*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, -32768
626*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
627*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
628*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
629*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
632*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
633*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: sltiu $[[R0:[0-9]+]], $4, -32768
634*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movz $[[I5]], $[[I3]], $[[R0]]
635*9880d681SAndroid Build Coastguard Worker
636*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
637*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
638*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  sltiu $[[R0:[0-9]+]], $4, -32768
639*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between +0 and +2
640*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T0:[0-9]+]], $[[I3]], $[[R0]]
641*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T1:[0-9]+]], $[[I5]], $[[R0]]
642*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
643*9880d681SAndroid Build Coastguard Worker
644*9880d681SAndroid Build Coastguard Workerdefine i32 @sltiu2(i32 signext %a) {
645*9880d681SAndroid Build Coastguard Workerentry:
646*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %a, -32769
647*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 3, i32 5
648*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
649*9880d681SAndroid Build Coastguard Worker}
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: sltiu3:
652*9880d681SAndroid Build Coastguard Worker
653*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
654*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $[[I5:2]], $zero, 5
655*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
656*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
657*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
658*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
661*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $[[I5:[0-9]+]], $zero, 5
662*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
663*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
664*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[I32767]], $4
665*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
666*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
667*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
668*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  or $2, $[[T0]], $[[T1]]
669*9880d681SAndroid Build Coastguard Worker
670*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I3:[0-9]+]], $zero, 3
671*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $[[I5:2]], $zero, 5
672*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: lui $[[R1:[0-9]+]], 65535
673*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: ori $[[R1]], $[[R1]], 32766
674*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: sltu $[[R0:[0-9]+]], $[[R1]], $4
675*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: movn $[[I5]], $[[I3]], $[[R0]]
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I3:[0-9]+]], $zero, 3
678*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $[[I5:2]], $zero, 5
679*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  lui $[[IMM:[0-9]+]], 65535
680*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  ori $[[IMM]], $[[IMM]], 32766
681*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  sltu $[[R0:[0-9]+]], $[[IMM]], $4
682*9880d681SAndroid Build Coastguard Worker; FIXME: We can do better than this by using selccz to choose between -0 and -2
683*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  selnez $[[T0:[0-9]+]], $[[I3]], $[[R0]]
684*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  seleqz $[[T1:[0-9]+]], $[[I5]], $[[R0]]
685*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  or $2, $[[T0]], $[[T1]]
686*9880d681SAndroid Build Coastguard Worker
687*9880d681SAndroid Build Coastguard Workerdefine i32 @sltiu3(i32 signext %a) {
688*9880d681SAndroid Build Coastguard Workerentry:
689*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %a, -32770
690*9880d681SAndroid Build Coastguard Worker  %cond = select i1 %cmp, i32 3, i32 5
691*9880d681SAndroid Build Coastguard Worker  ret i32 %cond
692*9880d681SAndroid Build Coastguard Worker}
693*9880d681SAndroid Build Coastguard Worker
694*9880d681SAndroid Build Coastguard Worker; Check if
695*9880d681SAndroid Build Coastguard Worker;  (select (setxx a, N), x, x-1) or
696*9880d681SAndroid Build Coastguard Worker;  (select (setxx a, N), x-1, x)
697*9880d681SAndroid Build Coastguard Worker; doesn't generate conditional moves
698*9880d681SAndroid Build Coastguard Worker; for constant operands whose difference is |1|
699*9880d681SAndroid Build Coastguard Worker
700*9880d681SAndroid Build Coastguard Workerdefine i32 @slti4(i32 signext %a) nounwind readnone {
701*9880d681SAndroid Build Coastguard Worker  %1 = icmp slt i32 %a, 7
702*9880d681SAndroid Build Coastguard Worker  %2 = select i1 %1, i32 4, i32 3
703*9880d681SAndroid Build Coastguard Worker  ret i32 %2
704*9880d681SAndroid Build Coastguard Worker}
705*9880d681SAndroid Build Coastguard Worker
706*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti4:
707*9880d681SAndroid Build Coastguard Worker
708*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
709*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu $2, [[R1]], 3
710*9880d681SAndroid Build Coastguard Worker; 32-CMOV-NOT: movn
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
713*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu $2, [[R1]], 3
714*9880d681SAndroid Build Coastguard Worker; 32-CMP-NOT:  seleqz
715*9880d681SAndroid Build Coastguard Worker; 32-CMP-NOT:  selnez
716*9880d681SAndroid Build Coastguard Worker
717*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
718*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu $2, [[R1]], 3
719*9880d681SAndroid Build Coastguard Worker; 64-CMOV-NOT: movn
720*9880d681SAndroid Build Coastguard Worker
721*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
722*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu $2, [[R1]], 3
723*9880d681SAndroid Build Coastguard Worker; 64-CMP-NOT:  seleqz
724*9880d681SAndroid Build Coastguard Worker; 64-CMP-NOT:  selnez
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Workerdefine i32 @slti5(i32 signext %a) nounwind readnone {
727*9880d681SAndroid Build Coastguard Worker  %1 = icmp slt i32 %a, 7
728*9880d681SAndroid Build Coastguard Worker  %2 = select i1 %1, i32 -3, i32 -4
729*9880d681SAndroid Build Coastguard Worker  ret i32 %2
730*9880d681SAndroid Build Coastguard Worker}
731*9880d681SAndroid Build Coastguard Worker
732*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti5:
733*9880d681SAndroid Build Coastguard Worker
734*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
735*9880d681SAndroid Build Coastguard Worker; 32-CMOV-DAG: addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
736*9880d681SAndroid Build Coastguard Worker; 32-CMOV-NOT: movn
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
739*9880d681SAndroid Build Coastguard Worker; 32-CMP-DAG:  addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
740*9880d681SAndroid Build Coastguard Worker; 32-CMP-NOT:  seleqz
741*9880d681SAndroid Build Coastguard Worker; 32-CMP-NOT:  selnez
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: slti [[R1:\$[0-9]+]], $4, 7
744*9880d681SAndroid Build Coastguard Worker; 64-CMOV-DAG: addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
745*9880d681SAndroid Build Coastguard Worker; 64-CMOV-NOT: movn
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  slti [[R1:\$[0-9]+]], $4, 7
748*9880d681SAndroid Build Coastguard Worker; 64-CMP-DAG:  addiu [[R3:\$[0-9]+]], [[R2:\$[a-z0-9]+]], -4
749*9880d681SAndroid Build Coastguard Worker; 64-CMP-NOT:  seleqz
750*9880d681SAndroid Build Coastguard Worker; 64-CMP-NOT:  selnez
751*9880d681SAndroid Build Coastguard Worker
752*9880d681SAndroid Build Coastguard Workerdefine i32 @slti6(i32 signext %a) nounwind readnone {
753*9880d681SAndroid Build Coastguard Worker  %1 = icmp slt i32 %a, 7
754*9880d681SAndroid Build Coastguard Worker  %2 = select i1 %1, i32 3, i32 4
755*9880d681SAndroid Build Coastguard Worker  ret i32 %2
756*9880d681SAndroid Build Coastguard Worker}
757*9880d681SAndroid Build Coastguard Worker
758*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: slti6:
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Worker; ALL-DAG: addiu [[R1:\$[0-9]+]], $zero, 6
761*9880d681SAndroid Build Coastguard Worker; ALL-DAG: slt [[R1]], [[R1]], $4
762*9880d681SAndroid Build Coastguard Worker; ALL-DAG: addiu [[R2:\$[0-9]+]], [[R1]], 3
763*9880d681SAndroid Build Coastguard Worker; ALL-NOT: movn
764*9880d681SAndroid Build Coastguard Worker; ALL-NOT:  seleqz
765*9880d681SAndroid Build Coastguard Worker; ALL-NOT:  selnez
766