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