1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_floattoi32(float %in) { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_floattoi32: 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker %signed = fptosi float %in to i32 7*9880d681SAndroid Build Coastguard Worker %unsigned = fptoui float %in to i32 8*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:w[0-9]+]], {{s[0-9]+}} 9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:w[0-9]+]], {{s[0-9]+}} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker %res = sub i32 %signed, %unsigned 12*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]] 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker ret i32 %res 15*9880d681SAndroid Build Coastguard Worker; CHECK: ret 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine i32 @test_doubletoi32(double %in) { 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_doubletoi32: 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker %signed = fptosi double %in to i32 22*9880d681SAndroid Build Coastguard Worker %unsigned = fptoui double %in to i32 23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:w[0-9]+]], {{d[0-9]+}} 24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:w[0-9]+]], {{d[0-9]+}} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker %res = sub i32 %signed, %unsigned 27*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]] 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker ret i32 %res 30*9880d681SAndroid Build Coastguard Worker; CHECK: ret 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i64 @test_floattoi64(float %in) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_floattoi64: 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker %signed = fptosi float %in to i64 37*9880d681SAndroid Build Coastguard Worker %unsigned = fptoui float %in to i64 38*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:x[0-9]+]], {{s[0-9]+}} 39*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:x[0-9]+]], {{s[0-9]+}} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker %res = sub i64 %signed, %unsigned 42*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]] 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker ret i64 %res 45*9880d681SAndroid Build Coastguard Worker; CHECK: ret 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i64 @test_doubletoi64(double %in) { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_doubletoi64: 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker %signed = fptosi double %in to i64 52*9880d681SAndroid Build Coastguard Worker %unsigned = fptoui double %in to i64 53*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:x[0-9]+]], {{d[0-9]+}} 54*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:x[0-9]+]], {{d[0-9]+}} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker %res = sub i64 %signed, %unsigned 57*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]] 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker ret i64 %res 60*9880d681SAndroid Build Coastguard Worker; CHECK: ret 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine float @test_i32tofloat(i32 %in) { 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32tofloat: 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker %signed = sitofp i32 %in to float 67*9880d681SAndroid Build Coastguard Worker %unsigned = uitofp i32 %in to float 68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:s[0-9]+]], {{w[0-9]+}} 69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:s[0-9]+]], {{w[0-9]+}} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker %res = fsub float %signed, %unsigned 72*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]] 73*9880d681SAndroid Build Coastguard Worker ret float %res 74*9880d681SAndroid Build Coastguard Worker; CHECK: ret 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine double @test_i32todouble(i32 %in) { 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32todouble: 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker %signed = sitofp i32 %in to double 81*9880d681SAndroid Build Coastguard Worker %unsigned = uitofp i32 %in to double 82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:d[0-9]+]], {{w[0-9]+}} 83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:d[0-9]+]], {{w[0-9]+}} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker %res = fsub double %signed, %unsigned 86*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{d[0-9]+}}, [[SIG]], [[UNSIG]] 87*9880d681SAndroid Build Coastguard Worker ret double %res 88*9880d681SAndroid Build Coastguard Worker; CHECK: ret 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine float @test_i64tofloat(i64 %in) { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64tofloat: 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker %signed = sitofp i64 %in to float 95*9880d681SAndroid Build Coastguard Worker %unsigned = uitofp i64 %in to float 96*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:s[0-9]+]], {{x[0-9]+}} 97*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:s[0-9]+]], {{x[0-9]+}} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker %res = fsub float %signed, %unsigned 100*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]] 101*9880d681SAndroid Build Coastguard Worker ret float %res 102*9880d681SAndroid Build Coastguard Worker; CHECK: ret 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine double @test_i64todouble(i64 %in) { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64todouble: 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker %signed = sitofp i64 %in to double 109*9880d681SAndroid Build Coastguard Worker %unsigned = uitofp i64 %in to double 110*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:d[0-9]+]], {{x[0-9]+}} 111*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:d[0-9]+]], {{x[0-9]+}} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker %res = fsub double %signed, %unsigned 114*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{d[0-9]+}}, [[SIG]], [[UNSIG]] 115*9880d681SAndroid Build Coastguard Worker ret double %res 116*9880d681SAndroid Build Coastguard Worker; CHECK: ret 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine i32 @test_bitcastfloattoi32(float %in) { 120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcastfloattoi32: 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker %res = bitcast float %in to i32 123*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{w[0-9]+}}, {{s[0-9]+}} 124*9880d681SAndroid Build Coastguard Worker ret i32 %res 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine i64 @test_bitcastdoubletoi64(double %in) { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcastdoubletoi64: 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker %res = bitcast double %in to i64 131*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}} 132*9880d681SAndroid Build Coastguard Worker ret i64 %res 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine float @test_bitcasti32tofloat(i32 %in) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcasti32tofloat: 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker %res = bitcast i32 %in to float 139*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{s[0-9]+}}, {{w[0-9]+}} 140*9880d681SAndroid Build Coastguard Worker ret float %res 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine double @test_bitcasti64todouble(i64 %in) { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcasti64todouble: 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker %res = bitcast i64 %in to double 148*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}} 149*9880d681SAndroid Build Coastguard Worker ret double %res 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerdefine double @bitcast_fabs(double %x) { 154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fabs: 155*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fabs d0, d0 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 158*9880d681SAndroid Build Coastguard Worker; 159*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast double %x to i64 160*9880d681SAndroid Build Coastguard Worker %and = and i64 %bc1, 9223372036854775807 161*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i64 %and to double 162*9880d681SAndroid Build Coastguard Worker ret double %bc2 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine float @bitcast_fneg(float %x) { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fneg: 167*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fneg s0, s0 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 170*9880d681SAndroid Build Coastguard Worker; 171*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast float %x to i32 172*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %bc1, 2147483648 173*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast i32 %xor to float 174*9880d681SAndroid Build Coastguard Worker ret float %bc2 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177