1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=sparc <%s | FileCheck %s -check-prefix=V8 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=sparc -mattr=v9 <%s | FileCheck %s -check-prefix=V9 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=sparc64-unknown-linux <%s | FileCheck %s -check-prefix=SPARC64 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine i32 @test_addx(i64 %a, i64 %b, i64 %c) nounwind readnone noinline { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; V8: addcc 9*9880d681SAndroid Build Coastguard Worker; V8-NOT: subcc 10*9880d681SAndroid Build Coastguard Worker; V8: addx 11*9880d681SAndroid Build Coastguard Worker; V9: addcc 12*9880d681SAndroid Build Coastguard Worker; V9-NOT: subcc 13*9880d681SAndroid Build Coastguard Worker; V9: addx 14*9880d681SAndroid Build Coastguard Worker; V9: mov{{e|ne}} %icc 15*9880d681SAndroid Build Coastguard Worker %0 = add i64 %a, %b 16*9880d681SAndroid Build Coastguard Worker %1 = icmp ugt i64 %0, %c 17*9880d681SAndroid Build Coastguard Worker %2 = zext i1 %1 to i32 18*9880d681SAndroid Build Coastguard Worker ret i32 %2 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @test_select_int_icc(i32 %a, i32 %b, i32 %c) nounwind readnone noinline { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker; V8: test_select_int_icc 25*9880d681SAndroid Build Coastguard Worker; V8: cmp 26*9880d681SAndroid Build Coastguard Worker; V8: {{be|bne}} 27*9880d681SAndroid Build Coastguard Worker; V9: test_select_int_icc 28*9880d681SAndroid Build Coastguard Worker; V9: cmp 29*9880d681SAndroid Build Coastguard Worker; V9-NOT: {{be|bne}} 30*9880d681SAndroid Build Coastguard Worker; V9: mov{{e|ne}} %icc 31*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 %a, 0 32*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, i32 %b, i32 %c 33*9880d681SAndroid Build Coastguard Worker ret i32 %1 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine float @test_select_fp_icc(i32 %a, float %f1, float %f2) nounwind readnone noinline { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker; V8: test_select_fp_icc 40*9880d681SAndroid Build Coastguard Worker; V8: cmp 41*9880d681SAndroid Build Coastguard Worker; V8: {{be|bne}} 42*9880d681SAndroid Build Coastguard Worker; V9: test_select_fp_icc 43*9880d681SAndroid Build Coastguard Worker; V9: cmp 44*9880d681SAndroid Build Coastguard Worker; V9-NOT: {{be|bne}} 45*9880d681SAndroid Build Coastguard Worker; V9: fmovs{{e|ne}} %icc 46*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 %a, 0 47*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float %f1, float %f2 48*9880d681SAndroid Build Coastguard Worker ret float %1 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine double @test_select_dfp_icc(i32 %a, double %f1, double %f2) nounwind readnone noinline { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker; V8: test_select_dfp_icc 54*9880d681SAndroid Build Coastguard Worker; V8: cmp 55*9880d681SAndroid Build Coastguard Worker; V8: {{be|bne}} 56*9880d681SAndroid Build Coastguard Worker; V9: test_select_dfp_icc 57*9880d681SAndroid Build Coastguard Worker; V9: cmp 58*9880d681SAndroid Build Coastguard Worker; V9-NOT: {{be|bne}} 59*9880d681SAndroid Build Coastguard Worker; V9: fmovd{{e|ne}} %icc 60*9880d681SAndroid Build Coastguard Worker %0 = icmp eq i32 %a, 0 61*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, double %f1, double %f2 62*9880d681SAndroid Build Coastguard Worker ret double %1 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @test_select_int_fcc(float %f, i32 %a, i32 %b) nounwind readnone noinline { 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker;V8-LABEL: test_select_int_fcc: 68*9880d681SAndroid Build Coastguard Worker;V8: fcmps 69*9880d681SAndroid Build Coastguard Worker;V8-NEXT: nop 70*9880d681SAndroid Build Coastguard Worker;V8: {{fbe|fbne}} 71*9880d681SAndroid Build Coastguard Worker;V9-LABEL: test_select_int_fcc: 72*9880d681SAndroid Build Coastguard Worker;V9: fcmps 73*9880d681SAndroid Build Coastguard Worker;V9-NOT: nop 74*9880d681SAndroid Build Coastguard Worker;V9-NOT: {{fbe|fbne}} 75*9880d681SAndroid Build Coastguard Worker;V9: mov{{e|ne}} %fcc0 76*9880d681SAndroid Build Coastguard Worker %0 = fcmp une float %f, 0.000000e+00 77*9880d681SAndroid Build Coastguard Worker %a.b = select i1 %0, i32 %a, i32 %b 78*9880d681SAndroid Build Coastguard Worker ret i32 %a.b 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdefine float @test_select_fp_fcc(float %f, float %f1, float %f2) nounwind readnone noinline { 83*9880d681SAndroid Build Coastguard Workerentry: 84*9880d681SAndroid Build Coastguard Worker;V8-LABEL: test_select_fp_fcc: 85*9880d681SAndroid Build Coastguard Worker;V8: fcmps 86*9880d681SAndroid Build Coastguard Worker;V8: {{fbe|fbne}} 87*9880d681SAndroid Build Coastguard Worker;V9-LABEL: test_select_fp_fcc: 88*9880d681SAndroid Build Coastguard Worker;V9: fcmps 89*9880d681SAndroid Build Coastguard Worker;V9-NOT: {{fbe|fbne}} 90*9880d681SAndroid Build Coastguard Worker;V9: fmovs{{e|ne}} %fcc0 91*9880d681SAndroid Build Coastguard Worker %0 = fcmp une float %f, 0.000000e+00 92*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, float %f1, float %f2 93*9880d681SAndroid Build Coastguard Worker ret float %1 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine double @test_select_dfp_fcc(double %f, double %f1, double %f2) nounwind readnone noinline { 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker;V8-LABEL: test_select_dfp_fcc: 99*9880d681SAndroid Build Coastguard Worker;V8: fcmpd 100*9880d681SAndroid Build Coastguard Worker;V8-NEXT: nop 101*9880d681SAndroid Build Coastguard Worker;V8: {{fbne|fbe}} 102*9880d681SAndroid Build Coastguard Worker;V9-LABEL: test_select_dfp_fcc: 103*9880d681SAndroid Build Coastguard Worker;V9: fcmpd 104*9880d681SAndroid Build Coastguard Worker;V9-NOT: nop 105*9880d681SAndroid Build Coastguard Worker;V9-NOT: {{fbne|fbe}} 106*9880d681SAndroid Build Coastguard Worker;V9: fmovd{{e|ne}} %fcc0 107*9880d681SAndroid Build Coastguard Worker %0 = fcmp une double %f, 0.000000e+00 108*9880d681SAndroid Build Coastguard Worker %1 = select i1 %0, double %f1, double %f2 109*9880d681SAndroid Build Coastguard Worker ret double %1 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine i32 @test_float_cc(double %a, double %b, i32 %c, i32 %d) { 113*9880d681SAndroid Build Coastguard Workerentry: 114*9880d681SAndroid Build Coastguard Worker; V8-LABEL: test_float_cc 115*9880d681SAndroid Build Coastguard Worker; V8: fcmpd 116*9880d681SAndroid Build Coastguard Worker; V8: {{fbl|fbuge}} .LBB 117*9880d681SAndroid Build Coastguard Worker; V8: fcmpd 118*9880d681SAndroid Build Coastguard Worker; V8: {{fbule|fbg}} .LBB 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; V9-LABEL: test_float_cc 121*9880d681SAndroid Build Coastguard Worker; V9: fcmpd 122*9880d681SAndroid Build Coastguard Worker; V9: {{fbl|fbuge}} .LBB 123*9880d681SAndroid Build Coastguard Worker; V9: fcmpd 124*9880d681SAndroid Build Coastguard Worker; V9: {{fbule|fbg}} .LBB 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker %0 = fcmp uge double %a, 0.000000e+00 127*9880d681SAndroid Build Coastguard Worker br i1 %0, label %loop, label %loop.2 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerloop: 130*9880d681SAndroid Build Coastguard Worker %1 = icmp eq i32 %c, 10 131*9880d681SAndroid Build Coastguard Worker br i1 %1, label %loop, label %exit.0 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerloop.2: 134*9880d681SAndroid Build Coastguard Worker %2 = fcmp ogt double %b, 0.000000e+00 135*9880d681SAndroid Build Coastguard Worker br i1 %2, label %exit.1, label %loop 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerexit.0: 138*9880d681SAndroid Build Coastguard Worker ret i32 0 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerexit.1: 141*9880d681SAndroid Build Coastguard Worker ret i32 1 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; V8-LABEL: test_adde_sube 145*9880d681SAndroid Build Coastguard Worker; V8: addcc 146*9880d681SAndroid Build Coastguard Worker; V8: addxcc 147*9880d681SAndroid Build Coastguard Worker; V8: addxcc 148*9880d681SAndroid Build Coastguard Worker; V8: addxcc 149*9880d681SAndroid Build Coastguard Worker; V8: subcc 150*9880d681SAndroid Build Coastguard Worker; V8: subxcc 151*9880d681SAndroid Build Coastguard Worker; V8: subxcc 152*9880d681SAndroid Build Coastguard Worker; V8: subxcc 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; V9-LABEL: test_adde_sube 156*9880d681SAndroid Build Coastguard Worker; V9: addcc 157*9880d681SAndroid Build Coastguard Worker; V9: addxcc 158*9880d681SAndroid Build Coastguard Worker; V9: addxcc 159*9880d681SAndroid Build Coastguard Worker; V9: addxcc 160*9880d681SAndroid Build Coastguard Worker; V9: subcc 161*9880d681SAndroid Build Coastguard Worker; V9: subxcc 162*9880d681SAndroid Build Coastguard Worker; V9: subxcc 163*9880d681SAndroid Build Coastguard Worker; V9: subxcc 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; SPARC64-LABEL: test_adde_sube 166*9880d681SAndroid Build Coastguard Worker; SPARC64: addcc 167*9880d681SAndroid Build Coastguard Worker; SPARC64: addxcc 168*9880d681SAndroid Build Coastguard Worker; SPARC64: addxcc 169*9880d681SAndroid Build Coastguard Worker; SPARC64: addxcc 170*9880d681SAndroid Build Coastguard Worker; SPARC64: subcc 171*9880d681SAndroid Build Coastguard Worker; SPARC64: subxcc 172*9880d681SAndroid Build Coastguard Worker; SPARC64: subxcc 173*9880d681SAndroid Build Coastguard Worker; SPARC64: subxcc 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerdefine void @test_adde_sube(i8* %a, i8* %b, i8* %sum, i8* %diff) { 177*9880d681SAndroid Build Coastguard Workerentry: 178*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %a to i128* 179*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8* %b to i128* 180*9880d681SAndroid Build Coastguard Worker %2 = load i128, i128* %0 181*9880d681SAndroid Build Coastguard Worker %3 = load i128, i128* %1 182*9880d681SAndroid Build Coastguard Worker %4 = add i128 %2, %3 183*9880d681SAndroid Build Coastguard Worker %5 = bitcast i8* %sum to i128* 184*9880d681SAndroid Build Coastguard Worker store i128 %4, i128* %5 185*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "=*m,*m"(i128 *%0, i128* %5) nounwind 186*9880d681SAndroid Build Coastguard Worker %6 = load i128, i128* %0 187*9880d681SAndroid Build Coastguard Worker %7 = sub i128 %2, %6 188*9880d681SAndroid Build Coastguard Worker %8 = bitcast i8* %diff to i128* 189*9880d681SAndroid Build Coastguard Worker store i128 %7, i128* %8 190*9880d681SAndroid Build Coastguard Worker ret void 191*9880d681SAndroid Build Coastguard Worker} 192