151 lines · plain
1// RUN: mlir-translate -no-implicit-module -test-spirv-roundtrip %s | FileCheck %s2 3// RUN: %if spirv-tools %{ rm -rf %t %}4// RUN: %if spirv-tools %{ mkdir %t %}5// RUN: %if spirv-tools %{ mlir-translate --no-implicit-module --serialize-spirv --split-input-file --spirv-save-validation-files-with-prefix=%t/module %s %}6// RUN: %if spirv-tools %{ spirv-val %t %}7 8spirv.module Logical GLSL450 requires #spirv.vce<v1.0, [Shader, Linkage], []> {9 spirv.func @math(%arg0 : f32, %arg1 : f32, %arg2 : i32) "None" {10 // CHECK: {{%.*}} = spirv.GL.Exp {{%.*}} : f3211 %0 = spirv.GL.Exp %arg0 : f3212 // CHECK: {{%.*}} = spirv.GL.Sqrt {{%.*}} : f3213 %2 = spirv.GL.Sqrt %arg0 : f3214 // CHECK: {{%.*}} = spirv.GL.Cos {{%.*}} : f3215 %3 = spirv.GL.Cos %arg0 : f3216 // CHECK: {{%.*}} = spirv.GL.Sin {{%.*}} : f3217 %4 = spirv.GL.Sin %arg0 : f3218 // CHECK: {{%.*}} = spirv.GL.Tan {{%.*}} : f3219 %5 = spirv.GL.Tan %arg0 : f3220 // CHECK: {{%.*}} = spirv.GL.Acos {{%.*}} : f3221 %6 = spirv.GL.Acos %arg0 : f3222 // CHECK: {{%.*}} = spirv.GL.Asin {{%.*}} : f3223 %7 = spirv.GL.Asin %arg0 : f3224 // CHECK: {{%.*}} = spirv.GL.Atan {{%.*}} : f3225 %8 = spirv.GL.Atan %arg0 : f3226 // CHECK: {{%.*}} = spirv.GL.Sinh {{%.*}} : f3227 %9 = spirv.GL.Sinh %arg0 : f3228 // CHECK: {{%.*}} = spirv.GL.Cosh {{%.*}} : f3229 %10 = spirv.GL.Cosh %arg0 : f3230 // CHECK: {{%.*}} = spirv.GL.Pow {{%.*}} : f3231 %11 = spirv.GL.Pow %arg0, %arg1 : f3232 // CHECK: {{%.*}} = spirv.GL.Round {{%.*}} : f3233 %12 = spirv.GL.Round %arg0 : f3234 // CHECK: {{%.*}} = spirv.GL.FrexpStruct {{%.*}} : f32 -> !spirv.struct<(f32, i32)>35 %13 = spirv.GL.FrexpStruct %arg0 : f32 -> !spirv.struct<(f32, i32)>36 // CHECK: {{%.*}} = spirv.GL.Ldexp {{%.*}} : f32, {{%.*}} : i32 -> f3237 %14 = spirv.GL.Ldexp %arg0 : f32, %arg2 : i32 -> f3238 // CHECK: {{%.*}} = spirv.GL.FMix {{%.*}} : f32, {{%.*}} : f32, {{%.*}} : f32 -> f3239 %15 = spirv.GL.FMix %arg0 : f32, %arg1 : f32, %arg0 : f32 -> f3240 // CHECK: {{%.*}} = spirv.GL.Fract {{%.*}} : f3241 %16 = spirv.GL.Fract %arg0 : f3242 // CHECK: {{%.*}} = spirv.GL.Asinh {{%.*}} : f3243 %17 = spirv.GL.Asinh %arg0 : f3244 // CHECK: {{%.*}} = spirv.GL.Acosh {{%.*}} : f3245 %18 = spirv.GL.Acosh %arg0 : f3246 // CHECK: {{%.*}} = spirv.GL.Atanh {{%.*}} : f3247 %19 = spirv.GL.Atanh %arg0 : f3248 // CHECK: {{%.*}} = spirv.GL.Log2 {{%.*}} : f3249 %20 = spirv.GL.Log2 %arg0 : f3250 // CHECK: {{%.*}} = spirv.GL.Tanh {{%.*}} : f3251 %21 = spirv.GL.Tanh %arg0 : f3252 // CHECK: {{%.*}} = spirv.GL.Exp2 {{%.*}} : f3253 %22 = spirv.GL.Exp2 %arg0 : f3254 spirv.Return55 }56 57 spirv.func @maxmin(%arg0 : f32, %arg1 : f32, %arg2 : i32, %arg3 : i32) "None" {58 // CHECK: {{%.*}} = spirv.GL.FMax {{%.*}}, {{%.*}} : f3259 %1 = spirv.GL.FMax %arg0, %arg1 : f3260 // CHECK: {{%.*}} = spirv.GL.SMax {{%.*}}, {{%.*}} : i3261 %2 = spirv.GL.SMax %arg2, %arg3 : i3262 // CHECK: {{%.*}} = spirv.GL.UMax {{%.*}}, {{%.*}} : i3263 %3 = spirv.GL.UMax %arg2, %arg3 : i3264 65 // CHECK: {{%.*}} = spirv.GL.FMin {{%.*}}, {{%.*}} : f3266 %4 = spirv.GL.FMin %arg0, %arg1 : f3267 // CHECK: {{%.*}} = spirv.GL.SMin {{%.*}}, {{%.*}} : i3268 %5 = spirv.GL.SMin %arg2, %arg3 : i3269 // CHECK: {{%.*}} = spirv.GL.UMin {{%.*}}, {{%.*}} : i3270 %6 = spirv.GL.UMin %arg2, %arg3 : i3271 spirv.Return72 }73 74 spirv.func @fclamp(%arg0 : f32, %arg1 : f32, %arg2 : f32) "None" {75 // CHECK: spirv.GL.FClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : f3276 %13 = spirv.GL.FClamp %arg0, %arg1, %arg2 : f3277 spirv.Return78 }79 80 spirv.func @uclamp(%arg0 : ui32, %arg1 : ui32, %arg2 : ui32) "None" {81 // CHECK: spirv.GL.UClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : i3282 %13 = spirv.GL.UClamp %arg0, %arg1, %arg2 : ui3283 spirv.Return84 }85 86 spirv.func @sclamp(%arg0 : si32, %arg1 : si32, %arg2 : si32) "None" {87 // CHECK: spirv.GL.SClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : si3288 %13 = spirv.GL.SClamp %arg0, %arg1, %arg2 : si3289 spirv.Return90 }91 92 spirv.func @fma(%arg0 : f32, %arg1 : f32, %arg2 : f32) "None" {93 // CHECK: spirv.GL.Fma {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : f3294 %13 = spirv.GL.Fma %arg0, %arg1, %arg2 : f3295 spirv.Return96 }97 98 spirv.func @findilsb(%arg0 : i32) "None" {99 // CHECK: spirv.GL.FindILsb {{%.*}} : i32100 %2 = spirv.GL.FindILsb %arg0 : i32101 spirv.Return102 }103 spirv.func @findsmsb(%arg0 : i32) "None" {104 // CHECK: spirv.GL.FindSMsb {{%.*}} : i32105 %2 = spirv.GL.FindSMsb %arg0 : i32106 spirv.Return107 }108 109 spirv.func @findumsb(%arg0 : i32) "None" {110 // CHECK: spirv.GL.FindUMsb {{%.*}} : i32111 %2 = spirv.GL.FindUMsb %arg0 : i32112 spirv.Return113 }114 115 spirv.func @vector(%arg0 : f32, %arg1 : vector<3xf32>, %arg2 : vector<3xf32>, %arg3: vector<3xi32>) "None" {116 // CHECK: {{%.*}} = spirv.GL.Cross {{%.*}}, {{%.*}} : vector<3xf32>117 %0 = spirv.GL.Cross %arg1, %arg2 : vector<3xf32>118 // CHECK: {{%.*}} = spirv.GL.Normalize {{%.*}} : f32119 %1 = spirv.GL.Normalize %arg0 : f32120 // CHECK: {{%.*}} = spirv.GL.Normalize {{%.*}} : vector<3xf32>121 %2 = spirv.GL.Normalize %arg1 : vector<3xf32>122 // CHECK: {{%.*}} = spirv.GL.Reflect {{%.*}}, {{%.*}} : f32123 %3 = spirv.GL.Reflect %arg0, %arg0 : f32124 // CHECK: {{%.*}} = spirv.GL.Reflect {{%.*}}, {{%.*}} : vector<3xf32>125 %4 = spirv.GL.Reflect %arg1, %arg2 : vector<3xf32>126 // CHECK: {{%.*}} = spirv.GL.Distance {{%.*}}, {{%.*}} : f32, f32 -> f32127 %5 = spirv.GL.Distance %arg0, %arg0 : f32, f32 -> f32128 // CHECK: {{%.*}} = spirv.GL.Distance {{%.*}}, {{%.*}} : vector<3xf32>, vector<3xf32> -> f32129 %6 = spirv.GL.Distance %arg1, %arg2 : vector<3xf32>, vector<3xf32> -> f32130 // CHECK: {{%.*}} = spirv.GL.FindILsb {{%.*}} : vector<3xi32>131 %7 = spirv.GL.FindILsb %arg3 : vector<3xi32>132 // CHECK: {{%.*}} = spirv.GL.FindSMsb {{%.*}} : vector<3xi32>133 %8 = spirv.GL.FindSMsb %arg3 : vector<3xi32>134 // CHECK: {{%.*}} = spirv.GL.FindUMsb {{%.*}} : vector<3xi32>135 %9 = spirv.GL.FindUMsb %arg3 : vector<3xi32>136 // CHECK: {{%.*}} = spirv.GL.Length {{%.*}} : f32 -> f32137 %10 = spirv.GL.Length %arg0 : f32 -> f32138 // CHECK: {{%.*}} = spirv.GL.Length {{%.*}} : vector<3xf32> -> f32139 %11 = spirv.GL.Length %arg1 : vector<3xf32> -> f32140 spirv.Return141 }142 143 spirv.func @pack_half_2x16(%arg0 : i32) "None" {144 // CHECK: {{%.*}} = spirv.GL.UnpackHalf2x16 {{%.*}} : i32 -> vector<2xf32>145 %0 = spirv.GL.UnpackHalf2x16 %arg0 : i32 -> vector<2xf32>146 // CHECK: {{%.*}} = spirv.GL.PackHalf2x16 {{%.*}} : vector<2xf32> -> i32147 %1 = spirv.GL.PackHalf2x16 %0 : vector<2xf32> -> i32148 spirv.Return149 }150}151