annotate test/CodeGen/AMDGPU/fpext-free.ll @ 146:3fc4d5c3e21e

set tail call flag for code segment in CGCAll
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:23:36 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
1 ; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-fp32-denormals -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,GFX9,GFX9-F32FLUSH %s
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
2 ; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=+fp32-denormals -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,GFX9,GFX9-F32DENORM %s
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
3 ; RUN: llc -march=amdgcn -mcpu=gfx803 -mattr=-fp32-denormals -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,VI,VI-F32FLUSH %s
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
4 ; RUN: llc -march=amdgcn -mcpu=gfx803 -mattr=+fp32-denormals -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX89,VI,VI-F32DENORM %s
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
5
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
6 ; fold (fadd (fpext (fmul x, y)), z) -> (fma (fpext x), (fpext y), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
7
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
8 ; GCN-LABEL: {{^}}fadd_fpext_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
9 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
10 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, v0, v1, v2 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
11 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
12
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
13 ; GFX9-F32DENORM-NEXT: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
14 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
15 ; GFX9-F32DENORM-NEXT: v_add_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
16 define float @fadd_fpext_fmul_f16_to_f32(half %x, half %y, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
17 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
18 %mul = fmul half %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
19 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
20 %add = fadd float %mul.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
21 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
22 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
23
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
24 ; f16->f64 is not free.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
25 ; GCN-LABEL: {{^}}fadd_fpext_fmul_f16_to_f64:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
26 ; GFX89: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
27 ; GFX89: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
28 ; GFX89: v_cvt_f64_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
29 ; GFX89: v_add_f64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
30 define double @fadd_fpext_fmul_f16_to_f64(half %x, half %y, double %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
31 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
32 %mul = fmul half %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
33 %mul.ext = fpext half %mul to double
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
34 %add = fadd double %mul.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
35 ret double %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
36 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
37
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
38 ; f32->f64 is not free.
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
39 ; GCN-LABEL: {{^}}fadd_fpext_fmul_f32_to_f64:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
40 ; GCN: v_mul_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
41 ; GCN: v_cvt_f64_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
42 ; GCN: v_add_f64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
43 define double @fadd_fpext_fmul_f32_to_f64(float %x, float %y, double %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
44 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
45 %mul = fmul float %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
46 %mul.ext = fpext float %mul to double
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
47 %add = fadd double %mul.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
48 ret double %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
49 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
50
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
51 ; fold (fadd x, (fpext (fmul y, z))) -> (fma (fpext y), (fpext z), x)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
52 ; GCN-LABEL: {{^}}fadd_fpext_fmul_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
53 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
54 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, v0, v1, v2 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
55 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
56
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
57 ; GFX9-F32DENORM-NEXT: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
58 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
59 ; GFX9-F32DENORM-NEXT: v_add_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
60 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
61 define float @fadd_fpext_fmul_f16_to_f32_commute(half %x, half %y, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
62 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
63 %mul = fmul half %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
64 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
65 %add = fadd float %z, %mul.ext
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
66 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
67 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
68
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
69 ; fold (fadd (fma x, y, (fpext (fmul u, v))), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
70 ; -> (fma x, y, (fma (fpext u), (fpext v), z))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
71
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
72 ; GCN-LABEL: {{^}}fadd_muladd_fpext_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
73 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
74 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v2, v2, v3, v4 op_sel_hi:[1,1,0]
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
75 ; GFX9-F32FLUSH-NEXT: v_mac_f32_e32 v2, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
76 ; GFX9-F32FLUSH-NEXT: v_mov_b32_e32 v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
77 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
78
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
79 ; GFX9-F32DENORM-NEXT: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
80 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
81 ; GFX9-F32DENORM-NEXT: v_fma_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
82 ; GFX9-F32DENORM-NEXT: v_add_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
83 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
84 define float @fadd_muladd_fpext_fmul_f16_to_f32(float %x, float %y, half %u, half %v, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
85 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
86 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
87 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
88 %fma = call float @llvm.fmuladd.f32(float %x, float %y, float %mul.ext)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
89 %add = fadd float %fma, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
90 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
91 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
92
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
93 ; fold (fadd x, (fma y, z, (fpext (fmul u, v)))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
94 ; -> (fma y, z, (fma (fpext u), (fpext v), x))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
95 ; GCN-LABEL: {{^}}fadd_muladd_fpext_fmul_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
96 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
97 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v2, v2, v3, v4 op_sel_hi:[1,1,0]
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
98 ; GFX9-F32FLUSH-NEXT: v_mac_f32_e32 v2, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
99 ; GFX9-F32FLUSH-NEXT: v_mov_b32_e32 v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
100 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
101
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
102 ; GFX9-F32DENORM-NEXT: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
103 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
104 ; GFX9-F32DENORM-NEXT: v_fma_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
105 ; GFX9-F32DENORM-NEXT: v_add_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
106 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
107 define float @fadd_muladd_fpext_fmul_f16_to_f32_commute(float %x, float %y, half %u, half %v, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
108 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
109 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
110 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
111 %fma = call float @llvm.fmuladd.f32(float %x, float %y, float %mul.ext)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
112 %add = fadd float %z, %fma
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
113 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
114 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
115
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
116 ; GCN-LABEL: {{^}}fadd_fmad_fpext_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
117 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
118 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v2, v2, v3, v4 op_sel_hi:[1,1,0]
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
119 ; GFX9-F32FLUSH-NEXT: v_mac_f32_e32 v2, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
120 ; GFX9-F32FLUSH-NEXT: v_mov_b32_e32 v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
121 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
122
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
123 ; GFX9-F32DENORM-NEXT: v_mul_f16_e32 v2, v2, v3
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
124 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32 v2, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
125 ; GFX9-F32DENORM-NEXT: v_fma_f32 v0, v0, v1, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
126 define float @fadd_fmad_fpext_fmul_f16_to_f32(float %x, float %y, half %u, half %v, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
127 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
128 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
129 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
130 %mul1 = fmul contract float %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
131 %fmad = fadd contract float %mul1, %mul.ext
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
132 %add = fadd float %fmad, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
133 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
134 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
135
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
136 ; fold (fadd (fma x, y, (fpext (fmul u, v))), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
137 ; -> (fma x, y, (fma (fpext u), (fpext v), z))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
138
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
139 ; GCN-LABEL: {{^}}fadd_fma_fpext_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
140 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
141 ; GFX89: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
142 ; GFX89: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
143 ; GFX89: v_fma_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
144 ; GFX89: v_add_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
145 define float @fadd_fma_fpext_fmul_f16_to_f32(float %x, float %y, half %u, half %v, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
146 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
147 %mul = fmul contract half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
148 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
149 %fma = call float @llvm.fma.f32(float %x, float %y, float %mul.ext)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
150 %add = fadd float %fma, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
151 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
152 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
153
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
154 ; GCN-LABEL: {{^}}fadd_fma_fpext_fmul_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
155 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
156 ; GFX89: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
157 ; GFX89: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
158 ; GFX89: v_fma_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
159 ; GFX89: v_add_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
160 define float @fadd_fma_fpext_fmul_f16_to_f32_commute(float %x, float %y, half %u, half %v, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
161 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
162 %mul = fmul contract half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
163 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
164 %fma = call float @llvm.fma.f32(float %x, float %y, float %mul.ext)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
165 %add = fadd float %z, %fma
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
166 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
167 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
168
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
169 ; fold (fadd x, (fpext (fma y, z, (fmul u, v)))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
170 ; -> (fma (fpext y), (fpext z), (fma (fpext u), (fpext v), x))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
171
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
172 ; GCN-LABEL: {{^}}fadd_fpext_fmuladd_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
173 ; GFX9: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
174 ; GFX9: v_fma_legacy_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
175 ; GFX9: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
176 ; GFX9: v_add_f32_e32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
177 define float @fadd_fpext_fmuladd_f16_to_f32(float %x, half %y, half %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
178 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
179 %mul = fmul contract half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
180 %fma = call half @llvm.fmuladd.f16(half %y, half %z, half %mul)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
181 %ext.fma = fpext half %fma to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
182 %add = fadd float %x, %ext.fma
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
183 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
184 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
185
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
186 ; GCN-LABEL: {{^}}fadd_fpext_fma_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
187 ; GFX9: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
188 ; GFX9: v_fma_legacy_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
189 ; GFX9: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
190 ; GFX9: v_add_f32_e32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
191 define float @fadd_fpext_fma_f16_to_f32(float %x, half %y, half %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
192 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
193 %mul = fmul contract half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
194 %fma = call half @llvm.fma.f16(half %y, half %z, half %mul)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
195 %ext.fma = fpext half %fma to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
196 %add = fadd float %x, %ext.fma
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
197 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
198 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
199
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
200 ; GCN-LABEL: {{^}}fadd_fpext_fma_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
201 ; GFX9: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
202 ; GFX9: v_fma_legacy_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
203 ; GFX9: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
204 ; GFX9: v_add_f32_e32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
205 define float @fadd_fpext_fma_f16_to_f32_commute(float %x, half %y, half %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
206 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
207 %mul = fmul contract half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
208 %fma = call half @llvm.fma.f16(half %y, half %z, half %mul)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
209 %ext.fma = fpext half %fma to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
210 %add = fadd float %ext.fma, %x
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
211 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
212 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
213
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
214 ; fold (fsub (fpext (fmul x, y)), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
215 ; -> (fma (fpext x), (fpext y), (fneg z))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
216
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
217 ; GCN-LABEL: {{^}}fsub_fpext_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
218 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
219 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, v0, v1, -v2 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
220 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
221
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
222 ; GFX9-F32DENORM-NEXT: v_mul_f16_e32 v0, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
223 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32 v0, v0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
224 ; GFX9-F32DENORM-NEXT: v_sub_f32_e32 v0, v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
225 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
226 define float @fsub_fpext_fmul_f16_to_f32(half %x, half %y, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
227 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
228 %mul = fmul half %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
229 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
230 %add = fsub float %mul.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
231 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
232 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
233
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
234 ; fold (fsub x, (fpext (fmul y, z)))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
235 ; -> (fma (fneg (fpext y)), (fpext z), x)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
236
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
237 ; GCN-LABEL: {{^}}fsub_fpext_fmul_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
238 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
239 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, -v1, v2, v0 op_sel_hi:[1,1,0]
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
240 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
241
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
242 ; GFX9-F32DENORM-NEXT: v_mul_f16_e32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
243 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
244 ; GFX9-F32DENORM-NEXT: v_sub_f32_e32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
245 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
246 define float @fsub_fpext_fmul_f16_to_f32_commute(float %x, half %y, half %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
247 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
248 %mul = fmul contract half %y, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
249 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
250 %add = fsub contract float %x, %mul.ext
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
251 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
252 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
253
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
254 ; fold (fsub (fpext (fneg (fmul, x, y))), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
255 ; -> (fneg (fma (fpext x), (fpext y), z))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
256
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
257 ; GCN-LABEL: {{^}}fsub_fpext_fneg_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
258 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
259 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, v0, -v1, -v2 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
260 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
261
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
262 ; GFX9-F32DENORM-NEXT: v_mul_f16_e64 v0, v0, -v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
263 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32 v0, v0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
264 ; GFX9-F32DENORM-NEXT: v_sub_f32_e32 v0, v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
265 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
266 define float @fsub_fpext_fneg_fmul_f16_to_f32(half %x, half %y, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
267 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
268 %mul = fmul half %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
269 %neg.mul = fsub half -0.0, %mul
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
270 %neg.mul.ext = fpext half %neg.mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
271 %add = fsub float %neg.mul.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
272 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
273 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
274
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
275 ; fold (fsub (fneg (fpext (fmul, x, y))), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
276 ; -> (fneg (fma (fpext x)), (fpext y), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
277
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
278 ; GCN-LABEL: {{^}}fsub_fneg_fpext_fmul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
279 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
280 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, v0, -v1, -v2 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
281 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
282
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
283 ; GFX9-F32DENORM-NEXT: v_mul_f16_e64 v0, v0, -v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
284 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32 v0, v0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
285 ; GFX9-F32DENORM-NEXT: v_sub_f32_e32 v0, v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
286 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
287 define float @fsub_fneg_fpext_fmul_f16_to_f32(half %x, half %y, float %z) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
288 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
289 %mul = fmul half %x, %y
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
290 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
291 %neg.mul.ext = fsub float -0.0, %mul.ext
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
292 %add = fsub float %neg.mul.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
293 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
294 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
295
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
296 ; fold (fsub (fmad x, y, (fpext (fmul u, v))), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
297 ; -> (fmad x, y (fmad (fpext u), (fpext v), (fneg z)))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
298 ; GCN-LABEL: {{^}}fsub_muladd_fpext_mul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
299 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
300 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v2, v3, v4, -v2 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
301 ; GFX9-F32FLUSH-NEXT: v_mac_f32_e32 v2, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
302 ; GFX9-F32FLUSH-NEXT: v_mov_b32_e32 v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
303 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
304
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
305 ; GFX9-F32DENORM-NEXT: v_mul_f16_e32 v3, v3, v4
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
306 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32 v3, v3
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
307 ; GFX9-F32DENORM-NEXT: v_fma_f32 v0, v0, v1, v3
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
308 ; GFX9-F32DENORM-NEXT: v_sub_f32_e32 v0, v0, v2
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
309 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
310 define float @fsub_muladd_fpext_mul_f16_to_f32(float %x, float %y, float %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
311 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
312 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
313 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
314 %fma = call float @llvm.fmuladd.f32(float %x, float %y, float %mul.ext)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
315 %add = fsub float %fma, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
316 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
317 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
318
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
319 ; fold (fsub (fpext (fmad x, y, (fmul u, v))), z)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
320 ; -> (fmad (fpext x), (fpext y),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
321 ; (fmad (fpext u), (fpext v), (fneg z)))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
322
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
323 ; GCN-LABEL: {{^}}fsub_fpext_muladd_mul_f16_to_f32:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
324 ; GFX9: v_mul_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
325 ; GFX9: v_fma_legacy_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
326 ; GFX9: v_cvt_f32_f16
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
327 ; GFX9: v_sub_f32
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
328 ; GCN: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
329 define float @fsub_fpext_muladd_mul_f16_to_f32(half %x, half %y, float %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
330 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
331 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
332 %fma = call half @llvm.fmuladd.f16(half %x, half %y, half %mul)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
333 %fma.ext = fpext half %fma to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
334 %add = fsub float %fma.ext, %z
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
335 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
336 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
337
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
338 ; fold (fsub x, (fmad y, z, (fpext (fmul u, v))))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
339 ; -> (fmad (fneg y), z, (fmad (fneg (fpext u)), (fpext v), x))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
340 ; GCN-LABEL: {{^}}fsub_muladd_fpext_mul_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
341 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
342 ; GFX9-F32FLUSH-NEXT: v_mad_mix_f32 v0, -v3, v4, v0 op_sel_hi:[1,1,0]{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
343 ; GFX9-F32FLUSH-NEXT: v_mad_f32 v0, -v1, v2, v0{{$}}
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
344 ; GFX9-F32FLUSH-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
345
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
346 ; GFX9-F32DENORM-NEXT: v_mul_f16_e32 v3, v3, v4
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
347 ; GFX9-F32DENORM-NEXT: v_cvt_f32_f16_e32 v3, v3
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
348 ; GFX9-F32DENORM-NEXT: v_fma_f32 v1, v1, v2, v3
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
349 ; GFX9-F32DENORM-NEXT: v_sub_f32_e32 v0, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
350 ; GFX9-F32DENORM-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
351 define float @fsub_muladd_fpext_mul_f16_to_f32_commute(float %x, float %y, float %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
352 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
353 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
354 %mul.ext = fpext half %mul to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
355 %fma = call float @llvm.fmuladd.f32(float %y, float %z, float %mul.ext)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
356 %add = fsub float %x, %fma
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
357 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
358 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
359
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
360 ; fold (fsub x, (fpext (fma y, z, (fmul u, v))))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
361 ; -> (fma (fneg (fpext y)), (fpext z),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
362 ; (fma (fneg (fpext u)), (fpext v), x))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
363 ; GCN-LABEL: {{^}}fsub_fpext_muladd_mul_f16_to_f32_commute:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
364 ; GCN: s_waitcnt
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
365 ; GFX9-NEXT: v_mul_f16_e32 v3, v3, v4
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
366 ; GFX9-NEXT: v_fma_legacy_f16 v1, v1, v2, v3
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
367 ; GFX9-NEXT: v_cvt_f32_f16_e32 v1, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
368 ; GFX9-NEXT: v_sub_f32_e32 v0, v0, v1
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
369 ; GFX9-NEXT: s_setpc_b64
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
370 define float @fsub_fpext_muladd_mul_f16_to_f32_commute(float %x, half %y, half %z, half %u, half %v) #0 {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
371 entry:
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
372 %mul = fmul half %u, %v
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
373 %fma = call half @llvm.fmuladd.f16(half %y, half %z, half %mul)
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
374 %fma.ext = fpext half %fma to float
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
375 %add = fsub float %x, %fma.ext
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
376 ret float %add
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
377 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
378
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
379 declare float @llvm.fmuladd.f32(float, float, float) #0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
380 declare float @llvm.fma.f32(float, float, float) #0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
381 declare half @llvm.fmuladd.f16(half, half, half) #0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
382 declare half @llvm.fma.f16(half, half, half) #0
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
383
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
384 attributes #0 = { nounwind readnone speculatable }