1; RUN: llc < %s | FileCheck %s 2target triple = "nvptx64-nvidia-cuda" 3 4; Checks that llvm intrinsics for math functions are correctly lowered to PTX. 5 6declare float @llvm.ceil.f32(float) #0 7declare double @llvm.ceil.f64(double) #0 8declare float @llvm.floor.f32(float) #0 9declare double @llvm.floor.f64(double) #0 10declare float @llvm.round.f32(float) #0 11declare double @llvm.round.f64(double) #0 12declare float @llvm.nearbyint.f32(float) #0 13declare double @llvm.nearbyint.f64(double) #0 14declare float @llvm.rint.f32(float) #0 15declare double @llvm.rint.f64(double) #0 16declare float @llvm.trunc.f32(float) #0 17declare double @llvm.trunc.f64(double) #0 18declare float @llvm.fabs.f32(float) #0 19declare double @llvm.fabs.f64(double) #0 20declare float @llvm.minnum.f32(float, float) #0 21declare double @llvm.minnum.f64(double, double) #0 22declare float @llvm.maxnum.f32(float, float) #0 23declare double @llvm.maxnum.f64(double, double) #0 24declare float @llvm.fma.f32(float, float, float) #0 25declare double @llvm.fma.f64(double, double, double) #0 26 27; ---- ceil ---- 28 29; CHECK-LABEL: ceil_float 30define float @ceil_float(float %a) { 31 ; CHECK: cvt.rpi.f32.f32 32 %b = call float @llvm.ceil.f32(float %a) 33 ret float %b 34} 35 36; CHECK-LABEL: ceil_float_ftz 37define float @ceil_float_ftz(float %a) #1 { 38 ; CHECK: cvt.rpi.ftz.f32.f32 39 %b = call float @llvm.ceil.f32(float %a) 40 ret float %b 41} 42 43; CHECK-LABEL: ceil_double 44define double @ceil_double(double %a) { 45 ; CHECK: cvt.rpi.f64.f64 46 %b = call double @llvm.ceil.f64(double %a) 47 ret double %b 48} 49 50; ---- floor ---- 51 52; CHECK-LABEL: floor_float 53define float @floor_float(float %a) { 54 ; CHECK: cvt.rmi.f32.f32 55 %b = call float @llvm.floor.f32(float %a) 56 ret float %b 57} 58 59; CHECK-LABEL: floor_float_ftz 60define float @floor_float_ftz(float %a) #1 { 61 ; CHECK: cvt.rmi.ftz.f32.f32 62 %b = call float @llvm.floor.f32(float %a) 63 ret float %b 64} 65 66; CHECK-LABEL: floor_double 67define double @floor_double(double %a) { 68 ; CHECK: cvt.rmi.f64.f64 69 %b = call double @llvm.floor.f64(double %a) 70 ret double %b 71} 72 73; ---- round ---- 74 75; CHECK-LABEL: round_float 76define float @round_float(float %a) { 77 ; CHECK: cvt.rni.f32.f32 78 %b = call float @llvm.round.f32(float %a) 79 ret float %b 80} 81 82; CHECK-LABEL: round_float_ftz 83define float @round_float_ftz(float %a) #1 { 84 ; CHECK: cvt.rni.ftz.f32.f32 85 %b = call float @llvm.round.f32(float %a) 86 ret float %b 87} 88 89; CHECK-LABEL: round_double 90define double @round_double(double %a) { 91 ; CHECK: cvt.rni.f64.f64 92 %b = call double @llvm.round.f64(double %a) 93 ret double %b 94} 95 96; ---- nearbyint ---- 97 98; CHECK-LABEL: nearbyint_float 99define float @nearbyint_float(float %a) { 100 ; CHECK: cvt.rni.f32.f32 101 %b = call float @llvm.nearbyint.f32(float %a) 102 ret float %b 103} 104 105; CHECK-LABEL: nearbyint_float_ftz 106define float @nearbyint_float_ftz(float %a) #1 { 107 ; CHECK: cvt.rni.ftz.f32.f32 108 %b = call float @llvm.nearbyint.f32(float %a) 109 ret float %b 110} 111 112; CHECK-LABEL: nearbyint_double 113define double @nearbyint_double(double %a) { 114 ; CHECK: cvt.rni.f64.f64 115 %b = call double @llvm.nearbyint.f64(double %a) 116 ret double %b 117} 118 119; ---- rint ---- 120 121; CHECK-LABEL: rint_float 122define float @rint_float(float %a) { 123 ; CHECK: cvt.rni.f32.f32 124 %b = call float @llvm.rint.f32(float %a) 125 ret float %b 126} 127 128; CHECK-LABEL: rint_float_ftz 129define float @rint_float_ftz(float %a) #1 { 130 ; CHECK: cvt.rni.ftz.f32.f32 131 %b = call float @llvm.rint.f32(float %a) 132 ret float %b 133} 134 135; CHECK-LABEL: rint_double 136define double @rint_double(double %a) { 137 ; CHECK: cvt.rni.f64.f64 138 %b = call double @llvm.rint.f64(double %a) 139 ret double %b 140} 141 142; ---- trunc ---- 143 144; CHECK-LABEL: trunc_float 145define float @trunc_float(float %a) { 146 ; CHECK: cvt.rzi.f32.f32 147 %b = call float @llvm.trunc.f32(float %a) 148 ret float %b 149} 150 151; CHECK-LABEL: trunc_float_ftz 152define float @trunc_float_ftz(float %a) #1 { 153 ; CHECK: cvt.rzi.ftz.f32.f32 154 %b = call float @llvm.trunc.f32(float %a) 155 ret float %b 156} 157 158; CHECK-LABEL: trunc_double 159define double @trunc_double(double %a) { 160 ; CHECK: cvt.rzi.f64.f64 161 %b = call double @llvm.trunc.f64(double %a) 162 ret double %b 163} 164 165; ---- abs ---- 166 167; CHECK-LABEL: abs_float 168define float @abs_float(float %a) { 169 ; CHECK: abs.f32 170 %b = call float @llvm.fabs.f32(float %a) 171 ret float %b 172} 173 174; CHECK-LABEL: abs_float_ftz 175define float @abs_float_ftz(float %a) #1 { 176 ; CHECK: abs.ftz.f32 177 %b = call float @llvm.fabs.f32(float %a) 178 ret float %b 179} 180 181; CHECK-LABEL: abs_double 182define double @abs_double(double %a) { 183 ; CHECK: abs.f64 184 %b = call double @llvm.fabs.f64(double %a) 185 ret double %b 186} 187 188; ---- min ---- 189 190; CHECK-LABEL: min_float 191define float @min_float(float %a, float %b) { 192 ; CHECK: min.f32 193 %x = call float @llvm.minnum.f32(float %a, float %b) 194 ret float %x 195} 196 197; CHECK-LABEL: min_imm1 198define float @min_imm1(float %a) { 199 ; CHECK: min.f32 200 %x = call float @llvm.minnum.f32(float %a, float 0.0) 201 ret float %x 202} 203 204; CHECK-LABEL: min_imm2 205define float @min_imm2(float %a) { 206 ; CHECK: min.f32 207 %x = call float @llvm.minnum.f32(float 0.0, float %a) 208 ret float %x 209} 210 211; CHECK-LABEL: min_float_ftz 212define float @min_float_ftz(float %a, float %b) #1 { 213 ; CHECK: min.ftz.f32 214 %x = call float @llvm.minnum.f32(float %a, float %b) 215 ret float %x 216} 217 218; CHECK-LABEL: min_double 219define double @min_double(double %a, double %b) { 220 ; CHECK: min.f64 221 %x = call double @llvm.minnum.f64(double %a, double %b) 222 ret double %x 223} 224 225; ---- max ---- 226 227; CHECK-LABEL: max_imm1 228define float @max_imm1(float %a) { 229 ; CHECK: max.f32 230 %x = call float @llvm.maxnum.f32(float %a, float 0.0) 231 ret float %x 232} 233 234; CHECK-LABEL: max_imm2 235define float @max_imm2(float %a) { 236 ; CHECK: max.f32 237 %x = call float @llvm.maxnum.f32(float 0.0, float %a) 238 ret float %x 239} 240 241; CHECK-LABEL: max_float 242define float @max_float(float %a, float %b) { 243 ; CHECK: max.f32 244 %x = call float @llvm.maxnum.f32(float %a, float %b) 245 ret float %x 246} 247 248; CHECK-LABEL: max_float_ftz 249define float @max_float_ftz(float %a, float %b) #1 { 250 ; CHECK: max.ftz.f32 251 %x = call float @llvm.maxnum.f32(float %a, float %b) 252 ret float %x 253} 254 255; CHECK-LABEL: max_double 256define double @max_double(double %a, double %b) { 257 ; CHECK: max.f64 258 %x = call double @llvm.maxnum.f64(double %a, double %b) 259 ret double %x 260} 261 262; ---- fma ---- 263 264; CHECK-LABEL: @fma_float 265define float @fma_float(float %a, float %b, float %c) { 266 ; CHECK: fma.rn.f32 267 %x = call float @llvm.fma.f32(float %a, float %b, float %c) 268 ret float %x 269} 270 271; CHECK-LABEL: @fma_float_ftz 272define float @fma_float_ftz(float %a, float %b, float %c) #1 { 273 ; CHECK: fma.rn.ftz.f32 274 %x = call float @llvm.fma.f32(float %a, float %b, float %c) 275 ret float %x 276} 277 278; CHECK-LABEL: @fma_double 279define double @fma_double(double %a, double %b, double %c) { 280 ; CHECK: fma.rn.f64 281 %x = call double @llvm.fma.f64(double %a, double %b, double %c) 282 ret double %x 283} 284 285attributes #0 = { nounwind readnone } 286attributes #1 = { "nvptx-f32ftz" = "true" } 287