367 lines · plain
1; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_80 -mattr=+ptx70 | FileCheck %s2; RUN: %if ptxas-sm_80 && ptxas-isa-7.0 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_80 -mattr=+ptx70 | %ptxas-verify -arch=sm_80 %}3 4declare bfloat @llvm.nvvm.abs.bf16(bfloat)5declare <2 x bfloat> @llvm.nvvm.abs.bf16x2(<2 x bfloat>)6declare bfloat @llvm.nvvm.neg.bf16(bfloat)7declare <2 x bfloat> @llvm.nvvm.neg.bf16x2(<2 x bfloat>)8 9declare float @llvm.nvvm.fmin.nan.f(float, float)10declare float @llvm.nvvm.fmin.ftz.nan.f(float, float)11declare half @llvm.nvvm.fmin.f16(half, half)12declare half @llvm.nvvm.fmin.ftz.f16(half, half)13declare half @llvm.nvvm.fmin.nan.f16(half, half)14declare half @llvm.nvvm.fmin.ftz.nan.f16(half, half)15declare <2 x half> @llvm.nvvm.fmin.f16x2(<2 x half>, <2 x half>)16declare <2 x half> @llvm.nvvm.fmin.ftz.f16x2(<2 x half>, <2 x half>)17declare <2 x half> @llvm.nvvm.fmin.nan.f16x2(<2 x half>, <2 x half>)18declare <2 x half> @llvm.nvvm.fmin.ftz.nan.f16x2(<2 x half>, <2 x half>)19declare bfloat @llvm.nvvm.fmin.bf16(bfloat, bfloat)20declare bfloat @llvm.nvvm.fmin.nan.bf16(bfloat, bfloat)21declare <2 x bfloat> @llvm.nvvm.fmin.bf16x2(<2 x bfloat>, <2 x bfloat>)22declare <2 x bfloat> @llvm.nvvm.fmin.nan.bf16x2(<2 x bfloat>, <2 x bfloat>)23 24declare float @llvm.nvvm.fmax.nan.f(float, float)25declare float @llvm.nvvm.fmax.ftz.nan.f(float, float)26declare half @llvm.nvvm.fmax.f16(half, half)27declare half @llvm.nvvm.fmax.ftz.f16(half, half)28declare half @llvm.nvvm.fmax.nan.f16(half, half)29declare half @llvm.nvvm.fmax.ftz.nan.f16(half, half)30declare <2 x half> @llvm.nvvm.fmax.f16x2(<2 x half>, <2 x half>)31declare <2 x half> @llvm.nvvm.fmax.ftz.f16x2(<2 x half>, <2 x half>)32declare <2 x half> @llvm.nvvm.fmax.nan.f16x2(<2 x half>, <2 x half>)33declare <2 x half> @llvm.nvvm.fmax.ftz.nan.f16x2(<2 x half>, <2 x half>)34declare bfloat @llvm.nvvm.fmax.bf16(bfloat, bfloat)35declare bfloat @llvm.nvvm.fmax.nan.bf16(bfloat, bfloat)36declare <2 x bfloat> @llvm.nvvm.fmax.bf16x2(<2 x bfloat>, <2 x bfloat>)37declare <2 x bfloat> @llvm.nvvm.fmax.nan.bf16x2(<2 x bfloat>, <2 x bfloat>)38 39declare half @llvm.nvvm.fma.rn.relu.f16(half, half, half)40declare half @llvm.nvvm.fma.rn.ftz.relu.f16(half, half, half)41declare <2 x half> @llvm.nvvm.fma.rn.relu.f16x2(<2 x half>, <2 x half>, <2 x half>)42declare <2 x half> @llvm.nvvm.fma.rn.ftz.relu.f16x2(<2 x half>, <2 x half>, <2 x half>)43declare bfloat @llvm.nvvm.fma.rn.bf16(bfloat, bfloat, bfloat)44declare bfloat @llvm.nvvm.fma.rn.relu.bf16(bfloat, bfloat, bfloat)45declare <2 x bfloat> @llvm.nvvm.fma.rn.bf16x2(<2 x bfloat>, <2 x bfloat>, <2 x bfloat>)46declare <2 x bfloat> @llvm.nvvm.fma.rn.relu.bf16x2(<2 x bfloat>, <2 x bfloat>, <2 x bfloat>)47 48; CHECK-LABEL: abs_bf1649define bfloat @abs_bf16(bfloat %0) {50 ; CHECK-NOT: call51 ; CHECK: abs.bf1652 %res = call bfloat @llvm.nvvm.abs.bf16(bfloat %0);53 ret bfloat %res54}55 56; CHECK-LABEL: abs_bf16x257define <2 x bfloat> @abs_bf16x2(<2 x bfloat> %0) {58 ; CHECK-NOT: call59 ; CHECK: abs.bf16x260 %res = call <2 x bfloat> @llvm.nvvm.abs.bf16x2(<2 x bfloat> %0);61 ret <2 x bfloat> %res62}63 64; CHECK-LABEL: neg_bf1665define bfloat @neg_bf16(bfloat %0) {66 ; CHECK-NOT: call67 ; CHECK: neg.bf1668 %res = call bfloat @llvm.nvvm.neg.bf16(bfloat %0);69 ret bfloat %res70}71 72; CHECK-LABEL: neg_bf16x273define <2 x bfloat> @neg_bf16x2(<2 x bfloat> %0) {74 ; CHECK-NOT: call75 ; CHECK: neg.bf16x276 %res = call <2 x bfloat> @llvm.nvvm.neg.bf16x2(<2 x bfloat> %0);77 ret <2 x bfloat> %res78}79 80; CHECK-LABEL: fmin_nan_f81define float @fmin_nan_f(float %0, float %1) {82 ; CHECK-NOT: call83 ; CHECK: min.NaN.f3284 %res = call float @llvm.nvvm.fmin.nan.f(float %0, float %1);85 ret float %res86}87 88; CHECK-LABEL: fmin_ftz_nan_f89define float @fmin_ftz_nan_f(float %0, float %1) {90 ; CHECK-NOT: call91 ; CHECK: min.ftz.NaN.f3292 %res = call float @llvm.nvvm.fmin.ftz.nan.f(float %0, float %1);93 ret float %res94}95 96; CHECK-LABEL: fmin_f1697define half @fmin_f16(half %0, half %1) {98 ; CHECK-NOT: call99 ; CHECK: min.f16100 %res = call half @llvm.nvvm.fmin.f16(half %0, half %1)101 ret half %res102}103 104; CHECK-LABEL: fmin_ftz_f16105define half @fmin_ftz_f16(half %0, half %1) {106 ; CHECK-NOT: call107 ; CHECK: min.ftz.f16108 %res = call half @llvm.nvvm.fmin.ftz.f16(half %0, half %1)109 ret half %res110}111 112; CHECK-LABEL: fmin_nan_f16113define half @fmin_nan_f16(half %0, half %1) {114 ; CHECK-NOT: call115 ; CHECK: min.NaN.f16116 %res = call half @llvm.nvvm.fmin.nan.f16(half %0, half %1)117 ret half %res118}119 120; CHECK-LABEL: fmin_ftz_nan_f16121define half @fmin_ftz_nan_f16(half %0, half %1) {122 ; CHECK-NOT: call123 ; CHECK: min.ftz.NaN.f16124 %res = call half @llvm.nvvm.fmin.ftz.nan.f16(half %0, half %1)125 ret half %res126}127 128; CHECK-LABEL: fmin_f16x2129define <2 x half> @fmin_f16x2(<2 x half> %0, <2 x half> %1) {130 ; CHECK-NOT: call131 ; CHECK: min.f16x2132 %res = call <2 x half> @llvm.nvvm.fmin.f16x2(<2 x half> %0, <2 x half> %1)133 ret <2 x half> %res134}135 136; CHECK-LABEL: fmin_ftz_f16x2137define <2 x half> @fmin_ftz_f16x2(<2 x half> %0, <2 x half> %1) {138 ; CHECK-NOT: call139 ; CHECK: min.ftz.f16x2140 %res = call <2 x half> @llvm.nvvm.fmin.ftz.f16x2(<2 x half> %0, <2 x half> %1)141 ret <2 x half> %res142}143 144; CHECK-LABEL: fmin_nan_f16x2145define <2 x half> @fmin_nan_f16x2(<2 x half> %0, <2 x half> %1) {146 ; CHECK-NOT: call147 ; CHECK: min.NaN.f16x2148 %res = call <2 x half> @llvm.nvvm.fmin.nan.f16x2(<2 x half> %0, <2 x half> %1)149 ret <2 x half> %res150}151 152; CHECK-LABEL: fmin_ftz_nan_f16x2153define <2 x half> @fmin_ftz_nan_f16x2(<2 x half> %0, <2 x half> %1) {154 ; CHECK-NOT: call155 ; CHECK: min.ftz.NaN.f16x2156 %res = call <2 x half> @llvm.nvvm.fmin.ftz.nan.f16x2(<2 x half> %0, <2 x half> %1)157 ret <2 x half> %res158}159 160; CHECK-LABEL: fmin_bf16161define bfloat @fmin_bf16(bfloat %0, bfloat %1) {162 ; CHECK-NOT: call163 ; CHECK: min.bf16164 %res = call bfloat @llvm.nvvm.fmin.bf16(bfloat %0, bfloat %1)165 ret bfloat %res166}167 168; CHECK-LABEL: fmin_nan_bf16169define bfloat @fmin_nan_bf16(bfloat %0, bfloat %1) {170 ; CHECK-NOT: call171 ; CHECK: min.NaN.bf16172 %res = call bfloat @llvm.nvvm.fmin.nan.bf16(bfloat %0, bfloat %1)173 ret bfloat %res174}175 176; CHECK-LABEL: fmin_bf16x2177define <2 x bfloat> @fmin_bf16x2(<2 x bfloat> %0, <2 x bfloat> %1) {178 ; CHECK-NOT: call179 ; CHECK: min.bf16x2180 %res = call <2 x bfloat> @llvm.nvvm.fmin.bf16x2(<2 x bfloat> %0, <2 x bfloat> %1)181 ret <2 x bfloat> %res182}183 184; CHECK-LABEL: fmin_nan_bf16x2185define <2 x bfloat> @fmin_nan_bf16x2(<2 x bfloat> %0, <2 x bfloat> %1) {186 ; CHECK-NOT: call187 ; CHECK: min.NaN.bf16x2188 %res = call <2 x bfloat> @llvm.nvvm.fmin.nan.bf16x2(<2 x bfloat> %0, <2 x bfloat> %1)189 ret <2 x bfloat> %res190}191 192; CHECK-LABEL: fmax_nan_f193define float @fmax_nan_f(float %0, float %1) {194 ; CHECK-NOT: call195 ; CHECK: max.NaN.f32196 %res = call float @llvm.nvvm.fmax.nan.f(float %0, float %1);197 ret float %res198}199 200; CHECK-LABEL: fmax_ftz_nan_f201define float @fmax_ftz_nan_f(float %0, float %1) {202 ; CHECK-NOT: call203 ; CHECK: max.ftz.NaN.f32204 %res = call float @llvm.nvvm.fmax.ftz.nan.f(float %0, float %1);205 ret float %res206}207 208; CHECK-LABEL: fmax_f16209define half @fmax_f16(half %0, half %1) {210 ; CHECK-NOT: call211 ; CHECK: max.f16212 %res = call half @llvm.nvvm.fmax.f16(half %0, half %1)213 ret half %res214}215 216; CHECK-LABEL: fmax_ftz_f16217define half @fmax_ftz_f16(half %0, half %1) {218 ; CHECK-NOT: call219 ; CHECK: max.ftz.f16220 %res = call half @llvm.nvvm.fmax.ftz.f16(half %0, half %1)221 ret half %res222}223 224; CHECK-LABEL: fmax_nan_f16225define half @fmax_nan_f16(half %0, half %1) {226 ; CHECK-NOT: call227 ; CHECK: max.NaN.f16228 %res = call half @llvm.nvvm.fmax.nan.f16(half %0, half %1)229 ret half %res230}231 232; CHECK-LABEL: fmax_ftz_nan_f16233define half @fmax_ftz_nan_f16(half %0, half %1) {234 ; CHECK-NOT: call235 ; CHECK: max.ftz.NaN.f16236 %res = call half @llvm.nvvm.fmax.ftz.nan.f16(half %0, half %1)237 ret half %res238}239 240; CHECK-LABEL: fmax_f16x2241define <2 x half> @fmax_f16x2(<2 x half> %0, <2 x half> %1) {242 ; CHECK-NOT: call243 ; CHECK: max.f16x2244 %res = call <2 x half> @llvm.nvvm.fmax.f16x2(<2 x half> %0, <2 x half> %1)245 ret <2 x half> %res246}247 248; CHECK-LABEL: fmax_ftz_f16x2249define <2 x half> @fmax_ftz_f16x2(<2 x half> %0, <2 x half> %1) {250 ; CHECK-NOT: call251 ; CHECK: max.ftz.f16x2252 %res = call <2 x half> @llvm.nvvm.fmax.ftz.f16x2(<2 x half> %0, <2 x half> %1)253 ret <2 x half> %res254}255 256; CHECK-LABEL: fmax_nan_f16x2257define <2 x half> @fmax_nan_f16x2(<2 x half> %0, <2 x half> %1) {258 ; CHECK-NOT: call259 ; CHECK: max.NaN.f16x2260 %res = call <2 x half> @llvm.nvvm.fmax.nan.f16x2(<2 x half> %0, <2 x half> %1)261 ret <2 x half> %res262}263 264; CHECK-LABEL: fmax_ftz_nan_f16x2265define <2 x half> @fmax_ftz_nan_f16x2(<2 x half> %0, <2 x half> %1) {266 ; CHECK-NOT: call267 ; CHECK: max.ftz.NaN.f16x2268 %res = call <2 x half> @llvm.nvvm.fmax.ftz.nan.f16x2(<2 x half> %0, <2 x half> %1)269 ret <2 x half> %res270}271 272; CHECK-LABEL: fmax_bf16273define bfloat @fmax_bf16(bfloat %0, bfloat %1) {274 ; CHECK-NOT: call275 ; CHECK: max.bf16276 %res = call bfloat @llvm.nvvm.fmax.bf16(bfloat %0, bfloat %1)277 ret bfloat %res278}279 280; CHECK-LABEL: fmax_nan_bf16281define bfloat @fmax_nan_bf16(bfloat %0, bfloat %1) {282 ; CHECK-NOT: call283 ; CHECK: max.NaN.bf16284 %res = call bfloat @llvm.nvvm.fmax.nan.bf16(bfloat %0, bfloat %1)285 ret bfloat %res286}287 288; CHECK-LABEL: fmax_bf16x2289define <2 x bfloat> @fmax_bf16x2(<2 x bfloat> %0, <2 x bfloat> %1) {290 ; CHECK-NOT: call291 ; CHECK: max.bf16x2292 %res = call <2 x bfloat> @llvm.nvvm.fmax.bf16x2(<2 x bfloat> %0, <2 x bfloat> %1)293 ret <2 x bfloat> %res294}295 296; CHECK-LABEL: fmax_nan_bf16x2297define <2 x bfloat> @fmax_nan_bf16x2(<2 x bfloat> %0, <2 x bfloat> %1) {298 ; CHECK-NOT: call299 ; CHECK: max.NaN.bf16x2300 %res = call <2 x bfloat> @llvm.nvvm.fmax.nan.bf16x2(<2 x bfloat> %0, <2 x bfloat> %1)301 ret <2 x bfloat> %res302}303 304; CHECK-LABEL: fma_rn_relu_f16305define half @fma_rn_relu_f16(half %0, half %1, half %2) {306 ; CHECK-NOT: call307 ; CHECK: fma.rn.relu.f16308 %res = call half @llvm.nvvm.fma.rn.relu.f16(half %0, half %1, half %2)309 ret half %res310}311 312; CHECK-LABEL: fma_rn_ftz_relu_f16313define half @fma_rn_ftz_relu_f16(half %0, half %1, half %2) {314 ; CHECK-NOT: call315 ; CHECK: fma.rn.ftz.relu.f16316 %res = call half @llvm.nvvm.fma.rn.ftz.relu.f16(half %0, half %1, half %2)317 ret half %res318}319 320; CHECK-LABEL: fma_rn_relu_f16x2321define <2 x half> @fma_rn_relu_f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2) {322 ; CHECK-NOT: call323 ; CHECK: fma.rn.relu.f16x2324 %res = call <2 x half> @llvm.nvvm.fma.rn.relu.f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2)325 ret <2 x half> %res326}327 328; CHECK-LABEL: fma_rn_ftz_relu_f16x2329define <2 x half> @fma_rn_ftz_relu_f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2) {330 ; CHECK-NOT: call331 ; CHECK: fma.rn.ftz.relu.f16x2332 %res = call <2 x half> @llvm.nvvm.fma.rn.ftz.relu.f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2)333 ret <2 x half> %res334}335 336; CHECK-LABEL: fma_rn_bf16337define bfloat @fma_rn_bf16(bfloat %0, bfloat %1, bfloat %2) {338 ; CHECK-NOT: call339 ; CHECK: fma.rn.bf16340 %res = call bfloat @llvm.nvvm.fma.rn.bf16(bfloat %0, bfloat %1, bfloat %2)341 ret bfloat %res342}343 344; CHECK-LABEL: fma_rn_relu_bf16345define bfloat @fma_rn_relu_bf16(bfloat %0, bfloat %1, bfloat %2) {346 ; CHECK-NOT: call347 ; CHECK: fma.rn.relu.bf16348 %res = call bfloat @llvm.nvvm.fma.rn.relu.bf16(bfloat %0, bfloat %1, bfloat %2)349 ret bfloat %res350}351 352; CHECK-LABEL: fma_rn_bf16x2353define <2 x bfloat> @fma_rn_bf16x2(<2 x bfloat> %0, <2 x bfloat> %1, <2 x bfloat> %2) {354 ; CHECK-NOT: call355 ; CHECK: fma.rn.bf16x2356 %res = call <2 x bfloat> @llvm.nvvm.fma.rn.bf16x2(<2 x bfloat> %0, <2 x bfloat> %1, <2 x bfloat> %2)357 ret <2 x bfloat> %res358}359 360; CHECK-LABEL: fma_rn_relu_bf16x2361define <2 x bfloat> @fma_rn_relu_bf16x2(<2 x bfloat> %0, <2 x bfloat> %1, <2 x bfloat> %2) {362 ; CHECK-NOT: call363 ; CHECK: fma.rn.relu.bf16x2364 %res = call <2 x bfloat> @llvm.nvvm.fma.rn.relu.bf16x2(<2 x bfloat> %0, <2 x bfloat> %1, <2 x bfloat> %2)365 ret <2 x bfloat> %res366}367