xref: /llvm-project/llvm/test/CodeGen/SPIRV/transcoding/DivRem.ll (revision 0a443f13b49b3f392461a0bb60b0146cfc4607c7)
18468e674SAndrey Tretyakov; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
2*0a443f13SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
38468e674SAndrey Tretyakov
48468e674SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#int:]] = OpTypeInt 32 0
58468e674SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#int2:]] = OpTypeVector %[[#int]] 2
68468e674SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#float:]] = OpTypeFloat 32
78468e674SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#float2:]] = OpTypeVector %[[#float]] 2
88468e674SAndrey Tretyakov
98468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunction
108468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#A:]] = OpFunctionParameter %[[#]]
118468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#B:]] = OpFunctionParameter %[[#]]
128468e674SAndrey Tretyakov; CHECK-SPIRV:      %[[#]] = OpSDiv %[[#int2]] %[[#A]] %[[#B]]
138468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunctionEnd
148468e674SAndrey Tretyakov
158468e674SAndrey Tretyakov;; kernel void testSDiv(int2 a, int2 b, global int2 *res) {
168468e674SAndrey Tretyakov;;   res[0] = a / b;
178468e674SAndrey Tretyakov;; }
188468e674SAndrey Tretyakov
198468e674SAndrey Tretyakovdefine dso_local spir_kernel void @testSDiv(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
208468e674SAndrey Tretyakoventry:
218468e674SAndrey Tretyakov  %div = sdiv <2 x i32> %a, %b
228468e674SAndrey Tretyakov  store <2 x i32> %div, <2 x i32> addrspace(1)* %res, align 8
238468e674SAndrey Tretyakov  ret void
248468e674SAndrey Tretyakov}
258468e674SAndrey Tretyakov
268468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunction
278468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#A:]] = OpFunctionParameter %[[#]]
288468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#B:]] = OpFunctionParameter %[[#]]
298468e674SAndrey Tretyakov; CHECK-SPIRV:      %[[#]] = OpUDiv %[[#int2]] %[[#A]] %[[#B]]
308468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunctionEnd
318468e674SAndrey Tretyakov
328468e674SAndrey Tretyakov;; kernel void testUDiv(uint2 a, uint2 b, global uint2 *res) {
338468e674SAndrey Tretyakov;;   res[0] = a / b;
348468e674SAndrey Tretyakov;; }
358468e674SAndrey Tretyakov
368468e674SAndrey Tretyakovdefine dso_local spir_kernel void @testUDiv(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
378468e674SAndrey Tretyakoventry:
388468e674SAndrey Tretyakov  %div = udiv <2 x i32> %a, %b
398468e674SAndrey Tretyakov  store <2 x i32> %div, <2 x i32> addrspace(1)* %res, align 8
408468e674SAndrey Tretyakov  ret void
418468e674SAndrey Tretyakov}
428468e674SAndrey Tretyakov
438468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunction
448468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#A:]] = OpFunctionParameter %[[#]]
458468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#B:]] = OpFunctionParameter %[[#]]
468468e674SAndrey Tretyakov; CHECK-SPIRV:      %[[#]] = OpFDiv %[[#float2]] %[[#A]] %[[#B]]
478468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunctionEnd
488468e674SAndrey Tretyakov
498468e674SAndrey Tretyakov;; kernel void testFDiv(float2 a, float2 b, global float2 *res) {
508468e674SAndrey Tretyakov;;   res[0] = a / b;
518468e674SAndrey Tretyakov;; }
528468e674SAndrey Tretyakov
538468e674SAndrey Tretyakovdefine dso_local spir_kernel void @testFDiv(<2 x float> noundef %a, <2 x float> noundef %b, <2 x float> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
548468e674SAndrey Tretyakoventry:
558468e674SAndrey Tretyakov  %div = fdiv <2 x float> %a, %b
568468e674SAndrey Tretyakov  store <2 x float> %div, <2 x float> addrspace(1)* %res, align 8
578468e674SAndrey Tretyakov  ret void
588468e674SAndrey Tretyakov}
598468e674SAndrey Tretyakov
608468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunction
618468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#A:]] = OpFunctionParameter %[[#]]
628468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#B:]] = OpFunctionParameter %[[#]]
638468e674SAndrey Tretyakov; CHECK-SPIRV:      %[[#]] = OpSRem %[[#int2]] %[[#A]] %[[#B]]
648468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunctionEnd
658468e674SAndrey Tretyakov
668468e674SAndrey Tretyakov;; kernel void testSRem(int2 a, int2 b, global int2 *res) {
678468e674SAndrey Tretyakov;;   res[0] = a % b;
688468e674SAndrey Tretyakov;; }
698468e674SAndrey Tretyakov
708468e674SAndrey Tretyakovdefine dso_local spir_kernel void @testSRem(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
718468e674SAndrey Tretyakoventry:
728468e674SAndrey Tretyakov  %rem = srem <2 x i32> %a, %b
738468e674SAndrey Tretyakov  store <2 x i32> %rem, <2 x i32> addrspace(1)* %res, align 8
748468e674SAndrey Tretyakov  ret void
758468e674SAndrey Tretyakov}
768468e674SAndrey Tretyakov
778468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunction
788468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#A:]] = OpFunctionParameter %[[#]]
798468e674SAndrey Tretyakov; CHECK-SPIRV-NEXT: %[[#B:]] = OpFunctionParameter %[[#]]
808468e674SAndrey Tretyakov; CHECK-SPIRV:      %[[#]] = OpUMod %[[#int2]] %[[#A]] %[[#B]]
818468e674SAndrey Tretyakov; CHECK-SPIRV:      OpFunctionEnd
828468e674SAndrey Tretyakov
838468e674SAndrey Tretyakov;; kernel void testUMod(uint2 a, uint2 b, global uint2 *res) {
848468e674SAndrey Tretyakov;;   res[0] = a % b;
858468e674SAndrey Tretyakov;; }
868468e674SAndrey Tretyakov
878468e674SAndrey Tretyakovdefine dso_local spir_kernel void @testUMod(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
888468e674SAndrey Tretyakoventry:
898468e674SAndrey Tretyakov  %rem = urem <2 x i32> %a, %b
908468e674SAndrey Tretyakov  store <2 x i32> %rem, <2 x i32> addrspace(1)* %res, align 8
918468e674SAndrey Tretyakov  ret void
928468e674SAndrey Tretyakov}
93