1// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip -split-input-file %s | FileCheck %s 2 3spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> { 4 spirv.func @bit_cast(%arg0 : f32) "None" { 5 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : f32 to i32 6 %0 = spirv.Bitcast %arg0 : f32 to i32 7 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : i32 to si32 8 %1 = spirv.Bitcast %0 : i32 to si32 9 // CHECK: {{%.*}} = spirv.Bitcast {{%.*}} : si32 to i32 10 %2 = spirv.Bitcast %1 : si32 to ui32 11 spirv.Return 12 } 13} 14 15// ----- 16 17spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader], []> { 18 spirv.func @convert_f_to_s(%arg0 : f32) -> i32 "None" { 19 // CHECK: {{%.*}} = spirv.ConvertFToS {{%.*}} : f32 to i32 20 %0 = spirv.ConvertFToS %arg0 : f32 to i32 21 spirv.ReturnValue %0 : i32 22 } 23 spirv.func @convert_f64_to_s32(%arg0 : f64) -> i32 "None" { 24 // CHECK: {{%.*}} = spirv.ConvertFToS {{%.*}} : f64 to i32 25 %0 = spirv.ConvertFToS %arg0 : f64 to i32 26 spirv.ReturnValue %0 : i32 27 } 28 spirv.func @convert_f_to_u(%arg0 : f32) -> i32 "None" { 29 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : f32 to i32 30 %0 = spirv.ConvertFToU %arg0 : f32 to i32 31 spirv.ReturnValue %0 : i32 32 } 33 spirv.func @convert_f64_to_u32(%arg0 : f64) -> i32 "None" { 34 // CHECK: {{%.*}} = spirv.ConvertFToU {{%.*}} : f64 to i32 35 %0 = spirv.ConvertFToU %arg0 : f64 to i32 36 spirv.ReturnValue %0 : i32 37 } 38 spirv.func @convert_s_to_f(%arg0 : i32) -> f32 "None" { 39 // CHECK: {{%.*}} = spirv.ConvertSToF {{%.*}} : i32 to f32 40 %0 = spirv.ConvertSToF %arg0 : i32 to f32 41 spirv.ReturnValue %0 : f32 42 } 43 spirv.func @convert_s64_to_f32(%arg0 : i64) -> f32 "None" { 44 // CHECK: {{%.*}} = spirv.ConvertSToF {{%.*}} : i64 to f32 45 %0 = spirv.ConvertSToF %arg0 : i64 to f32 46 spirv.ReturnValue %0 : f32 47 } 48 spirv.func @convert_u_to_f(%arg0 : i32) -> f32 "None" { 49 // CHECK: {{%.*}} = spirv.ConvertUToF {{%.*}} : i32 to f32 50 %0 = spirv.ConvertUToF %arg0 : i32 to f32 51 spirv.ReturnValue %0 : f32 52 } 53 spirv.func @convert_u64_to_f32(%arg0 : i64) -> f32 "None" { 54 // CHECK: {{%.*}} = spirv.ConvertUToF {{%.*}} : i64 to f32 55 %0 = spirv.ConvertUToF %arg0 : i64 to f32 56 spirv.ReturnValue %0 : f32 57 } 58 spirv.func @f_convert(%arg0 : f32) -> f64 "None" { 59 // CHECK: {{%.*}} = spirv.FConvert {{%.*}} : f32 to f64 60 %0 = spirv.FConvert %arg0 : f32 to f64 61 spirv.ReturnValue %0 : f64 62 } 63 spirv.func @s_convert(%arg0 : i32) -> i64 "None" { 64 // CHECK: {{%.*}} = spirv.SConvert {{%.*}} : i32 to i64 65 %0 = spirv.SConvert %arg0 : i32 to i64 66 spirv.ReturnValue %0 : i64 67 } 68 spirv.func @u_convert(%arg0 : i32) -> i64 "None" { 69 // CHECK: {{%.*}} = spirv.UConvert {{%.*}} : i32 to i64 70 %0 = spirv.UConvert %arg0 : i32 to i64 71 spirv.ReturnValue %0 : i64 72 } 73} 74 75// ----- 76 77spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Kernel], []> { 78 spirv.func @ptr_cast_to_generic(%arg0 : !spirv.ptr<f32, CrossWorkgroup>) "None" { 79 // CHECK: {{%.*}} = spirv.PtrCastToGeneric {{%.*}} : !spirv.ptr<f32, CrossWorkgroup> to !spirv.ptr<f32, Generic> 80 %0 = spirv.PtrCastToGeneric %arg0 : !spirv.ptr<f32, CrossWorkgroup> to !spirv.ptr<f32, Generic> 81 spirv.Return 82 } 83 spirv.func @generic_cast_to_ptr(%arg0 : !spirv.ptr<vector<2xi32>, Generic>) "None" { 84 // CHECK: {{%.*}} = spirv.GenericCastToPtr {{%.*}} : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup> 85 %0 = spirv.GenericCastToPtr %arg0 : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup> 86 spirv.Return 87 } 88 spirv.func @generic_cast_to_ptr_explicit(%arg0 : !spirv.ptr<vector<2xi32>, Generic>) "None" { 89 // CHECK: {{%.*}} = spirv.GenericCastToPtrExplicit {{%.*}} : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup> 90 %0 = spirv.GenericCastToPtrExplicit %arg0 : !spirv.ptr<vector<2xi32>, Generic> to !spirv.ptr<vector<2xi32>, CrossWorkgroup> 91 spirv.Return 92 } 93} 94 95// ----- 96 97spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses], []> { 98 spirv.func @covert_ptr_to_u(%arg0 : !spirv.ptr<i32, Generic>) "None" { 99 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i32, Generic> to i32 100 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, Generic> to i32 101 spirv.Return 102 } 103 spirv.func @covert_ptr_to_u_truncate(%arg0 : !spirv.ptr<i64, Generic>) "None" { 104 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i64, Generic> to i32 105 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i64, Generic> to i32 106 spirv.Return 107 } 108 spirv.func @covert_ptr_to_u_extend(%arg0 : !spirv.ptr<i32, Generic>) "None" { 109 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i32, Generic> to i64 110 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, Generic> to i64 111 spirv.Return 112 } 113} 114 115// ----- 116 117spirv.module PhysicalStorageBuffer64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, PhysicalStorageBufferAddresses], []> { 118 spirv.func @covert_ptr_to_u_PhysicalStorageBuffer(%arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> { spirv.decoration = #spirv.decoration<Aliased>} ) "None" { 119 // CHECK: {{%.*}} = spirv.ConvertPtrToU {{%.*}} : !spirv.ptr<i32, PhysicalStorageBuffer> to i32 120 %0 = spirv.ConvertPtrToU %arg0 : !spirv.ptr<i32, PhysicalStorageBuffer> to i32 121 spirv.Return 122 } 123} 124 125// ----- 126 127spirv.module Physical64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses], []> { 128 spirv.func @covert_u_to_ptr(%arg0 : i32) "None" { 129 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i32 to !spirv.ptr<i32, Generic> 130 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i32, Generic> 131 spirv.Return 132 } 133 spirv.func @covert_u_to_ptr_truncate(%arg0 : i64) "None" { 134 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i64 to !spirv.ptr<i32, Generic> 135 %0 = spirv.ConvertUToPtr %arg0 : i64 to !spirv.ptr<i32, Generic> 136 spirv.Return 137 } 138 spirv.func @covert_u_to_ptr_extend(%arg0 : i32) "None" { 139 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i32 to !spirv.ptr<i64, Generic> 140 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i64, Generic> 141 spirv.Return 142 } 143} 144 145// ----- 146 147spirv.module PhysicalStorageBuffer64 OpenCL requires #spirv.vce<v1.0, [Kernel, Addresses, PhysicalStorageBufferAddresses], []> { 148 spirv.func @covert_u_to_ptr_PhysicalStorageBuffer(%arg0 : i32) "None" { 149 // CHECK: {{%.*}} = spirv.ConvertUToPtr {{%.*}} : i32 to !spirv.ptr<i32, PhysicalStorageBuffer> 150 %0 = spirv.ConvertUToPtr %arg0 : i32 to !spirv.ptr<i32, PhysicalStorageBuffer> 151 spirv.Return 152 } 153} 154