1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float) nounwind readnone 5*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) nounwind readnone 6*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) nounwind readnone 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() nounwind readnone 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}fma_f32: 11*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 {{v[0-9]+, v[0-9]+, v[0-9]+, v[0-9]+}} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]\.[XYZW]]], {{T[0-9]\.[XYZW]}}, 14*9880d681SAndroid Build Coastguard Worker; EG: FMA {{\*? *}}[[RES]] 15*9880d681SAndroid Build Coastguard Workerdefine void @fma_f32(float addrspace(1)* %out, float addrspace(1)* %in1, 16*9880d681SAndroid Build Coastguard Worker float addrspace(1)* %in2, float addrspace(1)* %in3) { 17*9880d681SAndroid Build Coastguard Worker %r0 = load float, float addrspace(1)* %in1 18*9880d681SAndroid Build Coastguard Worker %r1 = load float, float addrspace(1)* %in2 19*9880d681SAndroid Build Coastguard Worker %r2 = load float, float addrspace(1)* %in3 20*9880d681SAndroid Build Coastguard Worker %r3 = tail call float @llvm.fma.f32(float %r0, float %r1, float %r2) 21*9880d681SAndroid Build Coastguard Worker store float %r3, float addrspace(1)* %out 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}fma_v2f32: 26*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 27*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]]].[[CHLO:[XYZW]]][[CHHI:[XYZW]]], {{T[0-9]\.[XYZW]}}, 30*9880d681SAndroid Build Coastguard Worker; EG-DAG: FMA {{\*? *}}[[RES]].[[CHLO]] 31*9880d681SAndroid Build Coastguard Worker; EG-DAG: FMA {{\*? *}}[[RES]].[[CHHI]] 32*9880d681SAndroid Build Coastguard Workerdefine void @fma_v2f32(<2 x float> addrspace(1)* %out, <2 x float> addrspace(1)* %in1, 33*9880d681SAndroid Build Coastguard Worker <2 x float> addrspace(1)* %in2, <2 x float> addrspace(1)* %in3) { 34*9880d681SAndroid Build Coastguard Worker %r0 = load <2 x float>, <2 x float> addrspace(1)* %in1 35*9880d681SAndroid Build Coastguard Worker %r1 = load <2 x float>, <2 x float> addrspace(1)* %in2 36*9880d681SAndroid Build Coastguard Worker %r2 = load <2 x float>, <2 x float> addrspace(1)* %in3 37*9880d681SAndroid Build Coastguard Worker %r3 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %r0, <2 x float> %r1, <2 x float> %r2) 38*9880d681SAndroid Build Coastguard Worker store <2 x float> %r3, <2 x float> addrspace(1)* %out 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}fma_v4f32: 43*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 44*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 45*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 46*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]]].{{[XYZW][XYZW][XYZW][XYZW]}}, {{T[0-9]\.[XYZW]}}, 49*9880d681SAndroid Build Coastguard Worker; EG-DAG: FMA {{\*? *}}[[RES]].X 50*9880d681SAndroid Build Coastguard Worker; EG-DAG: FMA {{\*? *}}[[RES]].Y 51*9880d681SAndroid Build Coastguard Worker; EG-DAG: FMA {{\*? *}}[[RES]].Z 52*9880d681SAndroid Build Coastguard Worker; EG-DAG: FMA {{\*? *}}[[RES]].W 53*9880d681SAndroid Build Coastguard Workerdefine void @fma_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in1, 54*9880d681SAndroid Build Coastguard Worker <4 x float> addrspace(1)* %in2, <4 x float> addrspace(1)* %in3) { 55*9880d681SAndroid Build Coastguard Worker %r0 = load <4 x float>, <4 x float> addrspace(1)* %in1 56*9880d681SAndroid Build Coastguard Worker %r1 = load <4 x float>, <4 x float> addrspace(1)* %in2 57*9880d681SAndroid Build Coastguard Worker %r2 = load <4 x float>, <4 x float> addrspace(1)* %in3 58*9880d681SAndroid Build Coastguard Worker %r3 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %r0, <4 x float> %r1, <4 x float> %r2) 59*9880d681SAndroid Build Coastguard Worker store <4 x float> %r3, <4 x 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: @fma_commute_mul_inline_imm_f32 64*9880d681SAndroid Build Coastguard Worker; SI: v_fma_f32 {{v[0-9]+}}, {{v[0-9]+}}, 2.0, {{v[0-9]+}} 65*9880d681SAndroid Build Coastguard Workerdefine void @fma_commute_mul_inline_imm_f32(float addrspace(1)* noalias %out, float addrspace(1)* noalias %in.a, float addrspace(1)* noalias %in.b) nounwind { 66*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.r600.read.tidig.x() nounwind readnone 67*9880d681SAndroid Build Coastguard Worker %in.a.gep = getelementptr float, float addrspace(1)* %in.a, i32 %tid 68*9880d681SAndroid Build Coastguard Worker %in.b.gep = getelementptr float, float addrspace(1)* %in.b, i32 %tid 69*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in.a.gep, align 4 72*9880d681SAndroid Build Coastguard Worker %b = load float, float addrspace(1)* %in.b.gep, align 4 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker %fma = call float @llvm.fma.f32(float %a, float 2.0, float %b) 75*9880d681SAndroid Build Coastguard Worker store float %fma, float addrspace(1)* %out.gep, align 4 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @fma_commute_mul_s_f32 80*9880d681SAndroid Build Coastguard Workerdefine void @fma_commute_mul_s_f32(float addrspace(1)* noalias %out, float addrspace(1)* noalias %in.a, float addrspace(1)* noalias %in.b, float %b) nounwind { 81*9880d681SAndroid Build Coastguard Worker %tid = tail call i32 @llvm.r600.read.tidig.x() nounwind readnone 82*9880d681SAndroid Build Coastguard Worker %in.a.gep = getelementptr float, float addrspace(1)* %in.a, i32 %tid 83*9880d681SAndroid Build Coastguard Worker %in.b.gep = getelementptr float, float addrspace(1)* %in.b, i32 %tid 84*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr float, float addrspace(1)* %out, i32 %tid 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %a = load float, float addrspace(1)* %in.a.gep, align 4 87*9880d681SAndroid Build Coastguard Worker %c = load float, float addrspace(1)* %in.b.gep, align 4 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker %fma = call float @llvm.fma.f32(float %a, float %b, float %c) 90*9880d681SAndroid Build Coastguard Worker store float %fma, float addrspace(1)* %out.gep, align 4 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93