xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/frem.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=SI -enable-misched < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=bonaire -enable-misched < %s | FileCheck -check-prefix=CI -check-prefix=GCN -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -enable-misched < %s | FileCheck -check-prefix=CI -check-prefix=GCN -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}frem_f32:
6*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_dword [[X:v[0-9]+]], {{.*$}}
7*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_dword [[Y:v[0-9]+]], {{.*}} offset:16
8*9880d681SAndroid Build Coastguard Worker; GCN: v_div_scale_f32
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; GCN: v_rcp_f32_e32
11*9880d681SAndroid Build Coastguard Worker; GCN: v_fma_f32
12*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32_e32
13*9880d681SAndroid Build Coastguard Worker; GCN: v_div_fmas_f32
14*9880d681SAndroid Build Coastguard Worker; GCN: v_div_fixup_f32
15*9880d681SAndroid Build Coastguard Worker; GCN: v_trunc_f32_e32
16*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32
17*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
18*9880d681SAndroid Build Coastguard Workerdefine void @frem_f32(float addrspace(1)* %out, float addrspace(1)* %in1,
19*9880d681SAndroid Build Coastguard Worker                      float addrspace(1)* %in2) #0 {
20*9880d681SAndroid Build Coastguard Worker   %gep2 = getelementptr float, float addrspace(1)* %in2, i32 4
21*9880d681SAndroid Build Coastguard Worker   %r0 = load float, float addrspace(1)* %in1, align 4
22*9880d681SAndroid Build Coastguard Worker   %r1 = load float, float addrspace(1)* %gep2, align 4
23*9880d681SAndroid Build Coastguard Worker   %r2 = frem float %r0, %r1
24*9880d681SAndroid Build Coastguard Worker   store float %r2, float addrspace(1)* %out, align 4
25*9880d681SAndroid Build Coastguard Worker   ret void
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}unsafe_frem_f32:
29*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[Y:v[0-9]+]], {{.*}} offset:16
30*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword [[X:v[0-9]+]], {{.*}}
31*9880d681SAndroid Build Coastguard Worker; GCN: v_rcp_f32_e32 [[INVY:v[0-9]+]], [[Y]]
32*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f32_e32 [[DIV:v[0-9]+]], [[INVY]], [[X]]
33*9880d681SAndroid Build Coastguard Worker; GCN: v_trunc_f32_e32 [[TRUNC:v[0-9]+]], [[DIV]]
34*9880d681SAndroid Build Coastguard Worker; GCN: v_mad_f32 [[RESULT:v[0-9]+]], -[[TRUNC]], [[Y]], [[X]]
35*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[RESULT]]
36*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
37*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_frem_f32(float addrspace(1)* %out, float addrspace(1)* %in1,
38*9880d681SAndroid Build Coastguard Worker                             float addrspace(1)* %in2) #1 {
39*9880d681SAndroid Build Coastguard Worker   %gep2 = getelementptr float, float addrspace(1)* %in2, i32 4
40*9880d681SAndroid Build Coastguard Worker   %r0 = load float, float addrspace(1)* %in1, align 4
41*9880d681SAndroid Build Coastguard Worker   %r1 = load float, float addrspace(1)* %gep2, align 4
42*9880d681SAndroid Build Coastguard Worker   %r2 = frem float %r0, %r1
43*9880d681SAndroid Build Coastguard Worker   store float %r2, float addrspace(1)* %out, align 4
44*9880d681SAndroid Build Coastguard Worker   ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}frem_f64:
48*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[Y:v\[[0-9]+:[0-9]+\]]], {{.*}}, 0
49*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2 [[X:v\[[0-9]+:[0-9]+\]]], {{.*}}, 0
50*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_div_fmas_f64
51*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_div_scale_f64
52*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mul_f64
53*9880d681SAndroid Build Coastguard Worker; CI: v_trunc_f64_e32
54*9880d681SAndroid Build Coastguard Worker; CI: v_mul_f64
55*9880d681SAndroid Build Coastguard Worker; GCN: v_add_f64
56*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dwordx2
57*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
58*9880d681SAndroid Build Coastguard Workerdefine void @frem_f64(double addrspace(1)* %out, double addrspace(1)* %in1,
59*9880d681SAndroid Build Coastguard Worker                      double addrspace(1)* %in2) #0 {
60*9880d681SAndroid Build Coastguard Worker   %r0 = load double, double addrspace(1)* %in1, align 8
61*9880d681SAndroid Build Coastguard Worker   %r1 = load double, double addrspace(1)* %in2, align 8
62*9880d681SAndroid Build Coastguard Worker   %r2 = frem double %r0, %r1
63*9880d681SAndroid Build Coastguard Worker   store double %r2, double addrspace(1)* %out, align 8
64*9880d681SAndroid Build Coastguard Worker   ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}unsafe_frem_f64:
68*9880d681SAndroid Build Coastguard Worker; GCN: v_rcp_f64_e32
69*9880d681SAndroid Build Coastguard Worker; GCN: v_mul_f64
70*9880d681SAndroid Build Coastguard Worker; SI: v_bfe_u32
71*9880d681SAndroid Build Coastguard Worker; CI: v_trunc_f64_e32
72*9880d681SAndroid Build Coastguard Worker; GCN: v_fma_f64
73*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm
74*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_frem_f64(double addrspace(1)* %out, double addrspace(1)* %in1,
75*9880d681SAndroid Build Coastguard Worker                             double addrspace(1)* %in2) #1 {
76*9880d681SAndroid Build Coastguard Worker   %r0 = load double, double addrspace(1)* %in1, align 8
77*9880d681SAndroid Build Coastguard Worker   %r1 = load double, double addrspace(1)* %in2, align 8
78*9880d681SAndroid Build Coastguard Worker   %r2 = frem double %r0, %r1
79*9880d681SAndroid Build Coastguard Worker   store double %r2, double addrspace(1)* %out, align 8
80*9880d681SAndroid Build Coastguard Worker   ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine void @frem_v2f32(<2 x float> addrspace(1)* %out, <2 x float> addrspace(1)* %in1,
84*9880d681SAndroid Build Coastguard Worker                        <2 x float> addrspace(1)* %in2) #0 {
85*9880d681SAndroid Build Coastguard Worker   %gep2 = getelementptr <2 x float>, <2 x float> addrspace(1)* %in2, i32 4
86*9880d681SAndroid Build Coastguard Worker   %r0 = load <2 x float>, <2 x float> addrspace(1)* %in1, align 8
87*9880d681SAndroid Build Coastguard Worker   %r1 = load <2 x float>, <2 x float> addrspace(1)* %gep2, align 8
88*9880d681SAndroid Build Coastguard Worker   %r2 = frem <2 x float> %r0, %r1
89*9880d681SAndroid Build Coastguard Worker   store <2 x float> %r2, <2 x float> addrspace(1)* %out, align 8
90*9880d681SAndroid Build Coastguard Worker   ret void
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine void @frem_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in1,
94*9880d681SAndroid Build Coastguard Worker                        <4 x float> addrspace(1)* %in2) #0 {
95*9880d681SAndroid Build Coastguard Worker   %gep2 = getelementptr <4 x float>, <4 x float> addrspace(1)* %in2, i32 4
96*9880d681SAndroid Build Coastguard Worker   %r0 = load <4 x float>, <4 x float> addrspace(1)* %in1, align 16
97*9880d681SAndroid Build Coastguard Worker   %r1 = load <4 x float>, <4 x float> addrspace(1)* %gep2, align 16
98*9880d681SAndroid Build Coastguard Worker   %r2 = frem <4 x float> %r0, %r1
99*9880d681SAndroid Build Coastguard Worker   store <4 x float> %r2, <4 x float> addrspace(1)* %out, align 16
100*9880d681SAndroid Build Coastguard Worker   ret void
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine void @frem_v2f64(<2 x double> addrspace(1)* %out, <2 x double> addrspace(1)* %in1,
104*9880d681SAndroid Build Coastguard Worker                        <2 x double> addrspace(1)* %in2) #0 {
105*9880d681SAndroid Build Coastguard Worker   %gep2 = getelementptr <2 x double>, <2 x double> addrspace(1)* %in2, i32 4
106*9880d681SAndroid Build Coastguard Worker   %r0 = load <2 x double>, <2 x double> addrspace(1)* %in1, align 16
107*9880d681SAndroid Build Coastguard Worker   %r1 = load <2 x double>, <2 x double> addrspace(1)* %gep2, align 16
108*9880d681SAndroid Build Coastguard Worker   %r2 = frem <2 x double> %r0, %r1
109*9880d681SAndroid Build Coastguard Worker   store <2 x double> %r2, <2 x double> addrspace(1)* %out, align 16
110*9880d681SAndroid Build Coastguard Worker   ret void
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "unsafe-fp-math"="false" }
114*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind "unsafe-fp-math"="true" }
115