1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=mipsel -mcpu=mips32r2 -O2 -relocation-model=pic \ 2*9880d681SAndroid Build Coastguard Worker; RUN: -fast-isel -fast-isel-abort=1 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine i1 @sel_i1(i1 %j, i1 %k, i1 %l) { 5*9880d681SAndroid Build Coastguard Workerentry: 6*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sel_i1: 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker ; FIXME: The following instruction is redundant. 9*9880d681SAndroid Build Coastguard Worker ; CHECK: xor $[[T0:[0-9]+]], $4, $zero 10*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: sltu $[[T1:[0-9]+]], $zero, $[[T0]] 11*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: andi $[[T2:[0-9]+]], $[[T1]], 1 12*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: movn $6, $5, $[[T2]] 13*9880d681SAndroid Build Coastguard Worker ; CHECK: move $2, $6 14*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i1 %j, 0 15*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i1 %k, i1 %l 16*9880d681SAndroid Build Coastguard Worker ret i1 %res 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i8 @sel_i8(i8 %j, i8 %k, i8 %l) { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sel_i8: 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: seb $[[T0:[0-9]+]], $4 24*9880d681SAndroid Build Coastguard Worker ; FIXME: The following 2 instructions are redundant. 25*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: seb $[[T1:[0-9]+]], $zero 26*9880d681SAndroid Build Coastguard Worker ; CHECK: xor $[[T2:[0-9]+]], $[[T0]], $[[T1]] 27*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: sltu $[[T3:[0-9]+]], $zero, $[[T2]] 28*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: andi $[[T4:[0-9]+]], $[[T3]], 1 29*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: movn $6, $5, $[[T4]] 30*9880d681SAndroid Build Coastguard Worker ; CHECK: move $2, $6 31*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i8 %j, 0 32*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i8 %k, i8 %l 33*9880d681SAndroid Build Coastguard Worker ret i8 %res 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i16 @sel_i16(i16 %j, i16 %k, i16 %l) { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sel_i16: 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: seh $[[T0:[0-9]+]], $4 41*9880d681SAndroid Build Coastguard Worker ; FIXME: The following 2 instructions are redundant. 42*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: seh $[[T1:[0-9]+]], $zero 43*9880d681SAndroid Build Coastguard Worker ; CHECK: xor $[[T2:[0-9]+]], $[[T0]], $[[T1]] 44*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: sltu $[[T3:[0-9]+]], $zero, $[[T2]] 45*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: andi $[[T4:[0-9]+]], $[[T3]], 1 46*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: movn $6, $5, $[[T4]] 47*9880d681SAndroid Build Coastguard Worker ; CHECK: move $2, $6 48*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i16 %j, 0 49*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i16 %k, i16 %l 50*9880d681SAndroid Build Coastguard Worker ret i16 %res 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine i32 @sel_i32(i32 %j, i32 %k, i32 %l) { 54*9880d681SAndroid Build Coastguard Workerentry: 55*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sel_i32: 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker ; FIXME: The following instruction is redundant. 58*9880d681SAndroid Build Coastguard Worker ; CHECK: xor $[[T0:[0-9]+]], $4, $zero 59*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: sltu $[[T1:[0-9]+]], $zero, $[[T0]] 60*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: andi $[[T2:[0-9]+]], $[[T1]], 1 61*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: movn $6, $5, $[[T2]] 62*9880d681SAndroid Build Coastguard Worker ; CHECK: move $2, $6 63*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i32 %j, 0 64*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, i32 %k, i32 %l 65*9880d681SAndroid Build Coastguard Worker ret i32 %res 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine float @sel_float(i32 %j, float %k, float %l) { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sel_float: 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: mtc1 $6, $f0 73*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: mtc1 $5, $f1 74*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: xor $[[T0:[0-9]+]], $4, $zero 75*9880d681SAndroid Build Coastguard Worker ; CHECK: sltu $[[T1:[0-9]+]], $zero, $[[T0]] 76*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: andi $[[T2:[0-9]+]], $[[T1]], 1 77*9880d681SAndroid Build Coastguard Worker ; CHECK: movn.s $f0, $f1, $[[T2]] 78*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i32 %j, 0 79*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, float %k, float %l 80*9880d681SAndroid Build Coastguard Worker ret float %res 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine double @sel_double(i32 %j, double %k, double %l) { 84*9880d681SAndroid Build Coastguard Workerentry: 85*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: sel_double: 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: mtc1 $6, $f2 88*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: mthc1 $7, $f2 89*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: ldc1 $f0, 16($sp) 90*9880d681SAndroid Build Coastguard Worker ; CHECK-DAG: xor $[[T0:[0-9]+]], $4, $zero 91*9880d681SAndroid Build Coastguard Worker ; CHECK: sltu $[[T1:[0-9]+]], $zero, $[[T0]] 92*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: andi $[[T2:[0-9]+]], $[[T1]], 1 93*9880d681SAndroid Build Coastguard Worker ; CHECK: movn.d $f0, $f2, $[[T2]] 94*9880d681SAndroid Build Coastguard Worker %cond = icmp ne i32 %j, 0 95*9880d681SAndroid Build Coastguard Worker %res = select i1 %cond, double %k, double %l 96*9880d681SAndroid Build Coastguard Worker ret double %res 97*9880d681SAndroid Build Coastguard Worker} 98