1 ; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s 2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s 3 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=+fp32-denormals -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s 4 ; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=+fp32-denormals -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s 5 6 declare float @llvm.amdgcn.fmad.ftz.f32(float %a, float %b, float %c) 7 8 ; GCN-LABEL: {{^}}mad_f32: 9 ; GCN: v_ma{{[dc]}}_f32 10 define amdgpu_kernel void @mad_f32( 11 float addrspace(1)* %r, 12 float addrspace(1)* %a, 13 float addrspace(1)* %b, 14 float addrspace(1)* %c) { 15 %a.val = load float, float addrspace(1)* %a 16 %b.val = load float, float addrspace(1)* %b 17 %c.val = load float, float addrspace(1)* %c 18 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float %a.val, float %b.val, float %c.val) 19 store float %r.val, float addrspace(1)* %r 20 ret void 21 } 22 23 ; GCN-LABEL: {{^}}mad_f32_imm_a: 24 ; GCN: v_mov_b32_e32 [[KA:v[0-9]+]], 0x41000000 25 ; GCN: v_ma{{[dc]}}_f32 {{v[0-9]+}}, [[KA]], 26 define amdgpu_kernel void @mad_f32_imm_a( 27 float addrspace(1)* %r, 28 float addrspace(1)* %b, 29 float addrspace(1)* %c) { 30 %b.val = load float, float addrspace(1)* %b 31 %c.val = load float, float addrspace(1)* %c 32 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float 8.0, float %b.val, float %c.val) 33 store float %r.val, float addrspace(1)* %r 34 ret void 35 } 36 37 ; GCN-LABEL: {{^}}mad_f32_imm_b: 38 ; GCN: v_mov_b32_e32 [[KB:v[0-9]+]], 0x41000000 39 ; GCN: v_ma{{[dc]}}_f32 {{v[0-9]+}}, {{[vs][0-9]+}}, [[KB]], 40 define amdgpu_kernel void @mad_f32_imm_b( 41 float addrspace(1)* %r, 42 float addrspace(1)* %a, 43 float addrspace(1)* %c) { 44 %a.val = load float, float addrspace(1)* %a 45 %c.val = load float, float addrspace(1)* %c 46 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float %a.val, float 8.0, float %c.val) 47 store float %r.val, float addrspace(1)* %r 48 ret void 49 } 50 51 ; GCN-LABEL: {{^}}mad_f32_imm_c: 52 ; GCN: v_mov_b32_e32 [[KC:v[0-9]+]], 0x41000000 53 ; GCN: v_ma{{[dc]}}_f32 {{v[0-9]+}}, {{[vs][0-9]+}}, {{v[0-9]+}}, [[KC]]{{$}} 54 define amdgpu_kernel void @mad_f32_imm_c( 55 float addrspace(1)* %r, 56 float addrspace(1)* %a, 57 float addrspace(1)* %b) { 58 %a.val = load float, float addrspace(1)* %a 59 %b.val = load float, float addrspace(1)* %b 60 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float %a.val, float %b.val, float 8.0) 61 store float %r.val, float addrspace(1)* %r 62 ret void 63 } 64 65 ; GCN-LABEL: {{^}}mad_f32_neg_b: 66 ; GCN: v_mad_f32 v{{[0-9]+}}, s{{[0-9]+}}, -v{{[0-9]+}}, v{{[0-9]+}} 67 define amdgpu_kernel void @mad_f32_neg_b( 68 float addrspace(1)* %r, 69 float addrspace(1)* %a, 70 float addrspace(1)* %b, 71 float addrspace(1)* %c) { 72 %a.val = load float, float addrspace(1)* %a 73 %b.val = load float, float addrspace(1)* %b 74 %c.val = load float, float addrspace(1)* %c 75 %neg.b = fsub float -0.0, %b.val 76 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float %a.val, float %neg.b, float %c.val) 77 store float %r.val, float addrspace(1)* %r 78 ret void 79 } 80 81 ; GCN-LABEL: {{^}}mad_f32_abs_b: 82 ; GCN: v_mad_f32 v{{[0-9]+}}, s{{[0-9]+}}, |v{{[0-9]+}}|, v{{[0-9]+}} 83 define amdgpu_kernel void @mad_f32_abs_b( 84 float addrspace(1)* %r, 85 float addrspace(1)* %a, 86 float addrspace(1)* %b, 87 float addrspace(1)* %c) { 88 %a.val = load float, float addrspace(1)* %a 89 %b.val = load float, float addrspace(1)* %b 90 %c.val = load float, float addrspace(1)* %c 91 %abs.b = call float @llvm.fabs.f32(float %b.val) 92 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float %a.val, float %abs.b, float %c.val) 93 store float %r.val, float addrspace(1)* %r 94 ret void 95 } 96 97 ; GCN-LABEL: {{^}}mad_f32_neg_abs_b: 98 ; GCN: v_mad_f32 v{{[0-9]+}}, s{{[0-9]+}}, -|v{{[0-9]+}}|, v{{[0-9]+}} 99 define amdgpu_kernel void @mad_f32_neg_abs_b( 100 float addrspace(1)* %r, 101 float addrspace(1)* %a, 102 float addrspace(1)* %b, 103 float addrspace(1)* %c) { 104 %a.val = load float, float addrspace(1)* %a 105 %b.val = load float, float addrspace(1)* %b 106 %c.val = load float, float addrspace(1)* %c 107 %abs.b = call float @llvm.fabs.f32(float %b.val) 108 %neg.abs.b = fsub float -0.0, %abs.b 109 %r.val = call float @llvm.amdgcn.fmad.ftz.f32(float %a.val, float %neg.abs.b, float %c.val) 110 store float %r.val, float addrspace(1)* %r 111 ret void 112 } 113 114 declare float @llvm.fabs.f32(float) 115