xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.div.fmas.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=GCN -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker; XUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=GCN -check-prefix=VI %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; FIXME: Enable for VI.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
7*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.amdgcn.div.fmas.f32(float, float, float, i1) nounwind readnone
8*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.amdgcn.div.fmas.f64(double, double, double, i1) nounwind readnone
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32:
11*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
12*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
13*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
14*9880d681SAndroid Build Coastguard Worker; VI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c
15*9880d681SAndroid Build Coastguard Worker; VI-DAG: s_load_dword [[SC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x34
16*9880d681SAndroid Build Coastguard Worker; VI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x30
17*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VC:v[0-9]+]], [[SC]]
18*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
19*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[VA:v[0-9]+]], [[SA]]
20*9880d681SAndroid Build Coastguard Worker; GCN: v_div_fmas_f32 [[RESULT:v[0-9]+]], [[VB]], [[VA]], [[VC]]
21*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[RESULT]],
22*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
23*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32(float addrspace(1)* %out, float %a, float %b, float %c, i1 %d) nounwind {
24*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float %c, i1 %d) nounwind readnone
25*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_inline_imm_0:
30*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
31*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
32*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VC:v[0-9]+]], [[SC]]
33*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
34*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 [[RESULT:v[0-9]+]], 1.0, [[VB]], [[VC]]
35*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]],
36*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
37*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_inline_imm_0(float addrspace(1)* %out, float %a, float %b, float %c, i1 %d) nounwind {
38*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float 1.0, float %b, float %c, i1 %d) nounwind readnone
39*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_inline_imm_1:
44*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
45*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SC:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd
46*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VC:v[0-9]+]], [[SC]]
47*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VA:v[0-9]+]], [[SA]]
48*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 [[RESULT:v[0-9]+]], [[VA]], 1.0, [[VC]]
49*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]],
50*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
51*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_inline_imm_1(float addrspace(1)* %out, float %a, float %b, float %c, i1 %d) nounwind {
52*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float 1.0, float %c, i1 %d) nounwind readnone
53*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
54*9880d681SAndroid Build Coastguard Worker  ret void
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_inline_imm_2:
58*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SA:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb
59*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[SB:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc
60*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VA:v[0-9]+]], [[SA]]
61*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[SB]]
62*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 [[RESULT:v[0-9]+]], [[VA]], [[VB]], 1.0
63*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT]],
64*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
65*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_inline_imm_2(float addrspace(1)* %out, float %a, float %b, float %c, i1 %d) nounwind {
66*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float 1.0, i1 %d) nounwind readnone
67*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f64:
72*9880d681SAndroid Build Coastguard Worker; GCN: v_div_fmas_f64
73*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f64(double addrspace(1)* %out, double %a, double %b, double %c, i1 %d) nounwind {
74*9880d681SAndroid Build Coastguard Worker  %result = call double @llvm.amdgcn.div.fmas.f64(double %a, double %b, double %c, i1 %d) nounwind readnone
75*9880d681SAndroid Build Coastguard Worker  store double %result, double addrspace(1)* %out, align 8
76*9880d681SAndroid Build Coastguard Worker  ret void
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_cond_to_vcc:
80*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_eq_i32_e64 vcc, 0, s{{[0-9]+}}
81*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
82*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_cond_to_vcc(float addrspace(1)* %out, float %a, float %b, float %c, i32 %i) nounwind {
83*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %i, 0
84*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float %c, i1 %cmp) nounwind readnone
85*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
86*9880d681SAndroid Build Coastguard Worker  ret void
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_imm_false_cond_to_vcc:
90*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b64 vcc, 0
91*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
92*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_imm_false_cond_to_vcc(float addrspace(1)* %out, float %a, float %b, float %c) nounwind {
93*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float %c, i1 false) nounwind readnone
94*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
95*9880d681SAndroid Build Coastguard Worker  ret void
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_imm_true_cond_to_vcc:
99*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b64 vcc, -1
100*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
101*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_imm_true_cond_to_vcc(float addrspace(1)* %out, float %a, float %b, float %c) nounwind {
102*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float %c, i1 true) nounwind readnone
103*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %out, align 4
104*9880d681SAndroid Build Coastguard Worker  ret void
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_logical_cond_to_vcc:
108*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
109*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4{{$}}
110*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[C:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8{{$}}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_eq_i32_e32 [[CMP0:vcc]], 0, v{{[0-9]+}}
113*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_ne_i32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]], 0, s{{[0-9]+}}
114*9880d681SAndroid Build Coastguard Worker; SI: s_and_b64 vcc, [[CMP0]], [[CMP1]]
115*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 {{v[0-9]+}}, [[A]], [[B]], [[C]]
116*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
117*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_logical_cond_to_vcc(float addrspace(1)* %out, float addrspace(1)* %in, i32 %d) nounwind {
118*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
119*9880d681SAndroid Build Coastguard Worker  %gep.a = getelementptr float, float addrspace(1)* %in, i32 %tid
120*9880d681SAndroid Build Coastguard Worker  %gep.b = getelementptr float, float addrspace(1)* %gep.a, i32 1
121*9880d681SAndroid Build Coastguard Worker  %gep.c = getelementptr float, float addrspace(1)* %gep.a, i32 2
122*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr float, float addrspace(1)* %out, i32 2
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.a
125*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.b
126*9880d681SAndroid Build Coastguard Worker  %c = load volatile float, float addrspace(1)* %gep.c
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker  %cmp0 = icmp eq i32 %tid, 0
129*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp ne i32 %d, 0
130*9880d681SAndroid Build Coastguard Worker  %and = and i1 %cmp0, %cmp1
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float %c, i1 %and) nounwind readnone
133*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %gep.out, align 4
134*9880d681SAndroid Build Coastguard Worker  ret void
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_div_fmas_f32_i1_phi_vcc:
138*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_eq_i32_e32 vcc, 0, v{{[0-9]+}}
139*9880d681SAndroid Build Coastguard Worker; SI: s_and_saveexec_b64 [[SAVE:s\[[0-9]+:[0-9]+\]]], vcc
140*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64 [[SAVE]], exec, [[SAVE]]
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[LOAD:v[0-9]+]]
143*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_ne_i32_e32 vcc, 0, [[LOAD]]
144*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e64 {{v[0-9]+}}, 0, -1, vcc
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; SI: BB9_2:
148*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 exec, exec, [[SAVE]]
149*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_ne_i32_e32 vcc, 0, v{{[0-9]+}}
150*9880d681SAndroid Build Coastguard Worker; SI: v_div_fmas_f32 {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}}
151*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword
152*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
153*9880d681SAndroid Build Coastguard Workerdefine void @test_div_fmas_f32_i1_phi_vcc(float addrspace(1)* %out, float addrspace(1)* %in, i32 addrspace(1)* %dummy) nounwind {
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
156*9880d681SAndroid Build Coastguard Worker  %gep.out = getelementptr float, float addrspace(1)* %out, i32 2
157*9880d681SAndroid Build Coastguard Worker  %gep.a = getelementptr float, float addrspace(1)* %in, i32 %tid
158*9880d681SAndroid Build Coastguard Worker  %gep.b = getelementptr float, float addrspace(1)* %gep.a, i32 1
159*9880d681SAndroid Build Coastguard Worker  %gep.c = getelementptr float, float addrspace(1)* %gep.a, i32 2
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.a
162*9880d681SAndroid Build Coastguard Worker  %b = load float, float addrspace(1)* %gep.b
163*9880d681SAndroid Build Coastguard Worker  %c = load float, float addrspace(1)* %gep.c
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  %cmp0 = icmp eq i32 %tid, 0
166*9880d681SAndroid Build Coastguard Worker  br i1 %cmp0, label %bb, label %exit
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerbb:
169*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32 addrspace(1)* %dummy
170*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp ne i32 %val, 0
171*9880d681SAndroid Build Coastguard Worker  br label %exit
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerexit:
174*9880d681SAndroid Build Coastguard Worker  %cond = phi i1 [false, %entry], [%cmp1, %bb]
175*9880d681SAndroid Build Coastguard Worker  %result = call float @llvm.amdgcn.div.fmas.f32(float %a, float %b, float %c, i1 %cond) nounwind readnone
176*9880d681SAndroid Build Coastguard Worker  store float %result, float addrspace(1)* %gep.out, align 4
177*9880d681SAndroid Build Coastguard Worker  ret void
178*9880d681SAndroid Build Coastguard Worker}
179