1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=sparc64-pc-openbsd -disable-sparc-leaf-proc | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Testing 64-bit conditionals. The sparc64 triple is an alias for sparcv9. 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK: cmpri 5*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i1, 1 6*9880d681SAndroid Build Coastguard Worker; CHECK: be %xcc, 7*9880d681SAndroid Build Coastguard Workerdefine void @cmpri(i64* %p, i64 %x) { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i64 %x, 1 10*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerif.then: 13*9880d681SAndroid Build Coastguard Worker store i64 %x, i64* %p, align 8 14*9880d681SAndroid Build Coastguard Worker br label %if.end 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerif.end: 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK: cmprr 21*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i1, %i2 22*9880d681SAndroid Build Coastguard Worker; CHECK: bgu %xcc, 23*9880d681SAndroid Build Coastguard Workerdefine void @cmprr(i64* %p, i64 %x, i64 %y) { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker %tobool = icmp ugt i64 %x, %y 26*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerif.then: 29*9880d681SAndroid Build Coastguard Worker store i64 %x, i64* %p, align 8 30*9880d681SAndroid Build Coastguard Worker br label %if.end 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerif.end: 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; CHECK: selecti32_xcc 37*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i0, %i1 38*9880d681SAndroid Build Coastguard Worker; CHECK: movg %xcc, %i2, %i3 39*9880d681SAndroid Build Coastguard Worker; CHECK: restore %g0, %i3, %o0 40*9880d681SAndroid Build Coastguard Workerdefine i32 @selecti32_xcc(i64 %x, i64 %y, i32 %a, i32 %b) { 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker %tobool = icmp sgt i64 %x, %y 43*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, i32 %a, i32 %b 44*9880d681SAndroid Build Coastguard Worker ret i32 %rv 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; CHECK: selecti64_xcc 48*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i0, %i1 49*9880d681SAndroid Build Coastguard Worker; CHECK: movg %xcc, %i2, %i3 50*9880d681SAndroid Build Coastguard Worker; CHECK: restore %g0, %i3, %o0 51*9880d681SAndroid Build Coastguard Workerdefine i64 @selecti64_xcc(i64 %x, i64 %y, i64 %a, i64 %b) { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %tobool = icmp sgt i64 %x, %y 54*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, i64 %a, i64 %b 55*9880d681SAndroid Build Coastguard Worker ret i64 %rv 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; CHECK: selecti64_icc 59*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i0, %i1 60*9880d681SAndroid Build Coastguard Worker; CHECK: movg %icc, %i2, %i3 61*9880d681SAndroid Build Coastguard Worker; CHECK: restore %g0, %i3, %o0 62*9880d681SAndroid Build Coastguard Workerdefine i64 @selecti64_icc(i32 %x, i32 %y, i64 %a, i64 %b) { 63*9880d681SAndroid Build Coastguard Workerentry: 64*9880d681SAndroid Build Coastguard Worker %tobool = icmp sgt i32 %x, %y 65*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, i64 %a, i64 %b 66*9880d681SAndroid Build Coastguard Worker ret i64 %rv 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK: selecti64_fcc 70*9880d681SAndroid Build Coastguard Worker; CHECK: fcmps %f1, %f3 71*9880d681SAndroid Build Coastguard Worker; CHECK: movul %fcc0, %i2, %i3 72*9880d681SAndroid Build Coastguard Worker; CHECK: restore %g0, %i3, %o0 73*9880d681SAndroid Build Coastguard Workerdefine i64 @selecti64_fcc(float %x, float %y, i64 %a, i64 %b) { 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker %tobool = fcmp ult float %x, %y 76*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, i64 %a, i64 %b 77*9880d681SAndroid Build Coastguard Worker ret i64 %rv 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK: selectf32_xcc 81*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i0, %i1 82*9880d681SAndroid Build Coastguard Worker; CHECK: fmovsg %xcc, %f5, %f7 83*9880d681SAndroid Build Coastguard Worker; CHECK: fmovs %f7, %f0 84*9880d681SAndroid Build Coastguard Workerdefine float @selectf32_xcc(i64 %x, i64 %y, float %a, float %b) { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker %tobool = icmp sgt i64 %x, %y 87*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, float %a, float %b 88*9880d681SAndroid Build Coastguard Worker ret float %rv 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; CHECK: selectf64_xcc 92*9880d681SAndroid Build Coastguard Worker; CHECK: cmp %i0, %i1 93*9880d681SAndroid Build Coastguard Worker; CHECK: fmovdg %xcc, %f4, %f6 94*9880d681SAndroid Build Coastguard Worker; CHECK: fmovd %f6, %f0 95*9880d681SAndroid Build Coastguard Workerdefine double @selectf64_xcc(i64 %x, i64 %y, double %a, double %b) { 96*9880d681SAndroid Build Coastguard Workerentry: 97*9880d681SAndroid Build Coastguard Worker %tobool = icmp sgt i64 %x, %y 98*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, double %a, double %b 99*9880d681SAndroid Build Coastguard Worker ret double %rv 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; The MOVXCC instruction can't use %g0 for its tied operand. 103*9880d681SAndroid Build Coastguard Worker; CHECK: select_consti64_xcc 104*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 105*9880d681SAndroid Build Coastguard Worker; CHECK: movg %xcc, 123, %i{{[0-2]}} 106*9880d681SAndroid Build Coastguard Workerdefine i64 @select_consti64_xcc(i64 %x, i64 %y) { 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker %tobool = icmp sgt i64 %x, %y 109*9880d681SAndroid Build Coastguard Worker %rv = select i1 %tobool, i64 123, i64 0 110*9880d681SAndroid Build Coastguard Worker ret i64 %rv 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: setcc_resultty 114*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: srax %i0, 63, %o0 115*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: mov %i0, %o1 116*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: mov 0, %o2 117*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: mov 32, %o3 118*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: call __multi3 119*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 120*9880d681SAndroid Build Coastguard Worker; CHECK: movne %xcc, 1, [[R:%[gilo][0-7]]] 121*9880d681SAndroid Build Coastguard Worker; CHECK: or [[R]], %i1, %i0 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine i1 @setcc_resultty(i64 %a, i1 %b) { 124*9880d681SAndroid Build Coastguard Worker %a0 = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %a, i64 32) 125*9880d681SAndroid Build Coastguard Worker %a1 = extractvalue { i64, i1 } %a0, 1 126*9880d681SAndroid Build Coastguard Worker %a4 = or i1 %a1, %b 127*9880d681SAndroid Build Coastguard Worker ret i1 %a4 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdeclare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) 131