1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=R600 -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}fmul_f32: 6*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}{{T[0-9]+\.[XYZW]}}, KC0[2].Z, KC0[2].W 9*9880d681SAndroid Build Coastguard Workerdefine void @fmul_f32(float addrspace(1)* %out, float %a, float %b) { 10*9880d681SAndroid Build Coastguard Workerentry: 11*9880d681SAndroid Build Coastguard Worker %0 = fmul float %a, %b 12*9880d681SAndroid Build Coastguard Worker store float %0, float addrspace(1)* %out 13*9880d681SAndroid Build Coastguard Worker ret void 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.R600.load.input(i32) readnone 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.AMDGPU.store.output(float, i32) 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}fmul_v2f32: 21*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 22*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}} 25*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}} 26*9880d681SAndroid Build Coastguard Workerdefine void @fmul_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %0 = fmul <2 x float> %a, %b 29*9880d681SAndroid Build Coastguard Worker store <2 x float> %0, <2 x float> addrspace(1)* %out 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}fmul_v4f32: 34*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 35*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 36*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 37*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 40*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 41*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 42*9880d681SAndroid Build Coastguard Worker; R600: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}} 43*9880d681SAndroid Build Coastguard Workerdefine void @fmul_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) { 44*9880d681SAndroid Build Coastguard Worker %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1 45*9880d681SAndroid Build Coastguard Worker %a = load <4 x float>, <4 x float> addrspace(1) * %in 46*9880d681SAndroid Build Coastguard Worker %b = load <4 x float>, <4 x float> addrspace(1) * %b_ptr 47*9880d681SAndroid Build Coastguard Worker %result = fmul <4 x float> %a, %b 48*9880d681SAndroid Build Coastguard Worker store <4 x float> %result, <4 x float> addrspace(1)* %out 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_mul_2_k: 53*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 54*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mul_f32 55*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 56*9880d681SAndroid Build Coastguard Workerdefine void @test_mul_2_k(float addrspace(1)* %out, float %x) #0 { 57*9880d681SAndroid Build Coastguard Worker %y = fmul float %x, 2.0 58*9880d681SAndroid Build Coastguard Worker %z = fmul float %y, 3.0 59*9880d681SAndroid Build Coastguard Worker store float %z, float addrspace(1)* %out 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_mul_2_k_inv: 64*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 65*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mul_f32 66*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mad_f32 67*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 68*9880d681SAndroid Build Coastguard Workerdefine void @test_mul_2_k_inv(float addrspace(1)* %out, float %x) #0 { 69*9880d681SAndroid Build Coastguard Worker %y = fmul float %x, 3.0 70*9880d681SAndroid Build Coastguard Worker %z = fmul float %y, 2.0 71*9880d681SAndroid Build Coastguard Worker store float %z, float addrspace(1)* %out 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; There should be three multiplies here; %a should be used twice (once 76*9880d681SAndroid Build Coastguard Worker; negated), not duplicated into mul x, 5.0 and mul x, -5.0. 77*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_mul_twouse: 78*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 79*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 80*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32 81*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_mul_f32 82*9880d681SAndroid Build Coastguard Workerdefine void @test_mul_twouse(float addrspace(1)* %out, float %x, float %y) #0 { 83*9880d681SAndroid Build Coastguard Worker %a = fmul float %x, 5.0 84*9880d681SAndroid Build Coastguard Worker %b = fsub float -0.0, %a 85*9880d681SAndroid Build Coastguard Worker %c = fmul float %b, %y 86*9880d681SAndroid Build Coastguard Worker %d = fmul float %c, %a 87*9880d681SAndroid Build Coastguard Worker store float %d, float addrspace(1)* %out 88*9880d681SAndroid Build Coastguard Worker ret void 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 92