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