1; RUN: llc < %s -mtriple=arm-apple-ios -mattr=+vfp2 -disable-post-ra | FileCheck %s 2; RUN: llc < %s -mtriple=arm-apple-ios -mattr=+vfp2 -disable-post-ra -regalloc=basic | FileCheck %s 3 4define void @test(float* %P, double* %D) { 5 %A = load float, float* %P ; <float> [#uses=1] 6 %B = load double, double* %D ; <double> [#uses=1] 7 store float %A, float* %P 8 store double %B, double* %D 9 ret void 10} 11 12declare float @fabsf(float) 13 14declare double @fabs(double) 15 16define void @test_abs(float* %P, double* %D) { 17;CHECK-LABEL: test_abs: 18 %a = load float, float* %P ; <float> [#uses=1] 19;CHECK: vabs.f32 20 %b = call float @fabsf( float %a ) readnone ; <float> [#uses=1] 21 store float %b, float* %P 22 %A = load double, double* %D ; <double> [#uses=1] 23;CHECK: vabs.f64 24 %B = call double @fabs( double %A ) readnone ; <double> [#uses=1] 25 store double %B, double* %D 26 ret void 27} 28 29define void @test_add(float* %P, double* %D) { 30;CHECK-LABEL: test_add: 31 %a = load float, float* %P ; <float> [#uses=2] 32 %b = fadd float %a, %a ; <float> [#uses=1] 33 store float %b, float* %P 34 %A = load double, double* %D ; <double> [#uses=2] 35 %B = fadd double %A, %A ; <double> [#uses=1] 36 store double %B, double* %D 37 ret void 38} 39 40define void @test_ext_round(float* %P, double* %D) { 41;CHECK-LABEL: test_ext_round: 42 %a = load float, float* %P ; <float> [#uses=1] 43;CHECK: vcvt.f64.f32 44;CHECK: vcvt.f32.f64 45 %b = fpext float %a to double ; <double> [#uses=1] 46 %A = load double, double* %D ; <double> [#uses=1] 47 %B = fptrunc double %A to float ; <float> [#uses=1] 48 store double %b, double* %D 49 store float %B, float* %P 50 ret void 51} 52 53define void @test_fma(float* %P1, float* %P2, float* %P3) { 54;CHECK-LABEL: test_fma: 55 %a1 = load float, float* %P1 ; <float> [#uses=1] 56 %a2 = load float, float* %P2 ; <float> [#uses=1] 57 %a3 = load float, float* %P3 ; <float> [#uses=1] 58;CHECK: vnmls.f32 59 %X = fmul float %a1, %a2 ; <float> [#uses=1] 60 %Y = fsub float %X, %a3 ; <float> [#uses=1] 61 store float %Y, float* %P1 62 ret void 63} 64 65define i32 @test_ftoi(float* %P1) { 66;CHECK-LABEL: test_ftoi: 67 %a1 = load float, float* %P1 ; <float> [#uses=1] 68;CHECK: vcvt.s32.f32 69 %b1 = fptosi float %a1 to i32 ; <i32> [#uses=1] 70 ret i32 %b1 71} 72 73define i32 @test_ftou(float* %P1) { 74;CHECK-LABEL: test_ftou: 75 %a1 = load float, float* %P1 ; <float> [#uses=1] 76;CHECK: vcvt.u32.f32 77 %b1 = fptoui float %a1 to i32 ; <i32> [#uses=1] 78 ret i32 %b1 79} 80 81define i32 @test_dtoi(double* %P1) { 82;CHECK-LABEL: test_dtoi: 83 %a1 = load double, double* %P1 ; <double> [#uses=1] 84;CHECK: vcvt.s32.f64 85 %b1 = fptosi double %a1 to i32 ; <i32> [#uses=1] 86 ret i32 %b1 87} 88 89define i32 @test_dtou(double* %P1) { 90;CHECK-LABEL: test_dtou: 91 %a1 = load double, double* %P1 ; <double> [#uses=1] 92;CHECK: vcvt.u32.f64 93 %b1 = fptoui double %a1 to i32 ; <i32> [#uses=1] 94 ret i32 %b1 95} 96 97define void @test_utod(double* %P1, i32 %X) { 98;CHECK-LABEL: test_utod: 99;CHECK: vcvt.f64.u32 100 %b1 = uitofp i32 %X to double ; <double> [#uses=1] 101 store double %b1, double* %P1 102 ret void 103} 104 105define void @test_utod2(double* %P1, i8 %X) { 106;CHECK-LABEL: test_utod2: 107;CHECK: vcvt.f64.u32 108 %b1 = uitofp i8 %X to double ; <double> [#uses=1] 109 store double %b1, double* %P1 110 ret void 111} 112 113define void @test_cmp(float* %glob, i32 %X) { 114;CHECK-LABEL: test_cmp: 115entry: 116 %tmp = load float, float* %glob ; <float> [#uses=2] 117 %tmp3 = getelementptr float, float* %glob, i32 2 ; <float*> [#uses=1] 118 %tmp4 = load float, float* %tmp3 ; <float> [#uses=2] 119 %tmp.upgrd.1 = fcmp oeq float %tmp, %tmp4 ; <i1> [#uses=1] 120 %tmp5 = fcmp uno float %tmp, %tmp4 ; <i1> [#uses=1] 121 %tmp6 = or i1 %tmp.upgrd.1, %tmp5 ; <i1> [#uses=1] 122;CHECK: bmi 123;CHECK-NEXT: bgt 124 br i1 %tmp6, label %cond_true, label %cond_false 125 126cond_true: ; preds = %entry 127 %tmp.upgrd.2 = tail call i32 (...) @bar( ) ; <i32> [#uses=0] 128 ret void 129 130cond_false: ; preds = %entry 131 %tmp7 = tail call i32 (...) @baz( ) ; <i32> [#uses=0] 132 ret void 133} 134 135declare i1 @llvm.isunordered.f32(float, float) 136 137declare i32 @bar(...) 138 139declare i32 @baz(...) 140 141define void @test_cmpfp0(float* %glob, i32 %X) { 142;CHECK-LABEL: test_cmpfp0: 143entry: 144 %tmp = load float, float* %glob ; <float> [#uses=1] 145;CHECK: vcmpe.f32 146 %tmp.upgrd.3 = fcmp ogt float %tmp, 0.000000e+00 ; <i1> [#uses=1] 147 br i1 %tmp.upgrd.3, label %cond_true, label %cond_false 148 149cond_true: ; preds = %entry 150 %tmp.upgrd.4 = tail call i32 (...) @bar( ) ; <i32> [#uses=0] 151 ret void 152 153cond_false: ; preds = %entry 154 %tmp1 = tail call i32 (...) @baz( ) ; <i32> [#uses=0] 155 ret void 156} 157