xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/fmax_legacy.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=SI-SAFE -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -enable-no-nans-fp-math -enable-unsafe-fp-math -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI-NONAN -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; FIXME: Should replace unsafe-fp-math with no signed zeros.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() #1
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmax_legacy_uge_f32
10*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
11*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
12*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
13*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; EG: MAX
16*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_uge_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 {
17*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
18*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
19*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
22*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp uge float %a, %b
25*9880d681SAndroid Build Coastguard Worker  %val = select i1 %cmp, float %a, float %b
26*9880d681SAndroid Build Coastguard Worker  store float %val, float addrspace(1)* %out, align 4
27*9880d681SAndroid Build Coastguard Worker  ret void
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmax_legacy_oge_f32
31*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
32*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
33*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32 {{v[0-9]+}}, [[A]], [[B]]
34*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
35*9880d681SAndroid Build Coastguard Worker; EG: MAX
36*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_oge_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 {
37*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
38*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
39*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
42*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oge float %a, %b
45*9880d681SAndroid Build Coastguard Worker  %val = select i1 %cmp, float %a, float %b
46*9880d681SAndroid Build Coastguard Worker  store float %val, float addrspace(1)* %out, align 4
47*9880d681SAndroid Build Coastguard Worker  ret void
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmax_legacy_ugt_f32
51*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
52*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
53*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
54*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
55*9880d681SAndroid Build Coastguard Worker; EG: MAX
56*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_ugt_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 {
57*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
58*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
59*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
62*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ugt float %a, %b
65*9880d681SAndroid Build Coastguard Worker  %val = select i1 %cmp, float %a, float %b
66*9880d681SAndroid Build Coastguard Worker  store float %val, float addrspace(1)* %out, align 4
67*9880d681SAndroid Build Coastguard Worker  ret void
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmax_legacy_ogt_f32
71*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
72*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
73*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32 {{v[0-9]+}}, [[A]], [[B]]
74*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
75*9880d681SAndroid Build Coastguard Worker; EG: MAX
76*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_ogt_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 {
77*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
78*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
79*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
82*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %a, %b
85*9880d681SAndroid Build Coastguard Worker  %val = select i1 %cmp, float %a, float %b
86*9880d681SAndroid Build Coastguard Worker  store float %val, float addrspace(1)* %out, align 4
87*9880d681SAndroid Build Coastguard Worker  ret void
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_fmax_legacy_ogt_v1f32:
91*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
92*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
93*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32 {{v[0-9]+}}, [[A]], [[B]]
94*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32 {{v[0-9]+}}, [[B]], [[A]]
95*9880d681SAndroid Build Coastguard Worker; EG: MAX
96*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_ogt_v1f32(<1 x float> addrspace(1)* %out, <1 x float> addrspace(1)* %in) #0 {
97*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
98*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr <1 x float>, <1 x float> addrspace(1)* %in, i32 %tid
99*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr <1 x float>, <1 x float> addrspace(1)* %gep.0, i32 1
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker  %a = load <1 x float>, <1 x float> addrspace(1)* %gep.0
102*9880d681SAndroid Build Coastguard Worker  %b = load <1 x float>, <1 x float> addrspace(1)* %gep.1
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt <1 x float> %a, %b
105*9880d681SAndroid Build Coastguard Worker  %val = select <1 x i1> %cmp, <1 x float> %a, <1 x float> %b
106*9880d681SAndroid Build Coastguard Worker  store <1 x float> %val, <1 x float> addrspace(1)* %out
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_fmax_legacy_ogt_v3f32:
111*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32
112*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32
113*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_max_legacy_f32_e32
114*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32
115*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32
116*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_max_f32_e32
117*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_ogt_v3f32(<3 x float> addrspace(1)* %out, <3 x float> addrspace(1)* %in) #0 {
118*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
119*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr <3 x float>, <3 x float> addrspace(1)* %in, i32 %tid
120*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr <3 x float>, <3 x float> addrspace(1)* %gep.0, i32 1
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker  %a = load <3 x float>, <3 x float> addrspace(1)* %gep.0
123*9880d681SAndroid Build Coastguard Worker  %b = load <3 x float>, <3 x float> addrspace(1)* %gep.1
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt <3 x float> %a, %b
126*9880d681SAndroid Build Coastguard Worker  %val = select <3 x i1> %cmp, <3 x float> %a, <3 x float> %b
127*9880d681SAndroid Build Coastguard Worker  store <3 x float> %val, <3 x float> addrspace(1)* %out
128*9880d681SAndroid Build Coastguard Worker  ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmax_legacy_ogt_f32_multi_use
132*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
133*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
134*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_max_
135*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_gt_f32
136*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32
137*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_max_
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; EG: MAX
140*9880d681SAndroid Build Coastguard Workerdefine void @test_fmax_legacy_ogt_f32_multi_use(float addrspace(1)* %out0, i1 addrspace(1)* %out1, float addrspace(1)* %in) #0 {
141*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.r600.read.tidig.x() #1
142*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
143*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
146*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %a, %b
149*9880d681SAndroid Build Coastguard Worker  %val = select i1 %cmp, float %a, float %b
150*9880d681SAndroid Build Coastguard Worker  store float %val, float addrspace(1)* %out0, align 4
151*9880d681SAndroid Build Coastguard Worker  store i1 %cmp, i1addrspace(1)* %out1
152*9880d681SAndroid Build Coastguard Worker  ret void
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
156*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone }
157