blob: d715c99a7dce14a20a0957587176694d1341f6d0 [file] [log] [blame]
Matt Arsenaultc6f8fdb2014-06-26 01:28:05 +00001; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Jan Veselyb535c902014-10-17 14:45:27 +00002; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
Niels Ole Salscheider6509ac62013-08-10 10:38:47 +00003
Matt Arsenaultc6f8fdb2014-06-26 01:28:05 +00004declare float @llvm.fma.f32(float, float, float) nounwind readnone
5declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) nounwind readnone
6declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) nounwind readnone
Niels Ole Salscheider6509ac62013-08-10 10:38:47 +00007
Tom Stellard79243d92014-10-01 17:15:17 +00008; FUNC-LABEL: {{^}}fma_f32:
Tom Stellard326d6ec2014-11-05 14:50:53 +00009; SI: v_fma_f32 {{v[0-9]+, v[0-9]+, v[0-9]+, v[0-9]+}}
Jan Veselyb535c902014-10-17 14:45:27 +000010
11; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]\.[XYZW]]], {{T[0-9]\.[XYZW]}},
12; EG: FMA {{\*? *}}[[RES]]
Niels Ole Salscheider6509ac62013-08-10 10:38:47 +000013define void @fma_f32(float addrspace(1)* %out, float addrspace(1)* %in1,
14 float addrspace(1)* %in2, float addrspace(1)* %in3) {
15 %r0 = load float addrspace(1)* %in1
16 %r1 = load float addrspace(1)* %in2
17 %r2 = load float addrspace(1)* %in3
18 %r3 = tail call float @llvm.fma.f32(float %r0, float %r1, float %r2)
19 store float %r3, float addrspace(1)* %out
20 ret void
21}
22
Tom Stellard79243d92014-10-01 17:15:17 +000023; FUNC-LABEL: {{^}}fma_v2f32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000024; SI: v_fma_f32
25; SI: v_fma_f32
Jan Veselyb535c902014-10-17 14:45:27 +000026
27; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]]].[[CHLO:[XYZW]]][[CHHI:[XYZW]]], {{T[0-9]\.[XYZW]}},
28; EG-DAG: FMA {{\*? *}}[[RES]].[[CHLO]]
29; EG-DAG: FMA {{\*? *}}[[RES]].[[CHHI]]
Matt Arsenaultc6f8fdb2014-06-26 01:28:05 +000030define void @fma_v2f32(<2 x float> addrspace(1)* %out, <2 x float> addrspace(1)* %in1,
31 <2 x float> addrspace(1)* %in2, <2 x float> addrspace(1)* %in3) {
32 %r0 = load <2 x float> addrspace(1)* %in1
33 %r1 = load <2 x float> addrspace(1)* %in2
34 %r2 = load <2 x float> addrspace(1)* %in3
35 %r3 = tail call <2 x float> @llvm.fma.v2f32(<2 x float> %r0, <2 x float> %r1, <2 x float> %r2)
36 store <2 x float> %r3, <2 x float> addrspace(1)* %out
37 ret void
38}
Niels Ole Salscheider6509ac62013-08-10 10:38:47 +000039
Tom Stellard79243d92014-10-01 17:15:17 +000040; FUNC-LABEL: {{^}}fma_v4f32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000041; SI: v_fma_f32
42; SI: v_fma_f32
43; SI: v_fma_f32
44; SI: v_fma_f32
Jan Veselyb535c902014-10-17 14:45:27 +000045
46; EG: MEM_RAT_{{.*}} STORE_{{.*}} [[RES:T[0-9]]].{{[XYZW][XYZW][XYZW][XYZW]}}, {{T[0-9]\.[XYZW]}},
47; EG-DAG: FMA {{\*? *}}[[RES]].X
48; EG-DAG: FMA {{\*? *}}[[RES]].Y
49; EG-DAG: FMA {{\*? *}}[[RES]].Z
50; EG-DAG: FMA {{\*? *}}[[RES]].W
Matt Arsenaultc6f8fdb2014-06-26 01:28:05 +000051define void @fma_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in1,
52 <4 x float> addrspace(1)* %in2, <4 x float> addrspace(1)* %in3) {
53 %r0 = load <4 x float> addrspace(1)* %in1
54 %r1 = load <4 x float> addrspace(1)* %in2
55 %r2 = load <4 x float> addrspace(1)* %in3
56 %r3 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> %r0, <4 x float> %r1, <4 x float> %r2)
57 store <4 x float> %r3, <4 x float> addrspace(1)* %out
58 ret void
59}