1; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s 2; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s 3 4@varhalf = global half 0.0 5@varfloat = global float 0.0 6@vardouble = global double 0.0 7 8declare float @fabsf(float) readonly 9declare double @fabs(double) readonly 10 11declare float @llvm.sqrt.f32(float %Val) 12declare double @llvm.sqrt.f64(double %Val) 13 14declare float @ceilf(float) readonly 15declare double @ceil(double) readonly 16 17declare float @floorf(float) readonly 18declare double @floor(double) readonly 19 20declare float @truncf(float) readonly 21declare double @trunc(double) readonly 22 23declare float @rintf(float) readonly 24declare double @rint(double) readonly 25 26declare float @nearbyintf(float) readonly 27declare double @nearbyint(double) readonly 28 29define void @simple_float() { 30; CHECK-LABEL: simple_float: 31 %val1 = load volatile float* @varfloat 32 33 %valabs = call float @fabsf(float %val1) 34 store volatile float %valabs, float* @varfloat 35; CHECK: fabs {{s[0-9]+}}, {{s[0-9]+}} 36 37 %valneg = fsub float -0.0, %val1 38 store volatile float %valneg, float* @varfloat 39; CHECK: fneg {{s[0-9]+}}, {{s[0-9]+}} 40 41 %valsqrt = call float @llvm.sqrt.f32(float %val1) 42 store volatile float %valsqrt, float* @varfloat 43; CHECK: fsqrt {{s[0-9]+}}, {{s[0-9]+}} 44 45 %valceil = call float @ceilf(float %val1) 46 store volatile float %valceil, float* @varfloat 47; CHECK: frintp {{s[0-9]+}}, {{s[0-9]+}} 48 49 %valfloor = call float @floorf(float %val1) 50 store volatile float %valfloor, float* @varfloat 51; CHECK: frintm {{s[0-9]+}}, {{s[0-9]+}} 52 53 %valtrunc = call float @truncf(float %val1) 54 store volatile float %valtrunc, float* @varfloat 55; CHECK: frintz {{s[0-9]+}}, {{s[0-9]+}} 56 57 %valrint = call float @rintf(float %val1) 58 store volatile float %valrint, float* @varfloat 59; CHECK: frintx {{s[0-9]+}}, {{s[0-9]+}} 60 61 %valnearbyint = call float @nearbyintf(float %val1) 62 store volatile float %valnearbyint, float* @varfloat 63; CHECK: frinti {{s[0-9]+}}, {{s[0-9]+}} 64 65 ret void 66} 67 68define void @simple_double() { 69; CHECK-LABEL: simple_double: 70 %val1 = load volatile double* @vardouble 71 72 %valabs = call double @fabs(double %val1) 73 store volatile double %valabs, double* @vardouble 74; CHECK: fabs {{d[0-9]+}}, {{d[0-9]+}} 75 76 %valneg = fsub double -0.0, %val1 77 store volatile double %valneg, double* @vardouble 78; CHECK: fneg {{d[0-9]+}}, {{d[0-9]+}} 79 80 %valsqrt = call double @llvm.sqrt.f64(double %val1) 81 store volatile double %valsqrt, double* @vardouble 82; CHECK: fsqrt {{d[0-9]+}}, {{d[0-9]+}} 83 84 %valceil = call double @ceil(double %val1) 85 store volatile double %valceil, double* @vardouble 86; CHECK: frintp {{d[0-9]+}}, {{d[0-9]+}} 87 88 %valfloor = call double @floor(double %val1) 89 store volatile double %valfloor, double* @vardouble 90; CHECK: frintm {{d[0-9]+}}, {{d[0-9]+}} 91 92 %valtrunc = call double @trunc(double %val1) 93 store volatile double %valtrunc, double* @vardouble 94; CHECK: frintz {{d[0-9]+}}, {{d[0-9]+}} 95 96 %valrint = call double @rint(double %val1) 97 store volatile double %valrint, double* @vardouble 98; CHECK: frintx {{d[0-9]+}}, {{d[0-9]+}} 99 100 %valnearbyint = call double @nearbyint(double %val1) 101 store volatile double %valnearbyint, double* @vardouble 102; CHECK: frinti {{d[0-9]+}}, {{d[0-9]+}} 103 104 ret void 105} 106 107define void @converts() { 108; CHECK-LABEL: converts: 109 110 %val16 = load volatile half* @varhalf 111 %val32 = load volatile float* @varfloat 112 %val64 = load volatile double* @vardouble 113 114 %val16to32 = fpext half %val16 to float 115 store volatile float %val16to32, float* @varfloat 116; CHECK: fcvt {{s[0-9]+}}, {{h[0-9]+}} 117 118 %val16to64 = fpext half %val16 to double 119 store volatile double %val16to64, double* @vardouble 120; CHECK: fcvt {{d[0-9]+}}, {{h[0-9]+}} 121 122 %val32to16 = fptrunc float %val32 to half 123 store volatile half %val32to16, half* @varhalf 124; CHECK: fcvt {{h[0-9]+}}, {{s[0-9]+}} 125 126 %val32to64 = fpext float %val32 to double 127 store volatile double %val32to64, double* @vardouble 128; CHECK: fcvt {{d[0-9]+}}, {{s[0-9]+}} 129 130 %val64to16 = fptrunc double %val64 to half 131 store volatile half %val64to16, half* @varhalf 132; CHECK: fcvt {{h[0-9]+}}, {{d[0-9]+}} 133 134 %val64to32 = fptrunc double %val64 to float 135 store volatile float %val64to32, float* @varfloat 136; CHECK: fcvt {{s[0-9]+}}, {{d[0-9]+}} 137 138 ret void 139} 140