diff --git a/BUILD.gn b/BUILD.gn
index f37264b..02fd884 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -916,12 +916,6 @@
     lang = "--metal"
     settings = "--settings"
   }
-  compile_sksl("hlsl_tests") {
-    sources = sksl_hlsl_tests_sources
-    outExtensions = [ ".hlsl" ]
-    lang = "--hlsl"
-    settings = "--settings"
-  }
   compile_sksl("skvm_tests") {
     sources = sksl_skvm_tests_sources
     outExtensions = [ ".skvm" ]
@@ -953,8 +947,6 @@
   }
   group("compile_sksl_metal_tests") {
   }
-  group("compile_sksl_hlsl_tests") {
-  }
   group("compile_sksl_skvm_tests") {
   }
   group("compile_sksl_spirv_tests") {
diff --git a/bazel/exporter/gni_exporter.go b/bazel/exporter/gni_exporter.go
index ef08522..1238c0b 100644
--- a/bazel/exporter/gni_exporter.go
+++ b/bazel/exporter/gni_exporter.go
@@ -91,8 +91,6 @@
 sksl_metal_tests_sources =
     sksl_metal_tests + sksl_blend_tests + sksl_shared_tests
 
-sksl_hlsl_tests_sources = sksl_blend_tests + sksl_shared_tests
-
 sksl_wgsl_tests_sources = sksl_wgsl_tests
 
 sksl_spirv_tests_sources =
diff --git a/gn/compile_sksl_tests.py b/gn/compile_sksl_tests.py
index be8573d..72f6ea8 100755
--- a/gn/compile_sksl_tests.py
+++ b/gn/compile_sksl_tests.py
@@ -71,10 +71,6 @@
         worklist.write(input + "\n")
         worklist.write(target + ".metal\n")
         worklist.write(settings + "\n\n")
-    elif lang == "--hlsl":
-        worklist.write(input + "\n")
-        worklist.write(target + ".hlsl\n")
-        worklist.write(settings + "\n\n")
     elif lang == "--spirv":
         worklist.write(input + "\n")
         worklist.write(target + ".asm" + extensionForSpirvAsm(ext) + "\n")
@@ -92,7 +88,7 @@
         worklist.write(target + ".wgsl\n")
         worklist.write(settings + "\n\n")
     else:
-        sys.exit("### Expected one of: --glsl --metal --hlsl --spirv --wgsl --skvm --stage --dsl, got " + lang)
+        sys.exit("### Expected one of: --glsl --metal --spirv --wgsl --skvm --stage --dsl, got " + lang)
 
     # Compile items one at a time.
     if not batchCompile:
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index ca278b9..7f91960 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -377,22 +377,17 @@
   "wgsl/VertexPositionOutputIsAlwaysDeclared.vert",
 ]
 
-# TODO(skia:12352): HLSL doesn't support inverse hyperbolic functions as intrinsics. These tests are
-# grouped separately for HLSL tests until there is a reasonable workaround in place.
-sksl_inverse_hyperbolic_intrinsics_tests = [
-  "intrinsics/Acosh.sksl",
-  "intrinsics/Asinh.sksl",
-  "intrinsics/Atanh.sksl",
-]
-
 sksl_shared_tests = [
   "intrinsics/AbsFloat.sksl",
   "intrinsics/AbsInt.sksl",
   "intrinsics/Acos.sksl",
+  "intrinsics/Acosh.sksl",
   "intrinsics/All.sksl",
   "intrinsics/Any.sksl",
   "intrinsics/Asin.sksl",
+  "intrinsics/Asinh.sksl",
   "intrinsics/Atan.sksl",
+  "intrinsics/Atanh.sksl",
   "intrinsics/BitCount.sksl",
   "intrinsics/Ceil.sksl",
   "intrinsics/ClampFloat.sksl",
@@ -843,22 +838,17 @@
 
 sksl_glsl_tests_sources =
     sksl_error_tests + sksl_glsl_tests + sksl_inliner_tests +
-    sksl_folding_tests + sksl_shared_tests +
-    sksl_inverse_hyperbolic_intrinsics_tests
+    sksl_folding_tests + sksl_shared_tests
 
 sksl_glsl_settings_tests_sources = sksl_blend_tests + sksl_settings_tests
 
 sksl_metal_tests_sources =
-    sksl_metal_tests + sksl_blend_tests + sksl_shared_tests +
-    sksl_inverse_hyperbolic_intrinsics_tests
-
-sksl_hlsl_tests_sources = sksl_blend_tests + sksl_shared_tests
+    sksl_metal_tests + sksl_blend_tests + sksl_shared_tests
 
 sksl_wgsl_tests_sources = sksl_wgsl_tests
 
 sksl_spirv_tests_sources =
-    sksl_blend_tests + sksl_shared_tests +
-    sksl_inverse_hyperbolic_intrinsics_tests + sksl_spirv_tests
+    sksl_blend_tests + sksl_shared_tests + sksl_spirv_tests
 
 sksl_skvm_tests_sources = sksl_rte_tests + sksl_rte_error_tests
 
diff --git a/resources/sksl/BUILD.bazel b/resources/sksl/BUILD.bazel
index 8246984..66467b5 100644
--- a/resources/sksl/BUILD.bazel
+++ b/resources/sksl/BUILD.bazel
@@ -20,7 +20,6 @@
         ":sksl_folding_tests",
         ":sksl_glsl_tests",
         ":sksl_inliner_tests",
-        ":sksl_inverse_hyperbolic_intrinsics_tests",
         ":sksl_shared_tests",
     ],
     visibility = ["//tools/skslc:__pkg__"],
@@ -43,7 +42,6 @@
     name = "sksl_metal_tests_sources",
     srcs = [
         ":sksl_blend_tests",
-        ":sksl_inverse_hyperbolic_intrinsics_tests",
         ":sksl_metal_tests",
         ":sksl_shared_tests",
     ],
@@ -77,24 +75,12 @@
     name = "sksl_spirv_tests_sources",
     srcs = [
         ":sksl_blend_tests",
-        ":sksl_inverse_hyperbolic_intrinsics_tests",
         ":sksl_shared_tests",
         ":sksl_spirv_tests",
     ],
     visibility = ["//tools/skslc:__pkg__"],
 )
 
-# Tests in sksl_hlsl_tests_sources will be compiled with --settings on, and are expected to
-# generate a .hlsl output file.
-skia_filegroup(
-    name = "sksl_hlsl_tests_sources",
-    srcs = [
-        ":sksl_blend_tests",
-        ":sksl_shared_tests",
-    ],
-    visibility = ["//tools/skslc:__pkg__"],
-)
-
 # Tests in sksl_wgsl_tests_sources will be compiled with --settings on, and are expected to generate
 # a .wgsl output file.
 # TODO(skia:13092): WGSL support is WIP and the test sources added here are copies of a subset of
@@ -684,27 +670,19 @@
     ],
 )
 
-# TODO(skia:12352): HLSL doesn't support inverse hyperbolic functions as intrinsics. These tests are
-# grouped separately for HLSL tests until there is a reasonable workaround in place.
-skia_filegroup(
-    name = "sksl_inverse_hyperbolic_intrinsics_tests",
-    srcs = [
-        "intrinsics/Acosh.sksl",
-        "intrinsics/Asinh.sksl",
-        "intrinsics/Atanh.sksl",
-    ],
-)
-
 skia_filegroup(
     name = "sksl_shared_tests",
     srcs = [
         "intrinsics/AbsFloat.sksl",
         "intrinsics/AbsInt.sksl",
         "intrinsics/Acos.sksl",
+        "intrinsics/Acosh.sksl",
         "intrinsics/All.sksl",
         "intrinsics/Any.sksl",
         "intrinsics/Asin.sksl",
+        "intrinsics/Asinh.sksl",
         "intrinsics/Atan.sksl",
+        "intrinsics/Atanh.sksl",
         "intrinsics/BitCount.sksl",
         "intrinsics/Ceil.sksl",
         "intrinsics/ClampFloat.sksl",
diff --git a/tests/sksl/blend/BlendClear.hlsl b/tests/sksl/blend/BlendClear.hlsl
deleted file mode 100644
index a412270..0000000
--- a/tests/sksl/blend/BlendClear.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = 0.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendColor.hlsl b/tests/sksl/blend/BlendColor.hlsl
deleted file mode 100644
index bdc90ad..0000000
--- a/tests/sksl/blend/BlendColor.hlsl
+++ /dev/null
@@ -1,126 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _18_src : packoffset(c0);
-    float4 _18_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float blend_color_saturation_Qhh3(float3 _24)
-{
-    return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
-}
-
-float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
-{
-    float _57 = _49.w * _48.w;
-    float alpha = _57;
-    float3 _63 = _48.xyz * _49.w;
-    float3 sda = _63;
-    float3 _69 = _49.xyz * _48.w;
-    float3 dsa = _69;
-    float3 _74 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _74 = _69;
-    }
-    else
-    {
-        _74 = _63;
-    }
-    float3 l = _74;
-    float3 _83 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _83 = _63;
-    }
-    else
-    {
-        _83 = _69;
-    }
-    float3 r = _83;
-    if (_47.y != 0.0f)
-    {
-        float _94 = min(min(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
-        float _100 = max(max(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
-        float3 _103 = 0.0f.xxx;
-        if (_100 > _94)
-        {
-            float3 _109 = _83;
-            _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
-        }
-        else
-        {
-            _103 = 0.0f.xxx;
-        }
-        l = _103;
-        r = _69;
-    }
-    float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
-    float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
-    float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
-    float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
-    float _135 = _131.x;
-    float _136 = _131.y;
-    float _137 = _131.z;
-    float _133 = min(min(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
-    float _139 = max(max(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
-    bool _145 = false;
-    if (_133 < 0.0f)
-    {
-        _145 = _119 != _133;
-    }
-    else
-    {
-        _145 = false;
-    }
-    if (_145)
-    {
-        float3 _148 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
-    }
-    bool _160 = false;
-    if (_139 > _57)
-    {
-        _160 = _139 != _119;
-    }
-    else
-    {
-        _160 = false;
-    }
-    if (_160)
-    {
-        float3 _164 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
-    }
-    return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float2 _197 = 0.0f.xx;
-    float4 _203 = _18_src;
-    float4 _207 = _18_dst;
-    sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendColorBurn.hlsl b/tests/sksl/blend/BlendColorBurn.hlsl
deleted file mode 100644
index 4c09abf..0000000
--- a/tests/sksl/blend/BlendColorBurn.hlsl
+++ /dev/null
@@ -1,56 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _17_src : packoffset(c0);
-    float4 _17_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float color_burn_component_Qhh2h2(float2 _23, float2 _24)
-{
-    if (_24.y == _24.x)
-    {
-        return ((_23.y * _24.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
-    }
-    else
-    {
-        if (_23.x == 0.0f)
-        {
-            return _24.x * (1.0f - _23.y);
-        }
-        else
-        {
-            float _68 = max(0.0f, _24.y - (((_24.y - _24.x) * _23.y) / (_23.x + _kGuardedDivideEpsilon)));
-            float delta = _68;
-            return ((_68 * _23.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
-        }
-    }
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float2 _111 = _17_src.xw;
-    float2 _116 = _17_dst.xw;
-    float2 _121 = _17_src.yw;
-    float2 _125 = _17_dst.yw;
-    float2 _130 = _17_src.zw;
-    float2 _134 = _17_dst.zw;
-    sk_FragColor = float4(color_burn_component_Qhh2h2(_111, _116), color_burn_component_Qhh2h2(_121, _125), color_burn_component_Qhh2h2(_130, _134), _17_src.w + ((1.0f - _17_src.w) * _17_dst.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendColorDodge.hlsl b/tests/sksl/blend/BlendColorDodge.hlsl
deleted file mode 100644
index b2e25e5..0000000
--- a/tests/sksl/blend/BlendColorDodge.hlsl
+++ /dev/null
@@ -1,58 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _17_src : packoffset(c0);
-    float4 _17_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float color_dodge_component_Qhh2h2(float2 _23, float2 _24)
-{
-    if (_24.x == 0.0f)
-    {
-        return _23.x * (1.0f - _24.y);
-    }
-    else
-    {
-        float _45 = _23.y - _23.x;
-        float delta = _45;
-        if (_45 == 0.0f)
-        {
-            return ((_23.y * _24.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
-        }
-        else
-        {
-            float _69 = min(_24.y, (_24.x * _23.y) / (_45 + _kGuardedDivideEpsilon));
-            delta = _69;
-            return ((_69 * _23.y) + (_23.x * (1.0f - _24.y))) + (_24.x * (1.0f - _23.y));
-        }
-    }
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float2 _106 = _17_src.xw;
-    float2 _111 = _17_dst.xw;
-    float2 _116 = _17_src.yw;
-    float2 _120 = _17_dst.yw;
-    float2 _125 = _17_src.zw;
-    float2 _129 = _17_dst.zw;
-    sk_FragColor = float4(color_dodge_component_Qhh2h2(_106, _111), color_dodge_component_Qhh2h2(_116, _120), color_dodge_component_Qhh2h2(_125, _129), _17_src.w + ((1.0f - _17_src.w) * _17_dst.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDarken.hlsl b/tests/sksl/blend/BlendDarken.hlsl
deleted file mode 100644
index 09ab9aa..0000000
--- a/tests/sksl/blend/BlendDarken.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _32 = _10_src + (_10_dst * (1.0f - _10_src.w));
-    float4 _RESERVED_IDENTIFIER_FIXUP_0_a = _32;
-    float3 _47 = (_10_src.xyz * (1.0f - _10_dst.w)) + _10_dst.xyz;
-    float3 _RESERVED_IDENTIFIER_FIXUP_1_b = _47;
-    float3 _48 = min(_32.xyz, _47);
-    float4 _50 = _RESERVED_IDENTIFIER_FIXUP_0_a;
-    float4 _51 = float4(_48.x, _48.y, _48.z, _50.w);
-    _RESERVED_IDENTIFIER_FIXUP_0_a = _51;
-    sk_FragColor = _51;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDifference.hlsl b/tests/sksl/blend/BlendDifference.hlsl
deleted file mode 100644
index c2296ec..0000000
--- a/tests/sksl/blend/BlendDifference.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float4((_10_src.xyz + _10_dst.xyz) - (min(_10_src.xyz * _10_dst.w, _10_dst.xyz * _10_src.w) * 2.0f), _10_src.w + ((1.0f - _10_src.w) * _10_dst.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDst.hlsl b/tests/sksl/blend/BlendDst.hlsl
deleted file mode 100644
index 8f4b8a9..0000000
--- a/tests/sksl/blend/BlendDst.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_dst;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDstAtop.hlsl b/tests/sksl/blend/BlendDstAtop.hlsl
deleted file mode 100644
index 733e26d..0000000
--- a/tests/sksl/blend/BlendDstAtop.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = (_10_src * _10_dst.w) + (_10_dst * (1.0f - _10_src.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDstIn.hlsl b/tests/sksl/blend/BlendDstIn.hlsl
deleted file mode 100644
index 931b9db..0000000
--- a/tests/sksl/blend/BlendDstIn.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_dst * _10_src.w;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDstOut.hlsl b/tests/sksl/blend/BlendDstOut.hlsl
deleted file mode 100644
index 6fba931..0000000
--- a/tests/sksl/blend/BlendDstOut.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_dst * (1.0f - _10_src.w);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendDstOver.hlsl b/tests/sksl/blend/BlendDstOver.hlsl
deleted file mode 100644
index 614462b..0000000
--- a/tests/sksl/blend/BlendDstOver.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = (_10_src * (1.0f - _10_dst.w)) + _10_dst;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendExclusion.hlsl b/tests/sksl/blend/BlendExclusion.hlsl
deleted file mode 100644
index 693850b..0000000
--- a/tests/sksl/blend/BlendExclusion.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float4((_10_dst.xyz + _10_src.xyz) - ((_10_dst.xyz * 2.0f) * _10_src.xyz), _10_src.w + ((1.0f - _10_src.w) * _10_dst.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendHardLight.hlsl b/tests/sksl/blend/BlendHardLight.hlsl
deleted file mode 100644
index 00a9284..0000000
--- a/tests/sksl/blend/BlendHardLight.hlsl
+++ /dev/null
@@ -1,59 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_src : packoffset(c0);
-    float4 _12_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float blend_overlay_component_Qhh2h2(float2 _18, float2 _19)
-{
-    float _28 = 0.0f;
-    if ((2.0f * _19.x) <= _19.y)
-    {
-        _28 = (2.0f * _18.x) * _19.x;
-    }
-    else
-    {
-        _28 = (_18.y * _19.y) - ((2.0f * (_19.y - _19.x)) * (_18.y - _18.x));
-    }
-    return _28;
-}
-
-float4 blend_overlay_h4h4h4(float4 _60, float4 _61)
-{
-    float2 _66 = _60.xw;
-    float2 _69 = _61.xw;
-    float2 _73 = _60.yw;
-    float2 _76 = _61.yw;
-    float2 _80 = _60.zw;
-    float2 _83 = _61.zw;
-    float4 result = float4(blend_overlay_component_Qhh2h2(_66, _69), blend_overlay_component_Qhh2h2(_73, _76), blend_overlay_component_Qhh2h2(_80, _83), _60.w + ((1.0f - _60.w) * _61.w));
-    float4 _96 = result;
-    float3 _112 = _96.xyz + ((_61.xyz * (1.0f - _60.w)) + (_60.xyz * (1.0f - _61.w)));
-    float4 _113 = result;
-    float4 _114 = float4(_112.x, _112.y, _112.z, _113.w);
-    result = _114;
-    return _114;
-}
-
-void frag_main()
-{
-    float4 _123 = _12_dst;
-    float4 _127 = _12_src;
-    sk_FragColor = blend_overlay_h4h4h4(_123, _127);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendHue.hlsl b/tests/sksl/blend/BlendHue.hlsl
deleted file mode 100644
index 67c4afd..0000000
--- a/tests/sksl/blend/BlendHue.hlsl
+++ /dev/null
@@ -1,126 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _18_src : packoffset(c0);
-    float4 _18_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float blend_color_saturation_Qhh3(float3 _24)
-{
-    return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
-}
-
-float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
-{
-    float _57 = _49.w * _48.w;
-    float alpha = _57;
-    float3 _63 = _48.xyz * _49.w;
-    float3 sda = _63;
-    float3 _69 = _49.xyz * _48.w;
-    float3 dsa = _69;
-    float3 _74 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _74 = _69;
-    }
-    else
-    {
-        _74 = _63;
-    }
-    float3 l = _74;
-    float3 _83 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _83 = _63;
-    }
-    else
-    {
-        _83 = _69;
-    }
-    float3 r = _83;
-    if (_47.y != 0.0f)
-    {
-        float _94 = min(min(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
-        float _100 = max(max(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
-        float3 _103 = 0.0f.xxx;
-        if (_100 > _94)
-        {
-            float3 _109 = _83;
-            _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
-        }
-        else
-        {
-            _103 = 0.0f.xxx;
-        }
-        l = _103;
-        r = _69;
-    }
-    float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
-    float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
-    float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
-    float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
-    float _135 = _131.x;
-    float _136 = _131.y;
-    float _137 = _131.z;
-    float _133 = min(min(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
-    float _139 = max(max(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
-    bool _145 = false;
-    if (_133 < 0.0f)
-    {
-        _145 = _119 != _133;
-    }
-    else
-    {
-        _145 = false;
-    }
-    if (_145)
-    {
-        float3 _148 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
-    }
-    bool _160 = false;
-    if (_139 > _57)
-    {
-        _160 = _139 != _119;
-    }
-    else
-    {
-        _160 = false;
-    }
-    if (_160)
-    {
-        float3 _164 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
-    }
-    return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float2 _197 = float2(0.0f, 1.0f);
-    float4 _203 = _18_src;
-    float4 _207 = _18_dst;
-    sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendLighten.hlsl b/tests/sksl/blend/BlendLighten.hlsl
deleted file mode 100644
index b6028f9..0000000
--- a/tests/sksl/blend/BlendLighten.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _32 = _10_src + (_10_dst * (1.0f - _10_src.w));
-    float4 _RESERVED_IDENTIFIER_FIXUP_0_result = _32;
-    float3 _33 = max(_32.xyz, (_10_src.xyz * (1.0f - _10_dst.w)) + _10_dst.xyz);
-    float4 _48 = _RESERVED_IDENTIFIER_FIXUP_0_result;
-    float4 _49 = float4(_33.x, _33.y, _33.z, _48.w);
-    _RESERVED_IDENTIFIER_FIXUP_0_result = _49;
-    sk_FragColor = _49;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendLuminosity.hlsl b/tests/sksl/blend/BlendLuminosity.hlsl
deleted file mode 100644
index f275e8e..0000000
--- a/tests/sksl/blend/BlendLuminosity.hlsl
+++ /dev/null
@@ -1,126 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _18_src : packoffset(c0);
-    float4 _18_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float blend_color_saturation_Qhh3(float3 _24)
-{
-    return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
-}
-
-float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
-{
-    float _57 = _49.w * _48.w;
-    float alpha = _57;
-    float3 _63 = _48.xyz * _49.w;
-    float3 sda = _63;
-    float3 _69 = _49.xyz * _48.w;
-    float3 dsa = _69;
-    float3 _74 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _74 = _69;
-    }
-    else
-    {
-        _74 = _63;
-    }
-    float3 l = _74;
-    float3 _83 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _83 = _63;
-    }
-    else
-    {
-        _83 = _69;
-    }
-    float3 r = _83;
-    if (_47.y != 0.0f)
-    {
-        float _94 = min(min(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
-        float _100 = max(max(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
-        float3 _103 = 0.0f.xxx;
-        if (_100 > _94)
-        {
-            float3 _109 = _83;
-            _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
-        }
-        else
-        {
-            _103 = 0.0f.xxx;
-        }
-        l = _103;
-        r = _69;
-    }
-    float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
-    float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
-    float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
-    float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
-    float _135 = _131.x;
-    float _136 = _131.y;
-    float _137 = _131.z;
-    float _133 = min(min(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
-    float _139 = max(max(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
-    bool _145 = false;
-    if (_133 < 0.0f)
-    {
-        _145 = _119 != _133;
-    }
-    else
-    {
-        _145 = false;
-    }
-    if (_145)
-    {
-        float3 _148 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
-    }
-    bool _160 = false;
-    if (_139 > _57)
-    {
-        _160 = _139 != _119;
-    }
-    else
-    {
-        _160 = false;
-    }
-    if (_160)
-    {
-        float3 _164 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
-    }
-    return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float2 _197 = float2(1.0f, 0.0f);
-    float4 _203 = _18_src;
-    float4 _207 = _18_dst;
-    sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendModulate.hlsl b/tests/sksl/blend/BlendModulate.hlsl
deleted file mode 100644
index e6c30f8..0000000
--- a/tests/sksl/blend/BlendModulate.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_src * _10_dst;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendMultiply.hlsl b/tests/sksl/blend/BlendMultiply.hlsl
deleted file mode 100644
index aa9116e..0000000
--- a/tests/sksl/blend/BlendMultiply.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float4(((_10_dst.xyz * (1.0f - _10_src.w)) + (_10_src.xyz * (1.0f - _10_dst.w))) + (_10_src.xyz * _10_dst.xyz), _10_src.w + ((1.0f - _10_src.w) * _10_dst.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendOverlay.hlsl b/tests/sksl/blend/BlendOverlay.hlsl
deleted file mode 100644
index 982e987..0000000
--- a/tests/sksl/blend/BlendOverlay.hlsl
+++ /dev/null
@@ -1,52 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_src : packoffset(c0);
-    float4 _11_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float blend_overlay_component_Qhh2h2(float2 _17, float2 _18)
-{
-    float _27 = 0.0f;
-    if ((2.0f * _18.x) <= _18.y)
-    {
-        _27 = (2.0f * _17.x) * _18.x;
-    }
-    else
-    {
-        _27 = (_17.y * _18.y) - ((2.0f * (_18.y - _18.x)) * (_17.y - _17.x));
-    }
-    return _27;
-}
-
-void frag_main()
-{
-    float2 _68 = _11_src.xw;
-    float2 _73 = _11_dst.xw;
-    float2 _78 = _11_src.yw;
-    float2 _82 = _11_dst.yw;
-    float2 _87 = _11_src.zw;
-    float2 _91 = _11_dst.zw;
-    float4 _RESERVED_IDENTIFIER_FIXUP_0_result = float4(blend_overlay_component_Qhh2h2(_68, _73), blend_overlay_component_Qhh2h2(_78, _82), blend_overlay_component_Qhh2h2(_87, _91), _11_src.w + ((1.0f - _11_src.w) * _11_dst.w));
-    float4 _107 = _RESERVED_IDENTIFIER_FIXUP_0_result;
-    float3 _127 = _107.xyz + ((_11_dst.xyz * (1.0f - _11_src.w)) + (_11_src.xyz * (1.0f - _11_dst.w)));
-    float4 _128 = _RESERVED_IDENTIFIER_FIXUP_0_result;
-    float4 _129 = float4(_127.x, _127.y, _127.z, _128.w);
-    _RESERVED_IDENTIFIER_FIXUP_0_result = _129;
-    sk_FragColor = _129;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendPlus.hlsl b/tests/sksl/blend/BlendPlus.hlsl
deleted file mode 100644
index 6cbdb71..0000000
--- a/tests/sksl/blend/BlendPlus.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = min(_10_src + _10_dst, 1.0f.xxxx);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSaturation.hlsl b/tests/sksl/blend/BlendSaturation.hlsl
deleted file mode 100644
index 6cdaeae..0000000
--- a/tests/sksl/blend/BlendSaturation.hlsl
+++ /dev/null
@@ -1,126 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _18_src : packoffset(c0);
-    float4 _18_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float blend_color_saturation_Qhh3(float3 _24)
-{
-    return max(max(_24.x, _24.y), _24.z) - min(min(_24.x, _24.y), _24.z);
-}
-
-float4 blend_hslc_h4h2h4h4(float2 _47, float4 _48, float4 _49)
-{
-    float _57 = _49.w * _48.w;
-    float alpha = _57;
-    float3 _63 = _48.xyz * _49.w;
-    float3 sda = _63;
-    float3 _69 = _49.xyz * _48.w;
-    float3 dsa = _69;
-    float3 _74 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _74 = _69;
-    }
-    else
-    {
-        _74 = _63;
-    }
-    float3 l = _74;
-    float3 _83 = 0.0f.xxx;
-    if (_47.x != 0.0f)
-    {
-        _83 = _63;
-    }
-    else
-    {
-        _83 = _69;
-    }
-    float3 r = _83;
-    if (_47.y != 0.0f)
-    {
-        float _94 = min(min(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_2_mn = _94;
-        float _100 = max(max(_74.x, _74.y), _74.z);
-        float _RESERVED_IDENTIFIER_FIXUP_3_mx = _100;
-        float3 _103 = 0.0f.xxx;
-        if (_100 > _94)
-        {
-            float3 _109 = _83;
-            _103 = ((_74 - _94.xxx) * blend_color_saturation_Qhh3(_109)) * (1.0f / (_100 - _94));
-        }
-        else
-        {
-            _103 = 0.0f.xxx;
-        }
-        l = _103;
-        r = _69;
-    }
-    float _119 = dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), r);
-    float _RESERVED_IDENTIFIER_FIXUP_4_lum = _119;
-    float3 _131 = (_119 - dot(float3(0.300000011920928955078125f, 0.589999973773956298828125f, 0.10999999940395355224609375f), l)).xxx + l;
-    float3 _RESERVED_IDENTIFIER_FIXUP_5_result = _131;
-    float _135 = _131.x;
-    float _136 = _131.y;
-    float _137 = _131.z;
-    float _133 = min(min(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_6_minComp = _133;
-    float _139 = max(max(_135, _136), _137);
-    float _RESERVED_IDENTIFIER_FIXUP_7_maxComp = _139;
-    bool _145 = false;
-    if (_133 < 0.0f)
-    {
-        _145 = _119 != _133;
-    }
-    else
-    {
-        _145 = false;
-    }
-    if (_145)
-    {
-        float3 _148 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _148 + ((_131 - _148) * (_119 / ((_119 - _133) + _kGuardedDivideEpsilon)));
-    }
-    bool _160 = false;
-    if (_139 > _57)
-    {
-        _160 = _139 != _119;
-    }
-    else
-    {
-        _160 = false;
-    }
-    if (_160)
-    {
-        float3 _164 = _119.xxx;
-        _RESERVED_IDENTIFIER_FIXUP_5_result = _164 + (((_RESERVED_IDENTIFIER_FIXUP_5_result - _164) * (_57 - _119)) * (1.0f / ((_139 - _119) + _kGuardedDivideEpsilon)));
-    }
-    return float4((((_RESERVED_IDENTIFIER_FIXUP_5_result + _49.xyz) - _69) + _48.xyz) - _63, (_48.w + _49.w) - _57);
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float2 _197 = 1.0f.xx;
-    float4 _203 = _18_src;
-    float4 _207 = _18_dst;
-    sk_FragColor = blend_hslc_h4h2h4h4(_197, _203, _207);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendScreen.hlsl b/tests/sksl/blend/BlendScreen.hlsl
deleted file mode 100644
index a27811c..0000000
--- a/tests/sksl/blend/BlendScreen.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_src + ((1.0f.xxxx - _10_src) * _10_dst);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSoftLight.hlsl b/tests/sksl/blend/BlendSoftLight.hlsl
deleted file mode 100644
index 2d227cf..0000000
--- a/tests/sksl/blend/BlendSoftLight.hlsl
+++ /dev/null
@@ -1,71 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _17_src : packoffset(c0);
-    float4 _17_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float _kGuardedDivideEpsilon = 0.0f;
-
-float soft_light_component_Qhh2h2(float2 _23, float2 _24)
-{
-    if ((2.0f * _23.x) <= _23.y)
-    {
-        return ((((_24.x * _24.x) * (_23.y - (2.0f * _23.x))) / (_24.y + _kGuardedDivideEpsilon)) + ((1.0f - _24.y) * _23.x)) + (_24.x * (((-_23.y) + (2.0f * _23.x)) + 1.0f));
-    }
-    else
-    {
-        if ((4.0f * _24.x) <= _24.y)
-        {
-            float _89 = _24.x * _24.x;
-            float DSqd = _89;
-            float _93 = _89 * _24.x;
-            float DCub = _93;
-            float _99 = _24.y * _24.y;
-            float DaSqd = _99;
-            float _103 = _99 * _24.y;
-            float DaCub = _103;
-            return ((((_99 * (_23.x - (_24.x * (((3.0f * _23.y) - (6.0f * _23.x)) - 1.0f)))) + (((12.0f * _24.y) * _89) * (_23.y - (2.0f * _23.x)))) - ((16.0f * _93) * (_23.y - (2.0f * _23.x)))) - (_103 * _23.x)) / (_99 + _kGuardedDivideEpsilon);
-        }
-        else
-        {
-            return (((_24.x * ((_23.y - (2.0f * _23.x)) + 1.0f)) + _23.x) - (sqrt(_24.y * _24.x) * (_23.y - (2.0f * _23.x)))) - (_24.y * _23.x);
-        }
-    }
-}
-
-void frag_main()
-{
-    _kGuardedDivideEpsilon = false ? 9.9999999392252902907785028219223e-09f : 0.0f;
-    float4 _194 = 0.0f.xxxx;
-    if (_17_dst.w == 0.0f)
-    {
-        _194 = _17_src;
-    }
-    else
-    {
-        float2 _205 = _17_src.xw;
-        float2 _209 = _17_dst.xw;
-        float2 _214 = _17_src.yw;
-        float2 _218 = _17_dst.yw;
-        float2 _223 = _17_src.zw;
-        float2 _227 = _17_dst.zw;
-        _194 = float4(soft_light_component_Qhh2h2(_205, _209), soft_light_component_Qhh2h2(_214, _218), soft_light_component_Qhh2h2(_223, _227), _17_src.w + ((1.0f - _17_src.w) * _17_dst.w));
-    }
-    sk_FragColor = _194;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSrc.hlsl b/tests/sksl/blend/BlendSrc.hlsl
deleted file mode 100644
index 46b767c..0000000
--- a/tests/sksl/blend/BlendSrc.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_src;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSrcAtop.hlsl b/tests/sksl/blend/BlendSrcAtop.hlsl
deleted file mode 100644
index 733e26d..0000000
--- a/tests/sksl/blend/BlendSrcAtop.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = (_10_src * _10_dst.w) + (_10_dst * (1.0f - _10_src.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSrcIn.hlsl b/tests/sksl/blend/BlendSrcIn.hlsl
deleted file mode 100644
index d1f16bb..0000000
--- a/tests/sksl/blend/BlendSrcIn.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_src * _10_dst.w;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSrcOut.hlsl b/tests/sksl/blend/BlendSrcOut.hlsl
deleted file mode 100644
index 27894a8..0000000
--- a/tests/sksl/blend/BlendSrcOut.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_src * (1.0f - _10_dst.w);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendSrcOver.hlsl b/tests/sksl/blend/BlendSrcOver.hlsl
deleted file mode 100644
index 4ed9ba5..0000000
--- a/tests/sksl/blend/BlendSrcOver.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _10_src + (_10_dst * (1.0f - _10_src.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/blend/BlendXor.hlsl b/tests/sksl/blend/BlendXor.hlsl
deleted file mode 100644
index 37a93a5..0000000
--- a/tests/sksl/blend/BlendXor.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_src : packoffset(c0);
-    float4 _10_dst : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = (_10_src * (1.0f - _10_dst.w)) + (_10_dst * (1.0f - _10_src.w));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/AbsFloat.hlsl b/tests/sksl/intrinsics/AbsFloat.hlsl
deleted file mode 100644
index 5de06af..0000000
--- a/tests/sksl/intrinsics/AbsFloat.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(1.25f, 0.0f, 0.75f, 2.25f);
-    bool _51 = false;
-    if (abs(_10_testInputs.x) == 1.25f)
-    {
-        float2 _43 = abs(_10_testInputs.xy);
-        _51 = all(bool2(_43.x == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.x, _43.y == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _63 = false;
-    if (_51)
-    {
-        float3 _54 = abs(_10_testInputs.xyz);
-        _63 = all(bool3(_54.x == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.x, _54.y == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.y, _54.z == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _63 = false;
-    }
-    bool _72 = false;
-    if (_63)
-    {
-        float4 _66 = abs(_10_testInputs);
-        _72 = all(bool4(_66.x == float4(1.25f, 0.0f, 0.75f, 2.25f).x, _66.y == float4(1.25f, 0.0f, 0.75f, 2.25f).y, _66.z == float4(1.25f, 0.0f, 0.75f, 2.25f).z, _66.w == float4(1.25f, 0.0f, 0.75f, 2.25f).w));
-    }
-    else
-    {
-        _72 = false;
-    }
-    bool _76 = false;
-    if (_72)
-    {
-        _76 = true;
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = all(bool2(float2(1.25f, 0.0f).x == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.x, float2(1.25f, 0.0f).y == float4(1.25f, 0.0f, 0.75f, 2.25f).xy.y));
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _90 = false;
-    if (_83)
-    {
-        _90 = all(bool3(float3(1.25f, 0.0f, 0.75f).x == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.x, float3(1.25f, 0.0f, 0.75f).y == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.y, float3(1.25f, 0.0f, 0.75f).z == float4(1.25f, 0.0f, 0.75f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _90 = false;
-    }
-    bool _93 = false;
-    if (_90)
-    {
-        _93 = true;
-    }
-    else
-    {
-        _93 = false;
-    }
-    float4 _94 = 0.0f.xxxx;
-    if (_93)
-    {
-        _94 = _10_colorGreen;
-    }
-    else
-    {
-        _94 = _10_colorRed;
-    }
-    return _94;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/AbsInt.hlsl b/tests/sksl/intrinsics/AbsInt.hlsl
deleted file mode 100644
index 5ec6c91..0000000
--- a/tests/sksl/intrinsics/AbsInt.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int4 expected = int4(1, 0, 0, 2);
-    bool _58 = false;
-    if (abs(int(_10_testInputs.x)) == 1)
-    {
-        int2 _44 = abs(int2(int(_10_testInputs.xy.x), int(_10_testInputs.xy.y)));
-        _58 = all(bool2(_44.x == int4(1, 0, 0, 2).xy.x, _44.y == int4(1, 0, 0, 2).xy.y));
-    }
-    else
-    {
-        _58 = false;
-    }
-    bool _78 = false;
-    if (_58)
-    {
-        int3 _61 = abs(int3(int(_10_testInputs.xyz.x), int(_10_testInputs.xyz.y), int(_10_testInputs.xyz.z)));
-        _78 = all(bool3(_61.x == int4(1, 0, 0, 2).xyz.x, _61.y == int4(1, 0, 0, 2).xyz.y, _61.z == int4(1, 0, 0, 2).xyz.z));
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _96 = false;
-    if (_78)
-    {
-        int4 _81 = abs(int4(int(_10_testInputs.x), int(_10_testInputs.y), int(_10_testInputs.z), int(_10_testInputs.w)));
-        _96 = all(bool4(_81.x == int4(1, 0, 0, 2).x, _81.y == int4(1, 0, 0, 2).y, _81.z == int4(1, 0, 0, 2).z, _81.w == int4(1, 0, 0, 2).w));
-    }
-    else
-    {
-        _96 = false;
-    }
-    bool _100 = false;
-    if (_96)
-    {
-        _100 = true;
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _107 = false;
-    if (_100)
-    {
-        _107 = all(bool2(int2(1, 0).x == int4(1, 0, 0, 2).xy.x, int2(1, 0).y == int4(1, 0, 0, 2).xy.y));
-    }
-    else
-    {
-        _107 = false;
-    }
-    bool _114 = false;
-    if (_107)
-    {
-        _114 = all(bool3(int3(1, 0, 0).x == int4(1, 0, 0, 2).xyz.x, int3(1, 0, 0).y == int4(1, 0, 0, 2).xyz.y, int3(1, 0, 0).z == int4(1, 0, 0, 2).xyz.z));
-    }
-    else
-    {
-        _114 = false;
-    }
-    bool _117 = false;
-    if (_114)
-    {
-        _117 = true;
-    }
-    else
-    {
-        _117 = false;
-    }
-    float4 _118 = 0.0f.xxxx;
-    if (_117)
-    {
-        _118 = _10_colorGreen;
-    }
-    else
-    {
-        _118 = _10_colorRed;
-    }
-    return _118;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Acos.hlsl b/tests/sksl/intrinsics/Acos.hlsl
deleted file mode 100644
index b6a773a..0000000
--- a/tests/sksl/intrinsics/Acos.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (acos(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = acos(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = acos(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = acos(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/All.hlsl b/tests/sksl/intrinsics/All.hlsl
deleted file mode 100644
index d70cfa7..0000000
--- a/tests/sksl/intrinsics/All.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputH4 : packoffset(c0);
-    float4 _10_expectedH4 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool4 _42 = bool4(_10_inputH4.x != 0.0f, _10_inputH4.y != 0.0f, _10_inputH4.z != 0.0f, _10_inputH4.w != 0.0f);
-    bool4 inputVal = _42;
-    bool4 _55 = bool4(_10_expectedH4.x != 0.0f, _10_expectedH4.y != 0.0f, _10_expectedH4.z != 0.0f, _10_expectedH4.w != 0.0f);
-    bool4 expected = _55;
-    bool _60 = _55.x;
-    bool _69 = false;
-    if (all(_42.xy) == _60)
-    {
-        _69 = all(_42.xyz) == _55.y;
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _75 = false;
-    if (_69)
-    {
-        _75 = all(_42) == _55.z;
-    }
-    else
-    {
-        _75 = false;
-    }
-    bool _78 = false;
-    if (_75)
-    {
-        _78 = _60;
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _83 = false;
-    if (_78)
-    {
-        _83 = false == _55.y;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _88 = false;
-    if (_83)
-    {
-        _88 = false == _55.z;
-    }
-    else
-    {
-        _88 = false;
-    }
-    float4 _89 = 0.0f.xxxx;
-    if (_88)
-    {
-        _89 = _10_colorGreen;
-    }
-    else
-    {
-        _89 = _10_colorRed;
-    }
-    return _89;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Any.hlsl b/tests/sksl/intrinsics/Any.hlsl
deleted file mode 100644
index 528a98d..0000000
--- a/tests/sksl/intrinsics/Any.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputH4 : packoffset(c0);
-    float4 _10_expectedH4 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool4 _42 = bool4(_10_inputH4.x != 0.0f, _10_inputH4.y != 0.0f, _10_inputH4.z != 0.0f, _10_inputH4.w != 0.0f);
-    bool4 inputVal = _42;
-    bool4 _55 = bool4(_10_expectedH4.x != 0.0f, _10_expectedH4.y != 0.0f, _10_expectedH4.z != 0.0f, _10_expectedH4.w != 0.0f);
-    bool4 expected = _55;
-    bool _60 = _55.x;
-    bool _69 = false;
-    if (any(_42.xy) == _60)
-    {
-        _69 = any(_42.xyz) == _55.y;
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _75 = false;
-    if (_69)
-    {
-        _75 = any(_42) == _55.z;
-    }
-    else
-    {
-        _75 = false;
-    }
-    bool _79 = false;
-    if (_75)
-    {
-        _79 = false == _60;
-    }
-    else
-    {
-        _79 = false;
-    }
-    bool _83 = false;
-    if (_79)
-    {
-        _83 = _55.y;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _87 = false;
-    if (_83)
-    {
-        _87 = _55.z;
-    }
-    else
-    {
-        _87 = false;
-    }
-    float4 _88 = 0.0f.xxxx;
-    if (_87)
-    {
-        _88 = _10_colorGreen;
-    }
-    else
-    {
-        _88 = _10_colorRed;
-    }
-    return _88;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Asin.hlsl b/tests/sksl/intrinsics/Asin.hlsl
deleted file mode 100644
index d2c89f8..0000000
--- a/tests/sksl/intrinsics/Asin.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (asin(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = asin(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = asin(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = asin(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Atan.hlsl b/tests/sksl/intrinsics/Atan.hlsl
deleted file mode 100644
index 380448c..0000000
--- a/tests/sksl/intrinsics/Atan.hlsl
+++ /dev/null
@@ -1,184 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (atan(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = atan(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = atan(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = atan(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    bool _120 = false;
-    if (_108)
-    {
-        _120 = atan2(_10_inputVal.x, 1.0f) == _10_expected.x;
-    }
-    else
-    {
-        _120 = false;
-    }
-    bool _133 = false;
-    if (_120)
-    {
-        float2 _123 = atan2(_10_inputVal.xy, 1.0f.xx);
-        _133 = all(bool2(_123.x == _10_expected.xy.x, _123.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _133 = false;
-    }
-    bool _146 = false;
-    if (_133)
-    {
-        float3 _136 = atan2(_10_inputVal.xyz, 1.0f.xxx);
-        _146 = all(bool3(_136.x == _10_expected.xyz.x, _136.y == _10_expected.xyz.y, _136.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _146 = false;
-    }
-    bool _157 = false;
-    if (_146)
-    {
-        float4 _149 = atan2(_10_inputVal, 1.0f.xxxx);
-        _157 = all(bool4(_149.x == _10_expected.x, _149.y == _10_expected.y, _149.z == _10_expected.z, _149.w == _10_expected.w));
-    }
-    else
-    {
-        _157 = false;
-    }
-    bool _164 = false;
-    if (_157)
-    {
-        _164 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _164 = false;
-    }
-    bool _172 = false;
-    if (_164)
-    {
-        _172 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _172 = false;
-    }
-    bool _180 = false;
-    if (_172)
-    {
-        _180 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _180 = false;
-    }
-    bool _187 = false;
-    if (_180)
-    {
-        _187 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _187 = false;
-    }
-    float4 _188 = 0.0f.xxxx;
-    if (_187)
-    {
-        _188 = _10_colorGreen;
-    }
-    else
-    {
-        _188 = _10_colorRed;
-    }
-    return _188;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/BitCount.hlsl b/tests/sksl/intrinsics/BitCount.hlsl
deleted file mode 100644
index f23ca4e..0000000
--- a/tests/sksl/intrinsics/BitCount.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    int _10_a : packoffset(c0);
-    uint _10_b : packoffset(c0.y);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor.x = float(countbits(_10_a));
-    sk_FragColor.y = float(int(countbits(_10_b)));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Ceil.hlsl b/tests/sksl/intrinsics/Ceil.hlsl
deleted file mode 100644
index 2a6f3ce..0000000
--- a/tests/sksl/intrinsics/Ceil.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(-1.0f, 0.0f, 1.0f, 3.0f);
-    bool _51 = false;
-    if (ceil(_10_testInputs.x) == (-1.0f))
-    {
-        float2 _43 = ceil(_10_testInputs.xy);
-        _51 = all(bool2(_43.x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.x, _43.y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _63 = false;
-    if (_51)
-    {
-        float3 _54 = ceil(_10_testInputs.xyz);
-        _63 = all(bool3(_54.x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.x, _54.y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.y, _54.z == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.z));
-    }
-    else
-    {
-        _63 = false;
-    }
-    bool _72 = false;
-    if (_63)
-    {
-        float4 _66 = ceil(_10_testInputs);
-        _72 = all(bool4(_66.x == float4(-1.0f, 0.0f, 1.0f, 3.0f).x, _66.y == float4(-1.0f, 0.0f, 1.0f, 3.0f).y, _66.z == float4(-1.0f, 0.0f, 1.0f, 3.0f).z, _66.w == float4(-1.0f, 0.0f, 1.0f, 3.0f).w));
-    }
-    else
-    {
-        _72 = false;
-    }
-    bool _76 = false;
-    if (_72)
-    {
-        _76 = true;
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xy.y));
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _90 = false;
-    if (_83)
-    {
-        _90 = all(bool3(float3(-1.0f, 0.0f, 1.0f).x == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.x, float3(-1.0f, 0.0f, 1.0f).y == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.y, float3(-1.0f, 0.0f, 1.0f).z == float4(-1.0f, 0.0f, 1.0f, 3.0f).xyz.z));
-    }
-    else
-    {
-        _90 = false;
-    }
-    bool _93 = false;
-    if (_90)
-    {
-        _93 = true;
-    }
-    else
-    {
-        _93 = false;
-    }
-    float4 _94 = 0.0f.xxxx;
-    if (_93)
-    {
-        _94 = _10_colorGreen;
-    }
-    else
-    {
-        _94 = _10_colorRed;
-    }
-    return _94;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/ClampFloat.hlsl b/tests/sksl/intrinsics/ClampFloat.hlsl
deleted file mode 100644
index 356b721..0000000
--- a/tests/sksl/intrinsics/ClampFloat.hlsl
+++ /dev/null
@@ -1,185 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedA = float4(-1.0f, 0.0f, 0.75f, 1.0f);
-    float4 expectedB = float4(-1.0f, 0.0f, 0.5f, 2.25f);
-    bool _57 = false;
-    if (clamp(_10_testInputs.x, -1.0f, 1.0f) == (-1.0f))
-    {
-        float2 _47 = clamp(_10_testInputs.xy, (-1.0f).xx, 1.0f.xx);
-        _57 = all(bool2(_47.x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.x, _47.y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.y));
-    }
-    else
-    {
-        _57 = false;
-    }
-    bool _71 = false;
-    if (_57)
-    {
-        float3 _60 = clamp(_10_testInputs.xyz, (-1.0f).xxx, 1.0f.xxx);
-        _71 = all(bool3(_60.x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.x, _60.y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.y, _60.z == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _82 = false;
-    if (_71)
-    {
-        float4 _74 = clamp(_10_testInputs, (-1.0f).xxxx, 1.0f.xxxx);
-        _82 = all(bool4(_74.x == float4(-1.0f, 0.0f, 0.75f, 1.0f).x, _74.y == float4(-1.0f, 0.0f, 0.75f, 1.0f).y, _74.z == float4(-1.0f, 0.0f, 0.75f, 1.0f).z, _74.w == float4(-1.0f, 0.0f, 0.75f, 1.0f).w));
-    }
-    else
-    {
-        _82 = false;
-    }
-    bool _90 = false;
-    if (_82)
-    {
-        _90 = clamp(_10_testInputs.x, -1.0f, 1.0f) == (-1.0f);
-    }
-    else
-    {
-        _90 = false;
-    }
-    bool _104 = false;
-    if (_90)
-    {
-        float2 _93 = clamp(_10_testInputs.xy, float2(-1.0f, -2.0f), float2(1.0f, 2.0f));
-        _104 = all(bool2(_93.x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.x, _93.y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.y));
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _116 = false;
-    if (_104)
-    {
-        float3 _107 = clamp(_10_testInputs.xyz, float3(-1.0f, -2.0f, -2.0f), float3(1.0f, 2.0f, 0.5f));
-        _116 = all(bool3(_107.x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.x, _107.y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.y, _107.z == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _116 = false;
-    }
-    bool _127 = false;
-    if (_116)
-    {
-        float4 _119 = clamp(_10_testInputs, float4(-1.0f, -2.0f, -2.0f, 1.0f), float4(1.0f, 2.0f, 0.5f, 3.0f));
-        _127 = all(bool4(_119.x == float4(-1.0f, 0.0f, 0.5f, 2.25f).x, _119.y == float4(-1.0f, 0.0f, 0.5f, 2.25f).y, _119.z == float4(-1.0f, 0.0f, 0.5f, 2.25f).z, _119.w == float4(-1.0f, 0.0f, 0.5f, 2.25f).w));
-    }
-    else
-    {
-        _127 = false;
-    }
-    bool _131 = false;
-    if (_127)
-    {
-        _131 = true;
-    }
-    else
-    {
-        _131 = false;
-    }
-    bool _138 = false;
-    if (_131)
-    {
-        _138 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xy.y));
-    }
-    else
-    {
-        _138 = false;
-    }
-    bool _145 = false;
-    if (_138)
-    {
-        _145 = all(bool3(float3(-1.0f, 0.0f, 0.75f).x == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.x, float3(-1.0f, 0.0f, 0.75f).y == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.y, float3(-1.0f, 0.0f, 0.75f).z == float4(-1.0f, 0.0f, 0.75f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _145 = false;
-    }
-    bool _148 = false;
-    if (_145)
-    {
-        _148 = true;
-    }
-    else
-    {
-        _148 = false;
-    }
-    bool _151 = false;
-    if (_148)
-    {
-        _151 = true;
-    }
-    else
-    {
-        _151 = false;
-    }
-    bool _157 = false;
-    if (_151)
-    {
-        _157 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xy.y));
-    }
-    else
-    {
-        _157 = false;
-    }
-    bool _164 = false;
-    if (_157)
-    {
-        _164 = all(bool3(float3(-1.0f, 0.0f, 0.5f).x == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.x, float3(-1.0f, 0.0f, 0.5f).y == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.y, float3(-1.0f, 0.0f, 0.5f).z == float4(-1.0f, 0.0f, 0.5f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _164 = false;
-    }
-    bool _167 = false;
-    if (_164)
-    {
-        _167 = true;
-    }
-    else
-    {
-        _167 = false;
-    }
-    float4 _168 = 0.0f.xxxx;
-    if (_167)
-    {
-        _168 = _10_colorGreen;
-    }
-    else
-    {
-        _168 = _10_colorRed;
-    }
-    return _168;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/ClampInt.hlsl b/tests/sksl/intrinsics/ClampInt.hlsl
deleted file mode 100644
index a771d42..0000000
--- a/tests/sksl/intrinsics/ClampInt.hlsl
+++ /dev/null
@@ -1,189 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _35 = _10_testInputs * 100.0f;
-    int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
-    int4 intValues = _44;
-    int4 expectedA = int4(-100, 0, 75, 100);
-    int4 expectedB = int4(-100, 0, 50, 225);
-    int _56 = _44.x;
-    bool _69 = false;
-    if (clamp(_56, -100, 100) == (-100))
-    {
-        int2 _60 = clamp(_44.xy, int2(-100, -100), int2(100, 100));
-        _69 = all(bool2(_60.x == int4(-100, 0, 75, 100).xy.x, _60.y == int4(-100, 0, 75, 100).xy.y));
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _81 = false;
-    if (_69)
-    {
-        int3 _72 = clamp(_44.xyz, int3(-100, -100, -100), int3(100, 100, 100));
-        _81 = all(bool3(_72.x == int4(-100, 0, 75, 100).xyz.x, _72.y == int4(-100, 0, 75, 100).xyz.y, _72.z == int4(-100, 0, 75, 100).xyz.z));
-    }
-    else
-    {
-        _81 = false;
-    }
-    bool _90 = false;
-    if (_81)
-    {
-        int4 _84 = clamp(_44, int4(-100, -100, -100, -100), int4(100, 100, 100, 100));
-        _90 = all(bool4(_84.x == int4(-100, 0, 75, 100).x, _84.y == int4(-100, 0, 75, 100).y, _84.z == int4(-100, 0, 75, 100).z, _84.w == int4(-100, 0, 75, 100).w));
-    }
-    else
-    {
-        _90 = false;
-    }
-    bool _94 = false;
-    if (_90)
-    {
-        _94 = true;
-    }
-    else
-    {
-        _94 = false;
-    }
-    bool _101 = false;
-    if (_94)
-    {
-        _101 = all(bool2(int2(-100, 0).x == int4(-100, 0, 75, 100).xy.x, int2(-100, 0).y == int4(-100, 0, 75, 100).xy.y));
-    }
-    else
-    {
-        _101 = false;
-    }
-    bool _108 = false;
-    if (_101)
-    {
-        _108 = all(bool3(int3(-100, 0, 75).x == int4(-100, 0, 75, 100).xyz.x, int3(-100, 0, 75).y == int4(-100, 0, 75, 100).xyz.y, int3(-100, 0, 75).z == int4(-100, 0, 75, 100).xyz.z));
-    }
-    else
-    {
-        _108 = false;
-    }
-    bool _111 = false;
-    if (_108)
-    {
-        _111 = true;
-    }
-    else
-    {
-        _111 = false;
-    }
-    bool _116 = false;
-    if (_111)
-    {
-        _116 = clamp(_56, -100, 100) == (-100);
-    }
-    else
-    {
-        _116 = false;
-    }
-    bool _128 = false;
-    if (_116)
-    {
-        int2 _119 = clamp(_44.xy, int2(-100, -200), int2(100, 200));
-        _128 = all(bool2(_119.x == int4(-100, 0, 50, 225).xy.x, _119.y == int4(-100, 0, 50, 225).xy.y));
-    }
-    else
-    {
-        _128 = false;
-    }
-    bool _138 = false;
-    if (_128)
-    {
-        int3 _131 = clamp(_44.xyz, int3(-100, -200, -200), int3(100, 200, 50));
-        _138 = all(bool3(_131.x == int4(-100, 0, 50, 225).xyz.x, _131.y == int4(-100, 0, 50, 225).xyz.y, _131.z == int4(-100, 0, 50, 225).xyz.z));
-    }
-    else
-    {
-        _138 = false;
-    }
-    bool _147 = false;
-    if (_138)
-    {
-        int4 _141 = clamp(_44, int4(-100, -200, -200, 100), int4(100, 200, 50, 300));
-        _147 = all(bool4(_141.x == int4(-100, 0, 50, 225).x, _141.y == int4(-100, 0, 50, 225).y, _141.z == int4(-100, 0, 50, 225).z, _141.w == int4(-100, 0, 50, 225).w));
-    }
-    else
-    {
-        _147 = false;
-    }
-    bool _150 = false;
-    if (_147)
-    {
-        _150 = true;
-    }
-    else
-    {
-        _150 = false;
-    }
-    bool _156 = false;
-    if (_150)
-    {
-        _156 = all(bool2(int2(-100, 0).x == int4(-100, 0, 50, 225).xy.x, int2(-100, 0).y == int4(-100, 0, 50, 225).xy.y));
-    }
-    else
-    {
-        _156 = false;
-    }
-    bool _163 = false;
-    if (_156)
-    {
-        _163 = all(bool3(int3(-100, 0, 50).x == int4(-100, 0, 50, 225).xyz.x, int3(-100, 0, 50).y == int4(-100, 0, 50, 225).xyz.y, int3(-100, 0, 50).z == int4(-100, 0, 50, 225).xyz.z));
-    }
-    else
-    {
-        _163 = false;
-    }
-    bool _166 = false;
-    if (_163)
-    {
-        _166 = true;
-    }
-    else
-    {
-        _166 = false;
-    }
-    float4 _167 = 0.0f.xxxx;
-    if (_166)
-    {
-        _167 = _10_colorGreen;
-    }
-    else
-    {
-        _167 = _10_colorRed;
-    }
-    return _167;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/ClampUInt.hlsl b/tests/sksl/intrinsics/ClampUInt.hlsl
deleted file mode 100644
index 5cdf90b..0000000
--- a/tests/sksl/intrinsics/ClampUInt.hlsl
+++ /dev/null
@@ -1,189 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _39 = (_10_testInputs * 100.0f) + 200.0f.xxxx;
-    uint4 _48 = uint4(uint(_39.x), uint(_39.y), uint(_39.z), uint(_39.w));
-    uint4 uintValues = _48;
-    uint4 expectedA = uint4(100u, 200u, 275u, 300u);
-    uint4 expectedB = uint4(100u, 200u, 250u, 425u);
-    uint _61 = _48.x;
-    bool _74 = false;
-    if (clamp(_61, 100u, 300u) == 100u)
-    {
-        uint2 _65 = clamp(_48.xy, uint2(100u, 100u), uint2(300u, 300u));
-        _74 = all(bool2(_65.x == uint4(100u, 200u, 275u, 300u).xy.x, _65.y == uint4(100u, 200u, 275u, 300u).xy.y));
-    }
-    else
-    {
-        _74 = false;
-    }
-    bool _86 = false;
-    if (_74)
-    {
-        uint3 _77 = clamp(_48.xyz, uint3(100u, 100u, 100u), uint3(300u, 300u, 300u));
-        _86 = all(bool3(_77.x == uint4(100u, 200u, 275u, 300u).xyz.x, _77.y == uint4(100u, 200u, 275u, 300u).xyz.y, _77.z == uint4(100u, 200u, 275u, 300u).xyz.z));
-    }
-    else
-    {
-        _86 = false;
-    }
-    bool _95 = false;
-    if (_86)
-    {
-        uint4 _89 = clamp(_48, uint4(100u, 100u, 100u, 100u), uint4(300u, 300u, 300u, 300u));
-        _95 = all(bool4(_89.x == uint4(100u, 200u, 275u, 300u).x, _89.y == uint4(100u, 200u, 275u, 300u).y, _89.z == uint4(100u, 200u, 275u, 300u).z, _89.w == uint4(100u, 200u, 275u, 300u).w));
-    }
-    else
-    {
-        _95 = false;
-    }
-    bool _99 = false;
-    if (_95)
-    {
-        _99 = true;
-    }
-    else
-    {
-        _99 = false;
-    }
-    bool _106 = false;
-    if (_99)
-    {
-        _106 = all(bool2(uint2(100u, 200u).x == uint4(100u, 200u, 275u, 300u).xy.x, uint2(100u, 200u).y == uint4(100u, 200u, 275u, 300u).xy.y));
-    }
-    else
-    {
-        _106 = false;
-    }
-    bool _113 = false;
-    if (_106)
-    {
-        _113 = all(bool3(uint3(100u, 200u, 275u).x == uint4(100u, 200u, 275u, 300u).xyz.x, uint3(100u, 200u, 275u).y == uint4(100u, 200u, 275u, 300u).xyz.y, uint3(100u, 200u, 275u).z == uint4(100u, 200u, 275u, 300u).xyz.z));
-    }
-    else
-    {
-        _113 = false;
-    }
-    bool _116 = false;
-    if (_113)
-    {
-        _116 = true;
-    }
-    else
-    {
-        _116 = false;
-    }
-    bool _121 = false;
-    if (_116)
-    {
-        _121 = clamp(_61, 100u, 300u) == 100u;
-    }
-    else
-    {
-        _121 = false;
-    }
-    bool _133 = false;
-    if (_121)
-    {
-        uint2 _124 = clamp(_48.xy, uint2(100u, 0u), uint2(300u, 400u));
-        _133 = all(bool2(_124.x == uint4(100u, 200u, 250u, 425u).xy.x, _124.y == uint4(100u, 200u, 250u, 425u).xy.y));
-    }
-    else
-    {
-        _133 = false;
-    }
-    bool _143 = false;
-    if (_133)
-    {
-        uint3 _136 = clamp(_48.xyz, uint3(100u, 0u, 0u), uint3(300u, 400u, 250u));
-        _143 = all(bool3(_136.x == uint4(100u, 200u, 250u, 425u).xyz.x, _136.y == uint4(100u, 200u, 250u, 425u).xyz.y, _136.z == uint4(100u, 200u, 250u, 425u).xyz.z));
-    }
-    else
-    {
-        _143 = false;
-    }
-    bool _152 = false;
-    if (_143)
-    {
-        uint4 _146 = clamp(_48, uint4(100u, 0u, 0u, 300u), uint4(300u, 400u, 250u, 500u));
-        _152 = all(bool4(_146.x == uint4(100u, 200u, 250u, 425u).x, _146.y == uint4(100u, 200u, 250u, 425u).y, _146.z == uint4(100u, 200u, 250u, 425u).z, _146.w == uint4(100u, 200u, 250u, 425u).w));
-    }
-    else
-    {
-        _152 = false;
-    }
-    bool _155 = false;
-    if (_152)
-    {
-        _155 = true;
-    }
-    else
-    {
-        _155 = false;
-    }
-    bool _161 = false;
-    if (_155)
-    {
-        _161 = all(bool2(uint2(100u, 200u).x == uint4(100u, 200u, 250u, 425u).xy.x, uint2(100u, 200u).y == uint4(100u, 200u, 250u, 425u).xy.y));
-    }
-    else
-    {
-        _161 = false;
-    }
-    bool _168 = false;
-    if (_161)
-    {
-        _168 = all(bool3(uint3(100u, 200u, 250u).x == uint4(100u, 200u, 250u, 425u).xyz.x, uint3(100u, 200u, 250u).y == uint4(100u, 200u, 250u, 425u).xyz.y, uint3(100u, 200u, 250u).z == uint4(100u, 200u, 250u, 425u).xyz.z));
-    }
-    else
-    {
-        _168 = false;
-    }
-    bool _171 = false;
-    if (_168)
-    {
-        _171 = true;
-    }
-    else
-    {
-        _171 = false;
-    }
-    float4 _172 = 0.0f.xxxx;
-    if (_171)
-    {
-        _172 = _10_colorGreen;
-    }
-    else
-    {
-        _172 = _10_colorRed;
-    }
-    return _172;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Cos.hlsl b/tests/sksl/intrinsics/Cos.hlsl
deleted file mode 100644
index dd74512..0000000
--- a/tests/sksl/intrinsics/Cos.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (cos(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = cos(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = cos(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = cos(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 1.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _93 = false;
-    if (_84)
-    {
-        _93 = all(bool2(1.0f.xx.x == _10_expected.xy.x, 1.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _102 = false;
-    if (_93)
-    {
-        _102 = all(bool3(1.0f.xxx.x == _10_expected.xyz.x, 1.0f.xxx.y == _10_expected.xyz.y, 1.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _102 = false;
-    }
-    bool _110 = false;
-    if (_102)
-    {
-        _110 = all(bool4(1.0f.xxxx.x == _10_expected.x, 1.0f.xxxx.y == _10_expected.y, 1.0f.xxxx.z == _10_expected.z, 1.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _110 = false;
-    }
-    float4 _111 = 0.0f.xxxx;
-    if (_110)
-    {
-        _111 = _10_colorGreen;
-    }
-    else
-    {
-        _111 = _10_colorRed;
-    }
-    return _111;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Cosh.hlsl b/tests/sksl/intrinsics/Cosh.hlsl
deleted file mode 100644
index 69c9582..0000000
--- a/tests/sksl/intrinsics/Cosh.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (cosh(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = cosh(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = cosh(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = cosh(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 1.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _93 = false;
-    if (_84)
-    {
-        _93 = all(bool2(1.0f.xx.x == _10_expected.xy.x, 1.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _102 = false;
-    if (_93)
-    {
-        _102 = all(bool3(1.0f.xxx.x == _10_expected.xyz.x, 1.0f.xxx.y == _10_expected.xyz.y, 1.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _102 = false;
-    }
-    bool _110 = false;
-    if (_102)
-    {
-        _110 = all(bool4(1.0f.xxxx.x == _10_expected.x, 1.0f.xxxx.y == _10_expected.y, 1.0f.xxxx.z == _10_expected.z, 1.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _110 = false;
-    }
-    float4 _111 = 0.0f.xxxx;
-    if (_110)
-    {
-        _111 = _10_colorGreen;
-    }
-    else
-    {
-        _111 = _10_colorRed;
-    }
-    return _111;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Cross.hlsl b/tests/sksl/intrinsics/Cross.hlsl
deleted file mode 100644
index 7689c2c..0000000
--- a/tests/sksl/intrinsics/Cross.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float2 _10_ah : packoffset(c0);
-    float2 _10_bh : packoffset(c0.z);
-    float2 _10_af : packoffset(c1);
-    float2 _10_bf : packoffset(c1.z);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor.x = determinant(float2x2(_10_ah, _10_bh));
-    sk_FragColor.y = determinant(float2x2(_10_af, _10_bf));
-    sk_FragColor.z = 12.0f;
-    sk_FragColor = float4(float3(-8.0f, -8.0f, 12.0f).x, float3(-8.0f, -8.0f, 12.0f).y, float3(-8.0f, -8.0f, 12.0f).z, sk_FragColor.w);
-    sk_FragColor = float4(sk_FragColor.x, float3(9.0f, -18.0f, -9.0f).x, float3(9.0f, -18.0f, -9.0f).y, float3(9.0f, -18.0f, -9.0f).z);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/CrossNoInline.hlsl b/tests/sksl/intrinsics/CrossNoInline.hlsl
deleted file mode 100644
index 28a039b..0000000
--- a/tests/sksl/intrinsics/CrossNoInline.hlsl
+++ /dev/null
@@ -1,43 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float2 _12_ah : packoffset(c0);
-    float2 _12_bh : packoffset(c0.z);
-    float2 _12_af : packoffset(c1);
-    float2 _12_bf : packoffset(c1.z);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float cross_length_2d_hh2h2(float2 _26, float2 _27)
-{
-    return determinant(float2x2(_26, _27));
-}
-
-float cross_length_2d_ff2f2(float2 _18, float2 _19)
-{
-    return determinant(float2x2(_18, _19));
-}
-
-void frag_main()
-{
-    float2 _41 = _12_ah;
-    float2 _45 = _12_bh;
-    sk_FragColor.x = cross_length_2d_hh2h2(_41, _45);
-    float2 _52 = _12_af;
-    float2 _56 = _12_bf;
-    sk_FragColor.y = cross_length_2d_ff2f2(_52, _56);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/DFdx.hlsl b/tests/sksl/intrinsics/DFdx.hlsl
deleted file mode 100644
index 3e6169b..0000000
--- a/tests/sksl/intrinsics/DFdx.hlsl
+++ /dev/null
@@ -1,103 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = 0.0f.xxxx;
-    bool _48 = false;
-    if (ddx(_10_testInputs.x) == 0.0f)
-    {
-        float2 _40 = ddx(_10_testInputs.xy);
-        _48 = all(bool2(_40.x == 0.0f.xxxx.xy.x, _40.y == 0.0f.xxxx.xy.y));
-    }
-    else
-    {
-        _48 = false;
-    }
-    bool _60 = false;
-    if (_48)
-    {
-        float3 _51 = ddx(_10_testInputs.xyz);
-        _60 = all(bool3(_51.x == 0.0f.xxxx.xyz.x, _51.y == 0.0f.xxxx.xyz.y, _51.z == 0.0f.xxxx.xyz.z));
-    }
-    else
-    {
-        _60 = false;
-    }
-    bool _69 = false;
-    if (_60)
-    {
-        float4 _63 = ddx(_10_testInputs);
-        _69 = all(bool4(_63.x == 0.0f.xxxx.x, _63.y == 0.0f.xxxx.y, _63.z == 0.0f.xxxx.z, _63.w == 0.0f.xxxx.w));
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _80 = false;
-    if (_69)
-    {
-        float2 _72 = sign(ddx(_24.xx));
-        _80 = all(bool2(_72.x == 1.0f.xx.x, _72.y == 1.0f.xx.y));
-    }
-    else
-    {
-        _80 = false;
-    }
-    bool _89 = false;
-    if (_80)
-    {
-        float2 _83 = sign(ddx(_24.yy));
-        _89 = all(bool2(_83.x == 0.0f.xx.x, _83.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _89 = false;
-    }
-    bool _98 = false;
-    if (_89)
-    {
-        float2 _92 = sign(ddx(_24));
-        _98 = all(bool2(_92.x == float2(1.0f, 0.0f).x, _92.y == float2(1.0f, 0.0f).y));
-    }
-    else
-    {
-        _98 = false;
-    }
-    float4 _99 = 0.0f.xxxx;
-    if (_98)
-    {
-        _99 = _10_colorGreen;
-    }
-    else
-    {
-        _99 = _10_colorRed;
-    }
-    return _99;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/DFdy.hlsl b/tests/sksl/intrinsics/DFdy.hlsl
deleted file mode 100644
index b436642..0000000
--- a/tests/sksl/intrinsics/DFdy.hlsl
+++ /dev/null
@@ -1,104 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_testInputs : packoffset(c0);
-    float4 _11_colorGreen : packoffset(c1);
-    float4 _11_colorRed : packoffset(c2);
-    float2 _11_u_skRTFlip : packoffset(c1024);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 expected = 0.0f.xxxx;
-    bool _60 = false;
-    if ((ddy(_11_testInputs.x) * _11_u_skRTFlip.y) == 0.0f)
-    {
-        float2 _55 = ddy(_11_testInputs.xy) * _11_u_skRTFlip.y.xx;
-        _60 = all(bool2(_55.x == 0.0f.xxxx.xy.x, _55.y == 0.0f.xxxx.xy.y));
-    }
-    else
-    {
-        _60 = false;
-    }
-    bool _77 = false;
-    if (_60)
-    {
-        float3 _72 = ddy(_11_testInputs.xyz) * _11_u_skRTFlip.y.xxx;
-        _77 = all(bool3(_72.x == 0.0f.xxxx.xyz.x, _72.y == 0.0f.xxxx.xyz.y, _72.z == 0.0f.xxxx.xyz.z));
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _91 = false;
-    if (_77)
-    {
-        float4 _87 = ddy(_11_testInputs) * _11_u_skRTFlip.y.xxxx;
-        _91 = all(bool4(_87.x == 0.0f.xxxx.x, _87.y == 0.0f.xxxx.y, _87.z == 0.0f.xxxx.z, _87.w == 0.0f.xxxx.w));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _105 = false;
-    if (_91)
-    {
-        float2 _94 = sign(ddy(_25.xx) * _11_u_skRTFlip.y.xx);
-        _105 = all(bool2(_94.x == 0.0f.xx.x, _94.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _105 = false;
-    }
-    bool _121 = false;
-    if (_105)
-    {
-        float2 _108 = sign(ddy(_25.yy) * _11_u_skRTFlip.y.xx);
-        _121 = all(bool2(_108.x == 1.0f.xx.x, _108.y == 1.0f.xx.y));
-    }
-    else
-    {
-        _121 = false;
-    }
-    bool _135 = false;
-    if (_121)
-    {
-        float2 _124 = sign(ddy(_25) * _11_u_skRTFlip.y.xx);
-        _135 = all(bool2(_124.x == float2(0.0f, 1.0f).x, _124.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _135 = false;
-    }
-    float4 _136 = 0.0f.xxxx;
-    if (_135)
-    {
-        _136 = _11_colorGreen;
-    }
-    else
-    {
-        _136 = _11_colorRed;
-    }
-    return _136;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl b/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl
deleted file mode 100644
index 05ad24b..0000000
--- a/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl
+++ /dev/null
@@ -1,103 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = 0.0f.xxxx;
-    bool _48 = false;
-    if (ddy(_10_testInputs.x) == 0.0f)
-    {
-        float2 _40 = ddy(_10_testInputs.xy);
-        _48 = all(bool2(_40.x == 0.0f.xxxx.xy.x, _40.y == 0.0f.xxxx.xy.y));
-    }
-    else
-    {
-        _48 = false;
-    }
-    bool _60 = false;
-    if (_48)
-    {
-        float3 _51 = ddy(_10_testInputs.xyz);
-        _60 = all(bool3(_51.x == 0.0f.xxxx.xyz.x, _51.y == 0.0f.xxxx.xyz.y, _51.z == 0.0f.xxxx.xyz.z));
-    }
-    else
-    {
-        _60 = false;
-    }
-    bool _69 = false;
-    if (_60)
-    {
-        float4 _63 = ddy(_10_testInputs);
-        _69 = all(bool4(_63.x == 0.0f.xxxx.x, _63.y == 0.0f.xxxx.y, _63.z == 0.0f.xxxx.z, _63.w == 0.0f.xxxx.w));
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _78 = false;
-    if (_69)
-    {
-        float2 _72 = sign(ddy(_24.xx));
-        _78 = all(bool2(_72.x == 0.0f.xx.x, _72.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _89 = false;
-    if (_78)
-    {
-        float2 _81 = sign(ddy(_24.yy));
-        _89 = all(bool2(_81.x == 1.0f.xx.x, _81.y == 1.0f.xx.y));
-    }
-    else
-    {
-        _89 = false;
-    }
-    bool _98 = false;
-    if (_89)
-    {
-        float2 _92 = sign(ddy(_24));
-        _98 = all(bool2(_92.x == float2(0.0f, 1.0f).x, _92.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _98 = false;
-    }
-    float4 _99 = 0.0f.xxxx;
-    if (_98)
-    {
-        _99 = _10_colorGreen;
-    }
-    else
-    {
-        _99 = _10_colorRed;
-    }
-    return _99;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Degrees.hlsl b/tests/sksl/intrinsics/Degrees.hlsl
deleted file mode 100644
index b99be45..0000000
--- a/tests/sksl/intrinsics/Degrees.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (degrees(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = degrees(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = degrees(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = degrees(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 90.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _94 = false;
-    if (_84)
-    {
-        _94 = all(bool2(float2(90.0f, 180.0f).x == _10_expected.xy.x, float2(90.0f, 180.0f).y == _10_expected.xy.y));
-    }
-    else
-    {
-        _94 = false;
-    }
-    bool _104 = false;
-    if (_94)
-    {
-        _104 = all(bool3(float3(90.0f, 180.0f, 270.0f).x == _10_expected.xyz.x, float3(90.0f, 180.0f, 270.0f).y == _10_expected.xyz.y, float3(90.0f, 180.0f, 270.0f).z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _113 = false;
-    if (_104)
-    {
-        _113 = all(bool4(float4(90.0f, 180.0f, 270.0f, 360.0f).x == _10_expected.x, float4(90.0f, 180.0f, 270.0f, 360.0f).y == _10_expected.y, float4(90.0f, 180.0f, 270.0f, 360.0f).z == _10_expected.z, float4(90.0f, 180.0f, 270.0f, 360.0f).w == _10_expected.w));
-    }
-    else
-    {
-        _113 = false;
-    }
-    float4 _114 = 0.0f.xxxx;
-    if (_113)
-    {
-        _114 = _10_colorGreen;
-    }
-    else
-    {
-        _114 = _10_colorRed;
-    }
-    return _114;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Determinant.hlsl b/tests/sksl/intrinsics/Determinant.hlsl
deleted file mode 100644
index 2f7be95..0000000
--- a/tests/sksl/intrinsics/Determinant.hlsl
+++ /dev/null
@@ -1,42 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _35 = 0.0f.xxxx;
-    if (determinant(_10_testMatrix2x2) == (-2.0f))
-    {
-        _35 = _10_colorGreen;
-    }
-    else
-    {
-        _35 = _10_colorRed;
-    }
-    return _35;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Distance.hlsl b/tests/sksl/intrinsics/Distance.hlsl
deleted file mode 100644
index e1af17e..0000000
--- a/tests/sksl/intrinsics/Distance.hlsl
+++ /dev/null
@@ -1,107 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_pos1 : packoffset(c0);
-    float4 _10_pos2 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(3.0f, 3.0f, 5.0f, 13.0f);
-    bool _55 = false;
-    if (distance(_10_pos1.x, _10_pos2.x) == 3.0f)
-    {
-        _55 = distance(_10_pos1.xy, _10_pos2.xy) == 3.0f;
-    }
-    else
-    {
-        _55 = false;
-    }
-    bool _67 = false;
-    if (_55)
-    {
-        _67 = distance(_10_pos1.xyz, _10_pos2.xyz) == 5.0f;
-    }
-    else
-    {
-        _67 = false;
-    }
-    bool _76 = false;
-    if (_67)
-    {
-        _76 = distance(_10_pos1, _10_pos2) == 13.0f;
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _80 = false;
-    if (_76)
-    {
-        _80 = true;
-    }
-    else
-    {
-        _80 = false;
-    }
-    bool _83 = false;
-    if (_80)
-    {
-        _83 = true;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _86 = false;
-    if (_83)
-    {
-        _86 = true;
-    }
-    else
-    {
-        _86 = false;
-    }
-    bool _89 = false;
-    if (_86)
-    {
-        _89 = true;
-    }
-    else
-    {
-        _89 = false;
-    }
-    float4 _90 = 0.0f.xxxx;
-    if (_89)
-    {
-        _90 = _10_colorGreen;
-    }
-    else
-    {
-        _90 = _10_colorRed;
-    }
-    return _90;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Dot.hlsl b/tests/sksl/intrinsics/Dot.hlsl
deleted file mode 100644
index ba03ea2..0000000
--- a/tests/sksl/intrinsics/Dot.hlsl
+++ /dev/null
@@ -1,107 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputA : packoffset(c0);
-    float4 _10_inputB : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(5.0f, 17.0f, 38.0f, 70.0f);
-    bool _56 = false;
-    if ((_10_inputA.x * _10_inputB.x) == 5.0f)
-    {
-        _56 = dot(_10_inputA.xy, _10_inputB.xy) == 17.0f;
-    }
-    else
-    {
-        _56 = false;
-    }
-    bool _68 = false;
-    if (_56)
-    {
-        _68 = dot(_10_inputA.xyz, _10_inputB.xyz) == 38.0f;
-    }
-    else
-    {
-        _68 = false;
-    }
-    bool _77 = false;
-    if (_68)
-    {
-        _77 = dot(_10_inputA, _10_inputB) == 70.0f;
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _81 = false;
-    if (_77)
-    {
-        _81 = true;
-    }
-    else
-    {
-        _81 = false;
-    }
-    bool _84 = false;
-    if (_81)
-    {
-        _84 = true;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _87 = false;
-    if (_84)
-    {
-        _87 = true;
-    }
-    else
-    {
-        _87 = false;
-    }
-    bool _90 = false;
-    if (_87)
-    {
-        _90 = true;
-    }
-    else
-    {
-        _90 = false;
-    }
-    float4 _91 = 0.0f.xxxx;
-    if (_90)
-    {
-        _91 = _10_colorGreen;
-    }
-    else
-    {
-        _91 = _10_colorRed;
-    }
-    return _91;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Equal.hlsl b/tests/sksl/intrinsics/Equal.hlsl
deleted file mode 100644
index 0ff6659..0000000
--- a/tests/sksl/intrinsics/Equal.hlsl
+++ /dev/null
@@ -1,54 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-    uint2 _10_c : packoffset(c2);
-    uint2 _10_d : packoffset(c2.z);
-    int3 _10_e : packoffset(c3);
-    int3 _10_f : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool4 expectTTFF = bool4(true, true, false, false);
-    bool4 expectFFTT = bool4(false, false, true, true);
-    bool4 expectTTTT = bool4(true, true, true, true);
-    sk_FragColor.x = float(int(bool4(_10_a.x == _10_b.x, _10_a.y == _10_b.y, _10_a.z == _10_b.z, _10_a.w == _10_b.w).x));
-    sk_FragColor.y = float(int(bool2(_10_c.x == _10_d.x, _10_c.y == _10_d.y).y));
-    sk_FragColor.z = float(int(bool3(_10_e.x == _10_f.x, _10_e.y == _10_f.y, _10_e.z == _10_f.z).z));
-    bool _75 = false;
-    if (any(expectTTFF))
-    {
-        _75 = true;
-    }
-    else
-    {
-        _75 = any(expectFFTT);
-    }
-    bool _80 = false;
-    if (_75)
-    {
-        _80 = true;
-    }
-    else
-    {
-        _80 = any(expectTTTT);
-    }
-    sk_FragColor.w = float(int(_80));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Exp.hlsl b/tests/sksl/intrinsics/Exp.hlsl
deleted file mode 100644
index b6deea2..0000000
--- a/tests/sksl/intrinsics/Exp.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (exp(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = exp(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = exp(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = exp(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 1.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _93 = false;
-    if (_84)
-    {
-        _93 = all(bool2(1.0f.xx.x == _10_expected.xy.x, 1.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _102 = false;
-    if (_93)
-    {
-        _102 = all(bool3(1.0f.xxx.x == _10_expected.xyz.x, 1.0f.xxx.y == _10_expected.xyz.y, 1.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _102 = false;
-    }
-    bool _110 = false;
-    if (_102)
-    {
-        _110 = all(bool4(1.0f.xxxx.x == _10_expected.x, 1.0f.xxxx.y == _10_expected.y, 1.0f.xxxx.z == _10_expected.z, 1.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _110 = false;
-    }
-    float4 _111 = 0.0f.xxxx;
-    if (_110)
-    {
-        _111 = _10_colorGreen;
-    }
-    else
-    {
-        _111 = _10_colorRed;
-    }
-    return _111;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Exp2.hlsl b/tests/sksl/intrinsics/Exp2.hlsl
deleted file mode 100644
index f577435..0000000
--- a/tests/sksl/intrinsics/Exp2.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (exp2(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = exp2(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = exp2(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = exp2(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 1.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _94 = false;
-    if (_84)
-    {
-        _94 = all(bool2(float2(1.0f, 2.0f).x == _10_expected.xy.x, float2(1.0f, 2.0f).y == _10_expected.xy.y));
-    }
-    else
-    {
-        _94 = false;
-    }
-    bool _104 = false;
-    if (_94)
-    {
-        _104 = all(bool3(float3(1.0f, 2.0f, 4.0f).x == _10_expected.xyz.x, float3(1.0f, 2.0f, 4.0f).y == _10_expected.xyz.y, float3(1.0f, 2.0f, 4.0f).z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _113 = false;
-    if (_104)
-    {
-        _113 = all(bool4(float4(1.0f, 2.0f, 4.0f, 8.0f).x == _10_expected.x, float4(1.0f, 2.0f, 4.0f, 8.0f).y == _10_expected.y, float4(1.0f, 2.0f, 4.0f, 8.0f).z == _10_expected.z, float4(1.0f, 2.0f, 4.0f, 8.0f).w == _10_expected.w));
-    }
-    else
-    {
-        _113 = false;
-    }
-    float4 _114 = 0.0f.xxxx;
-    if (_113)
-    {
-        _114 = _10_colorGreen;
-    }
-    else
-    {
-        _114 = _10_colorRed;
-    }
-    return _114;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/FaceForward.hlsl b/tests/sksl/intrinsics/FaceForward.hlsl
deleted file mode 100644
index 9c71cf3..0000000
--- a/tests/sksl/intrinsics/FaceForward.hlsl
+++ /dev/null
@@ -1,117 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_N : packoffset(c0);
-    float4 _10_I : packoffset(c1);
-    float4 _10_NRef : packoffset(c2);
-    float4 _10_colorGreen : packoffset(c3);
-    float4 _10_colorRed : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float spvFaceForward(float n, float i, float nref)
-{
-    return i * nref < 0.0 ? n : -n;
-}
-
-float4 main(float2 _24)
-{
-    float4 expectedPos = float4(1.0f, 2.0f, 3.0f, 4.0f);
-    float4 expectedNeg = float4(-1.0f, -2.0f, -3.0f, -4.0f);
-    bool _72 = false;
-    if (spvFaceForward(_10_N.x, _10_I.x, _10_NRef.x) == (-1.0f))
-    {
-        float2 _58 = faceforward(_10_N.xy, _10_I.xy, _10_NRef.xy);
-        _72 = all(bool2(_58.x == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.x, _58.y == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.y));
-    }
-    else
-    {
-        _72 = false;
-    }
-    bool _90 = false;
-    if (_72)
-    {
-        float3 _75 = faceforward(_10_N.xyz, _10_I.xyz, _10_NRef.xyz);
-        _90 = all(bool3(_75.x == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.x, _75.y == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.y, _75.z == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.z));
-    }
-    else
-    {
-        _90 = false;
-    }
-    bool _103 = false;
-    if (_90)
-    {
-        float4 _93 = faceforward(_10_N, _10_I, _10_NRef);
-        _103 = all(bool4(_93.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _93.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _93.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _93.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _107 = false;
-    if (_103)
-    {
-        _107 = true;
-    }
-    else
-    {
-        _107 = false;
-    }
-    bool _114 = false;
-    if (_107)
-    {
-        _114 = all(bool2(float2(-1.0f, -2.0f).x == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.x, float2(-1.0f, -2.0f).y == float4(-1.0f, -2.0f, -3.0f, -4.0f).xy.y));
-    }
-    else
-    {
-        _114 = false;
-    }
-    bool _121 = false;
-    if (_114)
-    {
-        _121 = all(bool3(float3(1.0f, 2.0f, 3.0f).x == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.x, float3(1.0f, 2.0f, 3.0f).y == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.y, float3(1.0f, 2.0f, 3.0f).z == float4(1.0f, 2.0f, 3.0f, 4.0f).xyz.z));
-    }
-    else
-    {
-        _121 = false;
-    }
-    bool _124 = false;
-    if (_121)
-    {
-        _124 = true;
-    }
-    else
-    {
-        _124 = false;
-    }
-    float4 _125 = 0.0f.xxxx;
-    if (_124)
-    {
-        _125 = _10_colorGreen;
-    }
-    else
-    {
-        _125 = _10_colorRed;
-    }
-    return _125;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/FindLSB.hlsl b/tests/sksl/intrinsics/FindLSB.hlsl
deleted file mode 100644
index 6517685..0000000
--- a/tests/sksl/intrinsics/FindLSB.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    int _10_a : packoffset(c0);
-    uint _10_b : packoffset(c0.y);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor.x = float(firstbitlow(_10_a));
-    sk_FragColor.y = float(int(firstbitlow(_10_b)));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/FindMSB.hlsl b/tests/sksl/intrinsics/FindMSB.hlsl
deleted file mode 100644
index 30ea09e..0000000
--- a/tests/sksl/intrinsics/FindMSB.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    int _10_a : packoffset(c0);
-    uint _10_b : packoffset(c0.y);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor.x = float(firstbithigh(_10_a));
-    sk_FragColor.y = float(int(firstbithigh(_10_b)));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/FloatBitsToInt.hlsl b/tests/sksl/intrinsics/FloatBitsToInt.hlsl
deleted file mode 100644
index c9687fa..0000000
--- a/tests/sksl/intrinsics/FloatBitsToInt.hlsl
+++ /dev/null
@@ -1,75 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_testInput : packoffset(c0);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c3);
-    float4 _10_colorRed : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
-    float4 inputVal = _42;
-    bool _58 = false;
-    if (asint(_42.x) == 1065353216)
-    {
-        int2 _50 = asint(_42.xy);
-        _58 = all(bool2(_50.x == int2(1065353216, 1073741824).x, _50.y == int2(1065353216, 1073741824).y));
-    }
-    else
-    {
-        _58 = false;
-    }
-    bool _70 = false;
-    if (_58)
-    {
-        int3 _61 = asint(_42.xyz);
-        _70 = all(bool3(_61.x == int3(1065353216, 1073741824, -1069547520).x, _61.y == int3(1065353216, 1073741824, -1069547520).y, _61.z == int3(1065353216, 1073741824, -1069547520).z));
-    }
-    else
-    {
-        _70 = false;
-    }
-    bool _80 = false;
-    if (_70)
-    {
-        int4 _73 = asint(_42);
-        _80 = all(bool4(_73.x == int4(1065353216, 1073741824, -1069547520, -1065353216).x, _73.y == int4(1065353216, 1073741824, -1069547520, -1065353216).y, _73.z == int4(1065353216, 1073741824, -1069547520, -1065353216).z, _73.w == int4(1065353216, 1073741824, -1069547520, -1065353216).w));
-    }
-    else
-    {
-        _80 = false;
-    }
-    float4 _81 = 0.0f.xxxx;
-    if (_80)
-    {
-        _81 = _10_colorGreen;
-    }
-    else
-    {
-        _81 = _10_colorRed;
-    }
-    return _81;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/FloatBitsToUint.hlsl b/tests/sksl/intrinsics/FloatBitsToUint.hlsl
deleted file mode 100644
index f8eff1c..0000000
--- a/tests/sksl/intrinsics/FloatBitsToUint.hlsl
+++ /dev/null
@@ -1,75 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_testInput : packoffset(c0);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c3);
-    float4 _10_colorRed : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
-    float4 inputVal = _42;
-    bool _59 = false;
-    if (asuint(_42.x) == 1065353216u)
-    {
-        uint2 _51 = asuint(_42.xy);
-        _59 = all(bool2(_51.x == uint2(1065353216u, 1073741824u).x, _51.y == uint2(1065353216u, 1073741824u).y));
-    }
-    else
-    {
-        _59 = false;
-    }
-    bool _71 = false;
-    if (_59)
-    {
-        uint3 _62 = asuint(_42.xyz);
-        _71 = all(bool3(_62.x == uint3(1065353216u, 1073741824u, 3225419776u).x, _62.y == uint3(1065353216u, 1073741824u, 3225419776u).y, _62.z == uint3(1065353216u, 1073741824u, 3225419776u).z));
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _81 = false;
-    if (_71)
-    {
-        uint4 _74 = asuint(_42);
-        _81 = all(bool4(_74.x == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).x, _74.y == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).y, _74.z == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).z, _74.w == uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).w));
-    }
-    else
-    {
-        _81 = false;
-    }
-    float4 _82 = 0.0f.xxxx;
-    if (_81)
-    {
-        _82 = _10_colorGreen;
-    }
-    else
-    {
-        _82 = _10_colorRed;
-    }
-    return _82;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Floor.hlsl b/tests/sksl/intrinsics/Floor.hlsl
deleted file mode 100644
index 54dac70..0000000
--- a/tests/sksl/intrinsics/Floor.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(-2.0f, 0.0f, 0.0f, 2.0f);
-    bool _50 = false;
-    if (floor(_10_testInputs.x) == (-2.0f))
-    {
-        float2 _42 = floor(_10_testInputs.xy);
-        _50 = all(bool2(_42.x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.x, _42.y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.y));
-    }
-    else
-    {
-        _50 = false;
-    }
-    bool _62 = false;
-    if (_50)
-    {
-        float3 _53 = floor(_10_testInputs.xyz);
-        _62 = all(bool3(_53.x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.x, _53.y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.y, _53.z == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.z));
-    }
-    else
-    {
-        _62 = false;
-    }
-    bool _71 = false;
-    if (_62)
-    {
-        float4 _65 = floor(_10_testInputs);
-        _71 = all(bool4(_65.x == float4(-2.0f, 0.0f, 0.0f, 2.0f).x, _65.y == float4(-2.0f, 0.0f, 0.0f, 2.0f).y, _65.z == float4(-2.0f, 0.0f, 0.0f, 2.0f).z, _65.w == float4(-2.0f, 0.0f, 0.0f, 2.0f).w));
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _75 = false;
-    if (_71)
-    {
-        _75 = true;
-    }
-    else
-    {
-        _75 = false;
-    }
-    bool _82 = false;
-    if (_75)
-    {
-        _82 = all(bool2(float2(-2.0f, 0.0f).x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.x, float2(-2.0f, 0.0f).y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xy.y));
-    }
-    else
-    {
-        _82 = false;
-    }
-    bool _89 = false;
-    if (_82)
-    {
-        _89 = all(bool3(float3(-2.0f, 0.0f, 0.0f).x == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.x, float3(-2.0f, 0.0f, 0.0f).y == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.y, float3(-2.0f, 0.0f, 0.0f).z == float4(-2.0f, 0.0f, 0.0f, 2.0f).xyz.z));
-    }
-    else
-    {
-        _89 = false;
-    }
-    bool _92 = false;
-    if (_89)
-    {
-        _92 = true;
-    }
-    else
-    {
-        _92 = false;
-    }
-    float4 _93 = 0.0f.xxxx;
-    if (_92)
-    {
-        _93 = _10_colorGreen;
-    }
-    else
-    {
-        _93 = _10_colorRed;
-    }
-    return _93;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Fma.hlsl b/tests/sksl/intrinsics/Fma.hlsl
deleted file mode 100644
index d1a84b8..0000000
--- a/tests/sksl/intrinsics/Fma.hlsl
+++ /dev/null
@@ -1,56 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float _10_testArray[5] : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    float one = _10_testArray[0];
-    float two = _10_testArray[1];
-    float three = _10_testArray[2];
-    float four = _10_testArray[3];
-    float five = _10_testArray[4];
-    bool _66 = false;
-    if (mad(_10_testArray[0], _10_testArray[1], _10_testArray[2]) == 5.0f)
-    {
-        _66 = mad(_10_testArray[2], _10_testArray[3], _10_testArray[4]) == 17.0f;
-    }
-    else
-    {
-        _66 = false;
-    }
-    float4 _67 = 0.0f.xxxx;
-    if (_66)
-    {
-        _67 = _10_colorGreen;
-    }
-    else
-    {
-        _67 = _10_colorRed;
-    }
-    return _67;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Fract.hlsl b/tests/sksl/intrinsics/Fract.hlsl
deleted file mode 100644
index f91ad22..0000000
--- a/tests/sksl/intrinsics/Fract.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (frac(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = frac(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = frac(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = frac(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _93 = false;
-    if (_83)
-    {
-        _93 = all(bool2(float2(0.0f, 0.25f).x == _10_expected.xy.x, float2(0.0f, 0.25f).y == _10_expected.xy.y));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _103 = false;
-    if (_93)
-    {
-        _103 = all(bool3(float3(0.0f, 0.25f, 0.5f).x == _10_expected.xyz.x, float3(0.0f, 0.25f, 0.5f).y == _10_expected.xyz.y, float3(0.0f, 0.25f, 0.5f).z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _112 = false;
-    if (_103)
-    {
-        _112 = all(bool4(float4(0.0f, 0.25f, 0.5f, 0.75f).x == _10_expected.x, float4(0.0f, 0.25f, 0.5f, 0.75f).y == _10_expected.y, float4(0.0f, 0.25f, 0.5f, 0.75f).z == _10_expected.z, float4(0.0f, 0.25f, 0.5f, 0.75f).w == _10_expected.w));
-    }
-    else
-    {
-        _112 = false;
-    }
-    float4 _113 = 0.0f.xxxx;
-    if (_112)
-    {
-        _113 = _10_colorGreen;
-    }
-    else
-    {
-        _113 = _10_colorRed;
-    }
-    return _113;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Frexp.hlsl b/tests/sksl/intrinsics/Frexp.hlsl
deleted file mode 100644
index 11be8a4..0000000
--- a/tests/sksl/intrinsics/Frexp.hlsl
+++ /dev/null
@@ -1,106 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _35 = _10_colorGreen.yyyy * 6.0f;
-    float4 value = _35;
-    int4 _exp = int4(0, 0, 0, 0);
-    int _47 = 0;
-    float _43 = frexp(_35.x, _47);
-    _exp.x = _47;
-    float4 result = 0.0f.xxxx;
-    result.x = _43;
-    bool _62 = false;
-    if (result.x == 0.75f)
-    {
-        _62 = _exp.x == 3;
-    }
-    else
-    {
-        _62 = false;
-    }
-    bool4 ok = bool4(false, false, false, false);
-    ok.x = _62;
-    int2 _68 = int2(0, 0);
-    float2 _65 = frexp(value.xy, _68);
-    int4 _72 = _exp;
-    _exp = int4(_68.x, _68.y, _72.z, _72.w);
-    float4 _74 = result;
-    result = float4(_65.x, _65.y, _74.z, _74.w);
-    bool _82 = false;
-    if (float4(_65.x, _65.y, _74.z, _74.w).y == 0.75f)
-    {
-        _82 = int4(_68.x, _68.y, _72.z, _72.w).y == 3;
-    }
-    else
-    {
-        _82 = false;
-    }
-    ok.y = _82;
-    int3 _89 = int3(0, 0, 0);
-    float3 _85 = frexp(value.xyz, _89);
-    int4 _93 = _exp;
-    _exp = int4(_89.x, _89.y, _89.z, _93.w);
-    float4 _95 = result;
-    result = float4(_85.x, _85.y, _85.z, _95.w);
-    bool _103 = false;
-    if (float4(_85.x, _85.y, _85.z, _95.w).z == 0.75f)
-    {
-        _103 = int4(_89.x, _89.y, _89.z, _93.w).z == 3;
-    }
-    else
-    {
-        _103 = false;
-    }
-    ok.z = _103;
-    int4 _108 = int4(0, 0, 0, 0);
-    float4 _106 = frexp(value, _108);
-    _exp = _108;
-    result = _106;
-    bool _116 = false;
-    if (_106.w == 0.75f)
-    {
-        _116 = _108.w == 3;
-    }
-    else
-    {
-        _116 = false;
-    }
-    ok.w = _116;
-    float4 _120 = 0.0f.xxxx;
-    if (all(ok))
-    {
-        _120 = _10_colorGreen;
-    }
-    else
-    {
-        _120 = _10_colorRed;
-    }
-    return _120;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Fwidth.hlsl b/tests/sksl/intrinsics/Fwidth.hlsl
deleted file mode 100644
index 3f140fd..0000000
--- a/tests/sksl/intrinsics/Fwidth.hlsl
+++ /dev/null
@@ -1,123 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = 0.0f.xxxx;
-    bool _48 = false;
-    if (ddx(_10_testInputs.x) == 0.0f)
-    {
-        float2 _40 = ddx(_10_testInputs.xy);
-        _48 = all(bool2(_40.x == 0.0f.xxxx.xy.x, _40.y == 0.0f.xxxx.xy.y));
-    }
-    else
-    {
-        _48 = false;
-    }
-    bool _60 = false;
-    if (_48)
-    {
-        float3 _51 = ddx(_10_testInputs.xyz);
-        _60 = all(bool3(_51.x == 0.0f.xxxx.xyz.x, _51.y == 0.0f.xxxx.xyz.y, _51.z == 0.0f.xxxx.xyz.z));
-    }
-    else
-    {
-        _60 = false;
-    }
-    bool _69 = false;
-    if (_60)
-    {
-        float4 _63 = ddx(_10_testInputs);
-        _69 = all(bool4(_63.x == 0.0f.xxxx.x, _63.y == 0.0f.xxxx.y, _63.z == 0.0f.xxxx.z, _63.w == 0.0f.xxxx.w));
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _80 = false;
-    if (_69)
-    {
-        float2 _72 = sign(fwidth(_24.xx));
-        _80 = all(bool2(_72.x == 1.0f.xx.x, _72.y == 1.0f.xx.y));
-    }
-    else
-    {
-        _80 = false;
-    }
-    bool _91 = false;
-    if (_80)
-    {
-        float2 _83 = sign(fwidth(float2(_24.x, 1.0f)));
-        _91 = all(bool2(_83.x == float2(1.0f, 0.0f).x, _83.y == float2(1.0f, 0.0f).y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        float2 _94 = sign(fwidth(_24.yy));
-        _100 = all(bool2(_94.x == 1.0f.xx.x, _94.y == 1.0f.xx.y));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _111 = false;
-    if (_100)
-    {
-        float2 _103 = sign(fwidth(float2(0.0f, _24.y)));
-        _111 = all(bool2(_103.x == float2(0.0f, 1.0f).x, _103.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _111 = false;
-    }
-    bool _119 = false;
-    if (_111)
-    {
-        float2 _114 = sign(fwidth(_24));
-        _119 = all(bool2(_114.x == 1.0f.xx.x, _114.y == 1.0f.xx.y));
-    }
-    else
-    {
-        _119 = false;
-    }
-    float4 _120 = 0.0f.xxxx;
-    if (_119)
-    {
-        _120 = _10_colorGreen;
-    }
-    else
-    {
-        _120 = _10_colorRed;
-    }
-    return _120;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/GreaterThan.hlsl b/tests/sksl/intrinsics/GreaterThan.hlsl
deleted file mode 100644
index 1ef3875..0000000
--- a/tests/sksl/intrinsics/GreaterThan.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-    uint2 _10_c : packoffset(c2);
-    uint2 _10_d : packoffset(c2.z);
-    int3 _10_e : packoffset(c3);
-    int3 _10_f : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool4 expectFFTT = bool4(false, false, true, true);
-    bool4 expectTTFF = bool4(true, true, false, false);
-    sk_FragColor.x = float(int(bool4(_10_a.x > _10_b.x, _10_a.y > _10_b.y, _10_a.z > _10_b.z, _10_a.w > _10_b.w).x));
-    sk_FragColor.y = float(int(bool2(_10_c.x > _10_d.x, _10_c.y > _10_d.y).y));
-    sk_FragColor.z = float(int(bool3(_10_e.x > _10_f.x, _10_e.y > _10_f.y, _10_e.z > _10_f.z).z));
-    bool _73 = false;
-    if (any(expectTTFF))
-    {
-        _73 = true;
-    }
-    else
-    {
-        _73 = any(expectFFTT);
-    }
-    sk_FragColor.w = float(int(_73));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/GreaterThanEqual.hlsl b/tests/sksl/intrinsics/GreaterThanEqual.hlsl
deleted file mode 100644
index 9b42fce..0000000
--- a/tests/sksl/intrinsics/GreaterThanEqual.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-    uint2 _10_c : packoffset(c2);
-    uint2 _10_d : packoffset(c2.z);
-    int3 _10_e : packoffset(c3);
-    int3 _10_f : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool4 expectFFTT = bool4(false, false, true, true);
-    bool4 expectTTFF = bool4(true, true, false, false);
-    sk_FragColor.x = float(int(bool4(_10_a.x >= _10_b.x, _10_a.y >= _10_b.y, _10_a.z >= _10_b.z, _10_a.w >= _10_b.w).x));
-    sk_FragColor.y = float(int(bool2(_10_c.x >= _10_d.x, _10_c.y >= _10_d.y).y));
-    sk_FragColor.z = float(int(bool3(_10_e.x >= _10_f.x, _10_e.y >= _10_f.y, _10_e.z >= _10_f.z).z));
-    bool _73 = false;
-    if (any(expectTTFF))
-    {
-        _73 = true;
-    }
-    else
-    {
-        _73 = any(expectFFTT);
-    }
-    sk_FragColor.w = float(int(_73));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/IntBitsToFloat.hlsl b/tests/sksl/intrinsics/IntBitsToFloat.hlsl
deleted file mode 100644
index 2e91e35..0000000
--- a/tests/sksl/intrinsics/IntBitsToFloat.hlsl
+++ /dev/null
@@ -1,78 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_testInput : packoffset(c0);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c3);
-    float4 _10_colorRed : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
-    float4 inputVal = _42;
-    int4 expectedB = int4(1065353216, 1073741824, -1069547520, -1065353216);
-    bool _64 = false;
-    if (_42.x == asfloat(1065353216))
-    {
-        float2 _57 = _42.xy;
-        float2 _58 = asfloat(int4(1065353216, 1073741824, -1069547520, -1065353216).xy);
-        _64 = all(bool2(_57.x == _58.x, _57.y == _58.y));
-    }
-    else
-    {
-        _64 = false;
-    }
-    bool _75 = false;
-    if (_64)
-    {
-        float3 _67 = _42.xyz;
-        float3 _69 = asfloat(int4(1065353216, 1073741824, -1069547520, -1065353216).xyz);
-        _75 = all(bool3(_67.x == _69.x, _67.y == _69.y, _67.z == _69.z));
-    }
-    else
-    {
-        _75 = false;
-    }
-    bool _82 = false;
-    if (_75)
-    {
-        float4 _78 = asfloat(int4(1065353216, 1073741824, -1069547520, -1065353216));
-        _82 = all(bool4(_42.x == _78.x, _42.y == _78.y, _42.z == _78.z, _42.w == _78.w));
-    }
-    else
-    {
-        _82 = false;
-    }
-    float4 _83 = 0.0f.xxxx;
-    if (_82)
-    {
-        _83 = _10_colorGreen;
-    }
-    else
-    {
-        _83 = _10_colorRed;
-    }
-    return _83;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Inverse.hlsl b/tests/sksl/intrinsics/Inverse.hlsl
deleted file mode 100644
index f8cd0da..0000000
--- a/tests/sksl/intrinsics/Inverse.hlsl
+++ /dev/null
@@ -1,108 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-// Returns the determinant of a 2x2 matrix.
-float spvDet2x2(float a1, float a2, float b1, float b2)
-{
-    return a1 * b2 - b1 * a2;
-}
-
-// Returns the inverse of a matrix, by using the algorithm of calculating the classical
-// adjoint and dividing by the determinant. The contents of the matrix are changed.
-float3x3 spvInverse(float3x3 m)
-{
-    float3x3 adj;	// The adjoint matrix (inverse after dividing by determinant)
-
-    // Create the transpose of the cofactors, as the classical adjoint of the matrix.
-    adj[0][0] =  spvDet2x2(m[1][1], m[1][2], m[2][1], m[2][2]);
-    adj[0][1] = -spvDet2x2(m[0][1], m[0][2], m[2][1], m[2][2]);
-    adj[0][2] =  spvDet2x2(m[0][1], m[0][2], m[1][1], m[1][2]);
-
-    adj[1][0] = -spvDet2x2(m[1][0], m[1][2], m[2][0], m[2][2]);
-    adj[1][1] =  spvDet2x2(m[0][0], m[0][2], m[2][0], m[2][2]);
-    adj[1][2] = -spvDet2x2(m[0][0], m[0][2], m[1][0], m[1][2]);
-
-    adj[2][0] =  spvDet2x2(m[1][0], m[1][1], m[2][0], m[2][1]);
-    adj[2][1] = -spvDet2x2(m[0][0], m[0][1], m[2][0], m[2][1]);
-    adj[2][2] =  spvDet2x2(m[0][0], m[0][1], m[1][0], m[1][1]);
-
-    // Calculate the determinant as a combination of the cofactors of the first row.
-    float det = (adj[0][0] * m[0][0]) + (adj[0][1] * m[1][0]) + (adj[0][2] * m[2][0]);
-
-    // Divide the classical adjoint matrix by the determinant.
-    // If determinant is zero, matrix is not invertable, so leave it unchanged.
-    return (det != 0.0f) ? (adj * (1.0f / det)) : m;
-}
-
-float4 main(float2 _24)
-{
-    float2x2 inv2x2 = float2x2(float2(-2.0f, 1.0f), float2(1.5f, -0.5f));
-    float3x3 inv3x3 = float3x3(float3(-24.0f, 18.0f, 5.0f), float3(20.0f, -15.0f, -4.0f), float3(-5.0f, 4.0f, 1.0f));
-    float4x4 inv4x4 = float4x4(float4(-2.0f, -0.5f, 1.0f, 0.5f), float4(1.0f, 0.5f, 0.0f, -0.5f), float4(-8.0f, -1.0f, 2.0f, 2.0f), float4(3.0f, 0.5f, -1.0f, -0.5f));
-    bool _83 = false;
-    if (all(bool2(float2(-2.0f, 1.0f).x == float2(-2.0f, 1.0f).x, float2(-2.0f, 1.0f).y == float2(-2.0f, 1.0f).y)) && all(bool2(float2(1.5f, -0.5f).x == float2(1.5f, -0.5f).x, float2(1.5f, -0.5f).y == float2(1.5f, -0.5f).y)))
-    {
-        _83 = (all(bool3(float3(-24.0f, 18.0f, 5.0f).x == float3(-24.0f, 18.0f, 5.0f).x, float3(-24.0f, 18.0f, 5.0f).y == float3(-24.0f, 18.0f, 5.0f).y, float3(-24.0f, 18.0f, 5.0f).z == float3(-24.0f, 18.0f, 5.0f).z)) && all(bool3(float3(20.0f, -15.0f, -4.0f).x == float3(20.0f, -15.0f, -4.0f).x, float3(20.0f, -15.0f, -4.0f).y == float3(20.0f, -15.0f, -4.0f).y, float3(20.0f, -15.0f, -4.0f).z == float3(20.0f, -15.0f, -4.0f).z))) && all(bool3(float3(-5.0f, 4.0f, 1.0f).x == float3(-5.0f, 4.0f, 1.0f).x, float3(-5.0f, 4.0f, 1.0f).y == float3(-5.0f, 4.0f, 1.0f).y, float3(-5.0f, 4.0f, 1.0f).z == float3(-5.0f, 4.0f, 1.0f).z));
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _98 = false;
-    if (_83)
-    {
-        _98 = ((all(bool4(float4(-2.0f, -0.5f, 1.0f, 0.5f).x == float4(-2.0f, -0.5f, 1.0f, 0.5f).x, float4(-2.0f, -0.5f, 1.0f, 0.5f).y == float4(-2.0f, -0.5f, 1.0f, 0.5f).y, float4(-2.0f, -0.5f, 1.0f, 0.5f).z == float4(-2.0f, -0.5f, 1.0f, 0.5f).z, float4(-2.0f, -0.5f, 1.0f, 0.5f).w == float4(-2.0f, -0.5f, 1.0f, 0.5f).w)) && all(bool4(float4(1.0f, 0.5f, 0.0f, -0.5f).x == float4(1.0f, 0.5f, 0.0f, -0.5f).x, float4(1.0f, 0.5f, 0.0f, -0.5f).y == float4(1.0f, 0.5f, 0.0f, -0.5f).y, float4(1.0f, 0.5f, 0.0f, -0.5f).z == float4(1.0f, 0.5f, 0.0f, -0.5f).z, float4(1.0f, 0.5f, 0.0f, -0.5f).w == float4(1.0f, 0.5f, 0.0f, -0.5f).w))) && all(bool4(float4(-8.0f, -1.0f, 2.0f, 2.0f).x == float4(-8.0f, -1.0f, 2.0f, 2.0f).x, float4(-8.0f, -1.0f, 2.0f, 2.0f).y == float4(-8.0f, -1.0f, 2.0f, 2.0f).y, float4(-8.0f, -1.0f, 2.0f, 2.0f).z == float4(-8.0f, -1.0f, 2.0f, 2.0f).z, float4(-8.0f, -1.0f, 2.0f, 2.0f).w == float4(-8.0f, -1.0f, 2.0f, 2.0f).w))) && all(bool4(float4(3.0f, 0.5f, -1.0f, -0.5f).x == float4(3.0f, 0.5f, -1.0f, -0.5f).x, float4(3.0f, 0.5f, -1.0f, -0.5f).y == float4(3.0f, 0.5f, -1.0f, -0.5f).y, float4(3.0f, 0.5f, -1.0f, -0.5f).z == float4(3.0f, 0.5f, -1.0f, -0.5f).z, float4(3.0f, 0.5f, -1.0f, -0.5f).w == float4(3.0f, 0.5f, -1.0f, -0.5f).w));
-    }
-    else
-    {
-        _98 = false;
-    }
-    bool _121 = false;
-    if (_98)
-    {
-        float3x3 _101 = spvInverse(float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)));
-        float3 _110 = _101[0];
-        float3 _113 = _101[1];
-        float3 _117 = _101[2];
-        _121 = (any(bool3(_110.x != float3(-24.0f, 18.0f, 5.0f).x, _110.y != float3(-24.0f, 18.0f, 5.0f).y, _110.z != float3(-24.0f, 18.0f, 5.0f).z)) || any(bool3(_113.x != float3(20.0f, -15.0f, -4.0f).x, _113.y != float3(20.0f, -15.0f, -4.0f).y, _113.z != float3(20.0f, -15.0f, -4.0f).z))) || any(bool3(_117.x != float3(-5.0f, 4.0f, 1.0f).x, _117.y != float3(-5.0f, 4.0f, 1.0f).y, _117.z != float3(-5.0f, 4.0f, 1.0f).z));
-    }
-    else
-    {
-        _121 = false;
-    }
-    float4 _122 = 0.0f.xxxx;
-    if (_121)
-    {
-        _122 = _10_colorGreen;
-    }
-    else
-    {
-        _122 = _10_colorRed;
-    }
-    return _122;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Inversesqrt.hlsl b/tests/sksl/intrinsics/Inversesqrt.hlsl
deleted file mode 100644
index 1f6a12d..0000000
--- a/tests/sksl/intrinsics/Inversesqrt.hlsl
+++ /dev/null
@@ -1,148 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (rsqrt(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = rsqrt(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = rsqrt(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = rsqrt(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 1.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _94 = false;
-    if (_84)
-    {
-        _94 = all(bool2(float2(1.0f, 0.5f).x == _10_expected.xy.x, float2(1.0f, 0.5f).y == _10_expected.xy.y));
-    }
-    else
-    {
-        _94 = false;
-    }
-    bool _104 = false;
-    if (_94)
-    {
-        _104 = all(bool3(float3(1.0f, 0.5f, 0.25f).x == _10_expected.xyz.x, float3(1.0f, 0.5f, 0.25f).y == _10_expected.xyz.y, float3(1.0f, 0.5f, 0.25f).z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _113 = false;
-    if (_104)
-    {
-        _113 = all(bool4(float4(1.0f, 0.5f, 0.25f, 0.125f).x == _10_expected.x, float4(1.0f, 0.5f, 0.25f, 0.125f).y == _10_expected.y, float4(1.0f, 0.5f, 0.25f, 0.125f).z == _10_expected.z, float4(1.0f, 0.5f, 0.25f, 0.125f).w == _10_expected.w));
-    }
-    else
-    {
-        _113 = false;
-    }
-    bool _122 = false;
-    if (_113)
-    {
-        _122 = rsqrt(-1.0f) == _10_expected.x;
-    }
-    else
-    {
-        _122 = false;
-    }
-    bool _133 = false;
-    if (_122)
-    {
-        float2 _125 = rsqrt(float2(-1.0f, -4.0f));
-        _133 = all(bool2(_125.x == _10_expected.xy.x, _125.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _133 = false;
-    }
-    bool _144 = false;
-    if (_133)
-    {
-        float3 _136 = rsqrt(float3(-1.0f, -4.0f, -16.0f));
-        _144 = all(bool3(_136.x == _10_expected.xyz.x, _136.y == _10_expected.xyz.y, _136.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _144 = false;
-    }
-    bool _154 = false;
-    if (_144)
-    {
-        float4 _147 = rsqrt(float4(-1.0f, -4.0f, -16.0f, -64.0f));
-        _154 = all(bool4(_147.x == _10_expected.x, _147.y == _10_expected.y, _147.z == _10_expected.z, _147.w == _10_expected.w));
-    }
-    else
-    {
-        _154 = false;
-    }
-    float4 _155 = 0.0f.xxxx;
-    if (_154)
-    {
-        _155 = _10_colorGreen;
-    }
-    else
-    {
-        _155 = _10_colorRed;
-    }
-    return _155;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/IsInf.hlsl b/tests/sksl/intrinsics/IsInf.hlsl
deleted file mode 100644
index 5c4bce1..0000000
--- a/tests/sksl/intrinsics/IsInf.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _46 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * (1.0f / _10_colorGreen.x);
-    float4 infiniteValue = _46;
-    float4 _59 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * (1.0f / _10_colorGreen.y);
-    float4 finiteValue = _59;
-    bool _69 = false;
-    if (isinf(_46.x))
-    {
-        _69 = all(isinf(_46.xy));
-    }
-    else
-    {
-        _69 = false;
-    }
-    bool _77 = false;
-    if (_69)
-    {
-        _77 = all(isinf(_46.xyz));
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _83 = false;
-    if (_77)
-    {
-        _83 = all(isinf(_46));
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _89 = false;
-    if (_83)
-    {
-        _89 = !isinf(_59.x);
-    }
-    else
-    {
-        _89 = false;
-    }
-    bool _96 = false;
-    if (_89)
-    {
-        _96 = !any(isinf(_59.xy));
-    }
-    else
-    {
-        _96 = false;
-    }
-    bool _103 = false;
-    if (_96)
-    {
-        _103 = !any(isinf(_59.xyz));
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _109 = false;
-    if (_103)
-    {
-        _109 = !any(isinf(_59));
-    }
-    else
-    {
-        _109 = false;
-    }
-    float4 _110 = 0.0f.xxxx;
-    if (_109)
-    {
-        _110 = _10_colorGreen;
-    }
-    else
-    {
-        _110 = _10_colorRed;
-    }
-    return _110;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/IsNan.hlsl b/tests/sksl/intrinsics/IsNan.hlsl
deleted file mode 100644
index 4a16b54..0000000
--- a/tests/sksl/intrinsics/IsNan.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _35 = 0.0f.xxxx / _10_testInputs.yyyy;
-    float4 valueIsNaN = _35;
-    float4 _41 = 1.0f.xxxx / _10_testInputs;
-    float4 valueIsNumber = _41;
-    bool _51 = false;
-    if (isnan(_35.x))
-    {
-        _51 = all(isnan(_35.xy));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _59 = false;
-    if (_51)
-    {
-        _59 = all(isnan(_35.xyz));
-    }
-    else
-    {
-        _59 = false;
-    }
-    bool _65 = false;
-    if (_59)
-    {
-        _65 = all(isnan(_35));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _71 = false;
-    if (_65)
-    {
-        _71 = !isnan(_41.x);
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _78 = false;
-    if (_71)
-    {
-        _78 = !any(isnan(_41.xy));
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _85 = false;
-    if (_78)
-    {
-        _85 = !any(isnan(_41.xyz));
-    }
-    else
-    {
-        _85 = false;
-    }
-    bool _91 = false;
-    if (_85)
-    {
-        _91 = !any(isnan(_41));
-    }
-    else
-    {
-        _91 = false;
-    }
-    float4 _92 = 0.0f.xxxx;
-    if (_91)
-    {
-        _92 = _10_colorGreen;
-    }
-    else
-    {
-        _92 = _10_colorRed;
-    }
-    return _92;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Ldexp.hlsl b/tests/sksl/intrinsics/Ldexp.hlsl
deleted file mode 100644
index c99d8a2..0000000
--- a/tests/sksl/intrinsics/Ldexp.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _13_a : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static int b = 0;
-
-void frag_main()
-{
-    sk_FragColor.x = ldexp(_13_a, b);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Length.hlsl b/tests/sksl/intrinsics/Length.hlsl
deleted file mode 100644
index dc0397f..0000000
--- a/tests/sksl/intrinsics/Length.hlsl
+++ /dev/null
@@ -1,106 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(3.0f, 3.0f, 5.0f, 13.0f);
-    bool _48 = false;
-    if (length(_10_inputVal.x) == 3.0f)
-    {
-        _48 = length(_10_inputVal.xy) == 3.0f;
-    }
-    else
-    {
-        _48 = false;
-    }
-    bool _57 = false;
-    if (_48)
-    {
-        _57 = length(_10_inputVal.xyz) == 5.0f;
-    }
-    else
-    {
-        _57 = false;
-    }
-    bool _64 = false;
-    if (_57)
-    {
-        _64 = length(_10_inputVal) == 13.0f;
-    }
-    else
-    {
-        _64 = false;
-    }
-    bool _68 = false;
-    if (_64)
-    {
-        _68 = true;
-    }
-    else
-    {
-        _68 = false;
-    }
-    bool _71 = false;
-    if (_68)
-    {
-        _71 = true;
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _74 = false;
-    if (_71)
-    {
-        _74 = true;
-    }
-    else
-    {
-        _74 = false;
-    }
-    bool _77 = false;
-    if (_74)
-    {
-        _77 = true;
-    }
-    else
-    {
-        _77 = false;
-    }
-    float4 _78 = 0.0f.xxxx;
-    if (_77)
-    {
-        _78 = _10_colorGreen;
-    }
-    else
-    {
-        _78 = _10_colorRed;
-    }
-    return _78;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/LessThan.hlsl b/tests/sksl/intrinsics/LessThan.hlsl
deleted file mode 100644
index 1c83bf1..0000000
--- a/tests/sksl/intrinsics/LessThan.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-    uint2 _10_c : packoffset(c2);
-    uint2 _10_d : packoffset(c2.z);
-    int3 _10_e : packoffset(c3);
-    int3 _10_f : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool4 expectTTFF = bool4(true, true, false, false);
-    bool4 expectFFTT = bool4(false, false, true, true);
-    sk_FragColor.x = float(int(bool4(_10_a.x < _10_b.x, _10_a.y < _10_b.y, _10_a.z < _10_b.z, _10_a.w < _10_b.w).x));
-    sk_FragColor.y = float(int(bool2(_10_c.x < _10_d.x, _10_c.y < _10_d.y).y));
-    sk_FragColor.z = float(int(bool3(_10_e.x < _10_f.x, _10_e.y < _10_f.y, _10_e.z < _10_f.z).z));
-    bool _73 = false;
-    if (any(expectTTFF))
-    {
-        _73 = true;
-    }
-    else
-    {
-        _73 = any(expectFFTT);
-    }
-    sk_FragColor.w = float(int(_73));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/LessThanEqual.hlsl b/tests/sksl/intrinsics/LessThanEqual.hlsl
deleted file mode 100644
index 5d921dd..0000000
--- a/tests/sksl/intrinsics/LessThanEqual.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-    uint2 _10_c : packoffset(c2);
-    uint2 _10_d : packoffset(c2.z);
-    int3 _10_e : packoffset(c3);
-    int3 _10_f : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool4 expectTTFF = bool4(true, true, false, false);
-    bool4 expectFFTT = bool4(false, false, true, true);
-    sk_FragColor.x = float(int(bool4(_10_a.x <= _10_b.x, _10_a.y <= _10_b.y, _10_a.z <= _10_b.z, _10_a.w <= _10_b.w).x));
-    sk_FragColor.y = float(int(bool2(_10_c.x <= _10_d.x, _10_c.y <= _10_d.y).y));
-    sk_FragColor.z = float(int(bool3(_10_e.x <= _10_f.x, _10_e.y <= _10_f.y, _10_e.z <= _10_f.z).z));
-    bool _73 = false;
-    if (any(expectTTFF))
-    {
-        _73 = true;
-    }
-    else
-    {
-        _73 = any(expectFFTT);
-    }
-    sk_FragColor.w = float(int(_73));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Log.hlsl b/tests/sksl/intrinsics/Log.hlsl
deleted file mode 100644
index a0dba64..0000000
--- a/tests/sksl/intrinsics/Log.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (log(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = log(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = log(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = log(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Log2.hlsl b/tests/sksl/intrinsics/Log2.hlsl
deleted file mode 100644
index 14bad78..0000000
--- a/tests/sksl/intrinsics/Log2.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (log2(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = log2(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = log2(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = log2(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _93 = false;
-    if (_83)
-    {
-        _93 = all(bool2(float2(0.0f, 1.0f).x == _10_expected.xy.x, float2(0.0f, 1.0f).y == _10_expected.xy.y));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _103 = false;
-    if (_93)
-    {
-        _103 = all(bool3(float3(0.0f, 1.0f, 2.0f).x == _10_expected.xyz.x, float3(0.0f, 1.0f, 2.0f).y == _10_expected.xyz.y, float3(0.0f, 1.0f, 2.0f).z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _112 = false;
-    if (_103)
-    {
-        _112 = all(bool4(float4(0.0f, 1.0f, 2.0f, 3.0f).x == _10_expected.x, float4(0.0f, 1.0f, 2.0f, 3.0f).y == _10_expected.y, float4(0.0f, 1.0f, 2.0f, 3.0f).z == _10_expected.z, float4(0.0f, 1.0f, 2.0f, 3.0f).w == _10_expected.w));
-    }
-    else
-    {
-        _112 = false;
-    }
-    float4 _113 = 0.0f.xxxx;
-    if (_112)
-    {
-        _113 = _10_colorGreen;
-    }
-    else
-    {
-        _113 = _10_colorRed;
-    }
-    return _113;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MatrixCompMultES2.hlsl b/tests/sksl/intrinsics/MatrixCompMultES2.hlsl
deleted file mode 100644
index 0689052..0000000
--- a/tests/sksl/intrinsics/MatrixCompMultES2.hlsl
+++ /dev/null
@@ -1,69 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
-    row_major float3x3 _10_testMatrix3x3 : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    float2x2 h22 = float2x2(float2(0.0f, 5.0f), float2(10.0f, 15.0f));
-    float2 _49 = _10_testMatrix2x2[0] * float2(1.0f, 0.0f);
-    float2 _51 = _10_testMatrix2x2[1] * float2(0.0f, 1.0f);
-    float2x2 f22 = float2x2(_49, _51);
-    float3 _64 = _10_testMatrix3x3[0] * 2.0f.xxx;
-    float3 _66 = _10_testMatrix3x3[1] * 2.0f.xxx;
-    float3 _68 = _10_testMatrix3x3[2] * 2.0f.xxx;
-    float3x3 h33 = float3x3(_64, _66, _68);
-    bool _87 = false;
-    if (all(bool2(float2(0.0f, 5.0f).x == float2(0.0f, 5.0f).x, float2(0.0f, 5.0f).y == float2(0.0f, 5.0f).y)) && all(bool2(float2(10.0f, 15.0f).x == float2(10.0f, 15.0f).x, float2(10.0f, 15.0f).y == float2(10.0f, 15.0f).y)))
-    {
-        _87 = all(bool2(_49.x == float2(1.0f, 0.0f).x, _49.y == float2(1.0f, 0.0f).y)) && all(bool2(_51.x == float2(0.0f, 4.0f).x, _51.y == float2(0.0f, 4.0f).y));
-    }
-    else
-    {
-        _87 = false;
-    }
-    bool _109 = false;
-    if (_87)
-    {
-        _109 = (all(bool3(_64.x == float3(2.0f, 4.0f, 6.0f).x, _64.y == float3(2.0f, 4.0f, 6.0f).y, _64.z == float3(2.0f, 4.0f, 6.0f).z)) && all(bool3(_66.x == float3(8.0f, 10.0f, 12.0f).x, _66.y == float3(8.0f, 10.0f, 12.0f).y, _66.z == float3(8.0f, 10.0f, 12.0f).z))) && all(bool3(_68.x == float3(14.0f, 16.0f, 18.0f).x, _68.y == float3(14.0f, 16.0f, 18.0f).y, _68.z == float3(14.0f, 16.0f, 18.0f).z));
-    }
-    else
-    {
-        _109 = false;
-    }
-    float4 _110 = 0.0f.xxxx;
-    if (_109)
-    {
-        _110 = _10_colorGreen;
-    }
-    else
-    {
-        _110 = _10_colorRed;
-    }
-    return _110;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MatrixCompMultES3.hlsl b/tests/sksl/intrinsics/MatrixCompMultES3.hlsl
deleted file mode 100644
index a52b88c0..0000000
--- a/tests/sksl/intrinsics/MatrixCompMultES3.hlsl
+++ /dev/null
@@ -1,72 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _42 = 9.0f.xxxx * _10_colorRed;
-    float4 _43 = 9.0f.xxxx * _10_colorGreen;
-    float2x4 h24 = float2x4(_42, _43);
-    float2 _68 = float2(_10_colorRed.xy);
-    float2 _71 = float2(_10_colorRed.zw);
-    float2 _74 = float2(_10_colorGreen.xy);
-    float2 _77 = float2(_10_colorGreen.zw);
-    float2 _79 = float2(1.0f, 2.0f) * _68;
-    float2 _80 = float2(3.0f, 4.0f) * _71;
-    float2 _81 = float2(5.0f, 6.0f) * _74;
-    float2 _82 = float2(7.0f, 8.0f) * _77;
-    float4x2 h42 = float4x2(_79, _80, _81, _82);
-    float4x3 f43 = float4x3(float3(12.0f, 22.0f, 30.0f), float3(36.0f, 40.0f, 42.0f), float3(42.0f, 40.0f, 36.0f), float3(30.0f, 22.0f, 12.0f));
-    bool _128 = false;
-    if (all(bool4(_42.x == float4(9.0f, 0.0f, 0.0f, 9.0f).x, _42.y == float4(9.0f, 0.0f, 0.0f, 9.0f).y, _42.z == float4(9.0f, 0.0f, 0.0f, 9.0f).z, _42.w == float4(9.0f, 0.0f, 0.0f, 9.0f).w)) && all(bool4(_43.x == float4(0.0f, 9.0f, 0.0f, 9.0f).x, _43.y == float4(0.0f, 9.0f, 0.0f, 9.0f).y, _43.z == float4(0.0f, 9.0f, 0.0f, 9.0f).z, _43.w == float4(0.0f, 9.0f, 0.0f, 9.0f).w)))
-    {
-        _128 = ((all(bool2(_79.x == float2(1.0f, 0.0f).x, _79.y == float2(1.0f, 0.0f).y)) && all(bool2(_80.x == float2(0.0f, 4.0f).x, _80.y == float2(0.0f, 4.0f).y))) && all(bool2(_81.x == float2(0.0f, 6.0f).x, _81.y == float2(0.0f, 6.0f).y))) && all(bool2(_82.x == float2(0.0f, 8.0f).x, _82.y == float2(0.0f, 8.0f).y));
-    }
-    else
-    {
-        _128 = false;
-    }
-    bool _143 = false;
-    if (_128)
-    {
-        _143 = ((all(bool3(float3(12.0f, 22.0f, 30.0f).x == float3(12.0f, 22.0f, 30.0f).x, float3(12.0f, 22.0f, 30.0f).y == float3(12.0f, 22.0f, 30.0f).y, float3(12.0f, 22.0f, 30.0f).z == float3(12.0f, 22.0f, 30.0f).z)) && all(bool3(float3(36.0f, 40.0f, 42.0f).x == float3(36.0f, 40.0f, 42.0f).x, float3(36.0f, 40.0f, 42.0f).y == float3(36.0f, 40.0f, 42.0f).y, float3(36.0f, 40.0f, 42.0f).z == float3(36.0f, 40.0f, 42.0f).z))) && all(bool3(float3(42.0f, 40.0f, 36.0f).x == float3(42.0f, 40.0f, 36.0f).x, float3(42.0f, 40.0f, 36.0f).y == float3(42.0f, 40.0f, 36.0f).y, float3(42.0f, 40.0f, 36.0f).z == float3(42.0f, 40.0f, 36.0f).z))) && all(bool3(float3(30.0f, 22.0f, 12.0f).x == float3(30.0f, 22.0f, 12.0f).x, float3(30.0f, 22.0f, 12.0f).y == float3(30.0f, 22.0f, 12.0f).y, float3(30.0f, 22.0f, 12.0f).z == float3(30.0f, 22.0f, 12.0f).z));
-    }
-    else
-    {
-        _143 = false;
-    }
-    float4 _144 = 0.0f.xxxx;
-    if (_143)
-    {
-        _144 = _10_colorGreen;
-    }
-    else
-    {
-        _144 = _10_colorRed;
-    }
-    return _144;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MaxFloat.hlsl b/tests/sksl/intrinsics/MaxFloat.hlsl
deleted file mode 100644
index 533ad33..0000000
--- a/tests/sksl/intrinsics/MaxFloat.hlsl
+++ /dev/null
@@ -1,185 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedA = float4(0.5f, 0.5f, 0.75f, 2.25f);
-    float4 expectedB = float4(0.0f, 1.0f, 0.75f, 2.25f);
-    bool _55 = false;
-    if (max(_10_testInputs.x, 0.5f) == 0.5f)
-    {
-        float2 _46 = max(_10_testInputs.xy, 0.5f.xx);
-        _55 = all(bool2(_46.x == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.x, _46.y == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.y));
-    }
-    else
-    {
-        _55 = false;
-    }
-    bool _68 = false;
-    if (_55)
-    {
-        float3 _58 = max(_10_testInputs.xyz, 0.5f.xxx);
-        _68 = all(bool3(_58.x == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.x, _58.y == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.y, _58.z == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _68 = false;
-    }
-    bool _78 = false;
-    if (_68)
-    {
-        float4 _71 = max(_10_testInputs, 0.5f.xxxx);
-        _78 = all(bool4(_71.x == float4(0.5f, 0.5f, 0.75f, 2.25f).x, _71.y == float4(0.5f, 0.5f, 0.75f, 2.25f).y, _71.z == float4(0.5f, 0.5f, 0.75f, 2.25f).z, _71.w == float4(0.5f, 0.5f, 0.75f, 2.25f).w));
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _82 = false;
-    if (_78)
-    {
-        _82 = true;
-    }
-    else
-    {
-        _82 = false;
-    }
-    bool _88 = false;
-    if (_82)
-    {
-        _88 = all(bool2(0.5f.xx.x == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.x, 0.5f.xx.y == float4(0.5f, 0.5f, 0.75f, 2.25f).xy.y));
-    }
-    else
-    {
-        _88 = false;
-    }
-    bool _95 = false;
-    if (_88)
-    {
-        _95 = all(bool3(float3(0.5f, 0.5f, 0.75f).x == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.x, float3(0.5f, 0.5f, 0.75f).y == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.y, float3(0.5f, 0.5f, 0.75f).z == float4(0.5f, 0.5f, 0.75f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _95 = false;
-    }
-    bool _98 = false;
-    if (_95)
-    {
-        _98 = true;
-    }
-    else
-    {
-        _98 = false;
-    }
-    bool _110 = false;
-    if (_98)
-    {
-        _110 = max(_10_testInputs.x, _10_colorGreen.x) == 0.0f;
-    }
-    else
-    {
-        _110 = false;
-    }
-    bool _123 = false;
-    if (_110)
-    {
-        float2 _113 = max(_10_testInputs.xy, _10_colorGreen.xy);
-        _123 = all(bool2(_113.x == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.x, _113.y == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.y));
-    }
-    else
-    {
-        _123 = false;
-    }
-    bool _136 = false;
-    if (_123)
-    {
-        float3 _126 = max(_10_testInputs.xyz, _10_colorGreen.xyz);
-        _136 = all(bool3(_126.x == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.x, _126.y == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.y, _126.z == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _136 = false;
-    }
-    bool _146 = false;
-    if (_136)
-    {
-        float4 _139 = max(_10_testInputs, _10_colorGreen);
-        _146 = all(bool4(_139.x == float4(0.0f, 1.0f, 0.75f, 2.25f).x, _139.y == float4(0.0f, 1.0f, 0.75f, 2.25f).y, _139.z == float4(0.0f, 1.0f, 0.75f, 2.25f).z, _139.w == float4(0.0f, 1.0f, 0.75f, 2.25f).w));
-    }
-    else
-    {
-        _146 = false;
-    }
-    bool _149 = false;
-    if (_146)
-    {
-        _149 = true;
-    }
-    else
-    {
-        _149 = false;
-    }
-    bool _156 = false;
-    if (_149)
-    {
-        _156 = all(bool2(float2(0.0f, 1.0f).x == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.x, float2(0.0f, 1.0f).y == float4(0.0f, 1.0f, 0.75f, 2.25f).xy.y));
-    }
-    else
-    {
-        _156 = false;
-    }
-    bool _163 = false;
-    if (_156)
-    {
-        _163 = all(bool3(float3(0.0f, 1.0f, 0.75f).x == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.x, float3(0.0f, 1.0f, 0.75f).y == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.y, float3(0.0f, 1.0f, 0.75f).z == float4(0.0f, 1.0f, 0.75f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _163 = false;
-    }
-    bool _166 = false;
-    if (_163)
-    {
-        _166 = true;
-    }
-    else
-    {
-        _166 = false;
-    }
-    float4 _167 = 0.0f.xxxx;
-    if (_166)
-    {
-        _167 = _10_colorGreen;
-    }
-    else
-    {
-        _167 = _10_colorRed;
-    }
-    return _167;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MaxInt.hlsl b/tests/sksl/intrinsics/MaxInt.hlsl
deleted file mode 100644
index aca4bc2..0000000
--- a/tests/sksl/intrinsics/MaxInt.hlsl
+++ /dev/null
@@ -1,192 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _35 = _10_testInputs * 100.0f;
-    int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
-    int4 intValues = _44;
-    float4 _49 = _10_colorGreen * 100.0f;
-    int4 _58 = int4(int(_49.x), int(_49.y), int(_49.z), int(_49.w));
-    int4 intGreen = _58;
-    int4 expectedA = int4(50, 50, 75, 225);
-    int4 expectedB = int4(0, 100, 75, 225);
-    int _69 = _44.x;
-    bool _81 = false;
-    if (max(_69, 50) == 50)
-    {
-        int2 _73 = max(_44.xy, int2(50, 50));
-        _81 = all(bool2(_73.x == int4(50, 50, 75, 225).xy.x, _73.y == int4(50, 50, 75, 225).xy.y));
-    }
-    else
-    {
-        _81 = false;
-    }
-    bool _92 = false;
-    if (_81)
-    {
-        int3 _84 = max(_44.xyz, int3(50, 50, 50));
-        _92 = all(bool3(_84.x == int4(50, 50, 75, 225).xyz.x, _84.y == int4(50, 50, 75, 225).xyz.y, _84.z == int4(50, 50, 75, 225).xyz.z));
-    }
-    else
-    {
-        _92 = false;
-    }
-    bool _100 = false;
-    if (_92)
-    {
-        int4 _95 = max(_44, int4(50, 50, 50, 50));
-        _100 = all(bool4(_95.x == int4(50, 50, 75, 225).x, _95.y == int4(50, 50, 75, 225).y, _95.z == int4(50, 50, 75, 225).z, _95.w == int4(50, 50, 75, 225).w));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _104 = false;
-    if (_100)
-    {
-        _104 = true;
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _110 = false;
-    if (_104)
-    {
-        _110 = all(bool2(int2(50, 50).x == int4(50, 50, 75, 225).xy.x, int2(50, 50).y == int4(50, 50, 75, 225).xy.y));
-    }
-    else
-    {
-        _110 = false;
-    }
-    bool _117 = false;
-    if (_110)
-    {
-        _117 = all(bool3(int3(50, 50, 75).x == int4(50, 50, 75, 225).xyz.x, int3(50, 50, 75).y == int4(50, 50, 75, 225).xyz.y, int3(50, 50, 75).z == int4(50, 50, 75, 225).xyz.z));
-    }
-    else
-    {
-        _117 = false;
-    }
-    bool _120 = false;
-    if (_117)
-    {
-        _120 = true;
-    }
-    else
-    {
-        _120 = false;
-    }
-    bool _126 = false;
-    if (_120)
-    {
-        _126 = max(_69, _58.x) == 0;
-    }
-    else
-    {
-        _126 = false;
-    }
-    bool _135 = false;
-    if (_126)
-    {
-        int2 _129 = max(_44.xy, _58.xy);
-        _135 = all(bool2(_129.x == int4(0, 100, 75, 225).xy.x, _129.y == int4(0, 100, 75, 225).xy.y));
-    }
-    else
-    {
-        _135 = false;
-    }
-    bool _144 = false;
-    if (_135)
-    {
-        int3 _138 = max(_44.xyz, _58.xyz);
-        _144 = all(bool3(_138.x == int4(0, 100, 75, 225).xyz.x, _138.y == int4(0, 100, 75, 225).xyz.y, _138.z == int4(0, 100, 75, 225).xyz.z));
-    }
-    else
-    {
-        _144 = false;
-    }
-    bool _150 = false;
-    if (_144)
-    {
-        int4 _147 = max(_44, _58);
-        _150 = all(bool4(_147.x == int4(0, 100, 75, 225).x, _147.y == int4(0, 100, 75, 225).y, _147.z == int4(0, 100, 75, 225).z, _147.w == int4(0, 100, 75, 225).w));
-    }
-    else
-    {
-        _150 = false;
-    }
-    bool _153 = false;
-    if (_150)
-    {
-        _153 = true;
-    }
-    else
-    {
-        _153 = false;
-    }
-    bool _160 = false;
-    if (_153)
-    {
-        _160 = all(bool2(int2(0, 100).x == int4(0, 100, 75, 225).xy.x, int2(0, 100).y == int4(0, 100, 75, 225).xy.y));
-    }
-    else
-    {
-        _160 = false;
-    }
-    bool _167 = false;
-    if (_160)
-    {
-        _167 = all(bool3(int3(0, 100, 75).x == int4(0, 100, 75, 225).xyz.x, int3(0, 100, 75).y == int4(0, 100, 75, 225).xyz.y, int3(0, 100, 75).z == int4(0, 100, 75, 225).xyz.z));
-    }
-    else
-    {
-        _167 = false;
-    }
-    bool _170 = false;
-    if (_167)
-    {
-        _170 = true;
-    }
-    else
-    {
-        _170 = false;
-    }
-    float4 _171 = 0.0f.xxxx;
-    if (_170)
-    {
-        _171 = _10_colorGreen;
-    }
-    else
-    {
-        _171 = _10_colorRed;
-    }
-    return _171;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MinFloat.hlsl b/tests/sksl/intrinsics/MinFloat.hlsl
deleted file mode 100644
index ec4668c..0000000
--- a/tests/sksl/intrinsics/MinFloat.hlsl
+++ /dev/null
@@ -1,185 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedA = float4(-1.25f, 0.0f, 0.5f, 0.5f);
-    float4 expectedB = float4(-1.25f, 0.0f, 0.0f, 1.0f);
-    bool _54 = false;
-    if (min(_10_testInputs.x, 0.5f) == (-1.25f))
-    {
-        float2 _45 = min(_10_testInputs.xy, 0.5f.xx);
-        _54 = all(bool2(_45.x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.x, _45.y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.y));
-    }
-    else
-    {
-        _54 = false;
-    }
-    bool _67 = false;
-    if (_54)
-    {
-        float3 _57 = min(_10_testInputs.xyz, 0.5f.xxx);
-        _67 = all(bool3(_57.x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.x, _57.y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.y, _57.z == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.z));
-    }
-    else
-    {
-        _67 = false;
-    }
-    bool _77 = false;
-    if (_67)
-    {
-        float4 _70 = min(_10_testInputs, 0.5f.xxxx);
-        _77 = all(bool4(_70.x == float4(-1.25f, 0.0f, 0.5f, 0.5f).x, _70.y == float4(-1.25f, 0.0f, 0.5f, 0.5f).y, _70.z == float4(-1.25f, 0.0f, 0.5f, 0.5f).z, _70.w == float4(-1.25f, 0.0f, 0.5f, 0.5f).w));
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _81 = false;
-    if (_77)
-    {
-        _81 = true;
-    }
-    else
-    {
-        _81 = false;
-    }
-    bool _88 = false;
-    if (_81)
-    {
-        _88 = all(bool2(float2(-1.25f, 0.0f).x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.x, float2(-1.25f, 0.0f).y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xy.y));
-    }
-    else
-    {
-        _88 = false;
-    }
-    bool _95 = false;
-    if (_88)
-    {
-        _95 = all(bool3(float3(-1.25f, 0.0f, 0.5f).x == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.x, float3(-1.25f, 0.0f, 0.5f).y == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.y, float3(-1.25f, 0.0f, 0.5f).z == float4(-1.25f, 0.0f, 0.5f, 0.5f).xyz.z));
-    }
-    else
-    {
-        _95 = false;
-    }
-    bool _98 = false;
-    if (_95)
-    {
-        _98 = true;
-    }
-    else
-    {
-        _98 = false;
-    }
-    bool _110 = false;
-    if (_98)
-    {
-        _110 = min(_10_testInputs.x, _10_colorGreen.x) == (-1.25f);
-    }
-    else
-    {
-        _110 = false;
-    }
-    bool _123 = false;
-    if (_110)
-    {
-        float2 _113 = min(_10_testInputs.xy, _10_colorGreen.xy);
-        _123 = all(bool2(_113.x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.x, _113.y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _123 = false;
-    }
-    bool _136 = false;
-    if (_123)
-    {
-        float3 _126 = min(_10_testInputs.xyz, _10_colorGreen.xyz);
-        _136 = all(bool3(_126.x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.x, _126.y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.y, _126.z == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _136 = false;
-    }
-    bool _146 = false;
-    if (_136)
-    {
-        float4 _139 = min(_10_testInputs, _10_colorGreen);
-        _146 = all(bool4(_139.x == float4(-1.25f, 0.0f, 0.0f, 1.0f).x, _139.y == float4(-1.25f, 0.0f, 0.0f, 1.0f).y, _139.z == float4(-1.25f, 0.0f, 0.0f, 1.0f).z, _139.w == float4(-1.25f, 0.0f, 0.0f, 1.0f).w));
-    }
-    else
-    {
-        _146 = false;
-    }
-    bool _149 = false;
-    if (_146)
-    {
-        _149 = true;
-    }
-    else
-    {
-        _149 = false;
-    }
-    bool _155 = false;
-    if (_149)
-    {
-        _155 = all(bool2(float2(-1.25f, 0.0f).x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.x, float2(-1.25f, 0.0f).y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _155 = false;
-    }
-    bool _162 = false;
-    if (_155)
-    {
-        _162 = all(bool3(float3(-1.25f, 0.0f, 0.0f).x == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.x, float3(-1.25f, 0.0f, 0.0f).y == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.y, float3(-1.25f, 0.0f, 0.0f).z == float4(-1.25f, 0.0f, 0.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _162 = false;
-    }
-    bool _165 = false;
-    if (_162)
-    {
-        _165 = true;
-    }
-    else
-    {
-        _165 = false;
-    }
-    float4 _166 = 0.0f.xxxx;
-    if (_165)
-    {
-        _166 = _10_colorGreen;
-    }
-    else
-    {
-        _166 = _10_colorRed;
-    }
-    return _166;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MinInt.hlsl b/tests/sksl/intrinsics/MinInt.hlsl
deleted file mode 100644
index c95a6e2..0000000
--- a/tests/sksl/intrinsics/MinInt.hlsl
+++ /dev/null
@@ -1,192 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _35 = _10_testInputs * 100.0f;
-    int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
-    int4 intValues = _44;
-    float4 _49 = _10_colorGreen * 100.0f;
-    int4 _58 = int4(int(_49.x), int(_49.y), int(_49.z), int(_49.w));
-    int4 intGreen = _58;
-    int4 expectedA = int4(-125, 0, 50, 50);
-    int4 expectedB = int4(-125, 0, 0, 100);
-    int _68 = _44.x;
-    bool _80 = false;
-    if (min(_68, 50) == (-125))
-    {
-        int2 _72 = min(_44.xy, int2(50, 50));
-        _80 = all(bool2(_72.x == int4(-125, 0, 50, 50).xy.x, _72.y == int4(-125, 0, 50, 50).xy.y));
-    }
-    else
-    {
-        _80 = false;
-    }
-    bool _91 = false;
-    if (_80)
-    {
-        int3 _83 = min(_44.xyz, int3(50, 50, 50));
-        _91 = all(bool3(_83.x == int4(-125, 0, 50, 50).xyz.x, _83.y == int4(-125, 0, 50, 50).xyz.y, _83.z == int4(-125, 0, 50, 50).xyz.z));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _99 = false;
-    if (_91)
-    {
-        int4 _94 = min(_44, int4(50, 50, 50, 50));
-        _99 = all(bool4(_94.x == int4(-125, 0, 50, 50).x, _94.y == int4(-125, 0, 50, 50).y, _94.z == int4(-125, 0, 50, 50).z, _94.w == int4(-125, 0, 50, 50).w));
-    }
-    else
-    {
-        _99 = false;
-    }
-    bool _103 = false;
-    if (_99)
-    {
-        _103 = true;
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _110 = false;
-    if (_103)
-    {
-        _110 = all(bool2(int2(-125, 0).x == int4(-125, 0, 50, 50).xy.x, int2(-125, 0).y == int4(-125, 0, 50, 50).xy.y));
-    }
-    else
-    {
-        _110 = false;
-    }
-    bool _117 = false;
-    if (_110)
-    {
-        _117 = all(bool3(int3(-125, 0, 50).x == int4(-125, 0, 50, 50).xyz.x, int3(-125, 0, 50).y == int4(-125, 0, 50, 50).xyz.y, int3(-125, 0, 50).z == int4(-125, 0, 50, 50).xyz.z));
-    }
-    else
-    {
-        _117 = false;
-    }
-    bool _120 = false;
-    if (_117)
-    {
-        _120 = true;
-    }
-    else
-    {
-        _120 = false;
-    }
-    bool _126 = false;
-    if (_120)
-    {
-        _126 = min(_68, _58.x) == (-125);
-    }
-    else
-    {
-        _126 = false;
-    }
-    bool _135 = false;
-    if (_126)
-    {
-        int2 _129 = min(_44.xy, _58.xy);
-        _135 = all(bool2(_129.x == int4(-125, 0, 0, 100).xy.x, _129.y == int4(-125, 0, 0, 100).xy.y));
-    }
-    else
-    {
-        _135 = false;
-    }
-    bool _144 = false;
-    if (_135)
-    {
-        int3 _138 = min(_44.xyz, _58.xyz);
-        _144 = all(bool3(_138.x == int4(-125, 0, 0, 100).xyz.x, _138.y == int4(-125, 0, 0, 100).xyz.y, _138.z == int4(-125, 0, 0, 100).xyz.z));
-    }
-    else
-    {
-        _144 = false;
-    }
-    bool _150 = false;
-    if (_144)
-    {
-        int4 _147 = min(_44, _58);
-        _150 = all(bool4(_147.x == int4(-125, 0, 0, 100).x, _147.y == int4(-125, 0, 0, 100).y, _147.z == int4(-125, 0, 0, 100).z, _147.w == int4(-125, 0, 0, 100).w));
-    }
-    else
-    {
-        _150 = false;
-    }
-    bool _153 = false;
-    if (_150)
-    {
-        _153 = true;
-    }
-    else
-    {
-        _153 = false;
-    }
-    bool _159 = false;
-    if (_153)
-    {
-        _159 = all(bool2(int2(-125, 0).x == int4(-125, 0, 0, 100).xy.x, int2(-125, 0).y == int4(-125, 0, 0, 100).xy.y));
-    }
-    else
-    {
-        _159 = false;
-    }
-    bool _166 = false;
-    if (_159)
-    {
-        _166 = all(bool3(int3(-125, 0, 0).x == int4(-125, 0, 0, 100).xyz.x, int3(-125, 0, 0).y == int4(-125, 0, 0, 100).xyz.y, int3(-125, 0, 0).z == int4(-125, 0, 0, 100).xyz.z));
-    }
-    else
-    {
-        _166 = false;
-    }
-    bool _169 = false;
-    if (_166)
-    {
-        _169 = true;
-    }
-    else
-    {
-        _169 = false;
-    }
-    float4 _170 = 0.0f.xxxx;
-    if (_169)
-    {
-        _170 = _10_colorGreen;
-    }
-    else
-    {
-        _170 = _10_colorRed;
-    }
-    return _170;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MixBool.hlsl b/tests/sksl/intrinsics/MixBool.hlsl
deleted file mode 100644
index e6886c1..0000000
--- a/tests/sksl/intrinsics/MixBool.hlsl
+++ /dev/null
@@ -1,359 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float4 _10_colorBlack : packoffset(c2);
-    float4 _10_colorWhite : packoffset(c3);
-    float4 _10_testInputs : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _35 = _10_colorGreen * 100.0f;
-    int4 _44 = int4(int(_35.x), int(_35.y), int(_35.z), int(_35.w));
-    int4 intGreen = _44;
-    float4 _49 = _10_colorRed * 100.0f;
-    int4 _58 = int4(int(_49.x), int(_49.y), int(_49.z), int(_49.w));
-    int4 intRed = _58;
-    int _61 = _44.x;
-    int _62 = _58.x;
-    bool _77 = false;
-    if ((false ? _62 : _61) == _61)
-    {
-        int2 _72 = _44.xy;
-        int2 _73 = _58.xy;
-        int2 _66 = int2(bool2(false, false).x ? _73.x : _72.x, bool2(false, false).y ? _73.y : _72.y);
-        int2 _74 = _44.xy;
-        _77 = all(bool2(_66.x == _74.x, _66.y == _74.y));
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _91 = false;
-    if (_77)
-    {
-        int3 _86 = _44.xyz;
-        int3 _87 = _58.xyz;
-        int3 _80 = int3(bool3(false, false, false).x ? _87.x : _86.x, bool3(false, false, false).y ? _87.y : _86.y, bool3(false, false, false).z ? _87.z : _86.z);
-        int3 _88 = _44.xyz;
-        _91 = all(bool3(_80.x == _88.x, _80.y == _88.y, _80.z == _88.z));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _99 = false;
-    if (_91)
-    {
-        int4 _94 = int4(bool4(false, false, false, false).x ? _58.x : _44.x, bool4(false, false, false, false).y ? _58.y : _44.y, bool4(false, false, false, false).z ? _58.z : _44.z, bool4(false, false, false, false).w ? _58.w : _44.w);
-        _99 = all(bool4(_94.x == _44.x, _94.y == _44.y, _94.z == _44.z, _94.w == _44.w));
-    }
-    else
-    {
-        _99 = false;
-    }
-    bool _105 = false;
-    if (_99)
-    {
-        _105 = (true ? _62 : _61) == _62;
-    }
-    else
-    {
-        _105 = false;
-    }
-    bool _117 = false;
-    if (_105)
-    {
-        int2 _112 = _44.xy;
-        int2 _113 = _58.xy;
-        int2 _108 = int2(bool2(true, true).x ? _113.x : _112.x, bool2(true, true).y ? _113.y : _112.y);
-        int2 _114 = _58.xy;
-        _117 = all(bool2(_108.x == _114.x, _108.y == _114.y));
-    }
-    else
-    {
-        _117 = false;
-    }
-    bool _129 = false;
-    if (_117)
-    {
-        int3 _124 = _44.xyz;
-        int3 _125 = _58.xyz;
-        int3 _120 = int3(bool3(true, true, true).x ? _125.x : _124.x, bool3(true, true, true).y ? _125.y : _124.y, bool3(true, true, true).z ? _125.z : _124.z);
-        int3 _126 = _58.xyz;
-        _129 = all(bool3(_120.x == _126.x, _120.y == _126.y, _120.z == _126.z));
-    }
-    else
-    {
-        _129 = false;
-    }
-    bool _136 = false;
-    if (_129)
-    {
-        int4 _132 = int4(bool4(true, true, true, true).x ? _58.x : _44.x, bool4(true, true, true, true).y ? _58.y : _44.y, bool4(true, true, true, true).z ? _58.z : _44.z, bool4(true, true, true, true).w ? _58.w : _44.w);
-        _136 = all(bool4(_132.x == _58.x, _132.y == _58.y, _132.z == _58.z, _132.w == _58.w));
-    }
-    else
-    {
-        _136 = false;
-    }
-    bool _140 = false;
-    if (_136)
-    {
-        _140 = 0 == _61;
-    }
-    else
-    {
-        _140 = false;
-    }
-    bool _148 = false;
-    if (_140)
-    {
-        int2 _145 = _44.xy;
-        _148 = all(bool2(int2(0, 100).x == _145.x, int2(0, 100).y == _145.y));
-    }
-    else
-    {
-        _148 = false;
-    }
-    bool _155 = false;
-    if (_148)
-    {
-        int3 _152 = _44.xyz;
-        _155 = all(bool3(int3(0, 100, 0).x == _152.x, int3(0, 100, 0).y == _152.y, int3(0, 100, 0).z == _152.z));
-    }
-    else
-    {
-        _155 = false;
-    }
-    bool _161 = false;
-    if (_155)
-    {
-        _161 = all(bool4(int4(0, 100, 0, 100).x == _44.x, int4(0, 100, 0, 100).y == _44.y, int4(0, 100, 0, 100).z == _44.z, int4(0, 100, 0, 100).w == _44.w));
-    }
-    else
-    {
-        _161 = false;
-    }
-    bool _165 = false;
-    if (_161)
-    {
-        _165 = 100 == _62;
-    }
-    else
-    {
-        _165 = false;
-    }
-    bool _172 = false;
-    if (_165)
-    {
-        int2 _169 = _58.xy;
-        _172 = all(bool2(int2(100, 0).x == _169.x, int2(100, 0).y == _169.y));
-    }
-    else
-    {
-        _172 = false;
-    }
-    bool _179 = false;
-    if (_172)
-    {
-        int3 _176 = _58.xyz;
-        _179 = all(bool3(int3(100, 0, 0).x == _176.x, int3(100, 0, 0).y == _176.y, int3(100, 0, 0).z == _176.z));
-    }
-    else
-    {
-        _179 = false;
-    }
-    bool _185 = false;
-    if (_179)
-    {
-        _185 = all(bool4(int4(100, 0, 0, 100).x == _58.x, int4(100, 0, 0, 100).y == _58.y, int4(100, 0, 0, 100).z == _58.z, int4(100, 0, 0, 100).w == _58.w));
-    }
-    else
-    {
-        _185 = false;
-    }
-    bool _205 = false;
-    if (_185)
-    {
-        _205 = (false ? _10_colorRed.x : _10_colorGreen.x) == _10_colorGreen.x;
-    }
-    else
-    {
-        _205 = false;
-    }
-    bool _226 = false;
-    if (_205)
-    {
-        float2 _208 = float2(bool2(false, false).x ? _10_colorRed.xy.x : _10_colorGreen.xy.x, bool2(false, false).y ? _10_colorRed.xy.y : _10_colorGreen.xy.y);
-        _226 = all(bool2(_208.x == _10_colorGreen.xy.x, _208.y == _10_colorGreen.xy.y));
-    }
-    else
-    {
-        _226 = false;
-    }
-    bool _248 = false;
-    if (_226)
-    {
-        float3 _229 = float3(bool3(false, false, false).x ? _10_colorRed.xyz.x : _10_colorGreen.xyz.x, bool3(false, false, false).y ? _10_colorRed.xyz.y : _10_colorGreen.xyz.y, bool3(false, false, false).z ? _10_colorRed.xyz.z : _10_colorGreen.xyz.z);
-        _248 = all(bool3(_229.x == _10_colorGreen.xyz.x, _229.y == _10_colorGreen.xyz.y, _229.z == _10_colorGreen.xyz.z));
-    }
-    else
-    {
-        _248 = false;
-    }
-    bool _264 = false;
-    if (_248)
-    {
-        float4 _251 = float4(bool4(false, false, false, false).x ? _10_colorRed.x : _10_colorGreen.x, bool4(false, false, false, false).y ? _10_colorRed.y : _10_colorGreen.y, bool4(false, false, false, false).z ? _10_colorRed.z : _10_colorGreen.z, bool4(false, false, false, false).w ? _10_colorRed.w : _10_colorGreen.w);
-        _264 = all(bool4(_251.x == _10_colorGreen.x, _251.y == _10_colorGreen.y, _251.z == _10_colorGreen.z, _251.w == _10_colorGreen.w));
-    }
-    else
-    {
-        _264 = false;
-    }
-    bool _284 = false;
-    if (_264)
-    {
-        _284 = (true ? _10_colorRed.x : _10_colorGreen.x) == _10_colorRed.x;
-    }
-    else
-    {
-        _284 = false;
-    }
-    bool _305 = false;
-    if (_284)
-    {
-        float2 _287 = float2(bool2(true, true).x ? _10_colorRed.xy.x : _10_colorGreen.xy.x, bool2(true, true).y ? _10_colorRed.xy.y : _10_colorGreen.xy.y);
-        _305 = all(bool2(_287.x == _10_colorRed.xy.x, _287.y == _10_colorRed.xy.y));
-    }
-    else
-    {
-        _305 = false;
-    }
-    bool _326 = false;
-    if (_305)
-    {
-        float3 _308 = float3(bool3(true, true, true).x ? _10_colorRed.xyz.x : _10_colorGreen.xyz.x, bool3(true, true, true).y ? _10_colorRed.xyz.y : _10_colorGreen.xyz.y, bool3(true, true, true).z ? _10_colorRed.xyz.z : _10_colorGreen.xyz.z);
-        _326 = all(bool3(_308.x == _10_colorRed.xyz.x, _308.y == _10_colorRed.xyz.y, _308.z == _10_colorRed.xyz.z));
-    }
-    else
-    {
-        _326 = false;
-    }
-    bool _342 = false;
-    if (_326)
-    {
-        float4 _329 = float4(bool4(true, true, true, true).x ? _10_colorRed.x : _10_colorGreen.x, bool4(true, true, true, true).y ? _10_colorRed.y : _10_colorGreen.y, bool4(true, true, true, true).z ? _10_colorRed.z : _10_colorGreen.z, bool4(true, true, true, true).w ? _10_colorRed.w : _10_colorGreen.w);
-        _342 = all(bool4(_329.x == _10_colorRed.x, _329.y == _10_colorRed.y, _329.z == _10_colorRed.z, _329.w == _10_colorRed.w));
-    }
-    else
-    {
-        _342 = false;
-    }
-    bool _349 = false;
-    if (_342)
-    {
-        _349 = 0.0f == _10_colorGreen.x;
-    }
-    else
-    {
-        _349 = false;
-    }
-    bool _359 = false;
-    if (_349)
-    {
-        _359 = all(bool2(float2(0.0f, 1.0f).x == _10_colorGreen.xy.x, float2(0.0f, 1.0f).y == _10_colorGreen.xy.y));
-    }
-    else
-    {
-        _359 = false;
-    }
-    bool _368 = false;
-    if (_359)
-    {
-        _368 = all(bool3(float3(0.0f, 1.0f, 0.0f).x == _10_colorGreen.xyz.x, float3(0.0f, 1.0f, 0.0f).y == _10_colorGreen.xyz.y, float3(0.0f, 1.0f, 0.0f).z == _10_colorGreen.xyz.z));
-    }
-    else
-    {
-        _368 = false;
-    }
-    bool _376 = false;
-    if (_368)
-    {
-        _376 = all(bool4(float4(0.0f, 1.0f, 0.0f, 1.0f).x == _10_colorGreen.x, float4(0.0f, 1.0f, 0.0f, 1.0f).y == _10_colorGreen.y, float4(0.0f, 1.0f, 0.0f, 1.0f).z == _10_colorGreen.z, float4(0.0f, 1.0f, 0.0f, 1.0f).w == _10_colorGreen.w));
-    }
-    else
-    {
-        _376 = false;
-    }
-    bool _383 = false;
-    if (_376)
-    {
-        _383 = 1.0f == _10_colorRed.x;
-    }
-    else
-    {
-        _383 = false;
-    }
-    bool _392 = false;
-    if (_383)
-    {
-        _392 = all(bool2(float2(1.0f, 0.0f).x == _10_colorRed.xy.x, float2(1.0f, 0.0f).y == _10_colorRed.xy.y));
-    }
-    else
-    {
-        _392 = false;
-    }
-    bool _401 = false;
-    if (_392)
-    {
-        _401 = all(bool3(float3(1.0f, 0.0f, 0.0f).x == _10_colorRed.xyz.x, float3(1.0f, 0.0f, 0.0f).y == _10_colorRed.xyz.y, float3(1.0f, 0.0f, 0.0f).z == _10_colorRed.xyz.z));
-    }
-    else
-    {
-        _401 = false;
-    }
-    bool _409 = false;
-    if (_401)
-    {
-        _409 = all(bool4(float4(1.0f, 0.0f, 0.0f, 1.0f).x == _10_colorRed.x, float4(1.0f, 0.0f, 0.0f, 1.0f).y == _10_colorRed.y, float4(1.0f, 0.0f, 0.0f, 1.0f).z == _10_colorRed.z, float4(1.0f, 0.0f, 0.0f, 1.0f).w == _10_colorRed.w));
-    }
-    else
-    {
-        _409 = false;
-    }
-    float4 _410 = 0.0f.xxxx;
-    if (_409)
-    {
-        _410 = _10_colorGreen;
-    }
-    else
-    {
-        _410 = _10_colorRed;
-    }
-    return _410;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/MixFloat.hlsl b/tests/sksl/intrinsics/MixFloat.hlsl
deleted file mode 100644
index bdd8ed4..0000000
--- a/tests/sksl/intrinsics/MixFloat.hlsl
+++ /dev/null
@@ -1,227 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float4 _10_colorBlack : packoffset(c2);
-    float4 _10_colorWhite : packoffset(c3);
-    float4 _10_testInputs : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedBW = float4(0.5f, 0.5f, 0.5f, 1.0f);
-    float4 expectedWT = float4(1.0f, 0.5f, 1.0f, 2.25f);
-    float4 _35 = lerp(_10_colorGreen, _10_colorRed, 0.0f.xxxx);
-    bool _62 = false;
-    if (all(bool4(_35.x == float4(0.0f, 1.0f, 0.0f, 1.0f).x, _35.y == float4(0.0f, 1.0f, 0.0f, 1.0f).y, _35.z == float4(0.0f, 1.0f, 0.0f, 1.0f).z, _35.w == float4(0.0f, 1.0f, 0.0f, 1.0f).w)))
-    {
-        float4 _51 = lerp(_10_colorGreen, _10_colorRed, 0.25f.xxxx);
-        _62 = all(bool4(_51.x == float4(0.25f, 0.75f, 0.0f, 1.0f).x, _51.y == float4(0.25f, 0.75f, 0.0f, 1.0f).y, _51.z == float4(0.25f, 0.75f, 0.0f, 1.0f).z, _51.w == float4(0.25f, 0.75f, 0.0f, 1.0f).w));
-    }
-    else
-    {
-        _62 = false;
-    }
-    bool _74 = false;
-    if (_62)
-    {
-        float4 _65 = lerp(_10_colorGreen, _10_colorRed, 0.75f.xxxx);
-        _74 = all(bool4(_65.x == float4(0.75f, 0.25f, 0.0f, 1.0f).x, _65.y == float4(0.75f, 0.25f, 0.0f, 1.0f).y, _65.z == float4(0.75f, 0.25f, 0.0f, 1.0f).z, _65.w == float4(0.75f, 0.25f, 0.0f, 1.0f).w));
-    }
-    else
-    {
-        _74 = false;
-    }
-    bool _86 = false;
-    if (_74)
-    {
-        float4 _77 = lerp(_10_colorGreen, _10_colorRed, 1.0f.xxxx);
-        _86 = all(bool4(_77.x == float4(1.0f, 0.0f, 0.0f, 1.0f).x, _77.y == float4(1.0f, 0.0f, 0.0f, 1.0f).y, _77.z == float4(1.0f, 0.0f, 0.0f, 1.0f).z, _77.w == float4(1.0f, 0.0f, 0.0f, 1.0f).w));
-    }
-    else
-    {
-        _86 = false;
-    }
-    bool _99 = false;
-    if (_86)
-    {
-        _99 = lerp(_10_colorBlack.x, _10_colorWhite.x, 0.5f) == 0.5f;
-    }
-    else
-    {
-        _99 = false;
-    }
-    bool _114 = false;
-    if (_99)
-    {
-        float2 _102 = lerp(_10_colorBlack.xy, _10_colorWhite.xy, 0.5f.xx);
-        _114 = all(bool2(_102.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.x, _102.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.y));
-    }
-    else
-    {
-        _114 = false;
-    }
-    bool _130 = false;
-    if (_114)
-    {
-        float3 _117 = lerp(_10_colorBlack.xyz, _10_colorWhite.xyz, 0.5f.xxx);
-        _130 = all(bool3(_117.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.x, _117.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.y, _117.z == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _130 = false;
-    }
-    bool _141 = false;
-    if (_130)
-    {
-        float4 _133 = lerp(_10_colorBlack, _10_colorWhite, 0.5f.xxxx);
-        _141 = all(bool4(_133.x == float4(0.5f, 0.5f, 0.5f, 1.0f).x, _133.y == float4(0.5f, 0.5f, 0.5f, 1.0f).y, _133.z == float4(0.5f, 0.5f, 0.5f, 1.0f).z, _133.w == float4(0.5f, 0.5f, 0.5f, 1.0f).w));
-    }
-    else
-    {
-        _141 = false;
-    }
-    bool _145 = false;
-    if (_141)
-    {
-        _145 = true;
-    }
-    else
-    {
-        _145 = false;
-    }
-    bool _151 = false;
-    if (_145)
-    {
-        _151 = all(bool2(0.5f.xx.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.x, 0.5f.xx.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xy.y));
-    }
-    else
-    {
-        _151 = false;
-    }
-    bool _157 = false;
-    if (_151)
-    {
-        _157 = all(bool3(0.5f.xxx.x == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.x, 0.5f.xxx.y == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.y, 0.5f.xxx.z == float4(0.5f, 0.5f, 0.5f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _157 = false;
-    }
-    bool _160 = false;
-    if (_157)
-    {
-        _160 = true;
-    }
-    else
-    {
-        _160 = false;
-    }
-    bool _172 = false;
-    if (_160)
-    {
-        _172 = lerp(_10_colorWhite.x, _10_testInputs.x, 0.0f) == 1.0f;
-    }
-    else
-    {
-        _172 = false;
-    }
-    bool _186 = false;
-    if (_172)
-    {
-        float2 _175 = lerp(_10_colorWhite.xy, _10_testInputs.xy, float2(0.0f, 0.5f));
-        _186 = all(bool2(_175.x == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.x, _175.y == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.y));
-    }
-    else
-    {
-        _186 = false;
-    }
-    bool _200 = false;
-    if (_186)
-    {
-        float3 _189 = lerp(_10_colorWhite.xyz, _10_testInputs.xyz, float3(0.0f, 0.5f, 0.0f));
-        _200 = all(bool3(_189.x == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.x, _189.y == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.y, _189.z == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _200 = false;
-    }
-    bool _211 = false;
-    if (_200)
-    {
-        float4 _203 = lerp(_10_colorWhite, _10_testInputs, float4(0.0f, 0.5f, 0.0f, 1.0f));
-        _211 = all(bool4(_203.x == float4(1.0f, 0.5f, 1.0f, 2.25f).x, _203.y == float4(1.0f, 0.5f, 1.0f, 2.25f).y, _203.z == float4(1.0f, 0.5f, 1.0f, 2.25f).z, _203.w == float4(1.0f, 0.5f, 1.0f, 2.25f).w));
-    }
-    else
-    {
-        _211 = false;
-    }
-    bool _214 = false;
-    if (_211)
-    {
-        _214 = true;
-    }
-    else
-    {
-        _214 = false;
-    }
-    bool _221 = false;
-    if (_214)
-    {
-        _221 = all(bool2(float2(1.0f, 0.5f).x == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.x, float2(1.0f, 0.5f).y == float4(1.0f, 0.5f, 1.0f, 2.25f).xy.y));
-    }
-    else
-    {
-        _221 = false;
-    }
-    bool _228 = false;
-    if (_221)
-    {
-        _228 = all(bool3(float3(1.0f, 0.5f, 1.0f).x == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.x, float3(1.0f, 0.5f, 1.0f).y == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.y, float3(1.0f, 0.5f, 1.0f).z == float4(1.0f, 0.5f, 1.0f, 2.25f).xyz.z));
-    }
-    else
-    {
-        _228 = false;
-    }
-    bool _231 = false;
-    if (_228)
-    {
-        _231 = true;
-    }
-    else
-    {
-        _231 = false;
-    }
-    float4 _232 = 0.0f.xxxx;
-    if (_231)
-    {
-        _232 = _10_colorGreen;
-    }
-    else
-    {
-        _232 = _10_colorRed;
-    }
-    return _232;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Mod.hlsl b/tests/sksl/intrinsics/Mod.hlsl
deleted file mode 100644
index 3b46785..0000000
--- a/tests/sksl/intrinsics/Mod.hlsl
+++ /dev/null
@@ -1,206 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-    float4 _10_colorWhite : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float mod(float x, float y)
-{
-    return x - y * floor(x / y);
-}
-
-float2 mod(float2 x, float2 y)
-{
-    return x - y * floor(x / y);
-}
-
-float3 mod(float3 x, float3 y)
-{
-    return x - y * floor(x / y);
-}
-
-float4 mod(float4 x, float4 y)
-{
-    return x - y * floor(x / y);
-}
-
-float4 main(float2 _24)
-{
-    float4 expectedA = float4(0.75f, 0.0f, 0.75f, 0.25f);
-    float4 expectedB = float4(0.25f, 0.0f, 0.75f, 1.0f);
-    bool _54 = false;
-    if (mod(_10_testInputs.x, 1.0f) == 0.75f)
-    {
-        float2 _45 = mod(_10_testInputs.xy, 1.0f.xx);
-        _54 = all(bool2(_45.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.x, _45.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.y));
-    }
-    else
-    {
-        _54 = false;
-    }
-    bool _67 = false;
-    if (_54)
-    {
-        float3 _57 = mod(_10_testInputs.xyz, 1.0f.xxx);
-        _67 = all(bool3(_57.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.x, _57.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.y, _57.z == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.z));
-    }
-    else
-    {
-        _67 = false;
-    }
-    bool _77 = false;
-    if (_67)
-    {
-        float4 _70 = mod(_10_testInputs, 1.0f.xxxx);
-        _77 = all(bool4(_70.x == float4(0.75f, 0.0f, 0.75f, 0.25f).x, _70.y == float4(0.75f, 0.0f, 0.75f, 0.25f).y, _70.z == float4(0.75f, 0.0f, 0.75f, 0.25f).z, _70.w == float4(0.75f, 0.0f, 0.75f, 0.25f).w));
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _81 = false;
-    if (_77)
-    {
-        _81 = true;
-    }
-    else
-    {
-        _81 = false;
-    }
-    bool _88 = false;
-    if (_81)
-    {
-        _88 = all(bool2(float2(0.75f, 0.0f).x == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.x, float2(0.75f, 0.0f).y == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.y));
-    }
-    else
-    {
-        _88 = false;
-    }
-    bool _95 = false;
-    if (_88)
-    {
-        _95 = all(bool3(float3(0.75f, 0.0f, 0.75f).x == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.x, float3(0.75f, 0.0f, 0.75f).y == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.y, float3(0.75f, 0.0f, 0.75f).z == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.z));
-    }
-    else
-    {
-        _95 = false;
-    }
-    bool _98 = false;
-    if (_95)
-    {
-        _98 = true;
-    }
-    else
-    {
-        _98 = false;
-    }
-    bool _110 = false;
-    if (_98)
-    {
-        _110 = mod(_10_testInputs.x, _10_colorWhite.x) == 0.75f;
-    }
-    else
-    {
-        _110 = false;
-    }
-    bool _123 = false;
-    if (_110)
-    {
-        float2 _113 = mod(_10_testInputs.xy, _10_colorWhite.xy);
-        _123 = all(bool2(_113.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.x, _113.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xy.y));
-    }
-    else
-    {
-        _123 = false;
-    }
-    bool _136 = false;
-    if (_123)
-    {
-        float3 _126 = mod(_10_testInputs.xyz, _10_colorWhite.xyz);
-        _136 = all(bool3(_126.x == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.x, _126.y == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.y, _126.z == float4(0.75f, 0.0f, 0.75f, 0.25f).xyz.z));
-    }
-    else
-    {
-        _136 = false;
-    }
-    bool _146 = false;
-    if (_136)
-    {
-        float4 _139 = mod(_10_testInputs, _10_colorWhite);
-        _146 = all(bool4(_139.x == float4(0.75f, 0.0f, 0.75f, 0.25f).x, _139.y == float4(0.75f, 0.0f, 0.75f, 0.25f).y, _139.z == float4(0.75f, 0.0f, 0.75f, 0.25f).z, _139.w == float4(0.75f, 0.0f, 0.75f, 0.25f).w));
-    }
-    else
-    {
-        _146 = false;
-    }
-    bool _149 = false;
-    if (_146)
-    {
-        _149 = true;
-    }
-    else
-    {
-        _149 = false;
-    }
-    bool _156 = false;
-    if (_149)
-    {
-        _156 = all(bool2(float2(0.25f, 0.0f).x == float4(0.25f, 0.0f, 0.75f, 1.0f).xy.x, float2(0.25f, 0.0f).y == float4(0.25f, 0.0f, 0.75f, 1.0f).xy.y));
-    }
-    else
-    {
-        _156 = false;
-    }
-    bool _163 = false;
-    if (_156)
-    {
-        _163 = all(bool3(float3(0.25f, 0.0f, 0.75f).x == float4(0.25f, 0.0f, 0.75f, 1.0f).xyz.x, float3(0.25f, 0.0f, 0.75f).y == float4(0.25f, 0.0f, 0.75f, 1.0f).xyz.y, float3(0.25f, 0.0f, 0.75f).z == float4(0.25f, 0.0f, 0.75f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _163 = false;
-    }
-    bool _166 = false;
-    if (_163)
-    {
-        _166 = true;
-    }
-    else
-    {
-        _166 = false;
-    }
-    float4 _167 = 0.0f.xxxx;
-    if (_166)
-    {
-        _167 = _10_colorGreen;
-    }
-    else
-    {
-        _167 = _10_colorRed;
-    }
-    return _167;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Modf.hlsl b/tests/sksl/intrinsics/Modf.hlsl
deleted file mode 100644
index b011bae..0000000
--- a/tests/sksl/intrinsics/Modf.hlsl
+++ /dev/null
@@ -1,105 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 value = float4(2.5f, -2.5f, 8.0f, -0.125f);
-    bool4 ok = bool4(false, false, false, false);
-    float4 whole = 0.0f.xxxx;
-    float _45 = 0.0f;
-    float _40 = modf(2.5f, _45);
-    whole.x = _45;
-    float4 fraction = 0.0f.xxxx;
-    fraction.x = _40;
-    bool _58 = false;
-    if (whole.x == 2.0f)
-    {
-        _58 = fraction.x == 0.5f;
-    }
-    else
-    {
-        _58 = false;
-    }
-    ok.x = _58;
-    float2 _64 = 0.0f.xx;
-    float2 _61 = modf(value.xy, _64);
-    float4 _66 = whole;
-    whole = float4(_64.x, _64.y, _66.z, _66.w);
-    float4 _68 = fraction;
-    fraction = float4(_61.x, _61.y, _68.z, _68.w);
-    bool _83 = false;
-    if (all(bool2(float4(_64.x, _64.y, _66.z, _66.w).xy.x == float2(2.0f, -2.0f).x, float4(_64.x, _64.y, _66.z, _66.w).xy.y == float2(2.0f, -2.0f).y)))
-    {
-        _83 = all(bool2(float4(_61.x, _61.y, _68.z, _68.w).xy.x == float2(0.5f, -0.5f).x, float4(_61.x, _61.y, _68.z, _68.w).xy.y == float2(0.5f, -0.5f).y));
-    }
-    else
-    {
-        _83 = false;
-    }
-    ok.y = _83;
-    float3 _90 = 0.0f.xxx;
-    float3 _86 = modf(value.xyz, _90);
-    float4 _93 = whole;
-    whole = float4(_90.x, _90.y, _90.z, _93.w);
-    float4 _95 = fraction;
-    fraction = float4(_86.x, _86.y, _86.z, _95.w);
-    bool _108 = false;
-    if (all(bool3(float4(_90.x, _90.y, _90.z, _93.w).xyz.x == float3(2.0f, -2.0f, 8.0f).x, float4(_90.x, _90.y, _90.z, _93.w).xyz.y == float3(2.0f, -2.0f, 8.0f).y, float4(_90.x, _90.y, _90.z, _93.w).xyz.z == float3(2.0f, -2.0f, 8.0f).z)))
-    {
-        _108 = all(bool3(float4(_86.x, _86.y, _86.z, _95.w).xyz.x == float3(0.5f, -0.5f, 0.0f).x, float4(_86.x, _86.y, _86.z, _95.w).xyz.y == float3(0.5f, -0.5f, 0.0f).y, float4(_86.x, _86.y, _86.z, _95.w).xyz.z == float3(0.5f, -0.5f, 0.0f).z));
-    }
-    else
-    {
-        _108 = false;
-    }
-    ok.z = _108;
-    float4 _113 = 0.0f.xxxx;
-    float4 _111 = modf(value, _113);
-    whole = _113;
-    fraction = _111;
-    bool _123 = false;
-    if (all(bool4(_113.x == float4(2.0f, -2.0f, 8.0f, 0.0f).x, _113.y == float4(2.0f, -2.0f, 8.0f, 0.0f).y, _113.z == float4(2.0f, -2.0f, 8.0f, 0.0f).z, _113.w == float4(2.0f, -2.0f, 8.0f, 0.0f).w)))
-    {
-        _123 = all(bool4(_111.x == float4(0.5f, -0.5f, 0.0f, -0.125f).x, _111.y == float4(0.5f, -0.5f, 0.0f, -0.125f).y, _111.z == float4(0.5f, -0.5f, 0.0f, -0.125f).z, _111.w == float4(0.5f, -0.5f, 0.0f, -0.125f).w));
-    }
-    else
-    {
-        _123 = false;
-    }
-    ok.w = _123;
-    float4 _128 = 0.0f.xxxx;
-    if (all(ok))
-    {
-        _128 = _10_colorGreen;
-    }
-    else
-    {
-        _128 = _10_colorRed;
-    }
-    return _128;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Normalize.hlsl b/tests/sksl/intrinsics/Normalize.hlsl
deleted file mode 100644
index fa5b8af..0000000
--- a/tests/sksl/intrinsics/Normalize.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedVec = float4(1.0f, 0.0f, 0.0f, 0.0f);
-    bool _49 = false;
-    if (sign(_10_inputVal.x) == 1.0f)
-    {
-        float2 _41 = normalize(_10_inputVal.xy);
-        _49 = all(bool2(_41.x == float4(1.0f, 0.0f, 0.0f, 0.0f).xy.x, _41.y == float4(1.0f, 0.0f, 0.0f, 0.0f).xy.y));
-    }
-    else
-    {
-        _49 = false;
-    }
-    bool _61 = false;
-    if (_49)
-    {
-        float3 _52 = normalize(_10_inputVal.xyz);
-        _61 = all(bool3(_52.x == float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.x, _52.y == float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.y, _52.z == float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.z));
-    }
-    else
-    {
-        _61 = false;
-    }
-    bool _70 = false;
-    if (_61)
-    {
-        float4 _64 = normalize(_10_inputVal);
-        _70 = all(bool4(_64.x == float4(1.0f, 0.0f, 0.0f, 0.0f).x, _64.y == float4(1.0f, 0.0f, 0.0f, 0.0f).y, _64.z == float4(1.0f, 0.0f, 0.0f, 0.0f).z, _64.w == float4(1.0f, 0.0f, 0.0f, 0.0f).w));
-    }
-    else
-    {
-        _70 = false;
-    }
-    bool _74 = false;
-    if (_70)
-    {
-        _74 = true;
-    }
-    else
-    {
-        _74 = false;
-    }
-    bool _81 = false;
-    if (_74)
-    {
-        _81 = all(bool2(float2(0.0f, 1.0f).x == float4(1.0f, 0.0f, 0.0f, 0.0f).yx.x, float2(0.0f, 1.0f).y == float4(1.0f, 0.0f, 0.0f, 0.0f).yx.y));
-    }
-    else
-    {
-        _81 = false;
-    }
-    bool _88 = false;
-    if (_81)
-    {
-        _88 = all(bool3(float3(0.0f, 1.0f, 0.0f).x == float4(1.0f, 0.0f, 0.0f, 0.0f).zxy.x, float3(0.0f, 1.0f, 0.0f).y == float4(1.0f, 0.0f, 0.0f, 0.0f).zxy.y, float3(0.0f, 1.0f, 0.0f).z == float4(1.0f, 0.0f, 0.0f, 0.0f).zxy.z));
-    }
-    else
-    {
-        _88 = false;
-    }
-    bool _91 = false;
-    if (_88)
-    {
-        _91 = true;
-    }
-    else
-    {
-        _91 = false;
-    }
-    float4 _92 = 0.0f.xxxx;
-    if (_91)
-    {
-        _92 = _10_colorGreen;
-    }
-    else
-    {
-        _92 = _10_colorRed;
-    }
-    return _92;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Not.hlsl b/tests/sksl/intrinsics/Not.hlsl
deleted file mode 100644
index c2cc98a..0000000
--- a/tests/sksl/intrinsics/Not.hlsl
+++ /dev/null
@@ -1,101 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputH4 : packoffset(c0);
-    float4 _10_expectedH4 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool4 _42 = bool4(_10_inputH4.x != 0.0f, _10_inputH4.y != 0.0f, _10_inputH4.z != 0.0f, _10_inputH4.w != 0.0f);
-    bool4 inputVal = _42;
-    bool4 _55 = bool4(_10_expectedH4.x != 0.0f, _10_expectedH4.y != 0.0f, _10_expectedH4.z != 0.0f, _10_expectedH4.w != 0.0f);
-    bool4 expected = _55;
-    bool2 _58 = _42.xy;
-    bool2 _57 = bool2(!_58.x, !_58.y);
-    bool2 _60 = _55.xy;
-    bool _71 = false;
-    if (all(bool2(_57.x == _60.x, _57.y == _60.y)))
-    {
-        bool3 _66 = _42.xyz;
-        bool3 _65 = bool3(!_66.x, !_66.y, !_66.z);
-        bool3 _68 = _55.xyz;
-        _71 = all(bool3(_65.x == _68.x, _65.y == _68.y, _65.z == _68.z));
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _77 = false;
-    if (_71)
-    {
-        bool4 _74 = bool4(!_42.x, !_42.y, !_42.z, !_42.w);
-        _77 = all(bool4(_74.x == _55.x, _74.y == _55.y, _74.z == _55.z, _74.w == _55.w));
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool _85 = false;
-    if (_77)
-    {
-        bool2 _82 = _55.xy;
-        _85 = all(bool2(bool2(false, true).x == _82.x, bool2(false, true).y == _82.y));
-    }
-    else
-    {
-        _85 = false;
-    }
-    bool _92 = false;
-    if (_85)
-    {
-        bool3 _89 = _55.xyz;
-        _92 = all(bool3(bool3(false, true, false).x == _89.x, bool3(false, true, false).y == _89.y, bool3(false, true, false).z == _89.z));
-    }
-    else
-    {
-        _92 = false;
-    }
-    bool _98 = false;
-    if (_92)
-    {
-        _98 = all(bool4(bool4(false, true, false, true).x == _55.x, bool4(false, true, false, true).y == _55.y, bool4(false, true, false, true).z == _55.z, bool4(false, true, false, true).w == _55.w));
-    }
-    else
-    {
-        _98 = false;
-    }
-    float4 _99 = 0.0f.xxxx;
-    if (_98)
-    {
-        _99 = _10_colorGreen;
-    }
-    else
-    {
-        _99 = _10_colorRed;
-    }
-    return _99;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/NotEqual.hlsl b/tests/sksl/intrinsics/NotEqual.hlsl
deleted file mode 100644
index 9019850..0000000
--- a/tests/sksl/intrinsics/NotEqual.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-    uint2 _10_c : packoffset(c2);
-    uint2 _10_d : packoffset(c2.z);
-    int3 _10_e : packoffset(c3);
-    int3 _10_f : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool4 expectFFTT = bool4(false, false, true, true);
-    bool4 expectTTFF = bool4(true, true, false, false);
-    sk_FragColor.x = float(int(bool4(_10_a.x != _10_b.x, _10_a.y != _10_b.y, _10_a.z != _10_b.z, _10_a.w != _10_b.w).x));
-    sk_FragColor.y = float(int(bool2(_10_c.x != _10_d.x, _10_c.y != _10_d.y).y));
-    sk_FragColor.z = float(int(bool3(_10_e.x != _10_f.x, _10_e.y != _10_f.y, _10_e.z != _10_f.z).z));
-    bool _73 = false;
-    if (any(expectTTFF))
-    {
-        _73 = true;
-    }
-    else
-    {
-        _73 = any(expectFFTT);
-    }
-    sk_FragColor.w = float(int(_73));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/OuterProduct.hlsl b/tests/sksl/intrinsics/OuterProduct.hlsl
deleted file mode 100644
index db9fb31..0000000
--- a/tests/sksl/intrinsics/OuterProduct.hlsl
+++ /dev/null
@@ -1,113 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
-    row_major float3x3 _10_testMatrix3x3 : packoffset(c4);
-    float4 _10_testInputs : packoffset(c7);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    float2x2 _30 = float2x2(_10_testMatrix2x2[0] * _10_testMatrix2x2[1].x, _10_testMatrix2x2[0] * _10_testMatrix2x2[1].y);
-    float2 _51 = _30[0];
-    float2 _54 = _30[1];
-    bool _91 = false;
-    if (all(bool2(_51.x == float2(3.0f, 6.0f).x, _51.y == float2(3.0f, 6.0f).y)) && all(bool2(_54.x == float2(4.0f, 8.0f).x, _54.y == float2(4.0f, 8.0f).y)))
-    {
-        float3x3 _60 = float3x3(_10_testMatrix3x3[0] * _10_testMatrix3x3[1].x, _10_testMatrix3x3[0] * _10_testMatrix3x3[1].y, _10_testMatrix3x3[0] * _10_testMatrix3x3[1].z);
-        float3 _80 = _60[0];
-        float3 _83 = _60[1];
-        float3 _87 = _60[2];
-        _91 = (all(bool3(_80.x == float3(4.0f, 8.0f, 12.0f).x, _80.y == float3(4.0f, 8.0f, 12.0f).y, _80.z == float3(4.0f, 8.0f, 12.0f).z)) && all(bool3(_83.x == float3(5.0f, 10.0f, 15.0f).x, _83.y == float3(5.0f, 10.0f, 15.0f).y, _83.z == float3(5.0f, 10.0f, 15.0f).z))) && all(bool3(_87.x == float3(6.0f, 12.0f, 18.0f).x, _87.y == float3(6.0f, 12.0f, 18.0f).y, _87.z == float3(6.0f, 12.0f, 18.0f).z));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _116 = false;
-    if (_91)
-    {
-        float3x2 _94 = float3x2(_10_testMatrix2x2[0] * _10_testMatrix3x3[1].x, _10_testMatrix2x2[0] * _10_testMatrix3x3[1].y, _10_testMatrix2x2[0] * _10_testMatrix3x3[1].z);
-        float2 _105 = _94[0];
-        float2 _108 = _94[1];
-        float2 _112 = _94[2];
-        _116 = (all(bool2(_105.x == float2(4.0f, 8.0f).x, _105.y == float2(4.0f, 8.0f).y)) && all(bool2(_108.x == float2(5.0f, 10.0f).x, _108.y == float2(5.0f, 10.0f).y))) && all(bool2(_112.x == float2(6.0f, 12.0f).x, _112.y == float2(6.0f, 12.0f).y));
-    }
-    else
-    {
-        _116 = false;
-    }
-    bool _154 = false;
-    if (_116)
-    {
-        float4x4 _119 = float4x4(_10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).x, _10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).y, _10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).z, _10_testInputs * float4(1.0f, 0.0f, 0.0f, 2.0f).w);
-        float4 _139 = _119[0];
-        float4 _142 = _119[1];
-        float4 _146 = _119[2];
-        float4 _150 = _119[3];
-        _154 = ((all(bool4(_139.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _139.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _139.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _139.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w)) && all(bool4(_142.x == 0.0f.xxxx.x, _142.y == 0.0f.xxxx.y, _142.z == 0.0f.xxxx.z, _142.w == 0.0f.xxxx.w))) && all(bool4(_146.x == 0.0f.xxxx.x, _146.y == 0.0f.xxxx.y, _146.z == 0.0f.xxxx.z, _146.w == 0.0f.xxxx.w))) && all(bool4(_150.x == float4(-2.5f, 0.0f, 1.5f, 4.5f).x, _150.y == float4(-2.5f, 0.0f, 1.5f, 4.5f).y, _150.z == float4(-2.5f, 0.0f, 1.5f, 4.5f).z, _150.w == float4(-2.5f, 0.0f, 1.5f, 4.5f).w));
-    }
-    else
-    {
-        _154 = false;
-    }
-    bool _170 = false;
-    if (_154)
-    {
-        float2x4 _157 = float2x4(_10_testInputs * float2(1.0f, 2.0f).x, _10_testInputs * float2(1.0f, 2.0f).y);
-        float4 _163 = _157[0];
-        float4 _166 = _157[1];
-        _170 = all(bool4(_163.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _163.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _163.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _163.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w)) && all(bool4(_166.x == float4(-2.5f, 0.0f, 1.5f, 4.5f).x, _166.y == float4(-2.5f, 0.0f, 1.5f, 4.5f).y, _166.z == float4(-2.5f, 0.0f, 1.5f, 4.5f).z, _166.w == float4(-2.5f, 0.0f, 1.5f, 4.5f).w));
-    }
-    else
-    {
-        _170 = false;
-    }
-    bool _196 = false;
-    if (_170)
-    {
-        float4x2 _173 = float4x2(float2(1.0f, 2.0f) * _10_testInputs.x, float2(1.0f, 2.0f) * _10_testInputs.y, float2(1.0f, 2.0f) * _10_testInputs.z, float2(1.0f, 2.0f) * _10_testInputs.w);
-        float2 _181 = _173[0];
-        float2 _184 = _173[1];
-        float2 _188 = _173[2];
-        float2 _192 = _173[3];
-        _196 = ((all(bool2(_181.x == float2(-1.25f, -2.5f).x, _181.y == float2(-1.25f, -2.5f).y)) && all(bool2(_184.x == 0.0f.xx.x, _184.y == 0.0f.xx.y))) && all(bool2(_188.x == float2(0.75f, 1.5f).x, _188.y == float2(0.75f, 1.5f).y))) && all(bool2(_192.x == float2(2.25f, 4.5f).x, _192.y == float2(2.25f, 4.5f).y));
-    }
-    else
-    {
-        _196 = false;
-    }
-    float4 _197 = 0.0f.xxxx;
-    if (_196)
-    {
-        _197 = _10_colorGreen;
-    }
-    else
-    {
-        _197 = _10_colorRed;
-    }
-    return _197;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Pack.hlsl b/tests/sksl/intrinsics/Pack.hlsl
deleted file mode 100644
index 09d9200..0000000
--- a/tests/sksl/intrinsics/Pack.hlsl
+++ /dev/null
@@ -1,91 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float2 _10_a : packoffset(c0);
-    float4 _10_b : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-uint spvPackHalf2x16(float2 value)
-{
-    uint2 Packed = f32tof16(value);
-    return Packed.x | (Packed.y << 16);
-}
-
-float2 spvUnpackHalf2x16(uint value)
-{
-    return f16tof32(uint2(value & 0xffff, value >> 16));
-}
-
-uint spvPackUnorm4x8(float4 value)
-{
-    uint4 Packed = uint4(round(saturate(value) * 255.0));
-    return Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24);
-}
-
-float4 spvUnpackUnorm4x8(uint value)
-{
-    uint4 Packed = uint4(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, value >> 24);
-    return float4(Packed) / 255.0;
-}
-
-uint spvPackSnorm4x8(float4 value)
-{
-    int4 Packed = int4(round(clamp(value, -1.0, 1.0) * 127.0)) & 0xff;
-    return uint(Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24));
-}
-
-float4 spvUnpackSnorm4x8(uint value)
-{
-    int SignedValue = int(value);
-    int4 Packed = int4(SignedValue << 24, SignedValue << 16, SignedValue << 8, SignedValue) >> 24;
-    return clamp(float4(Packed) / 127.0, -1.0, 1.0);
-}
-
-uint spvPackUnorm2x16(float2 value)
-{
-    uint2 Packed = uint2(round(saturate(value) * 65535.0));
-    return Packed.x | (Packed.y << 16);
-}
-
-float2 spvUnpackUnorm2x16(uint value)
-{
-    uint2 Packed = uint2(value & 0xffff, value >> 16);
-    return float2(Packed) / 65535.0;
-}
-
-uint spvPackSnorm2x16(float2 value)
-{
-    int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
-    return uint(Packed.x | (Packed.y << 16));
-}
-
-float2 spvUnpackSnorm2x16(uint value)
-{
-    int SignedValue = int(value);
-    int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
-    return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
-}
-
-void frag_main()
-{
-    sk_FragColor.x = float(spvPackHalf2x16(_10_a));
-    sk_FragColor.x = float(spvPackUnorm2x16(_10_a));
-    sk_FragColor.x = float(spvPackSnorm2x16(_10_a));
-    sk_FragColor.x = float(spvPackUnorm4x8(_10_b));
-    sk_FragColor.x = float(spvPackSnorm4x8(_10_b));
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/PackHalf2x16.hlsl b/tests/sksl/intrinsics/PackHalf2x16.hlsl
deleted file mode 100644
index e40a51a..0000000
--- a/tests/sksl/intrinsics/PackHalf2x16.hlsl
+++ /dev/null
@@ -1,68 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float4 _10_testInputs : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-uint spvPackHalf2x16(float2 value)
-{
-    uint2 Packed = f32tof16(value);
-    return Packed.x | (Packed.y << 16);
-}
-
-float2 spvUnpackHalf2x16(uint value)
-{
-    return f16tof32(uint2(value & 0xffff, value >> 16));
-}
-
-float4 main(float2 _24)
-{
-    uint _29 = spvPackHalf2x16(_10_testInputs.xy);
-    uint xy = _29;
-    uint _37 = spvPackHalf2x16(_10_testInputs.zw);
-    uint zw = _37;
-    float2 _42 = spvUnpackHalf2x16(_29);
-    bool _56 = false;
-    if (all(bool2(_42.x == float2(-1.25f, 0.0f).x, _42.y == float2(-1.25f, 0.0f).y)))
-    {
-        float2 _50 = spvUnpackHalf2x16(_37);
-        _56 = all(bool2(_50.x == float2(0.75f, 2.25f).x, _50.y == float2(0.75f, 2.25f).y));
-    }
-    else
-    {
-        _56 = false;
-    }
-    float4 _57 = 0.0f.xxxx;
-    if (_56)
-    {
-        _57 = _10_colorGreen;
-    }
-    else
-    {
-        _57 = _10_colorRed;
-    }
-    return _57;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/PackSnorm2x16.hlsl b/tests/sksl/intrinsics/PackSnorm2x16.hlsl
deleted file mode 100644
index c16e9d8..0000000
--- a/tests/sksl/intrinsics/PackSnorm2x16.hlsl
+++ /dev/null
@@ -1,70 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float4 _10_testInputs : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-uint spvPackSnorm2x16(float2 value)
-{
-    int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
-    return uint(Packed.x | (Packed.y << 16));
-}
-
-float2 spvUnpackSnorm2x16(uint value)
-{
-    int SignedValue = int(value);
-    int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
-    return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
-}
-
-float4 main(float2 _24)
-{
-    uint _29 = spvPackSnorm2x16(_10_testInputs.xy);
-    uint xy = _29;
-    uint _37 = spvPackSnorm2x16(_10_testInputs.zw);
-    uint zw = _37;
-    float2 _44 = abs(spvUnpackSnorm2x16(_29) - float2(-1.0f, 0.0f));
-    bool _62 = false;
-    if (all(bool2(_44.x < 0.015625f.xx.x, _44.y < 0.015625f.xx.y)))
-    {
-        float2 _56 = abs(spvUnpackSnorm2x16(_37) - float2(0.75f, 1.0f));
-        _62 = all(bool2(_56.x < 0.015625f.xx.x, _56.y < 0.015625f.xx.y));
-    }
-    else
-    {
-        _62 = false;
-    }
-    float4 _63 = 0.0f.xxxx;
-    if (_62)
-    {
-        _63 = _10_colorGreen;
-    }
-    else
-    {
-        _63 = _10_colorRed;
-    }
-    return _63;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/PackUnorm2x16.hlsl b/tests/sksl/intrinsics/PackUnorm2x16.hlsl
deleted file mode 100644
index 7297d99..0000000
--- a/tests/sksl/intrinsics/PackUnorm2x16.hlsl
+++ /dev/null
@@ -1,69 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float4 _10_testInputs : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-uint spvPackUnorm2x16(float2 value)
-{
-    uint2 Packed = uint2(round(saturate(value) * 65535.0));
-    return Packed.x | (Packed.y << 16);
-}
-
-float2 spvUnpackUnorm2x16(uint value)
-{
-    uint2 Packed = uint2(value & 0xffff, value >> 16);
-    return float2(Packed) / 65535.0;
-}
-
-float4 main(float2 _24)
-{
-    uint _29 = spvPackUnorm2x16(_10_testInputs.xy);
-    uint xy = _29;
-    uint _37 = spvPackUnorm2x16(_10_testInputs.zw);
-    uint zw = _37;
-    float2 _44 = abs(spvUnpackUnorm2x16(_29));
-    bool _59 = false;
-    if (all(bool2(_44.x < 0.015625f.xx.x, _44.y < 0.015625f.xx.y)))
-    {
-        float2 _53 = abs(spvUnpackUnorm2x16(_37) - float2(0.75f, 1.0f));
-        _59 = all(bool2(_53.x < 0.015625f.xx.x, _53.y < 0.015625f.xx.y));
-    }
-    else
-    {
-        _59 = false;
-    }
-    float4 _60 = 0.0f.xxxx;
-    if (_59)
-    {
-        _60 = _10_colorGreen;
-    }
-    else
-    {
-        _60 = _10_colorRed;
-    }
-    return _60;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Pow.hlsl b/tests/sksl/intrinsics/Pow.hlsl
deleted file mode 100644
index 705f896..0000000
--- a/tests/sksl/intrinsics/Pow.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(-1.5625f, 0.0f, 0.75f, 3.375f);
-    bool _54 = false;
-    if (pow(_10_testInputs.x, 2.0f) == (-1.5625f))
-    {
-        float2 _44 = pow(_10_testInputs.xy, float2(2.0f, 3.0f));
-        _54 = all(bool2(_44.x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.x, _44.y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.y));
-    }
-    else
-    {
-        _54 = false;
-    }
-    bool _68 = false;
-    if (_54)
-    {
-        float3 _57 = pow(_10_testInputs.xyz, float3(2.0f, 3.0f, 1.0f));
-        _68 = all(bool3(_57.x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.x, _57.y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.y, _57.z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.z));
-    }
-    else
-    {
-        _68 = false;
-    }
-    bool _79 = false;
-    if (_68)
-    {
-        float4 _71 = pow(_10_testInputs, float4(2.0f, 3.0f, 1.0f, 1.5f));
-        _79 = all(bool4(_71.x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).x, _71.y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).y, _71.z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).z, _71.w == float4(-1.5625f, 0.0f, 0.75f, 3.375f).w));
-    }
-    else
-    {
-        _79 = false;
-    }
-    bool _84 = false;
-    if (_79)
-    {
-        _84 = 1.5625f == (-1.5625f);
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _91 = false;
-    if (_84)
-    {
-        _91 = all(bool2(float2(1.5625f, 0.0f).x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.x, float2(1.5625f, 0.0f).y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _98 = false;
-    if (_91)
-    {
-        _98 = all(bool3(float3(1.5625f, 0.0f, 0.75f).x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.x, float3(1.5625f, 0.0f, 0.75f).y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.y, float3(1.5625f, 0.0f, 0.75f).z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).xyz.z));
-    }
-    else
-    {
-        _98 = false;
-    }
-    bool _104 = false;
-    if (_98)
-    {
-        _104 = all(bool4(float4(1.5625f, 0.0f, 0.75f, 3.375f).x == float4(-1.5625f, 0.0f, 0.75f, 3.375f).x, float4(1.5625f, 0.0f, 0.75f, 3.375f).y == float4(-1.5625f, 0.0f, 0.75f, 3.375f).y, float4(1.5625f, 0.0f, 0.75f, 3.375f).z == float4(-1.5625f, 0.0f, 0.75f, 3.375f).z, float4(1.5625f, 0.0f, 0.75f, 3.375f).w == float4(-1.5625f, 0.0f, 0.75f, 3.375f).w));
-    }
-    else
-    {
-        _104 = false;
-    }
-    float4 _105 = 0.0f.xxxx;
-    if (_104)
-    {
-        _105 = _10_colorGreen;
-    }
-    else
-    {
-        _105 = _10_colorRed;
-    }
-    return _105;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Radians.hlsl b/tests/sksl/intrinsics/Radians.hlsl
deleted file mode 100644
index 72fca52..0000000
--- a/tests/sksl/intrinsics/Radians.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (radians(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = radians(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = radians(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = radians(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Reflect.hlsl b/tests/sksl/intrinsics/Reflect.hlsl
deleted file mode 100644
index 21559d6..0000000
--- a/tests/sksl/intrinsics/Reflect.hlsl
+++ /dev/null
@@ -1,118 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_I : packoffset(c0);
-    float4 _10_N : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float spvReflect(float i, float n)
-{
-    return i - 2.0 * dot(n, i) * n;
-}
-
-float4 main(float2 _24)
-{
-    float expectedX = -49.0f;
-    float2 expectedXY = float2(-169.0f, 202.0f);
-    float3 expectedXYZ = float3(-379.0f, 454.0f, -529.0f);
-    float4 expectedXYZW = float4(-699.0f, 838.0f, -977.0f, 1116.0f);
-    bool _72 = false;
-    if (spvReflect(_10_I.x, _10_N.x) == (-49.0f))
-    {
-        float2 _62 = reflect(_10_I.xy, _10_N.xy);
-        _72 = all(bool2(_62.x == float2(-169.0f, 202.0f).x, _62.y == float2(-169.0f, 202.0f).y));
-    }
-    else
-    {
-        _72 = false;
-    }
-    bool _85 = false;
-    if (_72)
-    {
-        float3 _75 = reflect(_10_I.xyz, _10_N.xyz);
-        _85 = all(bool3(_75.x == float3(-379.0f, 454.0f, -529.0f).x, _75.y == float3(-379.0f, 454.0f, -529.0f).y, _75.z == float3(-379.0f, 454.0f, -529.0f).z));
-    }
-    else
-    {
-        _85 = false;
-    }
-    bool _96 = false;
-    if (_85)
-    {
-        float4 _88 = reflect(_10_I, _10_N);
-        _96 = all(bool4(_88.x == float4(-699.0f, 838.0f, -977.0f, 1116.0f).x, _88.y == float4(-699.0f, 838.0f, -977.0f, 1116.0f).y, _88.z == float4(-699.0f, 838.0f, -977.0f, 1116.0f).z, _88.w == float4(-699.0f, 838.0f, -977.0f, 1116.0f).w));
-    }
-    else
-    {
-        _96 = false;
-    }
-    bool _100 = false;
-    if (_96)
-    {
-        _100 = true;
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _103 = false;
-    if (_100)
-    {
-        _103 = true;
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _106 = false;
-    if (_103)
-    {
-        _106 = true;
-    }
-    else
-    {
-        _106 = false;
-    }
-    bool _109 = false;
-    if (_106)
-    {
-        _109 = true;
-    }
-    else
-    {
-        _109 = false;
-    }
-    float4 _110 = 0.0f.xxxx;
-    if (_109)
-    {
-        _110 = _10_colorGreen;
-    }
-    else
-    {
-        _110 = _10_colorRed;
-    }
-    return _110;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Refract.hlsl b/tests/sksl/intrinsics/Refract.hlsl
deleted file mode 100644
index 80e4dbd..0000000
--- a/tests/sksl/intrinsics/Refract.hlsl
+++ /dev/null
@@ -1,48 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_a : packoffset(c0);
-    float _10_b : packoffset(c0.y);
-    float _10_c : packoffset(c0.z);
-    float4 _10_d : packoffset(c1);
-    float4 _10_e : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float spvRefract(float i, float n, float eta)
-{
-    float NoI = n * i;
-    float NoI2 = NoI * NoI;
-    float k = 1.0 - eta * eta * (1.0 - NoI2);
-    if (k < 0.0)
-    {
-        return 0.0;
-    }
-    else
-    {
-        return eta * i - (eta * NoI + sqrt(k)) * n;
-    }
-}
-
-void frag_main()
-{
-    sk_FragColor.x = spvRefract(_10_a, _10_b, _10_c);
-    sk_FragColor = refract(_10_d, _10_e, _10_c);
-    sk_FragColor = float4(float2(0.5f, -0.866025388240814208984375f).x, float2(0.5f, -0.866025388240814208984375f).y, sk_FragColor.z, sk_FragColor.w);
-    sk_FragColor = float4(float3(0.5f, 0.0f, -0.866025388240814208984375f).x, float3(0.5f, 0.0f, -0.866025388240814208984375f).y, float3(0.5f, 0.0f, -0.866025388240814208984375f).z, sk_FragColor.w);
-    sk_FragColor = float4(0.5f, 0.0f, 0.0f, -0.866025388240814208984375f);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Round.hlsl b/tests/sksl/intrinsics/Round.hlsl
deleted file mode 100644
index 4479268..0000000
--- a/tests/sksl/intrinsics/Round.hlsl
+++ /dev/null
@@ -1,72 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _46 = false;
-    if (round(_10_testInputs.x) == (-1.0f))
-    {
-        float2 _38 = round(_10_testInputs.xy);
-        _46 = all(bool2(_38.x == float2(-1.0f, 0.0f).x, _38.y == float2(-1.0f, 0.0f).y));
-    }
-    else
-    {
-        _46 = false;
-    }
-    bool _59 = false;
-    if (_46)
-    {
-        float3 _49 = round(_10_testInputs.xyz);
-        _59 = all(bool3(_49.x == float3(-1.0f, 0.0f, 1.0f).x, _49.y == float3(-1.0f, 0.0f, 1.0f).y, _49.z == float3(-1.0f, 0.0f, 1.0f).z));
-    }
-    else
-    {
-        _59 = false;
-    }
-    bool _70 = false;
-    if (_59)
-    {
-        float4 _62 = round(_10_testInputs);
-        _70 = all(bool4(_62.x == float4(-1.0f, 0.0f, 1.0f, 2.0f).x, _62.y == float4(-1.0f, 0.0f, 1.0f, 2.0f).y, _62.z == float4(-1.0f, 0.0f, 1.0f, 2.0f).z, _62.w == float4(-1.0f, 0.0f, 1.0f, 2.0f).w));
-    }
-    else
-    {
-        _70 = false;
-    }
-    float4 _71 = 0.0f.xxxx;
-    if (_70)
-    {
-        _71 = _10_colorGreen;
-    }
-    else
-    {
-        _71 = _10_colorRed;
-    }
-    return _71;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/RoundEven.hlsl b/tests/sksl/intrinsics/RoundEven.hlsl
deleted file mode 100644
index 4479268..0000000
--- a/tests/sksl/intrinsics/RoundEven.hlsl
+++ /dev/null
@@ -1,72 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _46 = false;
-    if (round(_10_testInputs.x) == (-1.0f))
-    {
-        float2 _38 = round(_10_testInputs.xy);
-        _46 = all(bool2(_38.x == float2(-1.0f, 0.0f).x, _38.y == float2(-1.0f, 0.0f).y));
-    }
-    else
-    {
-        _46 = false;
-    }
-    bool _59 = false;
-    if (_46)
-    {
-        float3 _49 = round(_10_testInputs.xyz);
-        _59 = all(bool3(_49.x == float3(-1.0f, 0.0f, 1.0f).x, _49.y == float3(-1.0f, 0.0f, 1.0f).y, _49.z == float3(-1.0f, 0.0f, 1.0f).z));
-    }
-    else
-    {
-        _59 = false;
-    }
-    bool _70 = false;
-    if (_59)
-    {
-        float4 _62 = round(_10_testInputs);
-        _70 = all(bool4(_62.x == float4(-1.0f, 0.0f, 1.0f, 2.0f).x, _62.y == float4(-1.0f, 0.0f, 1.0f, 2.0f).y, _62.z == float4(-1.0f, 0.0f, 1.0f, 2.0f).z, _62.w == float4(-1.0f, 0.0f, 1.0f, 2.0f).w));
-    }
-    else
-    {
-        _70 = false;
-    }
-    float4 _71 = 0.0f.xxxx;
-    if (_70)
-    {
-        _71 = _10_colorGreen;
-    }
-    else
-    {
-        _71 = _10_colorRed;
-    }
-    return _71;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Sample.hlsl b/tests/sksl/intrinsics/Sample.hlsl
deleted file mode 100644
index d987263..0000000
--- a/tests/sksl/intrinsics/Sample.hlsl
+++ /dev/null
@@ -1,24 +0,0 @@
-Texture2D<float4> t : register(t0, space0);
-SamplerState _t_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _19 = t.Sample(_t_sampler, 0.0f.xx);
-    float4 c = _19;
-    sk_FragColor = _19 * t.Sample(_t_sampler, 1.0f.xxx.xy / 1.0f.xxx.z);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/SampleGrad.hlsl b/tests/sksl/intrinsics/SampleGrad.hlsl
deleted file mode 100644
index 43ad520..0000000
--- a/tests/sksl/intrinsics/SampleGrad.hlsl
+++ /dev/null
@@ -1,33 +0,0 @@
-cbuffer sksl_synthetic_uniforms : register(b0, space0)
-{
-    float2 _34_u_skRTFlip : packoffset(c1024);
-};
-
-Texture2D<float4> t : register(t0, space0);
-SamplerState _t_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    return t.SampleGrad(_t_sampler, _25, ddx(_25), ddy(_25) * _34_u_skRTFlip.y.xx);
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/SampleLod.hlsl b/tests/sksl/intrinsics/SampleLod.hlsl
deleted file mode 100644
index 9e826e5..0000000
--- a/tests/sksl/intrinsics/SampleLod.hlsl
+++ /dev/null
@@ -1,24 +0,0 @@
-Texture2D<float4> t : register(t0, space0);
-SamplerState _t_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _19 = t.SampleLevel(_t_sampler, 0.0f.xx, 0.0f);
-    float4 c = _19;
-    sk_FragColor = _19 * t.SampleLevel(_t_sampler, 1.0f.xxx.xy / 1.0f.xxx.z, 0.0f);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Saturate.hlsl b/tests/sksl/intrinsics/Saturate.hlsl
deleted file mode 100644
index 220b49f..0000000
--- a/tests/sksl/intrinsics/Saturate.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(0.0f, 0.0f, 0.75f, 1.0f);
-    bool _51 = false;
-    if (clamp(_10_testInputs.x, 0.0f, 1.0f) == 0.0f)
-    {
-        float2 _42 = clamp(_10_testInputs.xy, 0.0f.xx, 1.0f.xx);
-        _51 = all(bool2(_42.x == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.x, _42.y == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = clamp(_10_testInputs.xyz, 0.0f.xxx, 1.0f.xxx);
-        _65 = all(bool3(_54.x == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.x, _54.y == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.y, _54.z == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = clamp(_10_testInputs, 0.0f.xxxx, 1.0f.xxxx);
-        _76 = all(bool4(_68.x == float4(0.0f, 0.0f, 0.75f, 1.0f).x, _68.y == float4(0.0f, 0.0f, 0.75f, 1.0f).y, _68.z == float4(0.0f, 0.0f, 0.75f, 1.0f).z, _68.w == float4(0.0f, 0.0f, 0.75f, 1.0f).w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _80 = false;
-    if (_76)
-    {
-        _80 = true;
-    }
-    else
-    {
-        _80 = false;
-    }
-    bool _86 = false;
-    if (_80)
-    {
-        _86 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 0.75f, 1.0f).xy.y));
-    }
-    else
-    {
-        _86 = false;
-    }
-    bool _93 = false;
-    if (_86)
-    {
-        _93 = all(bool3(float3(0.0f, 0.0f, 0.75f).x == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.x, float3(0.0f, 0.0f, 0.75f).y == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.y, float3(0.0f, 0.0f, 0.75f).z == float4(0.0f, 0.0f, 0.75f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _96 = false;
-    if (_93)
-    {
-        _96 = true;
-    }
-    else
-    {
-        _96 = false;
-    }
-    float4 _97 = 0.0f.xxxx;
-    if (_96)
-    {
-        _97 = _10_colorGreen;
-    }
-    else
-    {
-        _97 = _10_colorRed;
-    }
-    return _97;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/SignFloat.hlsl b/tests/sksl/intrinsics/SignFloat.hlsl
deleted file mode 100644
index 62ea826..0000000
--- a/tests/sksl/intrinsics/SignFloat.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expected = float4(-1.0f, 0.0f, 1.0f, 1.0f);
-    bool _50 = false;
-    if (sign(_10_testInputs.x) == (-1.0f))
-    {
-        float2 _42 = sign(_10_testInputs.xy);
-        _50 = all(bool2(_42.x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.x, _42.y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _50 = false;
-    }
-    bool _62 = false;
-    if (_50)
-    {
-        float3 _53 = sign(_10_testInputs.xyz);
-        _62 = all(bool3(_53.x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.x, _53.y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.y, _53.z == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _62 = false;
-    }
-    bool _71 = false;
-    if (_62)
-    {
-        float4 _65 = sign(_10_testInputs);
-        _71 = all(bool4(_65.x == float4(-1.0f, 0.0f, 1.0f, 1.0f).x, _65.y == float4(-1.0f, 0.0f, 1.0f, 1.0f).y, _65.z == float4(-1.0f, 0.0f, 1.0f, 1.0f).z, _65.w == float4(-1.0f, 0.0f, 1.0f, 1.0f).w));
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _75 = false;
-    if (_71)
-    {
-        _75 = true;
-    }
-    else
-    {
-        _75 = false;
-    }
-    bool _82 = false;
-    if (_75)
-    {
-        _82 = all(bool2(float2(-1.0f, 0.0f).x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.x, float2(-1.0f, 0.0f).y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _82 = false;
-    }
-    bool _89 = false;
-    if (_82)
-    {
-        _89 = all(bool3(float3(-1.0f, 0.0f, 1.0f).x == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.x, float3(-1.0f, 0.0f, 1.0f).y == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.y, float3(-1.0f, 0.0f, 1.0f).z == float4(-1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _89 = false;
-    }
-    bool _92 = false;
-    if (_89)
-    {
-        _92 = true;
-    }
-    else
-    {
-        _92 = false;
-    }
-    float4 _93 = 0.0f.xxxx;
-    if (_92)
-    {
-        _93 = _10_colorGreen;
-    }
-    else
-    {
-        _93 = _10_colorRed;
-    }
-    return _93;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/SignInt.hlsl b/tests/sksl/intrinsics/SignInt.hlsl
deleted file mode 100644
index 35f183c..0000000
--- a/tests/sksl/intrinsics/SignInt.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int4 expected = int4(-1, 0, 0, 1);
-    bool _58 = false;
-    if (sign(int(_10_testInputs.x)) == (-1))
-    {
-        int2 _44 = sign(int2(int(_10_testInputs.xy.x), int(_10_testInputs.xy.y)));
-        _58 = all(bool2(_44.x == int4(-1, 0, 0, 1).xy.x, _44.y == int4(-1, 0, 0, 1).xy.y));
-    }
-    else
-    {
-        _58 = false;
-    }
-    bool _78 = false;
-    if (_58)
-    {
-        int3 _61 = sign(int3(int(_10_testInputs.xyz.x), int(_10_testInputs.xyz.y), int(_10_testInputs.xyz.z)));
-        _78 = all(bool3(_61.x == int4(-1, 0, 0, 1).xyz.x, _61.y == int4(-1, 0, 0, 1).xyz.y, _61.z == int4(-1, 0, 0, 1).xyz.z));
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _96 = false;
-    if (_78)
-    {
-        int4 _81 = sign(int4(int(_10_testInputs.x), int(_10_testInputs.y), int(_10_testInputs.z), int(_10_testInputs.w)));
-        _96 = all(bool4(_81.x == int4(-1, 0, 0, 1).x, _81.y == int4(-1, 0, 0, 1).y, _81.z == int4(-1, 0, 0, 1).z, _81.w == int4(-1, 0, 0, 1).w));
-    }
-    else
-    {
-        _96 = false;
-    }
-    bool _100 = false;
-    if (_96)
-    {
-        _100 = true;
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _107 = false;
-    if (_100)
-    {
-        _107 = all(bool2(int2(-1, 0).x == int4(-1, 0, 0, 1).xy.x, int2(-1, 0).y == int4(-1, 0, 0, 1).xy.y));
-    }
-    else
-    {
-        _107 = false;
-    }
-    bool _114 = false;
-    if (_107)
-    {
-        _114 = all(bool3(int3(-1, 0, 0).x == int4(-1, 0, 0, 1).xyz.x, int3(-1, 0, 0).y == int4(-1, 0, 0, 1).xyz.y, int3(-1, 0, 0).z == int4(-1, 0, 0, 1).xyz.z));
-    }
-    else
-    {
-        _114 = false;
-    }
-    bool _117 = false;
-    if (_114)
-    {
-        _117 = true;
-    }
-    else
-    {
-        _117 = false;
-    }
-    float4 _118 = 0.0f.xxxx;
-    if (_117)
-    {
-        _118 = _10_colorGreen;
-    }
-    else
-    {
-        _118 = _10_colorRed;
-    }
-    return _118;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Sin.hlsl b/tests/sksl/intrinsics/Sin.hlsl
deleted file mode 100644
index f583319..0000000
--- a/tests/sksl/intrinsics/Sin.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (sin(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = sin(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = sin(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = sin(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Sinh.hlsl b/tests/sksl/intrinsics/Sinh.hlsl
deleted file mode 100644
index 254a95f..0000000
--- a/tests/sksl/intrinsics/Sinh.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (sinh(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = sinh(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = sinh(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = sinh(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Smoothstep.hlsl b/tests/sksl/intrinsics/Smoothstep.hlsl
deleted file mode 100644
index a7000b4..0000000
--- a/tests/sksl/intrinsics/Smoothstep.hlsl
+++ /dev/null
@@ -1,221 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedA = float4(0.0f, 0.0f, 0.84375f, 1.0f);
-    float4 expectedB = float4(1.0f, 0.0f, 1.0f, 1.0f);
-    bool _41 = false;
-    if (true)
-    {
-        _41 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.y));
-    }
-    else
-    {
-        _41 = false;
-    }
-    bool _50 = false;
-    if (_41)
-    {
-        _50 = all(bool3(float3(0.0f, 0.0f, 0.84375f).x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.x, float3(0.0f, 0.0f, 0.84375f).y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.y, float3(0.0f, 0.0f, 0.84375f).z == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _50 = false;
-    }
-    bool _53 = false;
-    if (_50)
-    {
-        _53 = true;
-    }
-    else
-    {
-        _53 = false;
-    }
-    bool _56 = false;
-    if (_53)
-    {
-        _56 = true;
-    }
-    else
-    {
-        _56 = false;
-    }
-    bool _62 = false;
-    if (_56)
-    {
-        _62 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.y));
-    }
-    else
-    {
-        _62 = false;
-    }
-    bool _68 = false;
-    if (_62)
-    {
-        _68 = all(bool3(float3(0.0f, 0.0f, 0.84375f).x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.x, float3(0.0f, 0.0f, 0.84375f).y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.y, float3(0.0f, 0.0f, 0.84375f).z == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _68 = false;
-    }
-    bool _71 = false;
-    if (_68)
-    {
-        _71 = true;
-    }
-    else
-    {
-        _71 = false;
-    }
-    bool _87 = false;
-    if (_71)
-    {
-        _87 = smoothstep(_10_colorRed.y, _10_colorGreen.y, -1.25f) == 0.0f;
-    }
-    else
-    {
-        _87 = false;
-    }
-    bool _103 = false;
-    if (_87)
-    {
-        float2 _90 = smoothstep(_10_colorRed.y.xx, _10_colorGreen.y.xx, float2(-1.25f, 0.0f));
-        _103 = all(bool2(_90.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.x, _90.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xy.y));
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _120 = false;
-    if (_103)
-    {
-        float3 _106 = smoothstep(_10_colorRed.y.xxx, _10_colorGreen.y.xxx, float3(-1.25f, 0.0f, 0.75f));
-        _120 = all(bool3(_106.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.x, _106.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.y, _106.z == float4(0.0f, 0.0f, 0.84375f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _120 = false;
-    }
-    bool _137 = false;
-    if (_120)
-    {
-        float4 _123 = smoothstep(_10_colorRed.y.xxxx, _10_colorGreen.y.xxxx, float4(-1.25f, 0.0f, 0.75f, 2.25f));
-        _137 = all(bool4(_123.x == float4(0.0f, 0.0f, 0.84375f, 1.0f).x, _123.y == float4(0.0f, 0.0f, 0.84375f, 1.0f).y, _123.z == float4(0.0f, 0.0f, 0.84375f, 1.0f).z, _123.w == float4(0.0f, 0.0f, 0.84375f, 1.0f).w));
-    }
-    else
-    {
-        _137 = false;
-    }
-    bool _140 = false;
-    if (_137)
-    {
-        _140 = true;
-    }
-    else
-    {
-        _140 = false;
-    }
-    bool _147 = false;
-    if (_140)
-    {
-        _147 = all(bool2(float2(1.0f, 0.0f).x == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.x, float2(1.0f, 0.0f).y == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _147 = false;
-    }
-    bool _154 = false;
-    if (_147)
-    {
-        _154 = all(bool3(float3(1.0f, 0.0f, 1.0f).x == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.x, float3(1.0f, 0.0f, 1.0f).y == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.y, float3(1.0f, 0.0f, 1.0f).z == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _154 = false;
-    }
-    bool _157 = false;
-    if (_154)
-    {
-        _157 = true;
-    }
-    else
-    {
-        _157 = false;
-    }
-    bool _168 = false;
-    if (_157)
-    {
-        _168 = smoothstep(_10_colorRed.x, _10_colorGreen.x, -1.25f) == 1.0f;
-    }
-    else
-    {
-        _168 = false;
-    }
-    bool _181 = false;
-    if (_168)
-    {
-        float2 _171 = smoothstep(_10_colorRed.xy, _10_colorGreen.xy, float2(-1.25f, 0.0f));
-        _181 = all(bool2(_171.x == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.x, _171.y == float4(1.0f, 0.0f, 1.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _181 = false;
-    }
-    bool _194 = false;
-    if (_181)
-    {
-        float3 _184 = smoothstep(_10_colorRed.xyz, _10_colorGreen.xyz, float3(-1.25f, 0.0f, 0.75f));
-        _194 = all(bool3(_184.x == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.x, _184.y == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.y, _184.z == float4(1.0f, 0.0f, 1.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _194 = false;
-    }
-    bool _204 = false;
-    if (_194)
-    {
-        float4 _197 = smoothstep(_10_colorRed, _10_colorGreen, float4(-1.25f, 0.0f, 0.75f, 2.25f));
-        _204 = all(bool4(_197.x == float4(1.0f, 0.0f, 1.0f, 1.0f).x, _197.y == float4(1.0f, 0.0f, 1.0f, 1.0f).y, _197.z == float4(1.0f, 0.0f, 1.0f, 1.0f).z, _197.w == float4(1.0f, 0.0f, 1.0f, 1.0f).w));
-    }
-    else
-    {
-        _204 = false;
-    }
-    float4 _205 = 0.0f.xxxx;
-    if (_204)
-    {
-        _205 = _10_colorGreen;
-    }
-    else
-    {
-        _205 = _10_colorRed;
-    }
-    return _205;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Sqrt.hlsl b/tests/sksl/intrinsics/Sqrt.hlsl
deleted file mode 100644
index dfc6d7a..0000000
--- a/tests/sksl/intrinsics/Sqrt.hlsl
+++ /dev/null
@@ -1,148 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (sqrt(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = sqrt(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = sqrt(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = sqrt(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _84 = false;
-    if (_76)
-    {
-        _84 = 1.0f == _10_expected.x;
-    }
-    else
-    {
-        _84 = false;
-    }
-    bool _94 = false;
-    if (_84)
-    {
-        _94 = all(bool2(float2(1.0f, 2.0f).x == _10_expected.xy.x, float2(1.0f, 2.0f).y == _10_expected.xy.y));
-    }
-    else
-    {
-        _94 = false;
-    }
-    bool _104 = false;
-    if (_94)
-    {
-        _104 = all(bool3(float3(1.0f, 2.0f, 4.0f).x == _10_expected.xyz.x, float3(1.0f, 2.0f, 4.0f).y == _10_expected.xyz.y, float3(1.0f, 2.0f, 4.0f).z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _113 = false;
-    if (_104)
-    {
-        _113 = all(bool4(float4(1.0f, 2.0f, 4.0f, 8.0f).x == _10_expected.x, float4(1.0f, 2.0f, 4.0f, 8.0f).y == _10_expected.y, float4(1.0f, 2.0f, 4.0f, 8.0f).z == _10_expected.z, float4(1.0f, 2.0f, 4.0f, 8.0f).w == _10_expected.w));
-    }
-    else
-    {
-        _113 = false;
-    }
-    bool _122 = false;
-    if (_113)
-    {
-        _122 = sqrt(-1.0f) == _10_expected.x;
-    }
-    else
-    {
-        _122 = false;
-    }
-    bool _133 = false;
-    if (_122)
-    {
-        float2 _125 = sqrt(float2(-1.0f, -4.0f));
-        _133 = all(bool2(_125.x == _10_expected.xy.x, _125.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _133 = false;
-    }
-    bool _144 = false;
-    if (_133)
-    {
-        float3 _136 = sqrt(float3(-1.0f, -4.0f, -16.0f));
-        _144 = all(bool3(_136.x == _10_expected.xyz.x, _136.y == _10_expected.xyz.y, _136.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _144 = false;
-    }
-    bool _154 = false;
-    if (_144)
-    {
-        float4 _147 = sqrt(float4(-1.0f, -4.0f, -16.0f, -64.0f));
-        _154 = all(bool4(_147.x == _10_expected.x, _147.y == _10_expected.y, _147.z == _10_expected.z, _147.w == _10_expected.w));
-    }
-    else
-    {
-        _154 = false;
-    }
-    float4 _155 = 0.0f.xxxx;
-    if (_154)
-    {
-        _155 = _10_colorGreen;
-    }
-    else
-    {
-        _155 = _10_colorRed;
-    }
-    return _155;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Step.hlsl b/tests/sksl/intrinsics/Step.hlsl
deleted file mode 100644
index 75f1d03..0000000
--- a/tests/sksl/intrinsics/Step.hlsl
+++ /dev/null
@@ -1,185 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 expectedA = float4(0.0f, 0.0f, 1.0f, 1.0f);
-    float4 expectedB = float4(1.0f, 1.0f, 0.0f, 0.0f);
-    bool _53 = false;
-    if (step(0.5f, _10_testInputs.x) == 0.0f)
-    {
-        float2 _44 = step(0.5f.xx, _10_testInputs.xy);
-        _53 = all(bool2(_44.x == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.x, _44.y == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _53 = false;
-    }
-    bool _66 = false;
-    if (_53)
-    {
-        float3 _56 = step(0.5f.xxx, _10_testInputs.xyz);
-        _66 = all(bool3(_56.x == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.x, _56.y == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.y, _56.z == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _66 = false;
-    }
-    bool _76 = false;
-    if (_66)
-    {
-        float4 _69 = step(0.5f.xxxx, _10_testInputs);
-        _76 = all(bool4(_69.x == float4(0.0f, 0.0f, 1.0f, 1.0f).x, _69.y == float4(0.0f, 0.0f, 1.0f, 1.0f).y, _69.z == float4(0.0f, 0.0f, 1.0f, 1.0f).z, _69.w == float4(0.0f, 0.0f, 1.0f, 1.0f).w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _80 = false;
-    if (_76)
-    {
-        _80 = true;
-    }
-    else
-    {
-        _80 = false;
-    }
-    bool _86 = false;
-    if (_80)
-    {
-        _86 = all(bool2(0.0f.xx.x == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.x, 0.0f.xx.y == float4(0.0f, 0.0f, 1.0f, 1.0f).xy.y));
-    }
-    else
-    {
-        _86 = false;
-    }
-    bool _93 = false;
-    if (_86)
-    {
-        _93 = all(bool3(float3(0.0f, 0.0f, 1.0f).x == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.x, float3(0.0f, 0.0f, 1.0f).y == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.y, float3(0.0f, 0.0f, 1.0f).z == float4(0.0f, 0.0f, 1.0f, 1.0f).xyz.z));
-    }
-    else
-    {
-        _93 = false;
-    }
-    bool _96 = false;
-    if (_93)
-    {
-        _96 = true;
-    }
-    else
-    {
-        _96 = false;
-    }
-    bool _104 = false;
-    if (_96)
-    {
-        _104 = step(_10_testInputs.x, 0.0f) == 1.0f;
-    }
-    else
-    {
-        _104 = false;
-    }
-    bool _115 = false;
-    if (_104)
-    {
-        float2 _107 = step(_10_testInputs.xy, float2(0.0f, 1.0f));
-        _115 = all(bool2(_107.x == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.x, _107.y == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.y));
-    }
-    else
-    {
-        _115 = false;
-    }
-    bool _126 = false;
-    if (_115)
-    {
-        float3 _118 = step(_10_testInputs.xyz, float3(0.0f, 1.0f, 0.0f));
-        _126 = all(bool3(_118.x == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.x, _118.y == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.y, _118.z == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.z));
-    }
-    else
-    {
-        _126 = false;
-    }
-    bool _135 = false;
-    if (_126)
-    {
-        float4 _129 = step(_10_testInputs, float4(0.0f, 1.0f, 0.0f, 1.0f));
-        _135 = all(bool4(_129.x == float4(1.0f, 1.0f, 0.0f, 0.0f).x, _129.y == float4(1.0f, 1.0f, 0.0f, 0.0f).y, _129.z == float4(1.0f, 1.0f, 0.0f, 0.0f).z, _129.w == float4(1.0f, 1.0f, 0.0f, 0.0f).w));
-    }
-    else
-    {
-        _135 = false;
-    }
-    bool _138 = false;
-    if (_135)
-    {
-        _138 = true;
-    }
-    else
-    {
-        _138 = false;
-    }
-    bool _145 = false;
-    if (_138)
-    {
-        _145 = all(bool2(1.0f.xx.x == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.x, 1.0f.xx.y == float4(1.0f, 1.0f, 0.0f, 0.0f).xy.y));
-    }
-    else
-    {
-        _145 = false;
-    }
-    bool _152 = false;
-    if (_145)
-    {
-        _152 = all(bool3(float3(1.0f, 1.0f, 0.0f).x == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.x, float3(1.0f, 1.0f, 0.0f).y == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.y, float3(1.0f, 1.0f, 0.0f).z == float4(1.0f, 1.0f, 0.0f, 0.0f).xyz.z));
-    }
-    else
-    {
-        _152 = false;
-    }
-    bool _155 = false;
-    if (_152)
-    {
-        _155 = true;
-    }
-    else
-    {
-        _155 = false;
-    }
-    float4 _156 = 0.0f.xxxx;
-    if (_155)
-    {
-        _156 = _10_colorGreen;
-    }
-    else
-    {
-        _156 = _10_colorRed;
-    }
-    return _156;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Tan.hlsl b/tests/sksl/intrinsics/Tan.hlsl
deleted file mode 100644
index 54ab0d3..0000000
--- a/tests/sksl/intrinsics/Tan.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (tan(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = tan(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = tan(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = tan(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Tanh.hlsl b/tests/sksl/intrinsics/Tanh.hlsl
deleted file mode 100644
index 2dba513..0000000
--- a/tests/sksl/intrinsics/Tanh.hlsl
+++ /dev/null
@@ -1,109 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_inputVal : packoffset(c0);
-    float4 _10_expected : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _51 = false;
-    if (tanh(_10_inputVal.x) == _10_expected.x)
-    {
-        float2 _41 = tanh(_10_inputVal.xy);
-        _51 = all(bool2(_41.x == _10_expected.xy.x, _41.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _51 = false;
-    }
-    bool _65 = false;
-    if (_51)
-    {
-        float3 _54 = tanh(_10_inputVal.xyz);
-        _65 = all(bool3(_54.x == _10_expected.xyz.x, _54.y == _10_expected.xyz.y, _54.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float4 _68 = tanh(_10_inputVal);
-        _76 = all(bool4(_68.x == _10_expected.x, _68.y == _10_expected.y, _68.z == _10_expected.z, _68.w == _10_expected.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        _83 = 0.0f == _10_expected.x;
-    }
-    else
-    {
-        _83 = false;
-    }
-    bool _91 = false;
-    if (_83)
-    {
-        _91 = all(bool2(0.0f.xx.x == _10_expected.xy.x, 0.0f.xx.y == _10_expected.xy.y));
-    }
-    else
-    {
-        _91 = false;
-    }
-    bool _100 = false;
-    if (_91)
-    {
-        _100 = all(bool3(0.0f.xxx.x == _10_expected.xyz.x, 0.0f.xxx.y == _10_expected.xyz.y, 0.0f.xxx.z == _10_expected.xyz.z));
-    }
-    else
-    {
-        _100 = false;
-    }
-    bool _108 = false;
-    if (_100)
-    {
-        _108 = all(bool4(0.0f.xxxx.x == _10_expected.x, 0.0f.xxxx.y == _10_expected.y, 0.0f.xxxx.z == _10_expected.z, 0.0f.xxxx.w == _10_expected.w));
-    }
-    else
-    {
-        _108 = false;
-    }
-    float4 _109 = 0.0f.xxxx;
-    if (_108)
-    {
-        _109 = _10_colorGreen;
-    }
-    else
-    {
-        _109 = _10_colorRed;
-    }
-    return _109;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Transpose.hlsl b/tests/sksl/intrinsics/Transpose.hlsl
deleted file mode 100644
index 24bf05a..0000000
--- a/tests/sksl/intrinsics/Transpose.hlsl
+++ /dev/null
@@ -1,73 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c0);
-    row_major float3x3 _10_testMatrix3x3 : packoffset(c2);
-    float4 _10_colorGreen : packoffset(c5);
-    float4 _10_colorRed : packoffset(c6);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    float2x3 testMatrix2x3 = float2x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f));
-    float2x2 _42 = transpose(_10_testMatrix2x2);
-    float2 _52 = _42[0];
-    float2 _55 = _42[1];
-    bool _78 = false;
-    if (all(bool2(_52.x == float2(1.0f, 3.0f).x, _52.y == float2(1.0f, 3.0f).y)) && all(bool2(_55.x == float2(2.0f, 4.0f).x, _55.y == float2(2.0f, 4.0f).y)))
-    {
-        float3x2 _61 = transpose(float2x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f)));
-        float2 _67 = _61[0];
-        float2 _70 = _61[1];
-        float2 _74 = _61[2];
-        _78 = (all(bool2(_67.x == float2(1.0f, 4.0f).x, _67.y == float2(1.0f, 4.0f).y)) && all(bool2(_70.x == float2(2.0f, 5.0f).x, _70.y == float2(2.0f, 5.0f).y))) && all(bool2(_74.x == float2(3.0f, 6.0f).x, _74.y == float2(3.0f, 6.0f).y));
-    }
-    else
-    {
-        _78 = false;
-    }
-    bool _105 = false;
-    if (_78)
-    {
-        float3x3 _81 = transpose(_10_testMatrix3x3);
-        float3 _94 = _81[0];
-        float3 _97 = _81[1];
-        float3 _101 = _81[2];
-        _105 = (all(bool3(_94.x == float3(1.0f, 4.0f, 7.0f).x, _94.y == float3(1.0f, 4.0f, 7.0f).y, _94.z == float3(1.0f, 4.0f, 7.0f).z)) && all(bool3(_97.x == float3(2.0f, 5.0f, 8.0f).x, _97.y == float3(2.0f, 5.0f, 8.0f).y, _97.z == float3(2.0f, 5.0f, 8.0f).z))) && all(bool3(_101.x == float3(3.0f, 6.0f, 9.0f).x, _101.y == float3(3.0f, 6.0f, 9.0f).y, _101.z == float3(3.0f, 6.0f, 9.0f).z));
-    }
-    else
-    {
-        _105 = false;
-    }
-    float4 _106 = 0.0f.xxxx;
-    if (_105)
-    {
-        _106 = _10_colorGreen;
-    }
-    else
-    {
-        _106 = _10_colorRed;
-    }
-    return _106;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Trunc.hlsl b/tests/sksl/intrinsics/Trunc.hlsl
deleted file mode 100644
index 51b44ef..0000000
--- a/tests/sksl/intrinsics/Trunc.hlsl
+++ /dev/null
@@ -1,72 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _46 = false;
-    if (trunc(_10_testInputs.x) == (-1.0f))
-    {
-        float2 _38 = trunc(_10_testInputs.xy);
-        _46 = all(bool2(_38.x == float2(-1.0f, 0.0f).x, _38.y == float2(-1.0f, 0.0f).y));
-    }
-    else
-    {
-        _46 = false;
-    }
-    bool _58 = false;
-    if (_46)
-    {
-        float3 _49 = trunc(_10_testInputs.xyz);
-        _58 = all(bool3(_49.x == float3(-1.0f, 0.0f, 0.0f).x, _49.y == float3(-1.0f, 0.0f, 0.0f).y, _49.z == float3(-1.0f, 0.0f, 0.0f).z));
-    }
-    else
-    {
-        _58 = false;
-    }
-    bool _69 = false;
-    if (_58)
-    {
-        float4 _61 = trunc(_10_testInputs);
-        _69 = all(bool4(_61.x == float4(-1.0f, 0.0f, 0.0f, 2.0f).x, _61.y == float4(-1.0f, 0.0f, 0.0f, 2.0f).y, _61.z == float4(-1.0f, 0.0f, 0.0f, 2.0f).z, _61.w == float4(-1.0f, 0.0f, 0.0f, 2.0f).w));
-    }
-    else
-    {
-        _69 = false;
-    }
-    float4 _70 = 0.0f.xxxx;
-    if (_69)
-    {
-        _70 = _10_colorGreen;
-    }
-    else
-    {
-        _70 = _10_colorRed;
-    }
-    return _70;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/UintBitsToFloat.hlsl b/tests/sksl/intrinsics/UintBitsToFloat.hlsl
deleted file mode 100644
index 889189f..0000000
--- a/tests/sksl/intrinsics/UintBitsToFloat.hlsl
+++ /dev/null
@@ -1,78 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_testInput : packoffset(c0);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c3);
-    float4 _10_colorRed : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y) * float4(1.0f, 1.0f, -1.0f, -1.0f);
-    float4 inputVal = _42;
-    uint4 expectedB = uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u);
-    bool _65 = false;
-    if (_42.x == asfloat(1065353216u))
-    {
-        float2 _58 = _42.xy;
-        float2 _59 = asfloat(uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).xy);
-        _65 = all(bool2(_58.x == _59.x, _58.y == _59.y));
-    }
-    else
-    {
-        _65 = false;
-    }
-    bool _76 = false;
-    if (_65)
-    {
-        float3 _68 = _42.xyz;
-        float3 _70 = asfloat(uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u).xyz);
-        _76 = all(bool3(_68.x == _70.x, _68.y == _70.y, _68.z == _70.z));
-    }
-    else
-    {
-        _76 = false;
-    }
-    bool _83 = false;
-    if (_76)
-    {
-        float4 _79 = asfloat(uint4(1065353216u, 1073741824u, 3225419776u, 3229614080u));
-        _83 = all(bool4(_42.x == _79.x, _42.y == _79.y, _42.z == _79.z, _42.w == _79.w));
-    }
-    else
-    {
-        _83 = false;
-    }
-    float4 _84 = 0.0f.xxxx;
-    if (_83)
-    {
-        _84 = _10_colorGreen;
-    }
-    else
-    {
-        _84 = _10_colorRed;
-    }
-    return _84;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/intrinsics/Unpack.hlsl b/tests/sksl/intrinsics/Unpack.hlsl
deleted file mode 100644
index b3079c4..0000000
--- a/tests/sksl/intrinsics/Unpack.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    uint _10_a : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-uint spvPackHalf2x16(float2 value)
-{
-    uint2 Packed = f32tof16(value);
-    return Packed.x | (Packed.y << 16);
-}
-
-float2 spvUnpackHalf2x16(uint value)
-{
-    return f16tof32(uint2(value & 0xffff, value >> 16));
-}
-
-uint spvPackUnorm4x8(float4 value)
-{
-    uint4 Packed = uint4(round(saturate(value) * 255.0));
-    return Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24);
-}
-
-float4 spvUnpackUnorm4x8(uint value)
-{
-    uint4 Packed = uint4(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, value >> 24);
-    return float4(Packed) / 255.0;
-}
-
-uint spvPackSnorm4x8(float4 value)
-{
-    int4 Packed = int4(round(clamp(value, -1.0, 1.0) * 127.0)) & 0xff;
-    return uint(Packed.x | (Packed.y << 8) | (Packed.z << 16) | (Packed.w << 24));
-}
-
-float4 spvUnpackSnorm4x8(uint value)
-{
-    int SignedValue = int(value);
-    int4 Packed = int4(SignedValue << 24, SignedValue << 16, SignedValue << 8, SignedValue) >> 24;
-    return clamp(float4(Packed) / 127.0, -1.0, 1.0);
-}
-
-uint spvPackUnorm2x16(float2 value)
-{
-    uint2 Packed = uint2(round(saturate(value) * 65535.0));
-    return Packed.x | (Packed.y << 16);
-}
-
-float2 spvUnpackUnorm2x16(uint value)
-{
-    uint2 Packed = uint2(value & 0xffff, value >> 16);
-    return float2(Packed) / 65535.0;
-}
-
-uint spvPackSnorm2x16(float2 value)
-{
-    int2 Packed = int2(round(clamp(value, -1.0, 1.0) * 32767.0)) & 0xffff;
-    return uint(Packed.x | (Packed.y << 16));
-}
-
-float2 spvUnpackSnorm2x16(uint value)
-{
-    int SignedValue = int(value);
-    int2 Packed = int2(SignedValue << 16, SignedValue) >> 16;
-    return clamp(float2(Packed) / 32767.0, -1.0, 1.0);
-}
-
-void frag_main()
-{
-    float2 _17 = spvUnpackHalf2x16(_10_a);
-    sk_FragColor = float4(_17.x, _17.y, sk_FragColor.z, sk_FragColor.w);
-    float2 _26 = spvUnpackUnorm2x16(_10_a);
-    sk_FragColor = float4(_26.x, _26.y, sk_FragColor.z, sk_FragColor.w);
-    float2 _31 = spvUnpackSnorm2x16(_10_a);
-    sk_FragColor = float4(_31.x, _31.y, sk_FragColor.z, sk_FragColor.w);
-    sk_FragColor = spvUnpackUnorm4x8(_10_a);
-    sk_FragColor = spvUnpackSnorm4x8(_10_a);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayCast.hlsl b/tests/sksl/shared/ArrayCast.hlsl
deleted file mode 100644
index 5c06de9..0000000
--- a/tests/sksl/shared/ArrayCast.hlsl
+++ /dev/null
@@ -1,74 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float _35[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
-    float f[4] = _35;
-    float h[4] = _35;
-    f = _35;
-    h = _35;
-    int3 _47[3] = { int3(1, 1, 1), int3(2, 2, 2), int3(3, 3, 3) };
-    int3 i3[3] = _47;
-    int3 s3[3] = _47;
-    i3 = _47;
-    s3 = _47;
-    float2x2 _63[2] = { float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)), float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f)) };
-    float2x2 h2x2[2] = _63;
-    float2x2 f2x2[2] = _63;
-    f2x2 = _63;
-    h2x2 = _63;
-    bool _74 = false;
-    if (true && (true && (true && true)))
-    {
-        _74 = true && (true && true);
-    }
-    else
-    {
-        _74 = false;
-    }
-    bool _89 = false;
-    if (_74)
-    {
-        _89 = (all(bool2(float2(5.0f, 6.0f).x == float2(5.0f, 6.0f).x, float2(5.0f, 6.0f).y == float2(5.0f, 6.0f).y)) && all(bool2(float2(7.0f, 8.0f).x == float2(7.0f, 8.0f).x, float2(7.0f, 8.0f).y == float2(7.0f, 8.0f).y))) && (all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y)));
-    }
-    else
-    {
-        _89 = false;
-    }
-    float4 _90 = 0.0f.xxxx;
-    if (_89)
-    {
-        _90 = _10_colorGreen;
-    }
-    else
-    {
-        _90 = _10_colorRed;
-    }
-    return _90;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayComparison.hlsl b/tests/sksl/shared/ArrayComparison.hlsl
deleted file mode 100644
index 7e08abb..0000000
--- a/tests/sksl/shared/ArrayComparison.hlsl
+++ /dev/null
@@ -1,181 +0,0 @@
-struct S
-{
-    int x;
-    int y;
-};
-
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float _10_testArray[5] : packoffset(c2);
-    float _10_testArrayNegative[5] : packoffset(c7);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    float _36[5] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
-    float f1[5] = _36;
-    float f2[5] = _36;
-    float _40[5] = { 1.0f, 2.0f, 3.0f, -4.0f, 5.0f };
-    float f3[5] = _40;
-    int3 _52[2] = { int3(1, 2, 3), int3(4, 5, 6) };
-    int3 v1[2] = _52;
-    int3 v2[2] = _52;
-    int3 _57[2] = { int3(1, 2, 3), int3(4, 5, -6) };
-    int3 v3[2] = _57;
-    float2x2 _72[3] = { float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f)), float2x2(float2(3.0f, 4.0f), float2(5.0f, 6.0f)) };
-    float2x2 m1[3] = _72;
-    float2x2 m2[3] = _72;
-    float2x2 _81[3] = { float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), float2x2(float2(2.0f, 3.0f), float2(4.0f, 5.0f)), float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f)) };
-    float2x2 m3[3] = _81;
-    S _86 = { 1, 2 };
-    S _87 = { 3, 4 };
-    S _88 = { 5, 6 };
-    S _89[3] = { _86, _87, _88 };
-    S s1[3] = _89;
-    S _92 = { 0, 0 };
-    S _93[3] = { _86, _92, _88 };
-    S s2[3] = _93;
-    S s3[3] = _89;
-    bool _108 = false;
-    if (true && (true && (true && (true && true))))
-    {
-        _108 = false || ((4.0f != (-4.0f)) || (false || (false || false)));
-    }
-    else
-    {
-        _108 = false;
-    }
-    bool _135 = false;
-    if (_108)
-    {
-        _135 = (_10_testArray[4] != _10_testArrayNegative[4]) || ((_10_testArray[3] != _10_testArrayNegative[3]) || ((_10_testArray[2] != _10_testArrayNegative[2]) || ((_10_testArray[1] != _10_testArrayNegative[1]) || (_10_testArray[0] != _10_testArrayNegative[0]))));
-    }
-    else
-    {
-        _135 = false;
-    }
-    bool _154 = false;
-    if (_135)
-    {
-        _154 = (_10_testArray[4] == 5.0f) && ((_10_testArray[3] == 4.0f) && ((_10_testArray[2] == 3.0f) && ((_10_testArray[1] == 2.0f) && (_10_testArray[0] == 1.0f))));
-    }
-    else
-    {
-        _154 = false;
-    }
-    bool _173 = false;
-    if (_154)
-    {
-        _173 = (_10_testArray[4] != 5.0f) || ((_10_testArray[3] != (-4.0f)) || ((_10_testArray[2] != 3.0f) || ((_10_testArray[1] != 2.0f) || (_10_testArray[0] != 1.0f))));
-    }
-    else
-    {
-        _173 = false;
-    }
-    bool _192 = false;
-    if (_173)
-    {
-        _192 = (5.0f == _10_testArray[4]) && ((4.0f == _10_testArray[3]) && ((3.0f == _10_testArray[2]) && ((2.0f == _10_testArray[1]) && (1.0f == _10_testArray[0]))));
-    }
-    else
-    {
-        _192 = false;
-    }
-    bool _211 = false;
-    if (_192)
-    {
-        _211 = (5.0f != _10_testArray[4]) || (((-4.0f) != _10_testArray[3]) || ((3.0f != _10_testArray[2]) || ((2.0f != _10_testArray[1]) || (1.0f != _10_testArray[0]))));
-    }
-    else
-    {
-        _211 = false;
-    }
-    bool _215 = false;
-    if (_211)
-    {
-        _215 = true && true;
-    }
-    else
-    {
-        _215 = false;
-    }
-    bool _222 = false;
-    if (_215)
-    {
-        _222 = any(bool3(int3(4, 5, 6).x != int3(4, 5, -6).x, int3(4, 5, 6).y != int3(4, 5, -6).y, int3(4, 5, 6).z != int3(4, 5, -6).z)) || false;
-    }
-    else
-    {
-        _222 = false;
-    }
-    bool _243 = false;
-    if (_222)
-    {
-        _243 = (all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y)) && all(bool2(float2(5.0f, 6.0f).x == float2(5.0f, 6.0f).x, float2(5.0f, 6.0f).y == float2(5.0f, 6.0f).y))) && ((all(bool2(float2(2.0f, 0.0f).x == float2(2.0f, 0.0f).x, float2(2.0f, 0.0f).y == float2(2.0f, 0.0f).y)) && all(bool2(float2(0.0f, 2.0f).x == float2(0.0f, 2.0f).x, float2(0.0f, 2.0f).y == float2(0.0f, 2.0f).y))) && (all(bool2(float2(1.0f, 0.0f).x == float2(1.0f, 0.0f).x, float2(1.0f, 0.0f).y == float2(1.0f, 0.0f).y)) && all(bool2(float2(0.0f, 1.0f).x == float2(0.0f, 1.0f).x, float2(0.0f, 1.0f).y == float2(0.0f, 1.0f).y))));
-    }
-    else
-    {
-        _243 = false;
-    }
-    bool _263 = false;
-    if (_243)
-    {
-        _263 = (any(bool2(float2(3.0f, 4.0f).x != float2(6.0f, 0.0f).x, float2(3.0f, 4.0f).y != float2(6.0f, 0.0f).y)) || any(bool2(float2(5.0f, 6.0f).x != float2(0.0f, 6.0f).x, float2(5.0f, 6.0f).y != float2(0.0f, 6.0f).y))) || ((any(bool2(float2(2.0f, 0.0f).x != float2(2.0f, 3.0f).x, float2(2.0f, 0.0f).y != float2(2.0f, 3.0f).y)) || any(bool2(float2(0.0f, 2.0f).x != float2(4.0f, 5.0f).x, float2(0.0f, 2.0f).y != float2(4.0f, 5.0f).y))) || (any(bool2(float2(1.0f, 0.0f).x != float2(1.0f, 0.0f).x, float2(1.0f, 0.0f).y != float2(1.0f, 0.0f).y)) || any(bool2(float2(0.0f, 1.0f).x != float2(0.0f, 1.0f).x, float2(0.0f, 1.0f).y != float2(0.0f, 1.0f).y))));
-    }
-    else
-    {
-        _263 = false;
-    }
-    bool _273 = false;
-    if (_263)
-    {
-        _273 = (false || false) || (((4 != 0) || (3 != 0)) || (false || false));
-    }
-    else
-    {
-        _273 = false;
-    }
-    bool _281 = false;
-    if (_273)
-    {
-        _281 = (true && true) && ((true && true) && (true && true));
-    }
-    else
-    {
-        _281 = false;
-    }
-    float4 _282 = 0.0f.xxxx;
-    if (_281)
-    {
-        _282 = _10_colorGreen;
-    }
-    else
-    {
-        _282 = _10_colorRed;
-    }
-    return _282;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayConstructors.hlsl b/tests/sksl/shared/ArrayConstructors.hlsl
deleted file mode 100644
index fd28e30..0000000
--- a/tests/sksl/shared/ArrayConstructors.hlsl
+++ /dev/null
@@ -1,47 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float _35[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
-    float test1[4] = _35;
-    float2 _42[2] = { float2(1.0f, 2.0f), float2(3.0f, 4.0f) };
-    float2 test2[2] = _42;
-    float4x4 _54[1] = { float4x4(float4(16.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 16.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 16.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 16.0f)) };
-    float4x4 test3[1] = _54;
-    float4 _71 = 0.0f.xxxx;
-    if (((test1[3] + test2[1].y) + test3[0][3].w) == 24.0f)
-    {
-        _71 = _10_colorGreen;
-    }
-    else
-    {
-        _71 = _10_colorRed;
-    }
-    return _71;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayFollowedByScalar.hlsl b/tests/sksl/shared/ArrayFollowedByScalar.hlsl
deleted file mode 100644
index b68202e..0000000
--- a/tests/sksl/shared/ArrayFollowedByScalar.hlsl
+++ /dev/null
@@ -1,30 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float rgb[3] = { 0.0f, 0.0f, 0.0f };
-    rgb[0] = 0.0f;
-    rgb[1] = 1.0f;
-    rgb[2] = 0.0f;
-    float a = 1.0f;
-    return float4(rgb[0], rgb[1], rgb[2], 1.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayIndexTypes.hlsl b/tests/sksl/shared/ArrayIndexTypes.hlsl
deleted file mode 100644
index 3af3cc9..0000000
--- a/tests/sksl/shared/ArrayIndexTypes.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float _22[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
-    float array[4] = _22;
-    int x = 0;
-    uint y = 1u;
-    int z = 2;
-    uint w = 3u;
-    sk_FragColor = float4(array[0], array[1u], array[2], array[3u]);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayNarrowingConversions.hlsl b/tests/sksl/shared/ArrayNarrowingConversions.hlsl
deleted file mode 100644
index 9ea63a4..0000000
--- a/tests/sksl/shared/ArrayNarrowingConversions.hlsl
+++ /dev/null
@@ -1,81 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int _32[2] = { 1, 2 };
-    int i2[2] = _32;
-    int _34[2] = { 1, 2 };
-    int s2[2] = _34;
-    float _40[2] = { 1.0f, 2.0f };
-    float f2[2] = _40;
-    float _42[2] = { 1.0f, 2.0f };
-    float h2[2] = _42;
-    i2 = _34;
-    s2 = _34;
-    f2 = _42;
-    h2 = _42;
-    float cf2[2] = _40;
-    bool _50 = false;
-    if (true && true)
-    {
-        _50 = true && true;
-    }
-    else
-    {
-        _50 = false;
-    }
-    bool _54 = false;
-    if (_50)
-    {
-        _54 = true && true;
-    }
-    else
-    {
-        _54 = false;
-    }
-    bool _58 = false;
-    if (_54)
-    {
-        _58 = true && true;
-    }
-    else
-    {
-        _58 = false;
-    }
-    float4 _59 = 0.0f.xxxx;
-    if (_58)
-    {
-        _59 = _10_colorGreen;
-    }
-    else
-    {
-        _59 = _10_colorRed;
-    }
-    return _59;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ArrayTypes.hlsl b/tests/sksl/shared/ArrayTypes.hlsl
deleted file mode 100644
index 84267d3..0000000
--- a/tests/sksl/shared/ArrayTypes.hlsl
+++ /dev/null
@@ -1,45 +0,0 @@
-struct S
-{
-    float2 v;
-};
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void initialize_vS(inout S _27[2])
-{
-    _27[0].v = float2(0.0f, 1.0f);
-    _27[1].v = float2(2.0f, 1.0f);
-}
-
-float4 main(float2 _38)
-{
-    float2 x[2] = { 0.0f.xx, 0.0f.xx };
-    x[0] = 0.0f.xx;
-    x[1] = float2(1.0f, 0.0f);
-    float2 y[2] = { 0.0f.xx, 0.0f.xx };
-    y[0] = float2(0.0f, 1.0f);
-    y[1] = float2(-1.0f, 2.0f);
-    S _52[2] = { { 0.0f.xx }, { 0.0f.xx } };
-    initialize_vS(_52);
-    S z[2] = _52;
-    return float4((x[0].x * x[0].y) + z[0].v.x, x[1].x - (x[1].y * z[0].v.y), (y[0].x / y[0].y) / z[1].v.x, y[1].x + (y[1].y * z[1].v.y));
-}
-
-void frag_main()
-{
-    float2 _18 = 0.0f.xx;
-    sk_FragColor = main(_18);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Assignment.hlsl b/tests/sksl/shared/Assignment.hlsl
deleted file mode 100644
index d98683a..0000000
--- a/tests/sksl/shared/Assignment.hlsl
+++ /dev/null
@@ -1,113 +0,0 @@
-struct S
-{
-    float f;
-    float af[5];
-    float4 h4;
-    float4 ah4[5];
-};
-
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _22_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float4 globalVar = 0.0f.xxxx;
-static S globalStruct = { 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 0.0f.xxxx, { 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx } };
-
-void keepAlive_vf(float _39)
-{
-}
-
-void keepAlive_vh(float _37)
-{
-}
-
-void keepAlive_vi(int _43)
-{
-}
-
-float4 main(float2 _46)
-{
-    int i = 0;
-    int4 i4 = int4(1, 2, 3, 4);
-    float3x3 f3x3 = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
-    float4 x = 0.0f.xxxx;
-    x.w = 0.0f;
-    x = float4(0.0f.xx.y, 0.0f.xx.x, x.z, x.w);
-    int ai[1] = { 0 };
-    ai[0] = 0;
-    int4 ai4[1] = { int4(0, 0, 0, 0) };
-    ai4[0] = int4(1, 2, 3, 4);
-    float3x3 ah3x3[1] = { float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx) };
-    ah3x3[0] = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
-    float4 af4[1] = { 0.0f.xxxx };
-    af4[0].x = 0.0f;
-    af4[0] = float4(1.0f.xxxx.z, 1.0f.xxxx.x, 1.0f.xxxx.w, 1.0f.xxxx.y);
-    S s = { 0.0f, { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 0.0f.xxxx, { 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx } };
-    s.f = 0.0f;
-    s.af[1] = 0.0f;
-    s.h4 = float4(9.0f.xxx.y, 9.0f.xxx.z, 9.0f.xxx.x, s.h4.w);
-    s.ah4[2] = float4(s.ah4[2].x, 5.0f.xx.x, s.ah4[2].z, 5.0f.xx.y);
-    globalVar = 0.0f.xxxx;
-    globalStruct.f = 0.0f;
-    float l = 0.0f;
-    ai[0] += ai4[0].x;
-    s.f = 1.0f;
-    s.af[0] = 2.0f;
-    s.h4 = 1.0f.xxxx;
-    s.ah4[0] = 2.0f.xxxx;
-    float _131 = af4[0].x;
-    keepAlive_vf(_131);
-    af4[0].x = _131;
-    float _138 = ah3x3[0][0].x;
-    keepAlive_vh(_138);
-    ah3x3[0][0].x = _138;
-    int _142 = i;
-    keepAlive_vi(_142);
-    i = _142;
-    int _147 = i4.y;
-    keepAlive_vi(_147);
-    i4.y = _147;
-    int _152 = ai[0];
-    keepAlive_vi(_152);
-    ai[0] = _152;
-    int _158 = ai4[0].x;
-    keepAlive_vi(_158);
-    ai4[0].x = _158;
-    float _163 = x.y;
-    keepAlive_vh(_163);
-    x.y = _163;
-    float _168 = s.f;
-    keepAlive_vf(_168);
-    s.f = _168;
-    float _172 = l;
-    keepAlive_vh(_172);
-    l = _172;
-    float _178 = f3x3[0].x;
-    keepAlive_vf(_178);
-    f3x3[0].x = _178;
-    return _22_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _32 = 0.0f.xx;
-    float4 _34 = main(_32);
-    sk_FragColor = _34;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Caps.hlsl b/tests/sksl/shared/Caps.hlsl
deleted file mode 100644
index b52493a..0000000
--- a/tests/sksl/shared/Caps.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    int x = 0;
-    int y = 0;
-    int z = 0;
-    x = 1;
-    z = 1;
-    float3 _24 = float3(float(1), float(0), float(1));
-    sk_FragColor = float4(_24.x, _24.y, _24.z, sk_FragColor.w);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/CastsRoundTowardZero.hlsl b/tests/sksl/shared/CastsRoundTowardZero.hlsl
deleted file mode 100644
index af5dd9b..0000000
--- a/tests/sksl/shared/CastsRoundTowardZero.hlsl
+++ /dev/null
@@ -1,42 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool ok = true;
-    float4 _29 = 0.0f.xxxx;
-    if (true)
-    {
-        _29 = _10_colorGreen;
-    }
-    else
-    {
-        _29 = _10_colorRed;
-    }
-    return _29;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Clockwise.hlsl b/tests/sksl/shared/Clockwise.hlsl
deleted file mode 100644
index fe0e651..0000000
--- a/tests/sksl/shared/Clockwise.hlsl
+++ /dev/null
@@ -1,41 +0,0 @@
-cbuffer sksl_synthetic_uniforms : register(b0, space0)
-{
-    float2 _13_u_skRTFlip : packoffset(c1024);
-};
-
-
-static bool gl_FrontFacing;
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Input
-{
-    bool gl_FrontFacing : SV_IsFrontFace;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool _25 = false;
-    if (_13_u_skRTFlip.y > 0.0f)
-    {
-        _25 = !gl_FrontFacing;
-    }
-    else
-    {
-        _25 = gl_FrontFacing;
-    }
-    sk_FragColor = float(_25 ? 1 : (-1)).xxxx;
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_FrontFacing = stage_input.gl_FrontFacing;
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ClockwiseNoRTFlip.hlsl b/tests/sksl/shared/ClockwiseNoRTFlip.hlsl
deleted file mode 100644
index fea761c..0000000
--- a/tests/sksl/shared/ClockwiseNoRTFlip.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-static bool gl_FrontFacing;
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Input
-{
-    bool gl_FrontFacing : SV_IsFrontFace;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float(gl_FrontFacing ? 1 : (-1)).xxxx;
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_FrontFacing = stage_input.gl_FrontFacing;
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/CommaMixedTypes.hlsl b/tests/sksl/shared/CommaMixedTypes.hlsl
deleted file mode 100644
index ae38d44..0000000
--- a/tests/sksl/shared/CommaMixedTypes.hlsl
+++ /dev/null
@@ -1,37 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float _10_unknownInput : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 result = 0.0f.xxxx;
-    result.x = _10_colorGreen.x;
-    result.y = _10_colorGreen.y;
-    result.z = _10_colorGreen.z;
-    result.w = _10_colorGreen.w;
-    return result;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/CommaSideEffects.hlsl b/tests/sksl/shared/CommaSideEffects.hlsl
deleted file mode 100644
index 0c39c92..0000000
--- a/tests/sksl/shared/CommaSideEffects.hlsl
+++ /dev/null
@@ -1,89 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorRed : packoffset(c0);
-    float4 _11_colorGreen : packoffset(c1);
-    float4 _11_colorWhite : packoffset(c2);
-    float4 _11_colorBlack : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void setToColorBlack_vh4(out float4 _26)
-{
-    _26 = _11_colorBlack;
-}
-
-float4 main(float2 _34)
-{
-    float4 b = _11_colorRed;
-    float4 c = _11_colorGreen;
-    float4 _46 = 0.0f.xxxx;
-    setToColorBlack_vh4(_46);
-    float4 d = _46;
-    float4 a = _11_colorWhite;
-    float4 _52 = _11_colorWhite * _11_colorWhite;
-    a = _52;
-    float4 _53 = _11_colorRed * _11_colorRed;
-    b = _53;
-    float4 _54 = _11_colorGreen * _11_colorGreen;
-    c = _54;
-    float4 _55 = _46 * _46;
-    d = _55;
-    bool _68 = false;
-    if (all(bool4(_52.x == _11_colorWhite.x, _52.y == _11_colorWhite.y, _52.z == _11_colorWhite.z, _52.w == _11_colorWhite.w)))
-    {
-        _68 = all(bool4(_53.x == _11_colorRed.x, _53.y == _11_colorRed.y, _53.z == _11_colorRed.z, _53.w == _11_colorRed.w));
-    }
-    else
-    {
-        _68 = false;
-    }
-    bool _75 = false;
-    if (_68)
-    {
-        _75 = all(bool4(_54.x == _11_colorGreen.x, _54.y == _11_colorGreen.y, _54.z == _11_colorGreen.z, _54.w == _11_colorGreen.w));
-    }
-    else
-    {
-        _75 = false;
-    }
-    bool _82 = false;
-    if (_75)
-    {
-        _82 = all(bool4(_55.x == _11_colorBlack.x, _55.y == _11_colorBlack.y, _55.z == _11_colorBlack.z, _55.w == _11_colorBlack.w));
-    }
-    else
-    {
-        _82 = false;
-    }
-    float4 _83 = 0.0f.xxxx;
-    if (_82)
-    {
-        _83 = _11_colorGreen;
-    }
-    else
-    {
-        _83 = _11_colorRed;
-    }
-    return _83;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/CompileTimeConstantVariables.hlsl b/tests/sksl/shared/CompileTimeConstantVariables.hlsl
deleted file mode 100644
index e45d215..0000000
--- a/tests/sksl/shared/CompileTimeConstantVariables.hlsl
+++ /dev/null
@@ -1,68 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int _34 = int(_10_colorGreen.y);
-    int integerInput = _34;
-    if (_34 == 0)
-    {
-        return 2.1400001049041748046875f.xxxx;
-    }
-    else
-    {
-        if (_34 == 1)
-        {
-            return _10_colorGreen;
-        }
-        else
-        {
-            if (_34 == 2)
-            {
-                return float4(1.0f, 0.20000000298023223876953125f, 2.1400001049041748046875f, 1.0f);
-            }
-            else
-            {
-                if (3.1400001049041748046875f < (_10_colorGreen.x * 3.1400001049041748046875f))
-                {
-                    return 3.1400001049041748046875f.xxxx;
-                }
-                else
-                {
-                    if (2.1400001049041748046875f >= (_10_colorGreen.x * 2.1400001049041748046875f))
-                    {
-                        return 0.0f.xxxx;
-                    }
-                    else
-                    {
-                        return float4(1.0f, 0.0f, 0.0f, 1.0f);
-                    }
-                }
-            }
-        }
-    }
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ComplexDelete.hlsl b/tests/sksl/shared/ComplexDelete.hlsl
deleted file mode 100644
index ba145b0..0000000
--- a/tests/sksl/shared/ComplexDelete.hlsl
+++ /dev/null
@@ -1,39 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    row_major float4x4 _14_colorXform : packoffset(c0);
-};
-
-Texture2D<float4> s : register(t0, space0);
-SamplerState _s_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _23 = s.Sample(_s_sampler, 1.0f.xx);
-    float4 tmpColor = _23;
-    float4 _55 = 0.0f.xxxx;
-    if (((any(bool4(_14_colorXform[0].x != float4(1.0f, 0.0f, 0.0f, 0.0f).x, _14_colorXform[0].y != float4(1.0f, 0.0f, 0.0f, 0.0f).y, _14_colorXform[0].z != float4(1.0f, 0.0f, 0.0f, 0.0f).z, _14_colorXform[0].w != float4(1.0f, 0.0f, 0.0f, 0.0f).w)) || any(bool4(_14_colorXform[1].x != float4(0.0f, 1.0f, 0.0f, 0.0f).x, _14_colorXform[1].y != float4(0.0f, 1.0f, 0.0f, 0.0f).y, _14_colorXform[1].z != float4(0.0f, 1.0f, 0.0f, 0.0f).z, _14_colorXform[1].w != float4(0.0f, 1.0f, 0.0f, 0.0f).w))) || any(bool4(_14_colorXform[2].x != float4(0.0f, 0.0f, 1.0f, 0.0f).x, _14_colorXform[2].y != float4(0.0f, 0.0f, 1.0f, 0.0f).y, _14_colorXform[2].z != float4(0.0f, 0.0f, 1.0f, 0.0f).z, _14_colorXform[2].w != float4(0.0f, 0.0f, 1.0f, 0.0f).w))) || any(bool4(_14_colorXform[3].x != float4(0.0f, 0.0f, 0.0f, 1.0f).x, _14_colorXform[3].y != float4(0.0f, 0.0f, 0.0f, 1.0f).y, _14_colorXform[3].z != float4(0.0f, 0.0f, 0.0f, 1.0f).z, _14_colorXform[3].w != float4(0.0f, 0.0f, 0.0f, 1.0f).w)))
-    {
-        float _71 = _23.w;
-        _55 = float4(clamp(mul(float4(_23.xyz, 1.0f), _14_colorXform).xyz, 0.0f.xxx, _71.xxx), _71);
-    }
-    else
-    {
-        _55 = _23;
-    }
-    sk_FragColor = _55;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ConstArray.hlsl b/tests/sksl/shared/ConstArray.hlsl
deleted file mode 100644
index 77290f9..0000000
--- a/tests/sksl/shared/ConstArray.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    return float4(0.0f, 1.0f, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ConstGlobal.hlsl b/tests/sksl/shared/ConstGlobal.hlsl
deleted file mode 100644
index 0742b9a..0000000
--- a/tests/sksl/shared/ConstGlobal.hlsl
+++ /dev/null
@@ -1,57 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool verify_const_globals_bii(int _27, int _28)
-{
-    bool _39 = false;
-    if (_27 == 7)
-    {
-        _39 = _28 == 10;
-    }
-    else
-    {
-        _39 = false;
-    }
-    return _39;
-}
-
-float4 main(float2 _41)
-{
-    int _43 = 7;
-    int _44 = 10;
-    float4 _46 = 0.0f.xxxx;
-    if (verify_const_globals_bii(_43, _44))
-    {
-        _46 = _11_colorGreen;
-    }
-    else
-    {
-        _46 = _11_colorRed;
-    }
-    return _46;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ConstVariableComparison.hlsl b/tests/sksl/shared/ConstVariableComparison.hlsl
deleted file mode 100644
index dc4144d..0000000
--- a/tests/sksl/shared/ConstVariableComparison.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl b/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl
deleted file mode 100644
index 8d59cff..0000000
--- a/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl
+++ /dev/null
@@ -1,92 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _23_colorRed : packoffset(c0);
-    row_major float2x2 _23_testMatrix2x2 : packoffset(c1);
-    float _23_testArray[5] : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float globalArray[5] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
-static float2x2 globalMatrix = float2x2(0.0f.xx, 0.0f.xx);
-
-float4 main(float2 _36)
-{
-    float _16[5] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
-    globalArray = _16;
-    globalMatrix = float2x2(1.0f.xx, 1.0f.xx);
-    float _43[5] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f };
-    float localArray[5] = _43;
-    float2x2 localMatrix = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
-    bool _78 = false;
-    if ((1.0f == _23_testArray[4]) && ((1.0f == _23_testArray[3]) && ((1.0f == _23_testArray[2]) && ((1.0f == _23_testArray[1]) && (1.0f == _23_testArray[0])))))
-    {
-        _78 = true;
-    }
-    else
-    {
-        _78 = all(bool2(1.0f.xx.x == _23_colorRed.xy.x, 1.0f.xx.y == _23_colorRed.xy.y));
-    }
-    bool _92 = false;
-    if (_78)
-    {
-        _92 = true;
-    }
-    else
-    {
-        _92 = all(bool2(1.0f.xx.x == _23_testMatrix2x2[0].x, 1.0f.xx.y == _23_testMatrix2x2[0].y)) && all(bool2(1.0f.xx.x == _23_testMatrix2x2[1].x, 1.0f.xx.y == _23_testMatrix2x2[1].y));
-    }
-    bool _111 = false;
-    if (_92)
-    {
-        _111 = true;
-    }
-    else
-    {
-        _111 = (4.0f == _23_testArray[4]) && ((3.0f == _23_testArray[3]) && ((2.0f == _23_testArray[2]) && ((1.0f == _23_testArray[1]) && (0.0f == _23_testArray[0]))));
-    }
-    bool _119 = false;
-    if (_111)
-    {
-        _119 = true;
-    }
-    else
-    {
-        _119 = all(bool2(1.0f.xx.x == _23_colorRed.xy.x, 1.0f.xx.y == _23_colorRed.xy.y));
-    }
-    bool _131 = false;
-    if (_119)
-    {
-        _131 = true;
-    }
-    else
-    {
-        _131 = all(bool2(float2(0.0f, 1.0f).x == _23_testMatrix2x2[0].x, float2(0.0f, 1.0f).y == _23_testMatrix2x2[0].y)) && all(bool2(float2(2.0f, 3.0f).x == _23_testMatrix2x2[1].x, float2(2.0f, 3.0f).y == _23_testMatrix2x2[1].y));
-    }
-    if (_131)
-    {
-        return _23_colorRed;
-    }
-    return float4(0.0f, 1.0f, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _32 = 0.0f.xx;
-    float4 _34 = main(_32);
-    sk_FragColor = _34;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl b/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl
deleted file mode 100644
index 12b79be..0000000
--- a/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl
+++ /dev/null
@@ -1,37 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static int zero = 0;
-static float globalArray[2] = { 0.0f, 0.0f };
-static float2x2 globalMatrix = float2x2(0.0f.xx, 0.0f.xx);
-
-float4 main(float2 _36)
-{
-    zero = 0;
-    float _19[2] = { 1.0f, 1.0f };
-    globalArray = _19;
-    globalMatrix = float2x2(1.0f.xx, 1.0f.xx);
-    float _40[2] = { 0.0f, 1.0f };
-    float localArray[2] = _40;
-    float2x2 localMatrix = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
-    return float4(globalArray[zero] * localArray[zero], 1.0f.xx[zero] * 1.0f.xx[zero], globalMatrix[zero] * localMatrix[zero]);
-}
-
-void frag_main()
-{
-    float2 _32 = 0.0f.xx;
-    float4 _34 = main(_32);
-    sk_FragColor = _34;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ConstantIf.hlsl b/tests/sksl/shared/ConstantIf.hlsl
deleted file mode 100644
index 05e2c97..0000000
--- a/tests/sksl/shared/ConstantIf.hlsl
+++ /dev/null
@@ -1,75 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int a = 0;
-    int b = 0;
-    int c = 0;
-    int d = 0;
-    a = 1;
-    b = 2;
-    c = 5;
-    bool _40 = false;
-    if (true)
-    {
-        _40 = true;
-    }
-    else
-    {
-        _40 = false;
-    }
-    bool _43 = false;
-    if (_40)
-    {
-        _43 = true;
-    }
-    else
-    {
-        _43 = false;
-    }
-    bool _46 = false;
-    if (_43)
-    {
-        _46 = true;
-    }
-    else
-    {
-        _46 = false;
-    }
-    float4 _47 = 0.0f.xxxx;
-    if (_46)
-    {
-        _47 = _10_colorGreen;
-    }
-    else
-    {
-        _47 = _10_colorRed;
-    }
-    return _47;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Control.hlsl b/tests/sksl/shared/Control.hlsl
deleted file mode 100644
index 6dfb1cd..0000000
--- a/tests/sksl/shared/Control.hlsl
+++ /dev/null
@@ -1,60 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    if (_10_unknownInput > 5.0f)
-    {
-        sk_FragColor = 0.75f.xxxx;
-    }
-    else
-    {
-        discard;
-    }
-    int i = 0;
-    while (i < 10)
-    {
-        sk_FragColor *= 0.5f;
-        i++;
-    }
-    do
-    {
-        sk_FragColor += 0.25f.xxxx;
-    } while (sk_FragColor.x < 0.75f);
-    for (int i_1 = 0; i_1 < 10; i_1++)
-    {
-        if ((i_1 % 2) == 1)
-        {
-            break;
-        }
-        else
-        {
-            if (i_1 > 100)
-            {
-                return;
-            }
-            else
-            {
-                continue;
-            }
-        }
-    }
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadDoWhileLoop.hlsl b/tests/sksl/shared/DeadDoWhileLoop.hlsl
deleted file mode 100644
index e982fe5..0000000
--- a/tests/sksl/shared/DeadDoWhileLoop.hlsl
+++ /dev/null
@@ -1,22 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    do
-    {
-        sk_FragColor = 1.0f.xxxx;
-    } while (false);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadGlobals.hlsl b/tests/sksl/shared/DeadGlobals.hlsl
deleted file mode 100644
index dc4144d..0000000
--- a/tests/sksl/shared/DeadGlobals.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadIfStatement.hlsl b/tests/sksl/shared/DeadIfStatement.hlsl
deleted file mode 100644
index dc4144d..0000000
--- a/tests/sksl/shared/DeadIfStatement.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadLoopVariable.hlsl b/tests/sksl/shared/DeadLoopVariable.hlsl
deleted file mode 100644
index 57b7aac..0000000
--- a/tests/sksl/shared/DeadLoopVariable.hlsl
+++ /dev/null
@@ -1,36 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int x = 0;
-    while (!(x < 4))
-    {
-        break;
-    }
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadReturn.hlsl b/tests/sksl/shared/DeadReturn.hlsl
deleted file mode 100644
index 5b4614d..0000000
--- a/tests/sksl/shared/DeadReturn.hlsl
+++ /dev/null
@@ -1,122 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _18_colorGreen : packoffset(c0);
-    float4 _18_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static int scratchVar = 0;
-
-bool test_flat_b()
-{
-    return true;
-}
-
-bool test_if_b()
-{
-    if (_18_colorGreen.y > 0.0f)
-    {
-        return true;
-    }
-    else
-    {
-        scratchVar++;
-    }
-    scratchVar++;
-    return false;
-}
-
-bool test_else_b()
-{
-    if (_18_colorGreen.y == 0.0f)
-    {
-        return false;
-    }
-    else
-    {
-        return true;
-    }
-}
-
-bool test_loop_if_b()
-{
-    for (int x = 0; x <= 1; x++)
-    {
-        if (_18_colorGreen.y == 0.0f)
-        {
-            return false;
-        }
-        else
-        {
-            return true;
-        }
-    }
-    scratchVar++;
-    return true;
-}
-
-float4 main(float2 _79)
-{
-    scratchVar = 0;
-    bool _85 = false;
-    if (test_flat_b())
-    {
-        bool _84 = test_if_b();
-        _85 = _84;
-    }
-    else
-    {
-        _85 = false;
-    }
-    bool _89 = false;
-    if (_85)
-    {
-        _89 = test_else_b();
-    }
-    else
-    {
-        _89 = false;
-    }
-    bool _93 = false;
-    if (_89)
-    {
-        bool _92 = test_loop_if_b();
-        _93 = _92;
-    }
-    else
-    {
-        _93 = false;
-    }
-    float4 _94 = 0.0f.xxxx;
-    if (_93)
-    {
-        _94 = _18_colorGreen;
-    }
-    else
-    {
-        _94 = _18_colorRed;
-    }
-    return _94;
-}
-
-void frag_main()
-{
-    float2 _28 = 0.0f.xx;
-    float4 _30 = main(_28);
-    sk_FragColor = _30;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadReturnES3.hlsl b/tests/sksl/shared/DeadReturnES3.hlsl
deleted file mode 100644
index 9dd05f2..0000000
--- a/tests/sksl/shared/DeadReturnES3.hlsl
+++ /dev/null
@@ -1,190 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _18_colorGreen : packoffset(c0);
-    float4 _18_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_return_b()
-{
-    do
-    {
-        return true;
-    } while (false);
-}
-
-bool test_break_b()
-{
-    do
-    {
-        break;
-    } while (false);
-    return true;
-}
-
-bool test_continue_b()
-{
-    do
-    {
-    } while (false);
-    return true;
-}
-
-bool test_if_return_b()
-{
-    do
-    {
-        if (_18_colorGreen.y > 0.0f)
-        {
-            return true;
-        }
-        else
-        {
-            break;
-        }
-    } while (false);
-    return false;
-}
-
-bool test_if_break_b()
-{
-    do
-    {
-        if (_18_colorGreen.y > 0.0f)
-        {
-            break;
-        }
-        else
-        {
-            continue;
-        }
-    } while (false);
-    return true;
-}
-
-bool test_else_b()
-{
-    do
-    {
-        if (_18_colorGreen.y == 0.0f)
-        {
-            return false;
-        }
-        else
-        {
-            return true;
-        }
-    } while (false);
-}
-
-bool test_loop_return_b()
-{
-    return true;
-}
-
-bool test_loop_break_b()
-{
-    for (int x = 0; !(x <= 1); x++)
-    {
-        break;
-    }
-    return true;
-}
-
-float4 main(float2 _109)
-{
-    bool _115 = false;
-    if (test_return_b())
-    {
-        _115 = test_break_b();
-    }
-    else
-    {
-        _115 = false;
-    }
-    bool _119 = false;
-    if (_115)
-    {
-        _119 = test_continue_b();
-    }
-    else
-    {
-        _119 = false;
-    }
-    bool _123 = false;
-    if (_119)
-    {
-        _123 = test_if_return_b();
-    }
-    else
-    {
-        _123 = false;
-    }
-    bool _127 = false;
-    if (_123)
-    {
-        _127 = test_if_break_b();
-    }
-    else
-    {
-        _127 = false;
-    }
-    bool _131 = false;
-    if (_127)
-    {
-        _131 = test_else_b();
-    }
-    else
-    {
-        _131 = false;
-    }
-    bool _135 = false;
-    if (_131)
-    {
-        _135 = test_loop_return_b();
-    }
-    else
-    {
-        _135 = false;
-    }
-    bool _139 = false;
-    if (_135)
-    {
-        _139 = test_loop_break_b();
-    }
-    else
-    {
-        _139 = false;
-    }
-    float4 _140 = 0.0f.xxxx;
-    if (_139)
-    {
-        _140 = _18_colorGreen;
-    }
-    else
-    {
-        _140 = _18_colorRed;
-    }
-    return _140;
-}
-
-void frag_main()
-{
-    float2 _28 = 0.0f.xx;
-    sk_FragColor = main(_28);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DeadStripFunctions.hlsl b/tests/sksl/shared/DeadStripFunctions.hlsl
deleted file mode 100644
index a036937..0000000
--- a/tests/sksl/shared/DeadStripFunctions.hlsl
+++ /dev/null
@@ -1,67 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_colorGreen : packoffset(c0);
-    float4 _12_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 live_fn_h4h4h4(float4 _46, float4 _47)
-{
-    return _46 + _47;
-}
-
-float4 unpremul_h4h4(float4 _27)
-{
-    return float4(_27.xyz * (1.0f / max(_27.w, 9.9999997473787516355514526367188e-05f)), _27.w);
-}
-
-float4 main(float2 _53)
-{
-    float4 _59 = 3.0f.xxxx;
-    float4 _62 = (-5.0f).xxxx;
-    float4 _63 = live_fn_h4h4h4(_59, _62);
-    float4 a = _63;
-    float4 _65 = 1.0f.xxxx;
-    float4 _66 = unpremul_h4h4(_65);
-    float4 b = _66;
-    bool _76 = false;
-    if (any(bool4(_63.x != 0.0f.xxxx.x, _63.y != 0.0f.xxxx.y, _63.z != 0.0f.xxxx.z, _63.w != 0.0f.xxxx.w)))
-    {
-        _76 = any(bool4(_66.x != 0.0f.xxxx.x, _66.y != 0.0f.xxxx.y, _66.z != 0.0f.xxxx.z, _66.w != 0.0f.xxxx.w));
-    }
-    else
-    {
-        _76 = false;
-    }
-    float4 _77 = 0.0f.xxxx;
-    if (_76)
-    {
-        _77 = _12_colorGreen;
-    }
-    else
-    {
-        _77 = _12_colorRed;
-    }
-    return _77;
-}
-
-void frag_main()
-{
-    float2 _22 = 0.0f.xx;
-    sk_FragColor = main(_22);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DependentInitializers.hlsl b/tests/sksl/shared/DependentInitializers.hlsl
deleted file mode 100644
index 547682f..0000000
--- a/tests/sksl/shared/DependentInitializers.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float x = 0.5f;
-    float _31 = 0.5f * 2.0f;
-    float y = _31;
-    float4 _34 = 0.0f.xxxx;
-    if (_31 == 1.0f)
-    {
-        _34 = _10_colorGreen;
-    }
-    else
-    {
-        _34 = _10_colorRed;
-    }
-    return _34;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DerivativesUnused.hlsl b/tests/sksl/shared/DerivativesUnused.hlsl
deleted file mode 100644
index 12edad8..0000000
--- a/tests/sksl/shared/DerivativesUnused.hlsl
+++ /dev/null
@@ -1,19 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor.x = 1.0f;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Discard.hlsl b/tests/sksl/shared/Discard.hlsl
deleted file mode 100644
index 8da6875..0000000
--- a/tests/sksl/shared/Discard.hlsl
+++ /dev/null
@@ -1,19 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    discard;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DoWhileControlFlow.hlsl b/tests/sksl/shared/DoWhileControlFlow.hlsl
deleted file mode 100644
index f6005a3..0000000
--- a/tests/sksl/shared/DoWhileControlFlow.hlsl
+++ /dev/null
@@ -1,43 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float4 x = 1.0f.xxxx;
-    do
-    {
-        x.x -= 0.25f;
-        if (x.x <= 0.0f)
-        {
-            break;
-        }
-    } while (x.w == 1.0f);
-    do
-    {
-        x.z -= 0.25f;
-        if (x.w == 1.0f)
-        {
-            continue;
-        }
-        x.y = 0.0f;
-    } while (x.z > 0.0f);
-    return x;
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/DoubleNegation.hlsl b/tests/sksl/shared/DoubleNegation.hlsl
deleted file mode 100644
index 16365bb..0000000
--- a/tests/sksl/shared/DoubleNegation.hlsl
+++ /dev/null
@@ -1,31 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return float4(float(int(_10_colorGreen.x)), _10_colorGreen.y, _10_colorGreen.zw);
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/EmptyBlocksES2.hlsl b/tests/sksl/shared/EmptyBlocksES2.hlsl
deleted file mode 100644
index 376aad2..0000000
--- a/tests/sksl/shared/EmptyBlocksES2.hlsl
+++ /dev/null
@@ -1,43 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 color = 0.0f.xxxx;
-    if (_10_unknownInput == 1.0f)
-    {
-        color.y = 1.0f;
-    }
-    if (_10_unknownInput == 2.0f)
-    {
-    }
-    else
-    {
-        color.w = 1.0f;
-    }
-    return color;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/EmptyBlocksES3.hlsl b/tests/sksl/shared/EmptyBlocksES3.hlsl
deleted file mode 100644
index f619a16..0000000
--- a/tests/sksl/shared/EmptyBlocksES3.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorWhite : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 color = 0.0f.xxxx;
-    if (_10_colorWhite.x == 1.0f)
-    {
-        color.y = 1.0f;
-    }
-    if (_10_colorWhite.x == 2.0f)
-    {
-    }
-    else
-    {
-        color.w = 1.0f;
-    }
-    while (_10_colorWhite.x == 2.0f)
-    {
-    }
-    do
-    {
-    } while (_10_colorWhite.x == 2.0f);
-    return color;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ForLoopControlFlow.hlsl b/tests/sksl/shared/ForLoopControlFlow.hlsl
deleted file mode 100644
index 75f9659..0000000
--- a/tests/sksl/shared/ForLoopControlFlow.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorWhite : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 x = _10_colorWhite;
-    for (float r = -5.0f; r < 5.0f; r += 1.0f)
-    {
-        x.x = clamp(r, 0.0f, 1.0f);
-        if (x.x == 0.0f)
-        {
-            break;
-        }
-    }
-    for (float b = 5.0f; b >= 0.0f; b -= 1.0f)
-    {
-        x.z = b;
-        if (x.w == 1.0f)
-        {
-            continue;
-        }
-        x.y = 0.0f;
-    }
-    return x;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ForLoopMultipleInit.hlsl b/tests/sksl/shared/ForLoopMultipleInit.hlsl
deleted file mode 100644
index 7d21e1a..0000000
--- a/tests/sksl/shared/ForLoopMultipleInit.hlsl
+++ /dev/null
@@ -1,73 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float4 result = 0.0f.xxxx;
-    float a = 0.0f;
-    float b = 0.0f;
-    for (;;)
-    {
-        bool _42 = false;
-        if (a < 10.0f)
-        {
-            _42 = b < 10.0f;
-        }
-        else
-        {
-            _42 = false;
-        }
-        if (_42)
-        {
-            result.x += a;
-            result.y += b;
-            a += 1.0f;
-            b += 1.0f;
-            continue;
-        }
-        else
-        {
-            break;
-        }
-    }
-    for (int c = 0; c < 10; c++)
-    {
-        result.z += 1.0f;
-    }
-    float _78[2] = { 0.0f, 10.0f };
-    float d[2] = _78;
-    float _86[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
-    float e[4] = _86;
-    float f = 9.0f;
-    for (; d[0] < d[1]; d[0] += 1.0f)
-    {
-        result.w = e[0] * f;
-    }
-    for (;;)
-    {
-        break;
-    }
-    for (;;)
-    {
-        break;
-    }
-    return result;
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/FragCoords.hlsl b/tests/sksl/shared/FragCoords.hlsl
deleted file mode 100644
index 7fc9187..0000000
--- a/tests/sksl/shared/FragCoords.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-cbuffer sksl_synthetic_uniforms : register(b0, space0)
-{
-    float2 _15_u_skRTFlip : packoffset(c1024);
-};
-
-
-static float4 gl_FragCoord;
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Input
-{
-    float4 gl_FragCoord : SV_Position;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float2 _39 = float4(gl_FragCoord.x, _15_u_skRTFlip.x + (_15_u_skRTFlip.y * gl_FragCoord.y), gl_FragCoord.z, gl_FragCoord.w).xy;
-    sk_FragColor = float4(_39.x, _39.y, sk_FragColor.z, sk_FragColor.w);
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_FragCoord = stage_input.gl_FragCoord;
-    gl_FragCoord.w = 1.0 / gl_FragCoord.w;
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/FragCoordsNoRTFlip.hlsl b/tests/sksl/shared/FragCoordsNoRTFlip.hlsl
deleted file mode 100644
index 4d779d5..0000000
--- a/tests/sksl/shared/FragCoordsNoRTFlip.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-static float4 gl_FragCoord;
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Input
-{
-    float4 gl_FragCoord : SV_Position;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float4(gl_FragCoord.xy.x, gl_FragCoord.xy.y, sk_FragColor.z, sk_FragColor.w);
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_FragCoord = stage_input.gl_FragCoord;
-    gl_FragCoord.w = 1.0 / gl_FragCoord.w;
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/FunctionAnonymousParameters.hlsl b/tests/sksl/shared/FunctionAnonymousParameters.hlsl
deleted file mode 100644
index c13f36a..0000000
--- a/tests/sksl/shared/FunctionAnonymousParameters.hlsl
+++ /dev/null
@@ -1,62 +0,0 @@
-struct S
-{
-    int i;
-};
-
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_colorGreen : packoffset(c0);
-    float4 _12_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 fnGreen_h4bf2(bool _27, float2 _28)
-{
-    return _12_colorGreen;
-}
-
-float4 fnRed_h4ifS(int _40, float _41, S _42)
-{
-    return _12_colorRed;
-}
-
-float4 main(float2 _48)
-{
-    float4 _54 = 0.0f.xxxx;
-    if (_12_colorGreen.y != 0.0f)
-    {
-        bool _60 = true;
-        float2 _62 = _48;
-        _54 = fnGreen_h4bf2(_60, _62);
-    }
-    else
-    {
-        int _65 = 123;
-        float _67 = 3.1400001049041748046875f;
-        S _68 = { 0 };
-        S _69 = _68;
-        _54 = fnRed_h4ifS(_65, _67, _69);
-    }
-    return _54;
-}
-
-void frag_main()
-{
-    float2 _22 = 0.0f.xx;
-    sk_FragColor = main(_22);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/FunctionArgTypeMatch.hlsl b/tests/sksl/shared/FunctionArgTypeMatch.hlsl
deleted file mode 100644
index 03c51a9..0000000
--- a/tests/sksl/shared/FunctionArgTypeMatch.hlsl
+++ /dev/null
@@ -1,385 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _33_colorGreen : packoffset(c0);
-    float4 _33_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool takes_void_b()
-{
-    return true;
-}
-
-bool takes_float_bf(float _51)
-{
-    return true;
-}
-
-bool takes_float2_bf2(float2 _54)
-{
-    return true;
-}
-
-bool takes_float3_bf3(float3 _59)
-{
-    return true;
-}
-
-bool takes_float4_bf4(float4 _63)
-{
-    return true;
-}
-
-bool takes_float2x2_bf22(float2x2 _68)
-{
-    return true;
-}
-
-bool takes_float3x3_bf33(float3x3 _73)
-{
-    return true;
-}
-
-bool takes_float4x4_bf44(float4x4 _78)
-{
-    return true;
-}
-
-bool takes_half_bh(float _80)
-{
-    return true;
-}
-
-bool takes_half2_bh2(float2 _82)
-{
-    return true;
-}
-
-bool takes_half3_bh3(float3 _84)
-{
-    return true;
-}
-
-bool takes_half4_bh4(float4 _86)
-{
-    return true;
-}
-
-bool takes_half2x2_bh22(float2x2 _88)
-{
-    return true;
-}
-
-bool takes_half3x3_bh33(float3x3 _90)
-{
-    return true;
-}
-
-bool takes_half4x4_bh44(float4x4 _92)
-{
-    return true;
-}
-
-bool takes_bool_bb(bool _96)
-{
-    return true;
-}
-
-bool takes_bool2_bb2(bool2 _101)
-{
-    return true;
-}
-
-bool takes_bool3_bb3(bool3 _106)
-{
-    return true;
-}
-
-bool takes_bool4_bb4(bool4 _111)
-{
-    return true;
-}
-
-bool takes_int_bi(int _116)
-{
-    return true;
-}
-
-bool takes_int2_bi2(int2 _121)
-{
-    return true;
-}
-
-bool takes_int3_bi3(int3 _126)
-{
-    return true;
-}
-
-bool takes_int4_bi4(int4 _131)
-{
-    return true;
-}
-
-float4 main(float2 _134)
-{
-    bool _140 = false;
-    if (true)
-    {
-        _140 = takes_void_b();
-    }
-    else
-    {
-        _140 = false;
-    }
-    bool _146 = false;
-    if (_140)
-    {
-        float _144 = 1.0f;
-        _146 = takes_float_bf(_144);
-    }
-    else
-    {
-        _146 = false;
-    }
-    bool _153 = false;
-    if (_146)
-    {
-        float2 _151 = 2.0f.xx;
-        _153 = takes_float2_bf2(_151);
-    }
-    else
-    {
-        _153 = false;
-    }
-    bool _160 = false;
-    if (_153)
-    {
-        float3 _158 = 3.0f.xxx;
-        _160 = takes_float3_bf3(_158);
-    }
-    else
-    {
-        _160 = false;
-    }
-    bool _167 = false;
-    if (_160)
-    {
-        float4 _165 = 4.0f.xxxx;
-        _167 = takes_float4_bf4(_165);
-    }
-    else
-    {
-        _167 = false;
-    }
-    bool _175 = false;
-    if (_167)
-    {
-        float2x2 _173 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
-        _175 = takes_float2x2_bf22(_173);
-    }
-    else
-    {
-        _175 = false;
-    }
-    bool _184 = false;
-    if (_175)
-    {
-        float3x3 _182 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
-        _184 = takes_float3x3_bf33(_182);
-    }
-    else
-    {
-        _184 = false;
-    }
-    bool _194 = false;
-    if (_184)
-    {
-        float4x4 _192 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
-        _194 = takes_float4x4_bf44(_192);
-    }
-    else
-    {
-        _194 = false;
-    }
-    bool _199 = false;
-    if (_194)
-    {
-        float _197 = 1.0f;
-        _199 = takes_half_bh(_197);
-    }
-    else
-    {
-        _199 = false;
-    }
-    bool _204 = false;
-    if (_199)
-    {
-        float2 _202 = 2.0f.xx;
-        _204 = takes_half2_bh2(_202);
-    }
-    else
-    {
-        _204 = false;
-    }
-    bool _209 = false;
-    if (_204)
-    {
-        float3 _207 = 3.0f.xxx;
-        _209 = takes_half3_bh3(_207);
-    }
-    else
-    {
-        _209 = false;
-    }
-    bool _214 = false;
-    if (_209)
-    {
-        float4 _212 = 4.0f.xxxx;
-        _214 = takes_half4_bh4(_212);
-    }
-    else
-    {
-        _214 = false;
-    }
-    bool _219 = false;
-    if (_214)
-    {
-        float2x2 _217 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
-        _219 = takes_half2x2_bh22(_217);
-    }
-    else
-    {
-        _219 = false;
-    }
-    bool _224 = false;
-    if (_219)
-    {
-        float3x3 _222 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
-        _224 = takes_half3x3_bh33(_222);
-    }
-    else
-    {
-        _224 = false;
-    }
-    bool _229 = false;
-    if (_224)
-    {
-        float4x4 _227 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
-        _229 = takes_half4x4_bh44(_227);
-    }
-    else
-    {
-        _229 = false;
-    }
-    bool _234 = false;
-    if (_229)
-    {
-        bool _232 = true;
-        _234 = takes_bool_bb(_232);
-    }
-    else
-    {
-        _234 = false;
-    }
-    bool _240 = false;
-    if (_234)
-    {
-        bool2 _238 = bool2(true, true);
-        _240 = takes_bool2_bb2(_238);
-    }
-    else
-    {
-        _240 = false;
-    }
-    bool _246 = false;
-    if (_240)
-    {
-        bool3 _244 = bool3(true, true, true);
-        _246 = takes_bool3_bb3(_244);
-    }
-    else
-    {
-        _246 = false;
-    }
-    bool _252 = false;
-    if (_246)
-    {
-        bool4 _250 = bool4(true, true, true, true);
-        _252 = takes_bool4_bb4(_250);
-    }
-    else
-    {
-        _252 = false;
-    }
-    bool _258 = false;
-    if (_252)
-    {
-        int _256 = 1;
-        _258 = takes_int_bi(_256);
-    }
-    else
-    {
-        _258 = false;
-    }
-    bool _265 = false;
-    if (_258)
-    {
-        int2 _263 = int2(2, 2);
-        _265 = takes_int2_bi2(_263);
-    }
-    else
-    {
-        _265 = false;
-    }
-    bool _272 = false;
-    if (_265)
-    {
-        int3 _270 = int3(3, 3, 3);
-        _272 = takes_int3_bi3(_270);
-    }
-    else
-    {
-        _272 = false;
-    }
-    bool _279 = false;
-    if (_272)
-    {
-        int4 _277 = int4(4, 4, 4, 4);
-        _279 = takes_int4_bi4(_277);
-    }
-    else
-    {
-        _279 = false;
-    }
-    float4 _280 = 0.0f.xxxx;
-    if (_279)
-    {
-        _280 = _33_colorGreen;
-    }
-    else
-    {
-        _280 = _33_colorRed;
-    }
-    return _280;
-}
-
-void frag_main()
-{
-    float2 _43 = 0.0f.xx;
-    sk_FragColor = main(_43);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/FunctionPrototype.hlsl b/tests/sksl/shared/FunctionPrototype.hlsl
deleted file mode 100644
index d917e8f..0000000
--- a/tests/sksl/shared/FunctionPrototype.hlsl
+++ /dev/null
@@ -1,37 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 this_function_is_defined_before_use_h4h4(float4 _26)
-{
-    return -_26;
-}
-
-float4 main(float2 _31)
-{
-    float4 _39 = -_11_colorGreen;
-    return this_function_is_defined_before_use_h4h4(_39);
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/FunctionReturnTypeMatch.hlsl b/tests/sksl/shared/FunctionReturnTypeMatch.hlsl
deleted file mode 100644
index 04f0874..0000000
--- a/tests/sksl/shared/FunctionReturnTypeMatch.hlsl
+++ /dev/null
@@ -1,393 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _31_colorGreen : packoffset(c0);
-    float4 _31_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float2 returns_float2_f2()
-{
-    return 2.0f.xx;
-}
-
-float3 returns_float3_f3()
-{
-    return 3.0f.xxx;
-}
-
-float4 returns_float4_f4()
-{
-    return 4.0f.xxxx;
-}
-
-float2x2 returns_float2x2_f22()
-{
-    return float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
-}
-
-float3x3 returns_float3x3_f33()
-{
-    return float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
-}
-
-float4x4 returns_float4x4_f44()
-{
-    return float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
-}
-
-float returns_half_h()
-{
-    return 1.0f;
-}
-
-float2 returns_half2_h2()
-{
-    return 2.0f.xx;
-}
-
-float3 returns_half3_h3()
-{
-    return 3.0f.xxx;
-}
-
-float4 returns_half4_h4()
-{
-    return 4.0f.xxxx;
-}
-
-float2x2 returns_half2x2_h22()
-{
-    return float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
-}
-
-float3x3 returns_half3x3_h33()
-{
-    return float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
-}
-
-float4x4 returns_half4x4_h44()
-{
-    return float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
-}
-
-bool returns_bool_b()
-{
-    return true;
-}
-
-bool2 returns_bool2_b2()
-{
-    return bool2(true, true);
-}
-
-bool3 returns_bool3_b3()
-{
-    return bool3(true, true, true);
-}
-
-bool4 returns_bool4_b4()
-{
-    return bool4(true, true, true, true);
-}
-
-int returns_int_i()
-{
-    return 1;
-}
-
-int2 returns_int2_i2()
-{
-    return int2(2, 2);
-}
-
-int3 returns_int3_i3()
-{
-    return int3(3, 3, 3);
-}
-
-int4 returns_int4_i4()
-{
-    return int4(4, 4, 4, 4);
-}
-
-float4 main(float2 _122)
-{
-    float x1 = 1.0f;
-    float2 x2 = 2.0f.xx;
-    float3 x3 = 3.0f.xxx;
-    float4 x4 = 4.0f.xxxx;
-    float2x2 x5 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
-    float3x3 x6 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
-    float4x4 x7 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
-    float x8 = 1.0f;
-    float2 x9 = 2.0f.xx;
-    float3 x10 = 3.0f.xxx;
-    float4 x11 = 4.0f.xxxx;
-    float2x2 x12 = float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f));
-    float3x3 x13 = float3x3(float3(3.0f, 0.0f, 0.0f), float3(0.0f, 3.0f, 0.0f), float3(0.0f, 0.0f, 3.0f));
-    float4x4 x14 = float4x4(float4(4.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 4.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 4.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 4.0f));
-    bool x15 = true;
-    bool2 x16 = bool2(true, true);
-    bool3 x17 = bool3(true, true, true);
-    bool4 x18 = bool4(true, true, true, true);
-    int x19 = 1;
-    int2 x20 = int2(2, 2);
-    int3 x21 = int3(3, 3, 3);
-    int4 x22 = int4(4, 4, 4, 4);
-    bool _166 = false;
-    if (true)
-    {
-        float2 _163 = returns_float2_f2();
-        _166 = all(bool2(2.0f.xx.x == _163.x, 2.0f.xx.y == _163.y));
-    }
-    else
-    {
-        _166 = false;
-    }
-    bool _172 = false;
-    if (_166)
-    {
-        float3 _169 = returns_float3_f3();
-        _172 = all(bool3(3.0f.xxx.x == _169.x, 3.0f.xxx.y == _169.y, 3.0f.xxx.z == _169.z));
-    }
-    else
-    {
-        _172 = false;
-    }
-    bool _178 = false;
-    if (_172)
-    {
-        float4 _175 = returns_float4_f4();
-        _178 = all(bool4(4.0f.xxxx.x == _175.x, 4.0f.xxxx.y == _175.y, 4.0f.xxxx.z == _175.z, 4.0f.xxxx.w == _175.w));
-    }
-    else
-    {
-        _178 = false;
-    }
-    bool _189 = false;
-    if (_178)
-    {
-        float2x2 _181 = returns_float2x2_f22();
-        float2 _182 = _181[0];
-        float2 _185 = _181[1];
-        _189 = all(bool2(float2(2.0f, 0.0f).x == _182.x, float2(2.0f, 0.0f).y == _182.y)) && all(bool2(float2(0.0f, 2.0f).x == _185.x, float2(0.0f, 2.0f).y == _185.y));
-    }
-    else
-    {
-        _189 = false;
-    }
-    bool _204 = false;
-    if (_189)
-    {
-        float3x3 _192 = returns_float3x3_f33();
-        float3 _193 = _192[0];
-        float3 _196 = _192[1];
-        float3 _200 = _192[2];
-        _204 = (all(bool3(float3(3.0f, 0.0f, 0.0f).x == _193.x, float3(3.0f, 0.0f, 0.0f).y == _193.y, float3(3.0f, 0.0f, 0.0f).z == _193.z)) && all(bool3(float3(0.0f, 3.0f, 0.0f).x == _196.x, float3(0.0f, 3.0f, 0.0f).y == _196.y, float3(0.0f, 3.0f, 0.0f).z == _196.z))) && all(bool3(float3(0.0f, 0.0f, 3.0f).x == _200.x, float3(0.0f, 0.0f, 3.0f).y == _200.y, float3(0.0f, 0.0f, 3.0f).z == _200.z));
-    }
-    else
-    {
-        _204 = false;
-    }
-    bool _223 = false;
-    if (_204)
-    {
-        float4x4 _207 = returns_float4x4_f44();
-        float4 _208 = _207[0];
-        float4 _211 = _207[1];
-        float4 _215 = _207[2];
-        float4 _219 = _207[3];
-        _223 = ((all(bool4(float4(4.0f, 0.0f, 0.0f, 0.0f).x == _208.x, float4(4.0f, 0.0f, 0.0f, 0.0f).y == _208.y, float4(4.0f, 0.0f, 0.0f, 0.0f).z == _208.z, float4(4.0f, 0.0f, 0.0f, 0.0f).w == _208.w)) && all(bool4(float4(0.0f, 4.0f, 0.0f, 0.0f).x == _211.x, float4(0.0f, 4.0f, 0.0f, 0.0f).y == _211.y, float4(0.0f, 4.0f, 0.0f, 0.0f).z == _211.z, float4(0.0f, 4.0f, 0.0f, 0.0f).w == _211.w))) && all(bool4(float4(0.0f, 0.0f, 4.0f, 0.0f).x == _215.x, float4(0.0f, 0.0f, 4.0f, 0.0f).y == _215.y, float4(0.0f, 0.0f, 4.0f, 0.0f).z == _215.z, float4(0.0f, 0.0f, 4.0f, 0.0f).w == _215.w))) && all(bool4(float4(0.0f, 0.0f, 0.0f, 4.0f).x == _219.x, float4(0.0f, 0.0f, 0.0f, 4.0f).y == _219.y, float4(0.0f, 0.0f, 0.0f, 4.0f).z == _219.z, float4(0.0f, 0.0f, 0.0f, 4.0f).w == _219.w));
-    }
-    else
-    {
-        _223 = false;
-    }
-    bool _228 = false;
-    if (_223)
-    {
-        _228 = 1.0f == returns_half_h();
-    }
-    else
-    {
-        _228 = false;
-    }
-    bool _234 = false;
-    if (_228)
-    {
-        float2 _231 = returns_half2_h2();
-        _234 = all(bool2(2.0f.xx.x == _231.x, 2.0f.xx.y == _231.y));
-    }
-    else
-    {
-        _234 = false;
-    }
-    bool _240 = false;
-    if (_234)
-    {
-        float3 _237 = returns_half3_h3();
-        _240 = all(bool3(3.0f.xxx.x == _237.x, 3.0f.xxx.y == _237.y, 3.0f.xxx.z == _237.z));
-    }
-    else
-    {
-        _240 = false;
-    }
-    bool _246 = false;
-    if (_240)
-    {
-        float4 _243 = returns_half4_h4();
-        _246 = all(bool4(4.0f.xxxx.x == _243.x, 4.0f.xxxx.y == _243.y, 4.0f.xxxx.z == _243.z, 4.0f.xxxx.w == _243.w));
-    }
-    else
-    {
-        _246 = false;
-    }
-    bool _257 = false;
-    if (_246)
-    {
-        float2x2 _249 = returns_half2x2_h22();
-        float2 _250 = _249[0];
-        float2 _253 = _249[1];
-        _257 = all(bool2(float2(2.0f, 0.0f).x == _250.x, float2(2.0f, 0.0f).y == _250.y)) && all(bool2(float2(0.0f, 2.0f).x == _253.x, float2(0.0f, 2.0f).y == _253.y));
-    }
-    else
-    {
-        _257 = false;
-    }
-    bool _272 = false;
-    if (_257)
-    {
-        float3x3 _260 = returns_half3x3_h33();
-        float3 _261 = _260[0];
-        float3 _264 = _260[1];
-        float3 _268 = _260[2];
-        _272 = (all(bool3(float3(3.0f, 0.0f, 0.0f).x == _261.x, float3(3.0f, 0.0f, 0.0f).y == _261.y, float3(3.0f, 0.0f, 0.0f).z == _261.z)) && all(bool3(float3(0.0f, 3.0f, 0.0f).x == _264.x, float3(0.0f, 3.0f, 0.0f).y == _264.y, float3(0.0f, 3.0f, 0.0f).z == _264.z))) && all(bool3(float3(0.0f, 0.0f, 3.0f).x == _268.x, float3(0.0f, 0.0f, 3.0f).y == _268.y, float3(0.0f, 0.0f, 3.0f).z == _268.z));
-    }
-    else
-    {
-        _272 = false;
-    }
-    bool _291 = false;
-    if (_272)
-    {
-        float4x4 _275 = returns_half4x4_h44();
-        float4 _276 = _275[0];
-        float4 _279 = _275[1];
-        float4 _283 = _275[2];
-        float4 _287 = _275[3];
-        _291 = ((all(bool4(float4(4.0f, 0.0f, 0.0f, 0.0f).x == _276.x, float4(4.0f, 0.0f, 0.0f, 0.0f).y == _276.y, float4(4.0f, 0.0f, 0.0f, 0.0f).z == _276.z, float4(4.0f, 0.0f, 0.0f, 0.0f).w == _276.w)) && all(bool4(float4(0.0f, 4.0f, 0.0f, 0.0f).x == _279.x, float4(0.0f, 4.0f, 0.0f, 0.0f).y == _279.y, float4(0.0f, 4.0f, 0.0f, 0.0f).z == _279.z, float4(0.0f, 4.0f, 0.0f, 0.0f).w == _279.w))) && all(bool4(float4(0.0f, 0.0f, 4.0f, 0.0f).x == _283.x, float4(0.0f, 0.0f, 4.0f, 0.0f).y == _283.y, float4(0.0f, 0.0f, 4.0f, 0.0f).z == _283.z, float4(0.0f, 0.0f, 4.0f, 0.0f).w == _283.w))) && all(bool4(float4(0.0f, 0.0f, 0.0f, 4.0f).x == _287.x, float4(0.0f, 0.0f, 0.0f, 4.0f).y == _287.y, float4(0.0f, 0.0f, 0.0f, 4.0f).z == _287.z, float4(0.0f, 0.0f, 0.0f, 4.0f).w == _287.w));
-    }
-    else
-    {
-        _291 = false;
-    }
-    bool _296 = false;
-    if (_291)
-    {
-        _296 = true == returns_bool_b();
-    }
-    else
-    {
-        _296 = false;
-    }
-    bool _302 = false;
-    if (_296)
-    {
-        bool2 _299 = returns_bool2_b2();
-        _302 = all(bool2(bool2(true, true).x == _299.x, bool2(true, true).y == _299.y));
-    }
-    else
-    {
-        _302 = false;
-    }
-    bool _308 = false;
-    if (_302)
-    {
-        bool3 _305 = returns_bool3_b3();
-        _308 = all(bool3(bool3(true, true, true).x == _305.x, bool3(true, true, true).y == _305.y, bool3(true, true, true).z == _305.z));
-    }
-    else
-    {
-        _308 = false;
-    }
-    bool _314 = false;
-    if (_308)
-    {
-        bool4 _311 = returns_bool4_b4();
-        _314 = all(bool4(bool4(true, true, true, true).x == _311.x, bool4(true, true, true, true).y == _311.y, bool4(true, true, true, true).z == _311.z, bool4(true, true, true, true).w == _311.w));
-    }
-    else
-    {
-        _314 = false;
-    }
-    bool _319 = false;
-    if (_314)
-    {
-        _319 = 1 == returns_int_i();
-    }
-    else
-    {
-        _319 = false;
-    }
-    bool _325 = false;
-    if (_319)
-    {
-        int2 _322 = returns_int2_i2();
-        _325 = all(bool2(int2(2, 2).x == _322.x, int2(2, 2).y == _322.y));
-    }
-    else
-    {
-        _325 = false;
-    }
-    bool _331 = false;
-    if (_325)
-    {
-        int3 _328 = returns_int3_i3();
-        _331 = all(bool3(int3(3, 3, 3).x == _328.x, int3(3, 3, 3).y == _328.y, int3(3, 3, 3).z == _328.z));
-    }
-    else
-    {
-        _331 = false;
-    }
-    bool _337 = false;
-    if (_331)
-    {
-        int4 _334 = returns_int4_i4();
-        _337 = all(bool4(int4(4, 4, 4, 4).x == _334.x, int4(4, 4, 4, 4).y == _334.y, int4(4, 4, 4, 4).z == _334.z, int4(4, 4, 4, 4).w == _334.w));
-    }
-    else
-    {
-        _337 = false;
-    }
-    float4 _338 = 0.0f.xxxx;
-    if (_337)
-    {
-        _338 = _31_colorGreen;
-    }
-    else
-    {
-        _338 = _31_colorRed;
-    }
-    return _338;
-}
-
-void frag_main()
-{
-    float2 _41 = 0.0f.xx;
-    sk_FragColor = main(_41);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Functions.hlsl b/tests/sksl/shared/Functions.hlsl
deleted file mode 100644
index 34d9caa..0000000
--- a/tests/sksl/shared/Functions.hlsl
+++ /dev/null
@@ -1,59 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_colorGreen : packoffset(c0);
-    float4 _12_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float foo_ff2(float2 _26)
-{
-    return _26.x * _26.y;
-}
-
-void bar_vf(inout float _35)
-{
-    float y[2] = { 0.0f, 0.0f };
-    y[0] = _35;
-    y[1] = _35 * 2.0f;
-    float2 _55 = float2(y[0], y[1]);
-    _35 = foo_ff2(_55);
-}
-
-float4 main(float2 _58)
-{
-    float x = 10.0f;
-    float _62 = 10.0f;
-    bar_vf(_62);
-    x = _62;
-    float4 _67 = 0.0f.xxxx;
-    if (_62 == 200.0f)
-    {
-        _67 = _12_colorGreen;
-    }
-    else
-    {
-        _67 = _12_colorRed;
-    }
-    return _67;
-}
-
-void frag_main()
-{
-    float2 _22 = 0.0f.xx;
-    sk_FragColor = main(_22);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/GaussianBlur.hlsl b/tests/sksl/shared/GaussianBlur.hlsl
deleted file mode 100644
index 3d70411..0000000
--- a/tests/sksl/shared/GaussianBlur.hlsl
+++ /dev/null
@@ -1,252 +0,0 @@
-cbuffer uniformBuffer : register(b0, space0)
-{
-    float4 _4_sk_RTAdjust : packoffset(c0);
-    float2 _4_uIncrement_Stage1_c0 : packoffset(c1);
-    float4 _4_uKernel_Stage1_c0[7] : packoffset(c2);
-    row_major float3x3 _4_umatrix_Stage1_c0_c0 : packoffset(c9);
-    float4 _4_uborder_Stage1_c0_c0_c0 : packoffset(c12);
-    float4 _4_usubset_Stage1_c0_c0_c0 : packoffset(c13);
-    float4 _4_unorm_Stage1_c0_c0_c0 : packoffset(c14);
-};
-
-Texture2D<float4> uTextureSampler_0_Stage1 : register(t0, space0);
-SamplerState _uTextureSampler_0_Stage1_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-static float2 vLocalCoord_Stage0;
-
-struct SPIRV_Cross_Input
-{
-    float2 vLocalCoord_Stage0 : TEXCOORD0;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 MatrixEffect_Stage1_c0_c0_h4h4f2(float4 _29, float2 _30)
-{
-    float2 _43 = mul(float3(_30, 1.0f), _4_umatrix_Stage1_c0_c0).xy;
-    float2 _RESERVED_IDENTIFIER_FIXUP_1_inCoord = _43;
-    float2 _49 = _43 * _4_unorm_Stage1_c0_c0_c0.xy;
-    _RESERVED_IDENTIFIER_FIXUP_1_inCoord = _49;
-    float2 _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord = 0.0f.xx;
-    _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord.x = _49.x;
-    _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord.y = _RESERVED_IDENTIFIER_FIXUP_1_inCoord.y;
-    float2 _RESERVED_IDENTIFIER_FIXUP_3_clampedCoord = _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord;
-    float4 _RESERVED_IDENTIFIER_FIXUP_4_textureColor = uTextureSampler_0_Stage1.Sample(_uTextureSampler_0_Stage1_sampler, _RESERVED_IDENTIFIER_FIXUP_2_subsetCoord * _4_unorm_Stage1_c0_c0_c0.zw);
-    float _75 = floor(_RESERVED_IDENTIFIER_FIXUP_1_inCoord.x + 0.001000000047497451305389404296875f) + 0.5f;
-    float _RESERVED_IDENTIFIER_FIXUP_5_snappedX = _75;
-    bool _88 = false;
-    if (_75 < _4_usubset_Stage1_c0_c0_c0.x)
-    {
-        _88 = true;
-    }
-    else
-    {
-        _88 = _75 > _4_usubset_Stage1_c0_c0_c0.z;
-    }
-    if (_88)
-    {
-        _RESERVED_IDENTIFIER_FIXUP_4_textureColor = _4_uborder_Stage1_c0_c0_c0;
-    }
-    return _RESERVED_IDENTIFIER_FIXUP_4_textureColor;
-}
-
-void frag_main()
-{
-    float4 outputColor_Stage0 = 1.0f.xxxx;
-    float4 outputCoverage_Stage0 = 1.0f.xxxx;
-    float4 _RESERVED_IDENTIFIER_FIXUP_6_output = 0.0f.xxxx;
-    float2 _112 = vLocalCoord_Stage0 - (_4_uIncrement_Stage1_c0 * 12.0f);
-    float2 _RESERVED_IDENTIFIER_FIXUP_7_coord = _112;
-    float2 _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = 0.0f.xx;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _112;
-    float4 _115 = 1.0f.xxxx;
-    float2 _116 = _112;
-    float4 _123 = 0.0f.xxxx + (MatrixEffect_Stage1_c0_c0_h4h4f2(_115, _116) * _4_uKernel_Stage1_c0[0].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _123;
-    float2 _126 = _112 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _126;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _126;
-    float4 _127 = 1.0f.xxxx;
-    float2 _128 = _126;
-    float4 _134 = _123 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_127, _128) * _4_uKernel_Stage1_c0[0].y);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _134;
-    float2 _137 = _126 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _137;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _137;
-    float4 _138 = 1.0f.xxxx;
-    float2 _139 = _137;
-    float4 _145 = _134 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_138, _139) * _4_uKernel_Stage1_c0[0].z);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _145;
-    float2 _148 = _137 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _148;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _148;
-    float4 _149 = 1.0f.xxxx;
-    float2 _150 = _148;
-    float4 _156 = _145 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_149, _150) * _4_uKernel_Stage1_c0[0].w);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _156;
-    float2 _159 = _148 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _159;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _159;
-    float4 _160 = 1.0f.xxxx;
-    float2 _161 = _159;
-    float4 _167 = _156 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_160, _161) * _4_uKernel_Stage1_c0[1].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _167;
-    float2 _170 = _159 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _170;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _170;
-    float4 _171 = 1.0f.xxxx;
-    float2 _172 = _170;
-    float4 _178 = _167 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_171, _172) * _4_uKernel_Stage1_c0[1].y);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _178;
-    float2 _181 = _170 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _181;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _181;
-    float4 _182 = 1.0f.xxxx;
-    float2 _183 = _181;
-    float4 _189 = _178 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_182, _183) * _4_uKernel_Stage1_c0[1].z);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _189;
-    float2 _192 = _181 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _192;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _192;
-    float4 _193 = 1.0f.xxxx;
-    float2 _194 = _192;
-    float4 _200 = _189 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_193, _194) * _4_uKernel_Stage1_c0[1].w);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _200;
-    float2 _203 = _192 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _203;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _203;
-    float4 _204 = 1.0f.xxxx;
-    float2 _205 = _203;
-    float4 _211 = _200 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_204, _205) * _4_uKernel_Stage1_c0[2].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _211;
-    float2 _214 = _203 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _214;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _214;
-    float4 _215 = 1.0f.xxxx;
-    float2 _216 = _214;
-    float4 _222 = _211 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_215, _216) * _4_uKernel_Stage1_c0[2].y);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _222;
-    float2 _225 = _214 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _225;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _225;
-    float4 _226 = 1.0f.xxxx;
-    float2 _227 = _225;
-    float4 _233 = _222 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_226, _227) * _4_uKernel_Stage1_c0[2].z);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _233;
-    float2 _236 = _225 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _236;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _236;
-    float4 _237 = 1.0f.xxxx;
-    float2 _238 = _236;
-    float4 _244 = _233 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_237, _238) * _4_uKernel_Stage1_c0[2].w);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _244;
-    float2 _247 = _236 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _247;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _247;
-    float4 _248 = 1.0f.xxxx;
-    float2 _249 = _247;
-    float4 _255 = _244 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_248, _249) * _4_uKernel_Stage1_c0[3].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _255;
-    float2 _258 = _247 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _258;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _258;
-    float4 _259 = 1.0f.xxxx;
-    float2 _260 = _258;
-    float4 _266 = _255 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_259, _260) * _4_uKernel_Stage1_c0[3].y);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _266;
-    float2 _269 = _258 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _269;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _269;
-    float4 _270 = 1.0f.xxxx;
-    float2 _271 = _269;
-    float4 _277 = _266 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_270, _271) * _4_uKernel_Stage1_c0[3].z);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _277;
-    float2 _280 = _269 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _280;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _280;
-    float4 _281 = 1.0f.xxxx;
-    float2 _282 = _280;
-    float4 _288 = _277 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_281, _282) * _4_uKernel_Stage1_c0[3].w);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _288;
-    float2 _291 = _280 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _291;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _291;
-    float4 _292 = 1.0f.xxxx;
-    float2 _293 = _291;
-    float4 _299 = _288 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_292, _293) * _4_uKernel_Stage1_c0[4].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _299;
-    float2 _302 = _291 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _302;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _302;
-    float4 _303 = 1.0f.xxxx;
-    float2 _304 = _302;
-    float4 _310 = _299 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_303, _304) * _4_uKernel_Stage1_c0[4].y);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _310;
-    float2 _313 = _302 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _313;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _313;
-    float4 _314 = 1.0f.xxxx;
-    float2 _315 = _313;
-    float4 _321 = _310 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_314, _315) * _4_uKernel_Stage1_c0[4].z);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _321;
-    float2 _324 = _313 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _324;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _324;
-    float4 _325 = 1.0f.xxxx;
-    float2 _326 = _324;
-    float4 _332 = _321 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_325, _326) * _4_uKernel_Stage1_c0[4].w);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _332;
-    float2 _335 = _324 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _335;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _335;
-    float4 _336 = 1.0f.xxxx;
-    float2 _337 = _335;
-    float4 _343 = _332 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_336, _337) * _4_uKernel_Stage1_c0[5].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _343;
-    float2 _346 = _335 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _346;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _346;
-    float4 _347 = 1.0f.xxxx;
-    float2 _348 = _346;
-    float4 _354 = _343 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_347, _348) * _4_uKernel_Stage1_c0[5].y);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _354;
-    float2 _357 = _346 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _357;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _357;
-    float4 _358 = 1.0f.xxxx;
-    float2 _359 = _357;
-    float4 _365 = _354 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_358, _359) * _4_uKernel_Stage1_c0[5].z);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _365;
-    float2 _368 = _357 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _368;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _368;
-    float4 _369 = 1.0f.xxxx;
-    float2 _370 = _368;
-    float4 _376 = _365 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_369, _370) * _4_uKernel_Stage1_c0[5].w);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _376;
-    float2 _379 = _368 + _4_uIncrement_Stage1_c0;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _379;
-    _RESERVED_IDENTIFIER_FIXUP_8_coordSampled = _379;
-    float4 _380 = 1.0f.xxxx;
-    float2 _381 = _379;
-    float4 _387 = _376 + (MatrixEffect_Stage1_c0_c0_h4h4f2(_380, _381) * _4_uKernel_Stage1_c0[6].x);
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _387;
-    _RESERVED_IDENTIFIER_FIXUP_7_coord = _379 + _4_uIncrement_Stage1_c0;
-    float4 _391 = _387 * 1.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_6_output = _391;
-    float4 output_Stage1 = _391;
-    sk_FragColor = _391 * 1.0f.xxxx;
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    vLocalCoord_Stage0 = stage_input.vLocalCoord_Stage0;
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/GeometricIntrinsics.hlsl b/tests/sksl/shared/GeometricIntrinsics.hlsl
deleted file mode 100644
index f9aee29..0000000
--- a/tests/sksl/shared/GeometricIntrinsics.hlsl
+++ /dev/null
@@ -1,47 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float _RESERVED_IDENTIFIER_FIXUP_0_x = 1.0f;
-    float _29 = length(1.0f);
-    _RESERVED_IDENTIFIER_FIXUP_0_x = _29;
-    float _30 = distance(_29, 2.0f);
-    _RESERVED_IDENTIFIER_FIXUP_0_x = _30;
-    float _32 = _30 * 2.0f;
-    _RESERVED_IDENTIFIER_FIXUP_0_x = _32;
-    _RESERVED_IDENTIFIER_FIXUP_0_x = sign(_32);
-    float2 _RESERVED_IDENTIFIER_FIXUP_1_x = float2(1.0f, 2.0f);
-    float2 _37 = length(float2(1.0f, 2.0f)).xx;
-    _RESERVED_IDENTIFIER_FIXUP_1_x = _37;
-    float2 _42 = distance(_37, float2(3.0f, 4.0f)).xx;
-    _RESERVED_IDENTIFIER_FIXUP_1_x = _42;
-    float2 _44 = dot(_42, float2(3.0f, 4.0f)).xx;
-    _RESERVED_IDENTIFIER_FIXUP_1_x = _44;
-    _RESERVED_IDENTIFIER_FIXUP_1_x = normalize(_44);
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/HelloWorld.hlsl b/tests/sksl/shared/HelloWorld.hlsl
deleted file mode 100644
index 77290f9..0000000
--- a/tests/sksl/shared/HelloWorld.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    return float4(0.0f, 1.0f, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Hex.hlsl b/tests/sksl/shared/Hex.hlsl
deleted file mode 100644
index 18ffcd2..0000000
--- a/tests/sksl/shared/Hex.hlsl
+++ /dev/null
@@ -1,41 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int i1 = 0;
-    i1 = 0 + 1;
-    int i2 = 4660;
-    i2 = 4660 + 1;
-    int i3 = 32766;
-    i3 = 32766 + 1;
-    int i4 = -32766;
-    i4 = (-32766) + 1;
-    int i5 = 19132;
-    i5 = 19132 + 1;
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/HexUnsigned.hlsl b/tests/sksl/shared/HexUnsigned.hlsl
deleted file mode 100644
index 18f7abe..0000000
--- a/tests/sksl/shared/HexUnsigned.hlsl
+++ /dev/null
@@ -1,41 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    uint u1 = 0u;
-    u1 = 0u + 1u;
-    uint u2 = 305441741u;
-    u2 = 305441741u + 1u;
-    uint u3 = 2147483646u;
-    u3 = 2147483646u + 1u;
-    uint u4 = 4294967294u;
-    u4 = 4294967294u + 1u;
-    uint u5 = 65534u;
-    u5 = 65534u + 1u;
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/InoutParameters.hlsl b/tests/sksl/shared/InoutParameters.hlsl
deleted file mode 100644
index 832b97a..0000000
--- a/tests/sksl/shared/InoutParameters.hlsl
+++ /dev/null
@@ -1,67 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _14_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void outParameterWrite_vh4(out float4 _29)
-{
-    _29 = _14_colorGreen;
-}
-
-void outParameterWriteIndirect_vh4(out float4 _36)
-{
-    float4 _38 = 0.0f.xxxx;
-    outParameterWrite_vh4(_38);
-    _36 = _38;
-}
-
-void inoutParameterWrite_vh4(inout float4 _41)
-{
-    _41 *= _41;
-}
-
-void inoutParameterWriteIndirect_vh4(inout float4 _46)
-{
-    float4 _49 = _46;
-    inoutParameterWrite_vh4(_49);
-    _46 = _49;
-}
-
-float4 main(float2 _53)
-{
-    float4 _56 = 0.0f.xxxx;
-    outParameterWrite_vh4(_56);
-    float4 c = _56;
-    float4 _59 = 0.0f.xxxx;
-    outParameterWriteIndirect_vh4(_59);
-    c = _59;
-    float4 _62 = _59;
-    inoutParameterWrite_vh4(_62);
-    c = _62;
-    float4 _65 = _62;
-    inoutParameterWriteIndirect_vh4(_65);
-    c = _65;
-    return _65;
-}
-
-void frag_main()
-{
-    float2 _24 = 0.0f.xx;
-    sk_FragColor = main(_24);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/InoutParamsAreDistinct.hlsl b/tests/sksl/shared/InoutParamsAreDistinct.hlsl
deleted file mode 100644
index 69b16bf..0000000
--- a/tests/sksl/shared/InoutParamsAreDistinct.hlsl
+++ /dev/null
@@ -1,63 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool inout_params_are_distinct_bhh(out float _26, out float _27)
-{
-    _26 = 1.0f;
-    _27 = 2.0f;
-    bool _35 = false;
-    if (true)
-    {
-        _35 = true;
-    }
-    else
-    {
-        _35 = false;
-    }
-    return _35;
-}
-
-float4 main(float2 _37)
-{
-    float x = 0.0f;
-    float _40 = 0.0f;
-    float _41 = 0.0f;
-    bool _42 = inout_params_are_distinct_bhh(_40, _41);
-    x = _40;
-    x = _41;
-    float4 _45 = 0.0f.xxxx;
-    if (_42)
-    {
-        _45 = _11_colorGreen;
-    }
-    else
-    {
-        _45 = _11_colorRed;
-    }
-    return _45;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/InstanceID.hlsl b/tests/sksl/shared/InstanceID.hlsl
deleted file mode 100644
index e95d9be..0000000
--- a/tests/sksl/shared/InstanceID.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-static int gl_InstanceIndex;
-static int id;
-
-struct SPIRV_Cross_Input
-{
-    uint gl_InstanceIndex : SV_InstanceID;
-};
-
-struct SPIRV_Cross_Output
-{
-    int id : TEXCOORD1;
-};
-
-void vert_main()
-{
-    id = gl_InstanceIndex;
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_InstanceIndex = int(stage_input.gl_InstanceIndex);
-    vert_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.id = id;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/IntegerDivisionES3.hlsl b/tests/sksl/shared/IntegerDivisionES3.hlsl
deleted file mode 100644
index 7098d35..0000000
--- a/tests/sksl/shared/IntegerDivisionES3.hlsl
+++ /dev/null
@@ -1,51 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int _34 = int(_10_colorGreen.x);
-    int zero = _34;
-    int one = int(_10_colorGreen.y);
-    for (int x = _34; x < 100; x++)
-    {
-        for (int y = one; y < 100; y++)
-        {
-            int _RESERVED_IDENTIFIER_FIXUP_0_x = x;
-            int _RESERVED_IDENTIFIER_FIXUP_1_result = 0;
-            while (_RESERVED_IDENTIFIER_FIXUP_0_x >= y)
-            {
-                _RESERVED_IDENTIFIER_FIXUP_1_result++;
-                _RESERVED_IDENTIFIER_FIXUP_0_x -= y;
-            }
-            if ((x / y) != _RESERVED_IDENTIFIER_FIXUP_1_result)
-            {
-                return float4(1.0f, float(x) * 0.0039215688593685626983642578125f, float(y) * 0.0039215688593685626983642578125f, 1.0f);
-            }
-        }
-    }
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/InterfaceBlockBuffer.hlsl b/tests/sksl/shared/InterfaceBlockBuffer.hlsl
deleted file mode 100644
index e77feb6..0000000
--- a/tests/sksl/shared/InterfaceBlockBuffer.hlsl
+++ /dev/null
@@ -1,48 +0,0 @@
-### Compilation failed:
-
-error: SPIR-V validation error: [VUID-StandaloneSpirv-DescriptorSet-06491] Binding decoration on target <id> '3[%3]' must be in the StorageBuffer, Uniform, or UniformConstant storage class
-  OpDecorate %3 Binding 456
-
-OpCapability Shader
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main" %sk_Clockwise %sk_FragColor
-OpExecutionMode %main OriginUpperLeft
-OpName %testBlock "testBlock"
-OpMemberName %testBlock 0 "x"
-OpName %sk_Clockwise "sk_Clockwise"
-OpName %sk_FragColor "sk_FragColor"
-OpName %main "main"
-OpMemberDecorate %testBlock 0 Offset 0
-OpDecorate %testBlock Block
-OpDecorate %3 Binding 456
-OpDecorate %sk_Clockwise BuiltIn FrontFacing
-OpDecorate %sk_FragColor RelaxedPrecision
-OpDecorate %sk_FragColor Location 0
-OpDecorate %sk_FragColor Index 0
-OpDecorate %21 RelaxedPrecision
-%float = OpTypeFloat 32
-%testBlock = OpTypeStruct %float
-%_ptr_Function_testBlock = OpTypePointer Function %testBlock
-%3 = OpVariable %_ptr_Function_testBlock Function
-%bool = OpTypeBool
-%_ptr_Input_bool = OpTypePointer Input %bool
-%sk_Clockwise = OpVariable %_ptr_Input_bool Input
-%v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%sk_FragColor = OpVariable %_ptr_Output_v4float Output
-%void = OpTypeVoid
-%14 = OpTypeFunction %void
-%int = OpTypeInt 32 1
-%int_0 = OpConstant %int 0
-%_ptr_Private_float = OpTypePointer Private %float
-%main = OpFunction %void None %14
-%15 = OpLabel
-%18 = OpAccessChain %_ptr_Private_float %3 %int_0
-%20 = OpLoad %float %18
-%21 = OpCompositeConstruct %v4float %20 %20 %20 %20
-OpStore %sk_FragColor %21
-OpReturn
-OpFunctionEnd
-
-1 error
diff --git a/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl b/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl
deleted file mode 100644
index 86f4fa9..0000000
--- a/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl
+++ /dev/null
@@ -1,30 +0,0 @@
-cbuffer testBlockA : register(b1, space0)
-{
-    float2 _3_x : packoffset(c0);
-};
-
-cbuffer testBlockB : register(b2, space0)
-{
-    float2 _8_y : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float4(_3_x, _8_y);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/InterfaceBlockNamed.hlsl b/tests/sksl/shared/InterfaceBlockNamed.hlsl
deleted file mode 100644
index ea3b2a5..0000000
--- a/tests/sksl/shared/InterfaceBlockNamed.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-cbuffer testBlock : register(b456, space0)
-{
-    float _3_x : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = _3_x.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/InterfaceBlockNamedArray.hlsl b/tests/sksl/shared/InterfaceBlockNamedArray.hlsl
deleted file mode 100644
index 0f5372d..0000000
--- a/tests/sksl/shared/InterfaceBlockNamedArray.hlsl
+++ /dev/null
@@ -1,53 +0,0 @@
-### Compilation failed:
-
-error: SPIR-V validation error: Block decoration on target <id> '8[%_arr_testBlock_int_2]' must be a structure type
-  OpDecorate %_arr_testBlock_int_2 Block
-
-OpCapability Shader
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main" %sk_Clockwise %sk_FragColor
-OpExecutionMode %main OriginUpperLeft
-OpName %testBlock "testBlock"
-OpMemberName %testBlock 0 "x"
-OpName %sk_Clockwise "sk_Clockwise"
-OpName %sk_FragColor "sk_FragColor"
-OpName %main "main"
-OpMemberDecorate %testBlock 0 Offset 0
-OpDecorate %_arr_testBlock_int_2 ArrayStride 16
-OpDecorate %_arr_testBlock_int_2 Block
-OpDecorate %3 Binding 123
-OpDecorate %3 DescriptorSet 0
-OpDecorate %sk_Clockwise BuiltIn FrontFacing
-OpDecorate %sk_FragColor RelaxedPrecision
-OpDecorate %sk_FragColor Location 0
-OpDecorate %sk_FragColor Index 0
-OpDecorate %24 RelaxedPrecision
-%float = OpTypeFloat 32
-%testBlock = OpTypeStruct %float
-%int = OpTypeInt 32 1
-%int_2 = OpConstant %int 2
-%_arr_testBlock_int_2 = OpTypeArray %testBlock %int_2
-%_ptr_Uniform__arr_testBlock_int_2 = OpTypePointer Uniform %_arr_testBlock_int_2
-%3 = OpVariable %_ptr_Uniform__arr_testBlock_int_2 Uniform
-%bool = OpTypeBool
-%_ptr_Input_bool = OpTypePointer Input %bool
-%sk_Clockwise = OpVariable %_ptr_Input_bool Input
-%v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%sk_FragColor = OpVariable %_ptr_Output_v4float Output
-%void = OpTypeVoid
-%17 = OpTypeFunction %void
-%int_1 = OpConstant %int 1
-%int_0 = OpConstant %int 0
-%_ptr_Uniform_float = OpTypePointer Uniform %float
-%main = OpFunction %void None %17
-%18 = OpLabel
-%21 = OpAccessChain %_ptr_Uniform_float %3 %int_1 %int_0
-%23 = OpLoad %float %21
-%24 = OpCompositeConstruct %v4float %23 %23 %23 %23
-OpStore %sk_FragColor %24
-OpReturn
-OpFunctionEnd
-
-1 error
diff --git a/tests/sksl/shared/Matrices.hlsl b/tests/sksl/shared/Matrices.hlsl
deleted file mode 100644
index 91d46a7..0000000
--- a/tests/sksl/shared/Matrices.hlsl
+++ /dev/null
@@ -1,277 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_colorGreen : packoffset(c0);
-    float4 _12_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_half_b()
-{
-    bool ok = true;
-    float2x2 m1 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-    bool _49 = false;
-    if (true)
-    {
-        _49 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
-    }
-    else
-    {
-        _49 = false;
-    }
-    ok = _49;
-    float2x2 m3 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-    bool _58 = false;
-    if (_49)
-    {
-        _58 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
-    }
-    else
-    {
-        _58 = false;
-    }
-    ok = _58;
-    float2x2 m4 = float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f));
-    bool _71 = false;
-    if (_58)
-    {
-        _71 = all(bool2(float2(6.0f, 0.0f).x == float2(6.0f, 0.0f).x, float2(6.0f, 0.0f).y == float2(6.0f, 0.0f).y)) && all(bool2(float2(0.0f, 6.0f).x == float2(0.0f, 6.0f).x, float2(0.0f, 6.0f).y == float2(0.0f, 6.0f).y));
-    }
-    else
-    {
-        _71 = false;
-    }
-    ok = _71;
-    float2x2 _72 = mul(float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f)), float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)));
-    m3 = _72;
-    bool _88 = false;
-    if (_71)
-    {
-        float2 _81 = _72[0];
-        float2 _84 = _72[1];
-        _88 = all(bool2(_81.x == float2(6.0f, 12.0f).x, _81.y == float2(6.0f, 12.0f).y)) && all(bool2(_84.x == float2(18.0f, 24.0f).x, _84.y == float2(18.0f, 24.0f).y));
-    }
-    else
-    {
-        _88 = false;
-    }
-    ok = _88;
-    float2 _93 = m1[1];
-    float2 _95 = float2(_93.y, 0.0f);
-    float2 _96 = float2(0.0f, _93.y);
-    float2x2 m5 = float2x2(_95, _96);
-    bool _108 = false;
-    if (_88)
-    {
-        _108 = all(bool2(_95.x == float2(4.0f, 0.0f).x, _95.y == float2(4.0f, 0.0f).y)) && all(bool2(_96.x == float2(0.0f, 4.0f).x, _96.y == float2(0.0f, 4.0f).y));
-    }
-    else
-    {
-        _108 = false;
-    }
-    ok = _108;
-    float2 _109 = float2(1.0f, 2.0f) + _95;
-    float2 _110 = float2(3.0f, 4.0f) + _96;
-    m1 = float2x2(_109, _110);
-    bool _124 = false;
-    if (_108)
-    {
-        _124 = all(bool2(_109.x == float2(5.0f, 2.0f).x, _109.y == float2(5.0f, 2.0f).y)) && all(bool2(_110.x == float2(3.0f, 8.0f).x, _110.y == float2(3.0f, 8.0f).y));
-    }
-    else
-    {
-        _124 = false;
-    }
-    ok = _124;
-    float2x2 m7 = float2x2(float2(5.0f, 6.0f), float2(7.0f, 8.0f));
-    bool _137 = false;
-    if (_124)
-    {
-        _137 = all(bool2(float2(5.0f, 6.0f).x == float2(5.0f, 6.0f).x, float2(5.0f, 6.0f).y == float2(5.0f, 6.0f).y)) && all(bool2(float2(7.0f, 8.0f).x == float2(7.0f, 8.0f).x, float2(7.0f, 8.0f).y == float2(7.0f, 8.0f).y));
-    }
-    else
-    {
-        _137 = false;
-    }
-    ok = _137;
-    float3x3 m9 = float3x3(float3(9.0f, 0.0f, 0.0f), float3(0.0f, 9.0f, 0.0f), float3(0.0f, 0.0f, 9.0f));
-    bool _158 = false;
-    if (_137)
-    {
-        _158 = (all(bool3(float3(9.0f, 0.0f, 0.0f).x == float3(9.0f, 0.0f, 0.0f).x, float3(9.0f, 0.0f, 0.0f).y == float3(9.0f, 0.0f, 0.0f).y, float3(9.0f, 0.0f, 0.0f).z == float3(9.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 9.0f, 0.0f).x == float3(0.0f, 9.0f, 0.0f).x, float3(0.0f, 9.0f, 0.0f).y == float3(0.0f, 9.0f, 0.0f).y, float3(0.0f, 9.0f, 0.0f).z == float3(0.0f, 9.0f, 0.0f).z))) && all(bool3(float3(0.0f, 0.0f, 9.0f).x == float3(0.0f, 0.0f, 9.0f).x, float3(0.0f, 0.0f, 9.0f).y == float3(0.0f, 0.0f, 9.0f).y, float3(0.0f, 0.0f, 9.0f).z == float3(0.0f, 0.0f, 9.0f).z));
-    }
-    else
-    {
-        _158 = false;
-    }
-    ok = _158;
-    float4x4 m10 = float4x4(float4(11.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 11.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 11.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 11.0f));
-    bool _182 = false;
-    if (_158)
-    {
-        _182 = ((all(bool4(float4(11.0f, 0.0f, 0.0f, 0.0f).x == float4(11.0f, 0.0f, 0.0f, 0.0f).x, float4(11.0f, 0.0f, 0.0f, 0.0f).y == float4(11.0f, 0.0f, 0.0f, 0.0f).y, float4(11.0f, 0.0f, 0.0f, 0.0f).z == float4(11.0f, 0.0f, 0.0f, 0.0f).z, float4(11.0f, 0.0f, 0.0f, 0.0f).w == float4(11.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 11.0f, 0.0f, 0.0f).x == float4(0.0f, 11.0f, 0.0f, 0.0f).x, float4(0.0f, 11.0f, 0.0f, 0.0f).y == float4(0.0f, 11.0f, 0.0f, 0.0f).y, float4(0.0f, 11.0f, 0.0f, 0.0f).z == float4(0.0f, 11.0f, 0.0f, 0.0f).z, float4(0.0f, 11.0f, 0.0f, 0.0f).w == float4(0.0f, 11.0f, 0.0f, 0.0f).w))) && all(bool4(float4(0.0f, 0.0f, 11.0f, 0.0f).x == float4(0.0f, 0.0f, 11.0f, 0.0f).x, float4(0.0f, 0.0f, 11.0f, 0.0f).y == float4(0.0f, 0.0f, 11.0f, 0.0f).y, float4(0.0f, 0.0f, 11.0f, 0.0f).z == float4(0.0f, 0.0f, 11.0f, 0.0f).z, float4(0.0f, 0.0f, 11.0f, 0.0f).w == float4(0.0f, 0.0f, 11.0f, 0.0f).w))) && all(bool4(float4(0.0f, 0.0f, 0.0f, 11.0f).x == float4(0.0f, 0.0f, 0.0f, 11.0f).x, float4(0.0f, 0.0f, 0.0f, 11.0f).y == float4(0.0f, 0.0f, 0.0f, 11.0f).y, float4(0.0f, 0.0f, 0.0f, 11.0f).z == float4(0.0f, 0.0f, 0.0f, 11.0f).z, float4(0.0f, 0.0f, 0.0f, 11.0f).w == float4(0.0f, 0.0f, 0.0f, 11.0f).w));
-    }
-    else
-    {
-        _182 = false;
-    }
-    ok = _182;
-    float4x4 m11 = float4x4(20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx);
-    float4 _187 = 20.0f.xxxx - float4(11.0f, 0.0f, 0.0f, 0.0f);
-    float4 _188 = 20.0f.xxxx - float4(0.0f, 11.0f, 0.0f, 0.0f);
-    float4 _189 = 20.0f.xxxx - float4(0.0f, 0.0f, 11.0f, 0.0f);
-    float4 _190 = 20.0f.xxxx - float4(0.0f, 0.0f, 0.0f, 11.0f);
-    m11 = float4x4(_187, _188, _189, _190);
-    bool _210 = false;
-    if (_182)
-    {
-        _210 = ((all(bool4(_187.x == float4(9.0f, 20.0f, 20.0f, 20.0f).x, _187.y == float4(9.0f, 20.0f, 20.0f, 20.0f).y, _187.z == float4(9.0f, 20.0f, 20.0f, 20.0f).z, _187.w == float4(9.0f, 20.0f, 20.0f, 20.0f).w)) && all(bool4(_188.x == float4(20.0f, 9.0f, 20.0f, 20.0f).x, _188.y == float4(20.0f, 9.0f, 20.0f, 20.0f).y, _188.z == float4(20.0f, 9.0f, 20.0f, 20.0f).z, _188.w == float4(20.0f, 9.0f, 20.0f, 20.0f).w))) && all(bool4(_189.x == float4(20.0f, 20.0f, 9.0f, 20.0f).x, _189.y == float4(20.0f, 20.0f, 9.0f, 20.0f).y, _189.z == float4(20.0f, 20.0f, 9.0f, 20.0f).z, _189.w == float4(20.0f, 20.0f, 9.0f, 20.0f).w))) && all(bool4(_190.x == float4(20.0f, 20.0f, 20.0f, 9.0f).x, _190.y == float4(20.0f, 20.0f, 20.0f, 9.0f).y, _190.z == float4(20.0f, 20.0f, 20.0f, 9.0f).z, _190.w == float4(20.0f, 20.0f, 20.0f, 9.0f).w));
-    }
-    else
-    {
-        _210 = false;
-    }
-    ok = _210;
-    return _210;
-}
-
-bool test_comma_b()
-{
-    float2x2 x = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-    float2x2 y = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-    return all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
-}
-
-float4 main(float2 _220)
-{
-    bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_1_m1 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-    bool _231 = false;
-    if (true)
-    {
-        _231 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
-    }
-    else
-    {
-        _231 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _231;
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_2_m3 = float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f));
-    bool _240 = false;
-    if (_231)
-    {
-        _240 = all(bool2(float2(1.0f, 2.0f).x == float2(1.0f, 2.0f).x, float2(1.0f, 2.0f).y == float2(1.0f, 2.0f).y)) && all(bool2(float2(3.0f, 4.0f).x == float2(3.0f, 4.0f).x, float2(3.0f, 4.0f).y == float2(3.0f, 4.0f).y));
-    }
-    else
-    {
-        _240 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _240;
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_3_m4 = float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f));
-    float2x2 _242 = mul(float2x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f)), float2x2(float2(1.0f, 2.0f), float2(3.0f, 4.0f)));
-    _RESERVED_IDENTIFIER_FIXUP_2_m3 = _242;
-    bool _252 = false;
-    if (_240)
-    {
-        float2 _245 = _242[0];
-        float2 _248 = _242[1];
-        _252 = all(bool2(_245.x == float2(6.0f, 12.0f).x, _245.y == float2(6.0f, 12.0f).y)) && all(bool2(_248.x == float2(18.0f, 24.0f).x, _248.y == float2(18.0f, 24.0f).y));
-    }
-    else
-    {
-        _252 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _252;
-    float2 _255 = _RESERVED_IDENTIFIER_FIXUP_1_m1[1];
-    float2 _257 = float2(_255.y, 0.0f);
-    float2 _258 = float2(0.0f, _255.y);
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_4_m5 = float2x2(_257, _258);
-    bool _267 = false;
-    if (_252)
-    {
-        _267 = all(bool2(_257.x == float2(4.0f, 0.0f).x, _257.y == float2(4.0f, 0.0f).y)) && all(bool2(_258.x == float2(0.0f, 4.0f).x, _258.y == float2(0.0f, 4.0f).y));
-    }
-    else
-    {
-        _267 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _267;
-    float2 _268 = float2(1.0f, 2.0f) + _257;
-    float2 _269 = float2(3.0f, 4.0f) + _258;
-    _RESERVED_IDENTIFIER_FIXUP_1_m1 = float2x2(_268, _269);
-    bool _278 = false;
-    if (_267)
-    {
-        _278 = all(bool2(_268.x == float2(5.0f, 2.0f).x, _268.y == float2(5.0f, 2.0f).y)) && all(bool2(_269.x == float2(3.0f, 8.0f).x, _269.y == float2(3.0f, 8.0f).y));
-    }
-    else
-    {
-        _278 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _278;
-    float4x4 _RESERVED_IDENTIFIER_FIXUP_7_m10 = float4x4(float4(11.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 11.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 11.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 11.0f));
-    float4x4 _RESERVED_IDENTIFIER_FIXUP_8_m11 = float4x4(20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx, 20.0f.xxxx);
-    float4 _281 = 20.0f.xxxx - float4(11.0f, 0.0f, 0.0f, 0.0f);
-    float4 _282 = 20.0f.xxxx - float4(0.0f, 11.0f, 0.0f, 0.0f);
-    float4 _283 = 20.0f.xxxx - float4(0.0f, 0.0f, 11.0f, 0.0f);
-    float4 _284 = 20.0f.xxxx - float4(0.0f, 0.0f, 0.0f, 11.0f);
-    _RESERVED_IDENTIFIER_FIXUP_8_m11 = float4x4(_281, _282, _283, _284);
-    bool _299 = false;
-    if (_278)
-    {
-        _299 = ((all(bool4(_281.x == float4(9.0f, 20.0f, 20.0f, 20.0f).x, _281.y == float4(9.0f, 20.0f, 20.0f, 20.0f).y, _281.z == float4(9.0f, 20.0f, 20.0f, 20.0f).z, _281.w == float4(9.0f, 20.0f, 20.0f, 20.0f).w)) && all(bool4(_282.x == float4(20.0f, 9.0f, 20.0f, 20.0f).x, _282.y == float4(20.0f, 9.0f, 20.0f, 20.0f).y, _282.z == float4(20.0f, 9.0f, 20.0f, 20.0f).z, _282.w == float4(20.0f, 9.0f, 20.0f, 20.0f).w))) && all(bool4(_283.x == float4(20.0f, 20.0f, 9.0f, 20.0f).x, _283.y == float4(20.0f, 20.0f, 9.0f, 20.0f).y, _283.z == float4(20.0f, 20.0f, 9.0f, 20.0f).z, _283.w == float4(20.0f, 20.0f, 9.0f, 20.0f).w))) && all(bool4(_284.x == float4(20.0f, 20.0f, 20.0f, 9.0f).x, _284.y == float4(20.0f, 20.0f, 20.0f, 9.0f).y, _284.z == float4(20.0f, 20.0f, 20.0f, 9.0f).z, _284.w == float4(20.0f, 20.0f, 20.0f, 9.0f).w));
-    }
-    else
-    {
-        _299 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _299;
-    bool _303 = false;
-    if (_299)
-    {
-        _303 = test_half_b();
-    }
-    else
-    {
-        _303 = false;
-    }
-    bool _307 = false;
-    if (_303)
-    {
-        _307 = test_comma_b();
-    }
-    else
-    {
-        _307 = false;
-    }
-    float4 _308 = 0.0f.xxxx;
-    if (_307)
-    {
-        _308 = _12_colorGreen;
-    }
-    else
-    {
-        _308 = _12_colorRed;
-    }
-    return _308;
-}
-
-void frag_main()
-{
-    float2 _22 = 0.0f.xx;
-    sk_FragColor = main(_22);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatricesNonsquare.hlsl b/tests/sksl/shared/MatricesNonsquare.hlsl
deleted file mode 100644
index dad6e4e..0000000
--- a/tests/sksl/shared/MatricesNonsquare.hlsl
+++ /dev/null
@@ -1,279 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_half_b()
-{
-    bool ok = true;
-    float2x3 m23 = float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f));
-    bool _46 = false;
-    if (true)
-    {
-        _46 = all(bool3(float3(2.0f, 0.0f, 0.0f).x == float3(2.0f, 0.0f, 0.0f).x, float3(2.0f, 0.0f, 0.0f).y == float3(2.0f, 0.0f, 0.0f).y, float3(2.0f, 0.0f, 0.0f).z == float3(2.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 2.0f, 0.0f).x == float3(0.0f, 2.0f, 0.0f).x, float3(0.0f, 2.0f, 0.0f).y == float3(0.0f, 2.0f, 0.0f).y, float3(0.0f, 2.0f, 0.0f).z == float3(0.0f, 2.0f, 0.0f).z));
-    }
-    else
-    {
-        _46 = false;
-    }
-    ok = _46;
-    float2x4 m24 = float2x4(float4(3.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 3.0f, 0.0f, 0.0f));
-    bool _62 = false;
-    if (_46)
-    {
-        _62 = all(bool4(float4(3.0f, 0.0f, 0.0f, 0.0f).x == float4(3.0f, 0.0f, 0.0f, 0.0f).x, float4(3.0f, 0.0f, 0.0f, 0.0f).y == float4(3.0f, 0.0f, 0.0f, 0.0f).y, float4(3.0f, 0.0f, 0.0f, 0.0f).z == float4(3.0f, 0.0f, 0.0f, 0.0f).z, float4(3.0f, 0.0f, 0.0f, 0.0f).w == float4(3.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 3.0f, 0.0f, 0.0f).x == float4(0.0f, 3.0f, 0.0f, 0.0f).x, float4(0.0f, 3.0f, 0.0f, 0.0f).y == float4(0.0f, 3.0f, 0.0f, 0.0f).y, float4(0.0f, 3.0f, 0.0f, 0.0f).z == float4(0.0f, 3.0f, 0.0f, 0.0f).z, float4(0.0f, 3.0f, 0.0f, 0.0f).w == float4(0.0f, 3.0f, 0.0f, 0.0f).w));
-    }
-    else
-    {
-        _62 = false;
-    }
-    ok = _62;
-    float3x2 m32 = float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx);
-    bool _81 = false;
-    if (_62)
-    {
-        _81 = (all(bool2(float2(4.0f, 0.0f).x == float2(4.0f, 0.0f).x, float2(4.0f, 0.0f).y == float2(4.0f, 0.0f).y)) && all(bool2(float2(0.0f, 4.0f).x == float2(0.0f, 4.0f).x, float2(0.0f, 4.0f).y == float2(0.0f, 4.0f).y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _81 = false;
-    }
-    ok = _81;
-    float3x4 m34 = float3x4(float4(5.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 5.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 5.0f, 0.0f));
-    bool _100 = false;
-    if (_81)
-    {
-        _100 = (all(bool4(float4(5.0f, 0.0f, 0.0f, 0.0f).x == float4(5.0f, 0.0f, 0.0f, 0.0f).x, float4(5.0f, 0.0f, 0.0f, 0.0f).y == float4(5.0f, 0.0f, 0.0f, 0.0f).y, float4(5.0f, 0.0f, 0.0f, 0.0f).z == float4(5.0f, 0.0f, 0.0f, 0.0f).z, float4(5.0f, 0.0f, 0.0f, 0.0f).w == float4(5.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 5.0f, 0.0f, 0.0f).x == float4(0.0f, 5.0f, 0.0f, 0.0f).x, float4(0.0f, 5.0f, 0.0f, 0.0f).y == float4(0.0f, 5.0f, 0.0f, 0.0f).y, float4(0.0f, 5.0f, 0.0f, 0.0f).z == float4(0.0f, 5.0f, 0.0f, 0.0f).z, float4(0.0f, 5.0f, 0.0f, 0.0f).w == float4(0.0f, 5.0f, 0.0f, 0.0f).w))) && all(bool4(float4(0.0f, 0.0f, 5.0f, 0.0f).x == float4(0.0f, 0.0f, 5.0f, 0.0f).x, float4(0.0f, 0.0f, 5.0f, 0.0f).y == float4(0.0f, 0.0f, 5.0f, 0.0f).y, float4(0.0f, 0.0f, 5.0f, 0.0f).z == float4(0.0f, 0.0f, 5.0f, 0.0f).z, float4(0.0f, 0.0f, 5.0f, 0.0f).w == float4(0.0f, 0.0f, 5.0f, 0.0f).w));
-    }
-    else
-    {
-        _100 = false;
-    }
-    ok = _100;
-    float4x2 m42 = float4x2(float2(6.0f, 0.0f), float2(0.0f, 6.0f), 0.0f.xx, 0.0f.xx);
-    bool _121 = false;
-    if (_100)
-    {
-        _121 = ((all(bool2(float2(6.0f, 0.0f).x == float2(6.0f, 0.0f).x, float2(6.0f, 0.0f).y == float2(6.0f, 0.0f).y)) && all(bool2(float2(0.0f, 6.0f).x == float2(0.0f, 6.0f).x, float2(0.0f, 6.0f).y == float2(0.0f, 6.0f).y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _121 = false;
-    }
-    ok = _121;
-    float4x3 m43 = float4x3(float3(7.0f, 0.0f, 0.0f), float3(0.0f, 7.0f, 0.0f), float3(0.0f, 0.0f, 7.0f), 0.0f.xxx);
-    bool _144 = false;
-    if (_121)
-    {
-        _144 = ((all(bool3(float3(7.0f, 0.0f, 0.0f).x == float3(7.0f, 0.0f, 0.0f).x, float3(7.0f, 0.0f, 0.0f).y == float3(7.0f, 0.0f, 0.0f).y, float3(7.0f, 0.0f, 0.0f).z == float3(7.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 7.0f, 0.0f).x == float3(0.0f, 7.0f, 0.0f).x, float3(0.0f, 7.0f, 0.0f).y == float3(0.0f, 7.0f, 0.0f).y, float3(0.0f, 7.0f, 0.0f).z == float3(0.0f, 7.0f, 0.0f).z))) && all(bool3(float3(0.0f, 0.0f, 7.0f).x == float3(0.0f, 0.0f, 7.0f).x, float3(0.0f, 0.0f, 7.0f).y == float3(0.0f, 0.0f, 7.0f).y, float3(0.0f, 0.0f, 7.0f).z == float3(0.0f, 0.0f, 7.0f).z))) && all(bool3(0.0f.xxx.x == 0.0f.xxx.x, 0.0f.xxx.y == 0.0f.xxx.y, 0.0f.xxx.z == 0.0f.xxx.z));
-    }
-    else
-    {
-        _144 = false;
-    }
-    ok = _144;
-    float2x2 _148 = mul(float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f)), float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx));
-    float2x2 m22 = _148;
-    bool _162 = false;
-    if (_144)
-    {
-        float2 _155 = _148[0];
-        float2 _158 = _148[1];
-        _162 = all(bool2(_155.x == float2(8.0f, 0.0f).x, _155.y == float2(8.0f, 0.0f).y)) && all(bool2(_158.x == float2(0.0f, 8.0f).x, _158.y == float2(0.0f, 8.0f).y));
-    }
-    else
-    {
-        _162 = false;
-    }
-    ok = _162;
-    float3x3 _166 = mul(float3x4(float4(5.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 5.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 5.0f, 0.0f)), float4x3(float3(7.0f, 0.0f, 0.0f), float3(0.0f, 7.0f, 0.0f), float3(0.0f, 0.0f, 7.0f), 0.0f.xxx));
-    float3x3 m33 = _166;
-    bool _185 = false;
-    if (_162)
-    {
-        float3 _174 = _166[0];
-        float3 _177 = _166[1];
-        float3 _181 = _166[2];
-        _185 = (all(bool3(_174.x == float3(35.0f, 0.0f, 0.0f).x, _174.y == float3(35.0f, 0.0f, 0.0f).y, _174.z == float3(35.0f, 0.0f, 0.0f).z)) && all(bool3(_177.x == float3(0.0f, 35.0f, 0.0f).x, _177.y == float3(0.0f, 35.0f, 0.0f).y, _177.z == float3(0.0f, 35.0f, 0.0f).z))) && all(bool3(_181.x == float3(0.0f, 0.0f, 35.0f).x, _181.y == float3(0.0f, 0.0f, 35.0f).y, _181.z == float3(0.0f, 0.0f, 35.0f).z));
-    }
-    else
-    {
-        _185 = false;
-    }
-    ok = _185;
-    float3 _189 = float3(2.0f, 0.0f, 0.0f) + 1.0f.xxx;
-    float3 _190 = float3(0.0f, 2.0f, 0.0f) + 1.0f.xxx;
-    m23 = float2x3(_189, _190);
-    bool _202 = false;
-    if (_185)
-    {
-        _202 = all(bool3(_189.x == float3(3.0f, 1.0f, 1.0f).x, _189.y == float3(3.0f, 1.0f, 1.0f).y, _189.z == float3(3.0f, 1.0f, 1.0f).z)) && all(bool3(_190.x == float3(1.0f, 3.0f, 1.0f).x, _190.y == float3(1.0f, 3.0f, 1.0f).y, _190.z == float3(1.0f, 3.0f, 1.0f).z));
-    }
-    else
-    {
-        _202 = false;
-    }
-    ok = _202;
-    float2 _205 = float2(4.0f, 0.0f) - 2.0f.xx;
-    float2 _206 = float2(0.0f, 4.0f) - 2.0f.xx;
-    float2 _207 = 0.0f.xx - 2.0f.xx;
-    m32 = float3x2(_205, _206, _207);
-    bool _224 = false;
-    if (_202)
-    {
-        _224 = (all(bool2(_205.x == float2(2.0f, -2.0f).x, _205.y == float2(2.0f, -2.0f).y)) && all(bool2(_206.x == float2(-2.0f, 2.0f).x, _206.y == float2(-2.0f, 2.0f).y))) && all(bool2(_207.x == (-2.0f).xx.x, _207.y == (-2.0f).xx.y));
-    }
-    else
-    {
-        _224 = false;
-    }
-    ok = _224;
-    float4 _227 = float4(3.0f, 0.0f, 0.0f, 0.0f) / 4.0f.xxxx;
-    float4 _228 = float4(0.0f, 3.0f, 0.0f, 0.0f) / 4.0f.xxxx;
-    m24 = float2x4(_227, _228);
-    bool _241 = false;
-    if (_224)
-    {
-        _241 = all(bool4(_227.x == float4(0.75f, 0.0f, 0.0f, 0.0f).x, _227.y == float4(0.75f, 0.0f, 0.0f, 0.0f).y, _227.z == float4(0.75f, 0.0f, 0.0f, 0.0f).z, _227.w == float4(0.75f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(_228.x == float4(0.0f, 0.75f, 0.0f, 0.0f).x, _228.y == float4(0.0f, 0.75f, 0.0f, 0.0f).y, _228.z == float4(0.0f, 0.75f, 0.0f, 0.0f).z, _228.w == float4(0.0f, 0.75f, 0.0f, 0.0f).w));
-    }
-    else
-    {
-        _241 = false;
-    }
-    ok = _241;
-    return _241;
-}
-
-float4 main(float2 _243)
-{
-    bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
-    float2x3 _RESERVED_IDENTIFIER_FIXUP_1_m23 = float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f));
-    bool _254 = false;
-    if (true)
-    {
-        _254 = all(bool3(float3(2.0f, 0.0f, 0.0f).x == float3(2.0f, 0.0f, 0.0f).x, float3(2.0f, 0.0f, 0.0f).y == float3(2.0f, 0.0f, 0.0f).y, float3(2.0f, 0.0f, 0.0f).z == float3(2.0f, 0.0f, 0.0f).z)) && all(bool3(float3(0.0f, 2.0f, 0.0f).x == float3(0.0f, 2.0f, 0.0f).x, float3(0.0f, 2.0f, 0.0f).y == float3(0.0f, 2.0f, 0.0f).y, float3(0.0f, 2.0f, 0.0f).z == float3(0.0f, 2.0f, 0.0f).z));
-    }
-    else
-    {
-        _254 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _254;
-    float2x4 _RESERVED_IDENTIFIER_FIXUP_2_m24 = float2x4(float4(3.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 3.0f, 0.0f, 0.0f));
-    bool _263 = false;
-    if (_254)
-    {
-        _263 = all(bool4(float4(3.0f, 0.0f, 0.0f, 0.0f).x == float4(3.0f, 0.0f, 0.0f, 0.0f).x, float4(3.0f, 0.0f, 0.0f, 0.0f).y == float4(3.0f, 0.0f, 0.0f, 0.0f).y, float4(3.0f, 0.0f, 0.0f, 0.0f).z == float4(3.0f, 0.0f, 0.0f, 0.0f).z, float4(3.0f, 0.0f, 0.0f, 0.0f).w == float4(3.0f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(float4(0.0f, 3.0f, 0.0f, 0.0f).x == float4(0.0f, 3.0f, 0.0f, 0.0f).x, float4(0.0f, 3.0f, 0.0f, 0.0f).y == float4(0.0f, 3.0f, 0.0f, 0.0f).y, float4(0.0f, 3.0f, 0.0f, 0.0f).z == float4(0.0f, 3.0f, 0.0f, 0.0f).z, float4(0.0f, 3.0f, 0.0f, 0.0f).w == float4(0.0f, 3.0f, 0.0f, 0.0f).w));
-    }
-    else
-    {
-        _263 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _263;
-    float3x2 _RESERVED_IDENTIFIER_FIXUP_3_m32 = float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx);
-    bool _275 = false;
-    if (_263)
-    {
-        _275 = (all(bool2(float2(4.0f, 0.0f).x == float2(4.0f, 0.0f).x, float2(4.0f, 0.0f).y == float2(4.0f, 0.0f).y)) && all(bool2(float2(0.0f, 4.0f).x == float2(0.0f, 4.0f).x, float2(0.0f, 4.0f).y == float2(0.0f, 4.0f).y))) && all(bool2(0.0f.xx.x == 0.0f.xx.x, 0.0f.xx.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _275 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _275;
-    float2x2 _277 = mul(float2x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f)), float3x2(float2(4.0f, 0.0f), float2(0.0f, 4.0f), 0.0f.xx));
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_7_m22 = _277;
-    bool _287 = false;
-    if (_275)
-    {
-        float2 _280 = _277[0];
-        float2 _283 = _277[1];
-        _287 = all(bool2(_280.x == float2(8.0f, 0.0f).x, _280.y == float2(8.0f, 0.0f).y)) && all(bool2(_283.x == float2(0.0f, 8.0f).x, _283.y == float2(0.0f, 8.0f).y));
-    }
-    else
-    {
-        _287 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _287;
-    float3 _288 = float3(2.0f, 0.0f, 0.0f) + 1.0f.xxx;
-    float3 _289 = float3(0.0f, 2.0f, 0.0f) + 1.0f.xxx;
-    _RESERVED_IDENTIFIER_FIXUP_1_m23 = float2x3(_288, _289);
-    bool _298 = false;
-    if (_287)
-    {
-        _298 = all(bool3(_288.x == float3(3.0f, 1.0f, 1.0f).x, _288.y == float3(3.0f, 1.0f, 1.0f).y, _288.z == float3(3.0f, 1.0f, 1.0f).z)) && all(bool3(_289.x == float3(1.0f, 3.0f, 1.0f).x, _289.y == float3(1.0f, 3.0f, 1.0f).y, _289.z == float3(1.0f, 3.0f, 1.0f).z));
-    }
-    else
-    {
-        _298 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _298;
-    float2 _299 = float2(4.0f, 0.0f) - 2.0f.xx;
-    float2 _300 = float2(0.0f, 4.0f) - 2.0f.xx;
-    float2 _301 = 0.0f.xx - 2.0f.xx;
-    _RESERVED_IDENTIFIER_FIXUP_3_m32 = float3x2(_299, _300, _301);
-    bool _313 = false;
-    if (_298)
-    {
-        _313 = (all(bool2(_299.x == float2(2.0f, -2.0f).x, _299.y == float2(2.0f, -2.0f).y)) && all(bool2(_300.x == float2(-2.0f, 2.0f).x, _300.y == float2(-2.0f, 2.0f).y))) && all(bool2(_301.x == (-2.0f).xx.x, _301.y == (-2.0f).xx.y));
-    }
-    else
-    {
-        _313 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _313;
-    float4 _314 = float4(3.0f, 0.0f, 0.0f, 0.0f) / 4.0f.xxxx;
-    float4 _315 = float4(0.0f, 3.0f, 0.0f, 0.0f) / 4.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_2_m24 = float2x4(_314, _315);
-    bool _324 = false;
-    if (_313)
-    {
-        _324 = all(bool4(_314.x == float4(0.75f, 0.0f, 0.0f, 0.0f).x, _314.y == float4(0.75f, 0.0f, 0.0f, 0.0f).y, _314.z == float4(0.75f, 0.0f, 0.0f, 0.0f).z, _314.w == float4(0.75f, 0.0f, 0.0f, 0.0f).w)) && all(bool4(_315.x == float4(0.0f, 0.75f, 0.0f, 0.0f).x, _315.y == float4(0.0f, 0.75f, 0.0f, 0.0f).y, _315.z == float4(0.0f, 0.75f, 0.0f, 0.0f).z, _315.w == float4(0.0f, 0.75f, 0.0f, 0.0f).w));
-    }
-    else
-    {
-        _324 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _324;
-    bool _328 = false;
-    if (_324)
-    {
-        _328 = test_half_b();
-    }
-    else
-    {
-        _328 = false;
-    }
-    float4 _329 = 0.0f.xxxx;
-    if (_328)
-    {
-        _329 = _11_colorGreen;
-    }
-    else
-    {
-        _329 = _11_colorRed;
-    }
-    return _329;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixConstructorsES2.hlsl b/tests/sksl/shared/MatrixConstructorsES2.hlsl
deleted file mode 100644
index e71f8af..0000000
--- a/tests/sksl/shared/MatrixConstructorsES2.hlsl
+++ /dev/null
@@ -1,78 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _38 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
-    float4 f4 = _38;
-    float3 _41 = _38.xyz;
-    float2 _46 = float2(_41.xy);
-    float2 _48 = float2(_41.z, 4.0f);
-    bool _61 = all(bool2(_46.x == float2(1.0f, 2.0f).x, _46.y == float2(1.0f, 2.0f).y)) && all(bool2(_48.x == float2(3.0f, 4.0f).x, _48.y == float2(3.0f, 4.0f).y));
-    bool ok = _61;
-    bool _89 = false;
-    if (_61)
-    {
-        float2 _66 = _38.zw;
-        float3 _70 = float3(_38.xy, _66.x);
-        float3 _72 = float3(_66.y, _10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y);
-        float3 _73 = float3(_10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y, _10_testMatrix2x2[0].x);
-        _89 = (all(bool3(_70.x == float3(1.0f, 2.0f, 3.0f).x, _70.y == float3(1.0f, 2.0f, 3.0f).y, _70.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_72.x == float3(4.0f, 1.0f, 2.0f).x, _72.y == float3(4.0f, 1.0f, 2.0f).y, _72.z == float3(4.0f, 1.0f, 2.0f).z))) && all(bool3(_73.x == float3(3.0f, 4.0f, 1.0f).x, _73.y == float3(3.0f, 4.0f, 1.0f).y, _73.z == float3(3.0f, 4.0f, 1.0f).z));
-    }
-    else
-    {
-        _89 = false;
-    }
-    ok = _89;
-    bool _127 = false;
-    if (_89)
-    {
-        float3 _93 = _38.wxy;
-        float4 _94 = _38.zwxy;
-        float4 _100 = float4(_38.xyz, _93.x);
-        float4 _105 = float4(_93.yz, _94.xy);
-        float4 _110 = float4(_94.zw, _38.zw);
-        _127 = ((all(bool4(_100.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _100.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _100.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _100.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_105.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _105.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _105.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _105.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w))) && all(bool4(_110.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _110.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _110.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _110.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w))) && all(bool4(_38.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _38.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _38.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _38.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
-    }
-    else
-    {
-        _127 = false;
-    }
-    ok = _127;
-    float4 _128 = 0.0f.xxxx;
-    if (_127)
-    {
-        _128 = _10_colorGreen;
-    }
-    else
-    {
-        _128 = _10_colorRed;
-    }
-    return _128;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixConstructorsES3.hlsl b/tests/sksl/shared/MatrixConstructorsES3.hlsl
deleted file mode 100644
index 917742a..0000000
--- a/tests/sksl/shared/MatrixConstructorsES3.hlsl
+++ /dev/null
@@ -1,107 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    float4 _38 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
-    float4 f4 = _38;
-    float3 _43 = float3(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x);
-    float3 _46 = float3(_10_testMatrix2x2[1].y, _38.xy);
-    bool _61 = all(bool3(_43.x == float3(1.0f, 2.0f, 3.0f).x, _43.y == float3(1.0f, 2.0f, 3.0f).y, _43.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_46.x == float3(4.0f, 1.0f, 2.0f).x, _46.y == float3(4.0f, 1.0f, 2.0f).y, _46.z == float3(4.0f, 1.0f, 2.0f).z));
-    bool ok = _61;
-    bool _86 = false;
-    if (_61)
-    {
-        float4 _66 = _38.wxyz;
-        float4 _71 = float4(_38.xyz, _66.x);
-        float4 _75 = float4(_66.yzw, _10_testMatrix2x2[1].y);
-        _86 = all(bool4(_71.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _71.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _71.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _71.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_75.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _75.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _75.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _75.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
-    }
-    else
-    {
-        _86 = false;
-    }
-    ok = _86;
-    bool _110 = false;
-    if (_86)
-    {
-        float2 _90 = _38.zw;
-        float3 _94 = float3(_38.xy, _90.x);
-        float3 _96 = float3(_90.y, _10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y);
-        float3 _97 = float3(_10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y, _10_testMatrix2x2[0].x);
-        _110 = (all(bool3(_94.x == float3(1.0f, 2.0f, 3.0f).x, _94.y == float3(1.0f, 2.0f, 3.0f).y, _94.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_96.x == float3(4.0f, 1.0f, 2.0f).x, _96.y == float3(4.0f, 1.0f, 2.0f).y, _96.z == float3(4.0f, 1.0f, 2.0f).z))) && all(bool3(_97.x == float3(3.0f, 4.0f, 1.0f).x, _97.y == float3(3.0f, 4.0f, 1.0f).y, _97.z == float3(3.0f, 4.0f, 1.0f).z));
-    }
-    else
-    {
-        _110 = false;
-    }
-    ok = _110;
-    bool _143 = false;
-    if (_110)
-    {
-        float3 _113 = _38.xyz;
-        float4 _114 = _38.wxyz;
-        float2 _117 = float2(_113.xy);
-        float2 _120 = float2(_113.z, _114.x);
-        float2 _123 = float2(_114.yz);
-        float2 _125 = float2(_114.w, _10_testMatrix2x2[1].y);
-        _143 = ((all(bool2(_117.x == float2(1.0f, 2.0f).x, _117.y == float2(1.0f, 2.0f).y)) && all(bool2(_120.x == float2(3.0f, 4.0f).x, _120.y == float2(3.0f, 4.0f).y))) && all(bool2(_123.x == float2(1.0f, 2.0f).x, _123.y == float2(1.0f, 2.0f).y))) && all(bool2(_125.x == float2(3.0f, 4.0f).x, _125.y == float2(3.0f, 4.0f).y));
-    }
-    else
-    {
-        _143 = false;
-    }
-    ok = _143;
-    bool _175 = false;
-    if (_143)
-    {
-        float4 _146 = _38.yzwx;
-        float4 _147 = _38.yzwx;
-        float3 _148 = _38.yzw;
-        float3 _151 = float3(_10_testMatrix2x2[0].x, _146.xy);
-        float3 _155 = float3(_146.zw, _147.x);
-        float3 _159 = float3(_147.yzw);
-        _175 = ((all(bool3(_151.x == float3(1.0f, 2.0f, 3.0f).x, _151.y == float3(1.0f, 2.0f, 3.0f).y, _151.z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_155.x == float3(4.0f, 1.0f, 2.0f).x, _155.y == float3(4.0f, 1.0f, 2.0f).y, _155.z == float3(4.0f, 1.0f, 2.0f).z))) && all(bool3(_159.x == float3(3.0f, 4.0f, 1.0f).x, _159.y == float3(3.0f, 4.0f, 1.0f).y, _159.z == float3(3.0f, 4.0f, 1.0f).z))) && all(bool3(_148.x == float3(2.0f, 3.0f, 4.0f).x, _148.y == float3(2.0f, 3.0f, 4.0f).y, _148.z == float3(2.0f, 3.0f, 4.0f).z));
-    }
-    else
-    {
-        _175 = false;
-    }
-    ok = _175;
-    float4 _176 = 0.0f.xxxx;
-    if (_175)
-    {
-        _176 = _10_colorGreen;
-    }
-    else
-    {
-        _176 = _10_colorRed;
-    }
-    return _176;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixEquality.hlsl b/tests/sksl/shared/MatrixEquality.hlsl
deleted file mode 100644
index 7fb2bc0..0000000
--- a/tests/sksl/shared/MatrixEquality.hlsl
+++ /dev/null
@@ -1,84 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
-    row_major float3x3 _10_testMatrix3x3 : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
-    bool _55 = false;
-    if (true)
-    {
-        _55 = all(bool2(_10_testMatrix2x2[0].x == float2(1.0f, 2.0f).x, _10_testMatrix2x2[0].y == float2(1.0f, 2.0f).y)) && all(bool2(_10_testMatrix2x2[1].x == float2(3.0f, 4.0f).x, _10_testMatrix2x2[1].y == float2(3.0f, 4.0f).y));
-    }
-    else
-    {
-        _55 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _55;
-    bool _83 = false;
-    if (_55)
-    {
-        _83 = (all(bool3(_10_testMatrix3x3[0].x == float3(1.0f, 2.0f, 3.0f).x, _10_testMatrix3x3[0].y == float3(1.0f, 2.0f, 3.0f).y, _10_testMatrix3x3[0].z == float3(1.0f, 2.0f, 3.0f).z)) && all(bool3(_10_testMatrix3x3[1].x == float3(4.0f, 5.0f, 6.0f).x, _10_testMatrix3x3[1].y == float3(4.0f, 5.0f, 6.0f).y, _10_testMatrix3x3[1].z == float3(4.0f, 5.0f, 6.0f).z))) && all(bool3(_10_testMatrix3x3[2].x == float3(7.0f, 8.0f, 9.0f).x, _10_testMatrix3x3[2].y == float3(7.0f, 8.0f, 9.0f).y, _10_testMatrix3x3[2].z == float3(7.0f, 8.0f, 9.0f).z));
-    }
-    else
-    {
-        _83 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _83;
-    bool _99 = false;
-    if (_83)
-    {
-        _99 = any(bool2(_10_testMatrix2x2[0].x != float2(100.0f, 0.0f).x, _10_testMatrix2x2[0].y != float2(100.0f, 0.0f).y)) || any(bool2(_10_testMatrix2x2[1].x != float2(0.0f, 100.0f).x, _10_testMatrix2x2[1].y != float2(0.0f, 100.0f).y));
-    }
-    else
-    {
-        _99 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _99;
-    bool _119 = false;
-    if (_99)
-    {
-        _119 = (any(bool3(_10_testMatrix3x3[0].x != float3(9.0f, 8.0f, 7.0f).x, _10_testMatrix3x3[0].y != float3(9.0f, 8.0f, 7.0f).y, _10_testMatrix3x3[0].z != float3(9.0f, 8.0f, 7.0f).z)) || any(bool3(_10_testMatrix3x3[1].x != float3(6.0f, 5.0f, 4.0f).x, _10_testMatrix3x3[1].y != float3(6.0f, 5.0f, 4.0f).y, _10_testMatrix3x3[1].z != float3(6.0f, 5.0f, 4.0f).z))) || any(bool3(_10_testMatrix3x3[2].x != float3(3.0f, 2.0f, 1.0f).x, _10_testMatrix3x3[2].y != float3(3.0f, 2.0f, 1.0f).y, _10_testMatrix3x3[2].z != float3(3.0f, 2.0f, 1.0f).z));
-    }
-    else
-    {
-        _119 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _119;
-    float4 _120 = 0.0f.xxxx;
-    if (_119)
-    {
-        _120 = _10_colorGreen;
-    }
-    else
-    {
-        _120 = _10_colorRed;
-    }
-    return _120;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixOpEqualsES3.hlsl b/tests/sksl/shared/MatrixOpEqualsES3.hlsl
deleted file mode 100644
index 9467d34..0000000
--- a/tests/sksl/shared/MatrixOpEqualsES3.hlsl
+++ /dev/null
@@ -1,357 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorRed : packoffset(c0);
-    float4 _11_colorGreen : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_matrix_op_matrix_half_b()
-{
-    bool ok = true;
-    float3x2 splat_4 = float3x2(4.0f.xx, 4.0f.xx, 4.0f.xx);
-    float3x2 m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
-    float2 _40 = float2(2.0f, 0.0f) + 4.0f.xx;
-    float2 _41 = float2(0.0f, 2.0f) + 4.0f.xx;
-    float2 _42 = 0.0f.xx + 4.0f.xx;
-    m = float3x2(_40, _41, _42);
-    bool _60 = false;
-    if (true)
-    {
-        _60 = (all(bool2(_40.x == float2(6.0f, 4.0f).x, _40.y == float2(6.0f, 4.0f).y)) && all(bool2(_41.x == float2(4.0f, 6.0f).x, _41.y == float2(4.0f, 6.0f).y))) && all(bool2(_42.x == 4.0f.xx.x, _42.y == 4.0f.xx.y));
-    }
-    else
-    {
-        _60 = false;
-    }
-    ok = _60;
-    m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
-    float2 _61 = float2(2.0f, 0.0f) - 4.0f.xx;
-    float2 _62 = float2(0.0f, 2.0f) - 4.0f.xx;
-    float2 _63 = 0.0f.xx - 4.0f.xx;
-    m = float3x2(_61, _62, _63);
-    bool _81 = false;
-    if (_60)
-    {
-        _81 = (all(bool2(_61.x == float2(-2.0f, -4.0f).x, _61.y == float2(-2.0f, -4.0f).y)) && all(bool2(_62.x == float2(-4.0f, -2.0f).x, _62.y == float2(-4.0f, -2.0f).y))) && all(bool2(_63.x == (-4.0f).xx.x, _63.y == (-4.0f).xx.y));
-    }
-    else
-    {
-        _81 = false;
-    }
-    ok = _81;
-    m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
-    float2 _82 = float2(2.0f, 0.0f) / 4.0f.xx;
-    float2 _83 = float2(0.0f, 2.0f) / 4.0f.xx;
-    float2 _84 = 0.0f.xx / 4.0f.xx;
-    m = float3x2(_82, _83, _84);
-    bool _100 = false;
-    if (_81)
-    {
-        _100 = (all(bool2(_82.x == float2(0.5f, 0.0f).x, _82.y == float2(0.5f, 0.0f).y)) && all(bool2(_83.x == float2(0.0f, 0.5f).x, _83.y == float2(0.0f, 0.5f).y))) && all(bool2(_84.x == 0.0f.xx.x, _84.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _100 = false;
-    }
-    ok = _100;
-    float2x3 splat_4_1 = float2x3(4.0f.xxx, 4.0f.xxx);
-    float2x3 m_1 = float2x3(4.0f.xxx, 4.0f.xxx);
-    float3 _111 = 4.0f.xxx + float3(2.0f, 0.0f, 0.0f);
-    float3 _112 = 4.0f.xxx + float3(0.0f, 2.0f, 0.0f);
-    m_1 = float2x3(_111, _112);
-    bool _125 = false;
-    if (_100)
-    {
-        _125 = all(bool3(_111.x == float3(6.0f, 4.0f, 4.0f).x, _111.y == float3(6.0f, 4.0f, 4.0f).y, _111.z == float3(6.0f, 4.0f, 4.0f).z)) && all(bool3(_112.x == float3(4.0f, 6.0f, 4.0f).x, _112.y == float3(4.0f, 6.0f, 4.0f).y, _112.z == float3(4.0f, 6.0f, 4.0f).z));
-    }
-    else
-    {
-        _125 = false;
-    }
-    ok = _125;
-    m_1 = float2x3(4.0f.xxx, 4.0f.xxx);
-    float3 _126 = 4.0f.xxx - float3(2.0f, 0.0f, 0.0f);
-    float3 _127 = 4.0f.xxx - float3(0.0f, 2.0f, 0.0f);
-    m_1 = float2x3(_126, _127);
-    bool _139 = false;
-    if (_125)
-    {
-        _139 = all(bool3(_126.x == float3(2.0f, 4.0f, 4.0f).x, _126.y == float3(2.0f, 4.0f, 4.0f).y, _126.z == float3(2.0f, 4.0f, 4.0f).z)) && all(bool3(_127.x == float3(4.0f, 2.0f, 4.0f).x, _127.y == float3(4.0f, 2.0f, 4.0f).y, _127.z == float3(4.0f, 2.0f, 4.0f).z));
-    }
-    else
-    {
-        _139 = false;
-    }
-    ok = _139;
-    m_1 = float2x3(4.0f.xxx, 4.0f.xxx);
-    float3 _142 = 4.0f.xxx / 2.0f.xxx;
-    float3 _143 = 4.0f.xxx / 2.0f.xxx;
-    m_1 = float2x3(_142, _143);
-    bool _152 = false;
-    if (_139)
-    {
-        _152 = all(bool3(_142.x == 2.0f.xxx.x, _142.y == 2.0f.xxx.y, _142.z == 2.0f.xxx.z)) && all(bool3(_143.x == 2.0f.xxx.x, _143.y == 2.0f.xxx.y, _143.z == 2.0f.xxx.z));
-    }
-    else
-    {
-        _152 = false;
-    }
-    ok = _152;
-    float4x3 m_2 = float4x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), float3(10.0f, 11.0f, 12.0f));
-    float3 _179 = float3(1.0f, 2.0f, 3.0f) + float3(16.0f, 15.0f, 14.0f);
-    float3 _180 = float3(4.0f, 5.0f, 6.0f) + float3(13.0f, 12.0f, 11.0f);
-    float3 _181 = float3(7.0f, 8.0f, 9.0f) + float3(10.0f, 9.0f, 8.0f);
-    float3 _182 = float3(10.0f, 11.0f, 12.0f) + float3(7.0f, 6.0f, 5.0f);
-    m_2 = float4x3(_179, _180, _181, _182);
-    bool _200 = false;
-    if (_152)
-    {
-        _200 = ((all(bool3(_179.x == 17.0f.xxx.x, _179.y == 17.0f.xxx.y, _179.z == 17.0f.xxx.z)) && all(bool3(_180.x == 17.0f.xxx.x, _180.y == 17.0f.xxx.y, _180.z == 17.0f.xxx.z))) && all(bool3(_181.x == 17.0f.xxx.x, _181.y == 17.0f.xxx.y, _181.z == 17.0f.xxx.z))) && all(bool3(_182.x == 17.0f.xxx.x, _182.y == 17.0f.xxx.y, _182.z == 17.0f.xxx.z));
-    }
-    else
-    {
-        _200 = false;
-    }
-    ok = _200;
-    float4x2 m_3 = float4x2(float2(10.0f, 20.0f), float2(30.0f, 40.0f), float2(50.0f, 60.0f), float2(70.0f, 80.0f));
-    float2 _221 = float2(10.0f, 20.0f) - float2(1.0f, 2.0f);
-    float2 _222 = float2(30.0f, 40.0f) - float2(3.0f, 4.0f);
-    float2 _223 = float2(50.0f, 60.0f) - float2(5.0f, 6.0f);
-    float2 _224 = float2(70.0f, 80.0f) - float2(7.0f, 8.0f);
-    m_3 = float4x2(_221, _222, _223, _224);
-    bool _251 = false;
-    if (_200)
-    {
-        _251 = ((all(bool2(_221.x == float2(9.0f, 18.0f).x, _221.y == float2(9.0f, 18.0f).y)) && all(bool2(_222.x == float2(27.0f, 36.0f).x, _222.y == float2(27.0f, 36.0f).y))) && all(bool2(_223.x == float2(45.0f, 54.0f).x, _223.y == float2(45.0f, 54.0f).y))) && all(bool2(_224.x == float2(63.0f, 72.0f).x, _224.y == float2(63.0f, 72.0f).y));
-    }
-    else
-    {
-        _251 = false;
-    }
-    ok = _251;
-    float2x4 m_4 = float2x4(float4(10.0f, 20.0f, 30.0f, 40.0f), float4(10.0f, 20.0f, 30.0f, 40.0f));
-    float4 _260 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 10.0f.xxxx;
-    float4 _261 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 5.0f.xxxx;
-    m_4 = float2x4(_260, _261);
-    bool _274 = false;
-    if (_251)
-    {
-        _274 = all(bool4(_260.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _260.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _260.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _260.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_261.x == float4(2.0f, 4.0f, 6.0f, 8.0f).x, _261.y == float4(2.0f, 4.0f, 6.0f, 8.0f).y, _261.z == float4(2.0f, 4.0f, 6.0f, 8.0f).z, _261.w == float4(2.0f, 4.0f, 6.0f, 8.0f).w));
-    }
-    else
-    {
-        _274 = false;
-    }
-    ok = _274;
-    float2x3 m_5 = float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f));
-    float2x3 _283 = mul(float2x2(float2(1.0f, 4.0f), float2(2.0f, 5.0f)), float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f)));
-    m_5 = _283;
-    bool _301 = false;
-    if (_274)
-    {
-        float3 _294 = _283[0];
-        float3 _297 = _283[1];
-        _301 = all(bool3(_294.x == float3(39.0f, 49.0f, 59.0f).x, _294.y == float3(39.0f, 49.0f, 59.0f).y, _294.z == float3(39.0f, 49.0f, 59.0f).z)) && all(bool3(_297.x == float3(54.0f, 68.0f, 82.0f).x, _297.y == float3(54.0f, 68.0f, 82.0f).y, _297.z == float3(54.0f, 68.0f, 82.0f).z));
-    }
-    else
-    {
-        _301 = false;
-    }
-    ok = _301;
-    return _301;
-}
-
-float4 main(float2 _303)
-{
-    bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
-    float3x2 _RESERVED_IDENTIFIER_FIXUP_1_splat_4 = float3x2(4.0f.xx, 4.0f.xx, 4.0f.xx);
-    float3x2 _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
-    float2 _308 = float2(2.0f, 0.0f) + 4.0f.xx;
-    float2 _309 = float2(0.0f, 2.0f) + 4.0f.xx;
-    float2 _310 = 0.0f.xx + 4.0f.xx;
-    _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(_308, _309, _310);
-    bool _322 = false;
-    if (true)
-    {
-        _322 = (all(bool2(_308.x == float2(6.0f, 4.0f).x, _308.y == float2(6.0f, 4.0f).y)) && all(bool2(_309.x == float2(4.0f, 6.0f).x, _309.y == float2(4.0f, 6.0f).y))) && all(bool2(_310.x == 4.0f.xx.x, _310.y == 4.0f.xx.y));
-    }
-    else
-    {
-        _322 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _322;
-    _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
-    float2 _323 = float2(2.0f, 0.0f) - 4.0f.xx;
-    float2 _324 = float2(0.0f, 2.0f) - 4.0f.xx;
-    float2 _325 = 0.0f.xx - 4.0f.xx;
-    _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(_323, _324, _325);
-    bool _337 = false;
-    if (_322)
-    {
-        _337 = (all(bool2(_323.x == float2(-2.0f, -4.0f).x, _323.y == float2(-2.0f, -4.0f).y)) && all(bool2(_324.x == float2(-4.0f, -2.0f).x, _324.y == float2(-4.0f, -2.0f).y))) && all(bool2(_325.x == (-4.0f).xx.x, _325.y == (-4.0f).xx.y));
-    }
-    else
-    {
-        _337 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _337;
-    _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f), 0.0f.xx);
-    float2 _338 = float2(2.0f, 0.0f) / 4.0f.xx;
-    float2 _339 = float2(0.0f, 2.0f) / 4.0f.xx;
-    float2 _340 = 0.0f.xx / 4.0f.xx;
-    _RESERVED_IDENTIFIER_FIXUP_2_m = float3x2(_338, _339, _340);
-    bool _352 = false;
-    if (_337)
-    {
-        _352 = (all(bool2(_338.x == float2(0.5f, 0.0f).x, _338.y == float2(0.5f, 0.0f).y)) && all(bool2(_339.x == float2(0.0f, 0.5f).x, _339.y == float2(0.0f, 0.5f).y))) && all(bool2(_340.x == 0.0f.xx.x, _340.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _352 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _352;
-    float2x3 _RESERVED_IDENTIFIER_FIXUP_3_splat_4 = float2x3(4.0f.xxx, 4.0f.xxx);
-    float2x3 _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(4.0f.xxx, 4.0f.xxx);
-    float3 _355 = 4.0f.xxx + float3(2.0f, 0.0f, 0.0f);
-    float3 _356 = 4.0f.xxx + float3(0.0f, 2.0f, 0.0f);
-    _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(_355, _356);
-    bool _365 = false;
-    if (_352)
-    {
-        _365 = all(bool3(_355.x == float3(6.0f, 4.0f, 4.0f).x, _355.y == float3(6.0f, 4.0f, 4.0f).y, _355.z == float3(6.0f, 4.0f, 4.0f).z)) && all(bool3(_356.x == float3(4.0f, 6.0f, 4.0f).x, _356.y == float3(4.0f, 6.0f, 4.0f).y, _356.z == float3(4.0f, 6.0f, 4.0f).z));
-    }
-    else
-    {
-        _365 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _365;
-    _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(4.0f.xxx, 4.0f.xxx);
-    float3 _366 = 4.0f.xxx - float3(2.0f, 0.0f, 0.0f);
-    float3 _367 = 4.0f.xxx - float3(0.0f, 2.0f, 0.0f);
-    _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(_366, _367);
-    bool _376 = false;
-    if (_365)
-    {
-        _376 = all(bool3(_366.x == float3(2.0f, 4.0f, 4.0f).x, _366.y == float3(2.0f, 4.0f, 4.0f).y, _366.z == float3(2.0f, 4.0f, 4.0f).z)) && all(bool3(_367.x == float3(4.0f, 2.0f, 4.0f).x, _367.y == float3(4.0f, 2.0f, 4.0f).y, _367.z == float3(4.0f, 2.0f, 4.0f).z));
-    }
-    else
-    {
-        _376 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _376;
-    _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(4.0f.xxx, 4.0f.xxx);
-    float3 _377 = 4.0f.xxx / 2.0f.xxx;
-    float3 _378 = 4.0f.xxx / 2.0f.xxx;
-    _RESERVED_IDENTIFIER_FIXUP_4_m = float2x3(_377, _378);
-    bool _387 = false;
-    if (_376)
-    {
-        _387 = all(bool3(_377.x == 2.0f.xxx.x, _377.y == 2.0f.xxx.y, _377.z == 2.0f.xxx.z)) && all(bool3(_378.x == 2.0f.xxx.x, _378.y == 2.0f.xxx.y, _378.z == 2.0f.xxx.z));
-    }
-    else
-    {
-        _387 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _387;
-    float4x3 _RESERVED_IDENTIFIER_FIXUP_5_m = float4x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), float3(10.0f, 11.0f, 12.0f));
-    float3 _389 = float3(1.0f, 2.0f, 3.0f) + float3(16.0f, 15.0f, 14.0f);
-    float3 _390 = float3(4.0f, 5.0f, 6.0f) + float3(13.0f, 12.0f, 11.0f);
-    float3 _391 = float3(7.0f, 8.0f, 9.0f) + float3(10.0f, 9.0f, 8.0f);
-    float3 _392 = float3(10.0f, 11.0f, 12.0f) + float3(7.0f, 6.0f, 5.0f);
-    _RESERVED_IDENTIFIER_FIXUP_5_m = float4x3(_389, _390, _391, _392);
-    bool _407 = false;
-    if (_387)
-    {
-        _407 = ((all(bool3(_389.x == 17.0f.xxx.x, _389.y == 17.0f.xxx.y, _389.z == 17.0f.xxx.z)) && all(bool3(_390.x == 17.0f.xxx.x, _390.y == 17.0f.xxx.y, _390.z == 17.0f.xxx.z))) && all(bool3(_391.x == 17.0f.xxx.x, _391.y == 17.0f.xxx.y, _391.z == 17.0f.xxx.z))) && all(bool3(_392.x == 17.0f.xxx.x, _392.y == 17.0f.xxx.y, _392.z == 17.0f.xxx.z));
-    }
-    else
-    {
-        _407 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _407;
-    float4x2 _RESERVED_IDENTIFIER_FIXUP_6_m = float4x2(float2(10.0f, 20.0f), float2(30.0f, 40.0f), float2(50.0f, 60.0f), float2(70.0f, 80.0f));
-    float2 _409 = float2(10.0f, 20.0f) - float2(1.0f, 2.0f);
-    float2 _410 = float2(30.0f, 40.0f) - float2(3.0f, 4.0f);
-    float2 _411 = float2(50.0f, 60.0f) - float2(5.0f, 6.0f);
-    float2 _412 = float2(70.0f, 80.0f) - float2(7.0f, 8.0f);
-    _RESERVED_IDENTIFIER_FIXUP_6_m = float4x2(_409, _410, _411, _412);
-    bool _427 = false;
-    if (_407)
-    {
-        _427 = ((all(bool2(_409.x == float2(9.0f, 18.0f).x, _409.y == float2(9.0f, 18.0f).y)) && all(bool2(_410.x == float2(27.0f, 36.0f).x, _410.y == float2(27.0f, 36.0f).y))) && all(bool2(_411.x == float2(45.0f, 54.0f).x, _411.y == float2(45.0f, 54.0f).y))) && all(bool2(_412.x == float2(63.0f, 72.0f).x, _412.y == float2(63.0f, 72.0f).y));
-    }
-    else
-    {
-        _427 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _427;
-    float2x4 _RESERVED_IDENTIFIER_FIXUP_7_m = float2x4(float4(10.0f, 20.0f, 30.0f, 40.0f), float4(10.0f, 20.0f, 30.0f, 40.0f));
-    float4 _429 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 10.0f.xxxx;
-    float4 _430 = float4(10.0f, 20.0f, 30.0f, 40.0f) / 5.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_7_m = float2x4(_429, _430);
-    bool _439 = false;
-    if (_427)
-    {
-        _439 = all(bool4(_429.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _429.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _429.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _429.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w)) && all(bool4(_430.x == float4(2.0f, 4.0f, 6.0f, 8.0f).x, _430.y == float4(2.0f, 4.0f, 6.0f, 8.0f).y, _430.z == float4(2.0f, 4.0f, 6.0f, 8.0f).z, _430.w == float4(2.0f, 4.0f, 6.0f, 8.0f).w));
-    }
-    else
-    {
-        _439 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _439;
-    float2x3 _RESERVED_IDENTIFIER_FIXUP_8_m = float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f));
-    float2x3 _441 = mul(float2x2(float2(1.0f, 4.0f), float2(2.0f, 5.0f)), float2x3(float3(7.0f, 9.0f, 11.0f), float3(8.0f, 10.0f, 12.0f)));
-    _RESERVED_IDENTIFIER_FIXUP_8_m = _441;
-    bool _451 = false;
-    if (_439)
-    {
-        float3 _444 = _441[0];
-        float3 _447 = _441[1];
-        _451 = all(bool3(_444.x == float3(39.0f, 49.0f, 59.0f).x, _444.y == float3(39.0f, 49.0f, 59.0f).y, _444.z == float3(39.0f, 49.0f, 59.0f).z)) && all(bool3(_447.x == float3(54.0f, 68.0f, 82.0f).x, _447.y == float3(54.0f, 68.0f, 82.0f).y, _447.z == float3(54.0f, 68.0f, 82.0f).z));
-    }
-    else
-    {
-        _451 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _451;
-    bool _455 = false;
-    if (_451)
-    {
-        _455 = test_matrix_op_matrix_half_b();
-    }
-    else
-    {
-        _455 = false;
-    }
-    float4 _456 = 0.0f.xxxx;
-    if (_455)
-    {
-        _456 = _11_colorGreen;
-    }
-    else
-    {
-        _456 = _11_colorRed;
-    }
-    return _456;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixScalarMath.hlsl b/tests/sksl/shared/MatrixScalarMath.hlsl
deleted file mode 100644
index 297ee8b..0000000
--- a/tests/sksl/shared/MatrixScalarMath.hlsl
+++ /dev/null
@@ -1,185 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_bifffff22(int _30, float _31, float _32, float _33, float _34, float2x2 _35)
-{
-    float one = _11_colorRed.x;
-    float2 _52 = float2(_31 * _11_colorRed.x, _32 * _11_colorRed.x);
-    float2 _53 = float2(_33 * _11_colorRed.x, _34 * _11_colorRed.x);
-    float2x2 m2 = float2x2(_52, _53);
-    switch (_30)
-    {
-        case 1:
-        {
-            m2 = float2x2(_52 + 1.0f.xx, _53 + 1.0f.xx);
-            break;
-        }
-        case 2:
-        {
-            m2 = float2x2(m2[0] - 1.0f.xx, m2[1] - 1.0f.xx);
-            break;
-        }
-        case 3:
-        {
-            m2 = m2 * 2.0f;
-            break;
-        }
-        case 4:
-        {
-            m2 = float2x2(m2[0] / 2.0f.xx, m2[1] / 2.0f.xx);
-            break;
-        }
-    }
-    bool _102 = false;
-    if (m2[0].x == _35[0].x)
-    {
-        _102 = m2[0].y == _35[0].y;
-    }
-    else
-    {
-        _102 = false;
-    }
-    bool _112 = false;
-    if (_102)
-    {
-        _112 = m2[1].x == _35[1].x;
-    }
-    else
-    {
-        _112 = false;
-    }
-    bool _122 = false;
-    if (_112)
-    {
-        _122 = m2[1].y == _35[1].y;
-    }
-    else
-    {
-        _122 = false;
-    }
-    return _122;
-}
-
-float4 main(float2 _124)
-{
-    float f1 = _11_colorGreen.y;
-    float _134 = 2.0f * _11_colorGreen.y;
-    float f2 = _134;
-    float _140 = 3.0f * _11_colorGreen.y;
-    float f3 = _140;
-    float _146 = 4.0f * _11_colorGreen.y;
-    float f4 = _146;
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_0_expected = float2x2(float2(_11_colorGreen.y + 1.0f, _134 + 1.0f), float2(_140 + 1.0f, _146 + 1.0f));
-    float _RESERVED_IDENTIFIER_FIXUP_1_one = _11_colorRed.x;
-    float2 _164 = float2(_11_colorGreen.y * _11_colorRed.x, _134 * _11_colorRed.x);
-    float2 _165 = float2(_140 * _11_colorRed.x, _146 * _11_colorRed.x);
-    float2x2 _RESERVED_IDENTIFIER_FIXUP_2_m2 = float2x2(_164, _165);
-    _RESERVED_IDENTIFIER_FIXUP_2_m2 = float2x2(_164 + 1.0f.xx, _165 + 1.0f.xx);
-    bool _186 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_2_m2[0].x == _RESERVED_IDENTIFIER_FIXUP_0_expected[0].x)
-    {
-        _186 = _RESERVED_IDENTIFIER_FIXUP_2_m2[0].y == _RESERVED_IDENTIFIER_FIXUP_0_expected[0].y;
-    }
-    else
-    {
-        _186 = false;
-    }
-    bool _196 = false;
-    if (_186)
-    {
-        _196 = _RESERVED_IDENTIFIER_FIXUP_2_m2[1].x == _RESERVED_IDENTIFIER_FIXUP_0_expected[1].x;
-    }
-    else
-    {
-        _196 = false;
-    }
-    bool _206 = false;
-    if (_196)
-    {
-        _206 = _RESERVED_IDENTIFIER_FIXUP_2_m2[1].y == _RESERVED_IDENTIFIER_FIXUP_0_expected[1].y;
-    }
-    else
-    {
-        _206 = false;
-    }
-    bool _224 = false;
-    if (_206)
-    {
-        int _210 = 2;
-        float _211 = _11_colorGreen.y;
-        float _212 = _134;
-        float _213 = _140;
-        float _214 = _146;
-        float2x2 _222 = float2x2(float2(_11_colorGreen.y - 1.0f, _134 - 1.0f), float2(_140 - 1.0f, _146 - 1.0f));
-        _224 = test_bifffff22(_210, _211, _212, _213, _214, _222);
-    }
-    else
-    {
-        _224 = false;
-    }
-    bool _242 = false;
-    if (_224)
-    {
-        int _228 = 3;
-        float _229 = _11_colorGreen.y;
-        float _230 = _134;
-        float _231 = _140;
-        float _232 = _146;
-        float2x2 _240 = float2x2(float2(_11_colorGreen.y * 2.0f, _134 * 2.0f), float2(_140 * 2.0f, _146 * 2.0f));
-        _242 = test_bifffff22(_228, _229, _230, _231, _232, _240);
-    }
-    else
-    {
-        _242 = false;
-    }
-    bool _261 = false;
-    if (_242)
-    {
-        int _246 = 4;
-        float _247 = _11_colorGreen.y;
-        float _248 = _134;
-        float _249 = _140;
-        float _250 = _146;
-        float2x2 _259 = float2x2(float2(_11_colorGreen.y * 0.5f, _134 * 0.5f), float2(_140 * 0.5f, _146 * 0.5f));
-        _261 = test_bifffff22(_246, _247, _248, _249, _250, _259);
-    }
-    else
-    {
-        _261 = false;
-    }
-    float4 _262 = 0.0f.xxxx;
-    if (_261)
-    {
-        _262 = _11_colorGreen;
-    }
-    else
-    {
-        _262 = _11_colorRed;
-    }
-    return _262;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixScalarSplat.hlsl b/tests/sksl/shared/MatrixScalarSplat.hlsl
deleted file mode 100644
index 7653483..0000000
--- a/tests/sksl/shared/MatrixScalarSplat.hlsl
+++ /dev/null
@@ -1,371 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_half_b()
-{
-    bool ok = true;
-    bool _73 = false;
-    if (ok)
-    {
-        float3x3 _34 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _41 = 4.0f.xxx;
-        float3x3 _42 = float3x3(_41, _41, _41);
-        float3x3 _52 = float3x3(_34[0] + _42[0], _34[1] + _42[1], _34[2] + _42[2]);
-        float3x3 _57 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
-        float3 _59 = _52[0];
-        float3 _60 = _57[0];
-        float3 _63 = _52[1];
-        float3 _64 = _57[1];
-        float3 _68 = _52[2];
-        float3 _69 = _57[2];
-        _73 = (all(bool3(_59.x == _60.x, _59.y == _60.y, _59.z == _60.z)) && all(bool3(_63.x == _64.x, _63.y == _64.y, _63.z == _64.z))) && all(bool3(_68.x == _69.x, _68.y == _69.y, _68.z == _69.z));
-    }
-    else
-    {
-        _73 = false;
-    }
-    ok = _73;
-    bool _113 = false;
-    if (ok)
-    {
-        float3x3 _77 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _81 = 4.0f.xxx;
-        float3x3 _82 = float3x3(_81, _81, _81);
-        float3x3 _92 = float3x3(_77[0] - _82[0], _77[1] - _82[1], _77[2] - _82[2]);
-        float3x3 _98 = float3x3(float3(-2.0f, -4.0f, -4.0f), float3(-4.0f, -2.0f, -4.0f), float3(-4.0f, -4.0f, -2.0f));
-        float3 _99 = _92[0];
-        float3 _100 = _98[0];
-        float3 _103 = _92[1];
-        float3 _104 = _98[1];
-        float3 _108 = _92[2];
-        float3 _109 = _98[2];
-        _113 = (all(bool3(_99.x == _100.x, _99.y == _100.y, _99.z == _100.z)) && all(bool3(_103.x == _104.x, _103.y == _104.y, _103.z == _104.z))) && all(bool3(_108.x == _109.x, _108.y == _109.y, _108.z == _109.z));
-    }
-    else
-    {
-        _113 = false;
-    }
-    ok = _113;
-    bool _141 = false;
-    if (ok)
-    {
-        float3x3 _121 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
-        float3x3 _123 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
-        float3 _127 = _121[0];
-        float3 _128 = _123[0];
-        float3 _131 = _121[1];
-        float3 _132 = _123[1];
-        float3 _136 = _121[2];
-        float3 _137 = _123[2];
-        _141 = (all(bool3(_127.x == _128.x, _127.y == _128.y, _127.z == _128.z)) && all(bool3(_131.x == _132.x, _131.y == _132.y, _131.z == _132.z))) && all(bool3(_136.x == _137.x, _136.y == _137.y, _136.z == _137.z));
-    }
-    else
-    {
-        _141 = false;
-    }
-    ok = _141;
-    bool _170 = false;
-    if (ok)
-    {
-        float3x3 _150 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 0.25f;
-        float3x3 _152 = float3x3(float3(0.5f, 0.0f, 0.0f), float3(0.0f, 0.5f, 0.0f), float3(0.0f, 0.0f, 0.5f));
-        float3 _156 = _150[0];
-        float3 _157 = _152[0];
-        float3 _160 = _150[1];
-        float3 _161 = _152[1];
-        float3 _165 = _150[2];
-        float3 _166 = _152[2];
-        _170 = (all(bool3(_156.x == _157.x, _156.y == _157.y, _156.z == _157.z)) && all(bool3(_160.x == _161.x, _160.y == _161.y, _160.z == _161.z))) && all(bool3(_165.x == _166.x, _165.y == _166.y, _165.z == _166.z));
-    }
-    else
-    {
-        _170 = false;
-    }
-    ok = _170;
-    bool _208 = false;
-    if (ok)
-    {
-        float3x3 _174 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _178 = 4.0f.xxx;
-        float3x3 _179 = float3x3(_178, _178, _178);
-        float3x3 _189 = float3x3(_179[0] + _174[0], _179[1] + _174[1], _179[2] + _174[2]);
-        float3x3 _193 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
-        float3 _194 = _189[0];
-        float3 _195 = _193[0];
-        float3 _198 = _189[1];
-        float3 _199 = _193[1];
-        float3 _203 = _189[2];
-        float3 _204 = _193[2];
-        _208 = (all(bool3(_194.x == _195.x, _194.y == _195.y, _194.z == _195.z)) && all(bool3(_198.x == _199.x, _198.y == _199.y, _198.z == _199.z))) && all(bool3(_203.x == _204.x, _203.y == _204.y, _203.z == _204.z));
-    }
-    else
-    {
-        _208 = false;
-    }
-    ok = _208;
-    bool _246 = false;
-    if (ok)
-    {
-        float3x3 _212 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _216 = 4.0f.xxx;
-        float3x3 _217 = float3x3(_216, _216, _216);
-        float3x3 _227 = float3x3(_217[0] - _212[0], _217[1] - _212[1], _217[2] - _212[2]);
-        float3x3 _231 = float3x3(float3(2.0f, 4.0f, 4.0f), float3(4.0f, 2.0f, 4.0f), float3(4.0f, 4.0f, 2.0f));
-        float3 _232 = _227[0];
-        float3 _233 = _231[0];
-        float3 _236 = _227[1];
-        float3 _237 = _231[1];
-        float3 _241 = _227[2];
-        float3 _242 = _231[2];
-        _246 = (all(bool3(_232.x == _233.x, _232.y == _233.y, _232.z == _233.z)) && all(bool3(_236.x == _237.x, _236.y == _237.y, _236.z == _237.z))) && all(bool3(_241.x == _242.x, _241.y == _242.y, _241.z == _242.z));
-    }
-    else
-    {
-        _246 = false;
-    }
-    ok = _246;
-    bool _273 = false;
-    if (ok)
-    {
-        float3x3 _254 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
-        float3x3 _255 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
-        float3 _259 = _254[0];
-        float3 _260 = _255[0];
-        float3 _263 = _254[1];
-        float3 _264 = _255[1];
-        float3 _268 = _254[2];
-        float3 _269 = _255[2];
-        _273 = (all(bool3(_259.x == _260.x, _259.y == _260.y, _259.z == _260.z)) && all(bool3(_263.x == _264.x, _263.y == _264.y, _263.z == _264.z))) && all(bool3(_268.x == _269.x, _268.y == _269.y, _268.z == _269.z));
-    }
-    else
-    {
-        _273 = false;
-    }
-    ok = _273;
-    bool _303 = false;
-    if (ok)
-    {
-        float2x2 _279 = float2x2(2.0f.xx, 2.0f.xx);
-        float2 _281 = 4.0f.xx;
-        float2x2 _282 = float2x2(_281, _281);
-        float2x2 _289 = float2x2(_282[0] / _279[0], _282[1] / _279[1]);
-        float2x2 _292 = float2x2(2.0f.xx, 2.0f.xx);
-        float2 _294 = _289[0];
-        float2 _295 = _292[0];
-        float2 _298 = _289[1];
-        float2 _299 = _292[1];
-        _303 = all(bool2(_294.x == _295.x, _294.y == _295.y)) && all(bool2(_298.x == _299.x, _298.y == _299.y));
-    }
-    else
-    {
-        _303 = false;
-    }
-    ok = _303;
-    return ok;
-}
-
-float4 main(float2 _306)
-{
-    bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
-    bool _346 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _312 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _316 = 4.0f.xxx;
-        float3x3 _317 = float3x3(_316, _316, _316);
-        float3x3 _327 = float3x3(_312[0] + _317[0], _312[1] + _317[1], _312[2] + _317[2]);
-        float3x3 _331 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
-        float3 _332 = _327[0];
-        float3 _333 = _331[0];
-        float3 _336 = _327[1];
-        float3 _337 = _331[1];
-        float3 _341 = _327[2];
-        float3 _342 = _331[2];
-        _346 = (all(bool3(_332.x == _333.x, _332.y == _333.y, _332.z == _333.z)) && all(bool3(_336.x == _337.x, _336.y == _337.y, _336.z == _337.z))) && all(bool3(_341.x == _342.x, _341.y == _342.y, _341.z == _342.z));
-    }
-    else
-    {
-        _346 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _346;
-    bool _384 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _350 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _354 = 4.0f.xxx;
-        float3x3 _355 = float3x3(_354, _354, _354);
-        float3x3 _365 = float3x3(_350[0] - _355[0], _350[1] - _355[1], _350[2] - _355[2]);
-        float3x3 _369 = float3x3(float3(-2.0f, -4.0f, -4.0f), float3(-4.0f, -2.0f, -4.0f), float3(-4.0f, -4.0f, -2.0f));
-        float3 _370 = _365[0];
-        float3 _371 = _369[0];
-        float3 _374 = _365[1];
-        float3 _375 = _369[1];
-        float3 _379 = _365[2];
-        float3 _380 = _369[2];
-        _384 = (all(bool3(_370.x == _371.x, _370.y == _371.y, _370.z == _371.z)) && all(bool3(_374.x == _375.x, _374.y == _375.y, _374.z == _375.z))) && all(bool3(_379.x == _380.x, _379.y == _380.y, _379.z == _380.z));
-    }
-    else
-    {
-        _384 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _384;
-    bool _411 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _392 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
-        float3x3 _393 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
-        float3 _397 = _392[0];
-        float3 _398 = _393[0];
-        float3 _401 = _392[1];
-        float3 _402 = _393[1];
-        float3 _406 = _392[2];
-        float3 _407 = _393[2];
-        _411 = (all(bool3(_397.x == _398.x, _397.y == _398.y, _397.z == _398.z)) && all(bool3(_401.x == _402.x, _401.y == _402.y, _401.z == _402.z))) && all(bool3(_406.x == _407.x, _406.y == _407.y, _406.z == _407.z));
-    }
-    else
-    {
-        _411 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _411;
-    bool _438 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _419 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 0.25f;
-        float3x3 _420 = float3x3(float3(0.5f, 0.0f, 0.0f), float3(0.0f, 0.5f, 0.0f), float3(0.0f, 0.0f, 0.5f));
-        float3 _424 = _419[0];
-        float3 _425 = _420[0];
-        float3 _428 = _419[1];
-        float3 _429 = _420[1];
-        float3 _433 = _419[2];
-        float3 _434 = _420[2];
-        _438 = (all(bool3(_424.x == _425.x, _424.y == _425.y, _424.z == _425.z)) && all(bool3(_428.x == _429.x, _428.y == _429.y, _428.z == _429.z))) && all(bool3(_433.x == _434.x, _433.y == _434.y, _433.z == _434.z));
-    }
-    else
-    {
-        _438 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _438;
-    bool _476 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _442 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _446 = 4.0f.xxx;
-        float3x3 _447 = float3x3(_446, _446, _446);
-        float3x3 _457 = float3x3(_447[0] + _442[0], _447[1] + _442[1], _447[2] + _442[2]);
-        float3x3 _461 = float3x3(float3(6.0f, 4.0f, 4.0f), float3(4.0f, 6.0f, 4.0f), float3(4.0f, 4.0f, 6.0f));
-        float3 _462 = _457[0];
-        float3 _463 = _461[0];
-        float3 _466 = _457[1];
-        float3 _467 = _461[1];
-        float3 _471 = _457[2];
-        float3 _472 = _461[2];
-        _476 = (all(bool3(_462.x == _463.x, _462.y == _463.y, _462.z == _463.z)) && all(bool3(_466.x == _467.x, _466.y == _467.y, _466.z == _467.z))) && all(bool3(_471.x == _472.x, _471.y == _472.y, _471.z == _472.z));
-    }
-    else
-    {
-        _476 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _476;
-    bool _514 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _480 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f));
-        float3 _484 = 4.0f.xxx;
-        float3x3 _485 = float3x3(_484, _484, _484);
-        float3x3 _495 = float3x3(_485[0] - _480[0], _485[1] - _480[1], _485[2] - _480[2]);
-        float3x3 _499 = float3x3(float3(2.0f, 4.0f, 4.0f), float3(4.0f, 2.0f, 4.0f), float3(4.0f, 4.0f, 2.0f));
-        float3 _500 = _495[0];
-        float3 _501 = _499[0];
-        float3 _504 = _495[1];
-        float3 _505 = _499[1];
-        float3 _509 = _495[2];
-        float3 _510 = _499[2];
-        _514 = (all(bool3(_500.x == _501.x, _500.y == _501.y, _500.z == _501.z)) && all(bool3(_504.x == _505.x, _504.y == _505.y, _504.z == _505.z))) && all(bool3(_509.x == _510.x, _509.y == _510.y, _509.z == _510.z));
-    }
-    else
-    {
-        _514 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _514;
-    bool _541 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float3x3 _522 = float3x3(float3(2.0f, 0.0f, 0.0f), float3(0.0f, 2.0f, 0.0f), float3(0.0f, 0.0f, 2.0f)) * 4.0f;
-        float3x3 _523 = float3x3(float3(8.0f, 0.0f, 0.0f), float3(0.0f, 8.0f, 0.0f), float3(0.0f, 0.0f, 8.0f));
-        float3 _527 = _522[0];
-        float3 _528 = _523[0];
-        float3 _531 = _522[1];
-        float3 _532 = _523[1];
-        float3 _536 = _522[2];
-        float3 _537 = _523[2];
-        _541 = (all(bool3(_527.x == _528.x, _527.y == _528.y, _527.z == _528.z)) && all(bool3(_531.x == _532.x, _531.y == _532.y, _531.z == _532.z))) && all(bool3(_536.x == _537.x, _536.y == _537.y, _536.z == _537.z));
-    }
-    else
-    {
-        _541 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _541;
-    bool _569 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        float2x2 _547 = float2x2(2.0f.xx, 2.0f.xx);
-        float2 _548 = 4.0f.xx;
-        float2x2 _549 = float2x2(_548, _548);
-        float2x2 _556 = float2x2(_549[0] / _547[0], _549[1] / _547[1]);
-        float2x2 _559 = float2x2(2.0f.xx, 2.0f.xx);
-        float2 _560 = _556[0];
-        float2 _561 = _559[0];
-        float2 _564 = _556[1];
-        float2 _565 = _559[1];
-        _569 = all(bool2(_560.x == _561.x, _560.y == _561.y)) && all(bool2(_564.x == _565.x, _564.y == _565.y));
-    }
-    else
-    {
-        _569 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _569;
-    bool _574 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_0_ok)
-    {
-        _574 = test_half_b();
-    }
-    else
-    {
-        _574 = false;
-    }
-    float4 _575 = 0.0f.xxxx;
-    if (_574)
-    {
-        _575 = _11_colorGreen;
-    }
-    else
-    {
-        _575 = _11_colorRed;
-    }
-    return _575;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MatrixToVectorCast.hlsl b/tests/sksl/shared/MatrixToVectorCast.hlsl
deleted file mode 100644
index 1eecbcd..0000000
--- a/tests/sksl/shared/MatrixToVectorCast.hlsl
+++ /dev/null
@@ -1,87 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    row_major float2x2 _10_testMatrix2x2 : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _25)
-{
-    bool ok = true;
-    bool _51 = false;
-    if (true)
-    {
-        float4 _42 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
-        _51 = all(bool4(_42.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _42.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _42.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _42.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
-    }
-    else
-    {
-        _51 = false;
-    }
-    ok = _51;
-    bool _63 = false;
-    if (_51)
-    {
-        float4 _60 = float4(_10_testMatrix2x2[0].x, _10_testMatrix2x2[0].y, _10_testMatrix2x2[1].x, _10_testMatrix2x2[1].y);
-        _63 = all(bool4(_60.x == float4(1.0f, 2.0f, 3.0f, 4.0f).x, _60.y == float4(1.0f, 2.0f, 3.0f, 4.0f).y, _60.z == float4(1.0f, 2.0f, 3.0f, 4.0f).z, _60.w == float4(1.0f, 2.0f, 3.0f, 4.0f).w));
-    }
-    else
-    {
-        _63 = false;
-    }
-    ok = _63;
-    bool _85 = false;
-    if (_63)
-    {
-        int4 _78 = int4(int(_10_testMatrix2x2[0].x), int(_10_testMatrix2x2[0].y), int(_10_testMatrix2x2[1].x), int(_10_testMatrix2x2[1].y));
-        _85 = all(bool4(_78.x == int4(1, 2, 3, 4).x, _78.y == int4(1, 2, 3, 4).y, _78.z == int4(1, 2, 3, 4).z, _78.w == int4(1, 2, 3, 4).w));
-    }
-    else
-    {
-        _85 = false;
-    }
-    ok = _85;
-    bool _103 = false;
-    if (_85)
-    {
-        bool4 _99 = bool4(_10_testMatrix2x2[0].x != 0.0f, _10_testMatrix2x2[0].y != 0.0f, _10_testMatrix2x2[1].x != 0.0f, _10_testMatrix2x2[1].y != 0.0f);
-        _103 = all(bool4(_99.x == bool4(true, true, true, true).x, _99.y == bool4(true, true, true, true).y, _99.z == bool4(true, true, true, true).z, _99.w == bool4(true, true, true, true).w));
-    }
-    else
-    {
-        _103 = false;
-    }
-    ok = _103;
-    float4 _104 = 0.0f.xxxx;
-    if (_103)
-    {
-        _104 = _10_colorGreen;
-    }
-    else
-    {
-        _104 = _10_colorRed;
-    }
-    return _104;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/MultipleAssignments.hlsl b/tests/sksl/shared/MultipleAssignments.hlsl
deleted file mode 100644
index 19c7e2f..0000000
--- a/tests/sksl/shared/MultipleAssignments.hlsl
+++ /dev/null
@@ -1,30 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float y = 1.0f;
-    float x = 1.0f;
-    float c = 0.0f;
-    float b = 0.0f;
-    float a = 0.0f;
-    return float4(0.0f * 0.0f, 1.0f, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Negation.hlsl b/tests/sksl/shared/Negation.hlsl
deleted file mode 100644
index d712440..0000000
--- a/tests/sksl/shared/Negation.hlsl
+++ /dev/null
@@ -1,111 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_colorGreen : packoffset(c0);
-    float4 _12_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_ivec_b()
-{
-    int one = 1;
-    int two = 2;
-    bool ok = true;
-    bool _56 = false;
-    if (ok)
-    {
-        int2 _40 = -int2(-one, one + one);
-        int2 _48 = -int2(one - two, 2);
-        _56 = all(bool2(_40.x == _48.x, _40.y == _48.y));
-    }
-    else
-    {
-        _56 = false;
-    }
-    ok = _56;
-    return ok;
-}
-
-bool test_mat_b()
-{
-    bool ok = true;
-    return ok;
-}
-
-float4 main(float2 _62)
-{
-    float _RESERVED_IDENTIFIER_FIXUP_0_one = 1.0f;
-    float _RESERVED_IDENTIFIER_FIXUP_1_two = 2.0f;
-    bool _RESERVED_IDENTIFIER_FIXUP_4_ok = true;
-    bool _89 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_4_ok)
-    {
-        float4 _73 = -_RESERVED_IDENTIFIER_FIXUP_1_two.xxxx;
-        float4 _85 = float4(-_RESERVED_IDENTIFIER_FIXUP_1_two, (-_RESERVED_IDENTIFIER_FIXUP_1_two).xxx);
-        _89 = all(bool4(_73.x == _85.x, _73.y == _85.y, _73.z == _85.z, _73.w == _85.w));
-    }
-    else
-    {
-        _89 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_4_ok = _89;
-    bool _103 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_4_ok)
-    {
-        float2 _95 = -float2(_RESERVED_IDENTIFIER_FIXUP_0_one - _RESERVED_IDENTIFIER_FIXUP_1_two, _RESERVED_IDENTIFIER_FIXUP_1_two);
-        _103 = all(bool2(float2(1.0f, -2.0f).x == _95.x, float2(1.0f, -2.0f).y == _95.y));
-    }
-    else
-    {
-        _103 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_4_ok = _103;
-    bool _108 = false;
-    if (_RESERVED_IDENTIFIER_FIXUP_4_ok)
-    {
-        _108 = test_ivec_b();
-    }
-    else
-    {
-        _108 = false;
-    }
-    bool _112 = false;
-    if (_108)
-    {
-        _112 = test_mat_b();
-    }
-    else
-    {
-        _112 = false;
-    }
-    float4 _113 = 0.0f.xxxx;
-    if (_112)
-    {
-        _113 = _12_colorGreen;
-    }
-    else
-    {
-        _113 = _12_colorRed;
-    }
-    return _113;
-}
-
-void frag_main()
-{
-    float2 _22 = 0.0f.xx;
-    sk_FragColor = main(_22);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/NoFragCoordsPos.hlsl b/tests/sksl/shared/NoFragCoordsPos.hlsl
deleted file mode 100644
index 10867c9..0000000
--- a/tests/sksl/shared/NoFragCoordsPos.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-static float4 gl_Position;
-static float4 pos;
-
-struct SPIRV_Cross_Input
-{
-    float4 pos : TEXCOORD0;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 gl_Position : SV_Position;
-};
-
-void vert_main()
-{
-    gl_Position = pos;
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    pos = stage_input.pos;
-    vert_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.gl_Position = gl_Position;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/NoFragCoordsPosRT.hlsl b/tests/sksl/shared/NoFragCoordsPosRT.hlsl
deleted file mode 100644
index 5590eee..0000000
--- a/tests/sksl/shared/NoFragCoordsPosRT.hlsl
+++ /dev/null
@@ -1,33 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_sk_RTAdjust : packoffset(c0);
-};
-
-
-static float4 gl_Position;
-static float4 pos;
-
-struct SPIRV_Cross_Input
-{
-    float4 pos : TEXCOORD0;
-};
-
-struct SPIRV_Cross_Output
-{
-    float4 gl_Position : SV_Position;
-};
-
-void vert_main()
-{
-    gl_Position = pos;
-    gl_Position = float4((gl_Position.xy * _10_sk_RTAdjust.xz) + (gl_Position.ww * _10_sk_RTAdjust.yw), 0.0f, gl_Position.w);
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    pos = stage_input.pos;
-    vert_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.gl_Position = gl_Position;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/NormalizationVert.hlsl b/tests/sksl/shared/NormalizationVert.hlsl
deleted file mode 100644
index 49fddb6..0000000
--- a/tests/sksl/shared/NormalizationVert.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _8_sk_RTAdjust : packoffset(c0);
-};
-
-
-static float4 gl_Position;
-struct SPIRV_Cross_Output
-{
-    float4 gl_Position : SV_Position;
-};
-
-void vert_main()
-{
-    gl_Position = 1.0f.xxxx;
-    gl_Position = float4((gl_Position.xy * _8_sk_RTAdjust.xz) + (gl_Position.ww * _8_sk_RTAdjust.yw), 0.0f, gl_Position.w);
-}
-
-SPIRV_Cross_Output main()
-{
-    vert_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.gl_Position = gl_Position;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/NumberCasts.hlsl b/tests/sksl/shared/NumberCasts.hlsl
deleted file mode 100644
index c17cb5a..0000000
--- a/tests/sksl/shared/NumberCasts.hlsl
+++ /dev/null
@@ -1,55 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    bool3 B = bool3(false, false, false);
-    B.x = true;
-    B.y = true;
-    B.z = true;
-    float3 F = 0.0f.xxx;
-    F.x = 1.230000019073486328125f;
-    F.y = 0.0f;
-    F.z = 1.0f;
-    int3 I = int3(0, 0, 0);
-    I.x = 1;
-    I.y = 1;
-    I.z = 1;
-    bool _66 = false;
-    if (B.x)
-    {
-        _66 = B.y;
-    }
-    else
-    {
-        _66 = false;
-    }
-    bool _71 = false;
-    if (_66)
-    {
-        _71 = B.z;
-    }
-    else
-    {
-        _71 = false;
-    }
-    return float4((F.x * F.y) * F.z, float(_71), 0.0f, float((I.x * I.y) * I.z));
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/NumberConversions.hlsl b/tests/sksl/shared/NumberConversions.hlsl
deleted file mode 100644
index 0cc92f9..0000000
--- a/tests/sksl/shared/NumberConversions.hlsl
+++ /dev/null
@@ -1,84 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    bool b = true;
-    int _26 = int(_10_unknownInput);
-    int s = _26;
-    int _30 = int(_10_unknownInput);
-    int i = _30;
-    uint _36 = uint(_10_unknownInput);
-    uint us = _36;
-    uint _40 = uint(_10_unknownInput);
-    uint ui = _40;
-    float h = _10_unknownInput;
-    float f = _10_unknownInput;
-    int s2s = _26;
-    int i2s = _30;
-    int _51 = int(_36);
-    int us2s = _51;
-    int _53 = int(_40);
-    int ui2s = _53;
-    int _55 = int(_10_unknownInput);
-    int h2s = _55;
-    int _57 = int(_10_unknownInput);
-    int f2s = _57;
-    int _59 = int(true);
-    int b2s = _59;
-    int s2i = _26;
-    int i2i = _30;
-    int _64 = int(_36);
-    int us2i = _64;
-    int _66 = int(_40);
-    int ui2i = _66;
-    int _68 = int(_10_unknownInput);
-    int h2i = _68;
-    int _70 = int(_10_unknownInput);
-    int f2i = _70;
-    int _72 = int(true);
-    int b2i = _72;
-    uint _74 = uint(_26);
-    uint s2us = _74;
-    uint _76 = uint(_30);
-    uint i2us = _76;
-    uint us2us = _36;
-    uint ui2us = _40;
-    uint h2us = uint(_10_unknownInput);
-    uint f2us = uint(_10_unknownInput);
-    uint b2us = uint(true);
-    uint s2ui = uint(_26);
-    uint i2ui = uint(_30);
-    uint us2ui = _36;
-    uint ui2ui = _40;
-    uint h2ui = uint(_10_unknownInput);
-    uint f2ui = uint(_10_unknownInput);
-    uint b2ui = uint(true);
-    float s2f = float(_26);
-    float i2f = float(_30);
-    float us2f = float(_36);
-    float ui2f = float(_40);
-    float h2f = _10_unknownInput;
-    float f2f = _10_unknownInput;
-    float b2f = float(true);
-    sk_FragColor.x = (((((((((((((((((((((float(_26) + float(_30)) + float(_36)) + float(_40)) + _10_unknownInput) + _10_unknownInput) + float(_26)) + float(_30)) + float(_51)) + float(_53)) + float(_55)) + float(_57)) + float(_59)) + float(_26)) + float(_30)) + float(_64)) + float(_66)) + float(_68)) + float(_70)) + float(_72)) + float(_74)) + float(_76)) + float(_36);
-    sk_FragColor.x += (((((((((((((((((float(ui2us) + float(h2us)) + float(f2us)) + float(b2us)) + float(s2ui)) + float(i2ui)) + float(us2ui)) + float(ui2ui)) + float(h2ui)) + float(f2ui)) + float(b2ui)) + s2f) + i2f) + us2f) + ui2f) + h2f) + f2f) + b2f);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Octal.hlsl b/tests/sksl/shared/Octal.hlsl
deleted file mode 100644
index 0454677..0000000
--- a/tests/sksl/shared/Octal.hlsl
+++ /dev/null
@@ -1,72 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int i1 = 1;
-    int i2 = 342391;
-    int i3 = 2000000000;
-    int i4 = -2000000000;
-    bool _40 = false;
-    if (true)
-    {
-        _40 = true;
-    }
-    else
-    {
-        _40 = false;
-    }
-    bool _43 = false;
-    if (_40)
-    {
-        _43 = true;
-    }
-    else
-    {
-        _43 = false;
-    }
-    bool _46 = false;
-    if (_43)
-    {
-        _46 = true;
-    }
-    else
-    {
-        _46 = false;
-    }
-    float4 _47 = 0.0f.xxxx;
-    if (_46)
-    {
-        _47 = _10_colorGreen;
-    }
-    else
-    {
-        _47 = _10_colorRed;
-    }
-    return _47;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Offset.hlsl b/tests/sksl/shared/Offset.hlsl
deleted file mode 100644
index a97967c..0000000
--- a/tests/sksl/shared/Offset.hlsl
+++ /dev/null
@@ -1,28 +0,0 @@
-struct Test
-{
-    int x;
-    int y;
-    int z;
-};
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    Test t = { 0, 0, 0 };
-    t.x = 0;
-    sk_FragColor.x = float(t.x);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/OperatorsES2.hlsl b/tests/sksl/shared/OperatorsES2.hlsl
deleted file mode 100644
index 7a1d40d..0000000
--- a/tests/sksl/shared/OperatorsES2.hlsl
+++ /dev/null
@@ -1,124 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float _10_unknownInput : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float x = 1.0f;
-    float y = 2.0f;
-    int z = 3;
-    float _40 = (1.0f - 1.0f) + (((2.0f * 1.0f) * 1.0f) * (2.0f - 1.0f));
-    x = _40;
-    float _42 = (_40 / 2.0f) / _40;
-    y = _42;
-    int _48 = (((3 / 2) * 3) + 4) - 2;
-    z = _48;
-    bool _67 = false;
-    if ((_40 > 4.0f) == (_40 < 2.0f))
-    {
-        _67 = true;
-    }
-    else
-    {
-        bool _66 = false;
-        if (2.0f >= _10_unknownInput)
-        {
-            _66 = _42 <= _40;
-        }
-        else
-        {
-            _66 = false;
-        }
-        _67 = _66;
-    }
-    bool b = _67;
-    bool _71 = _10_unknownInput > 2.0f;
-    bool c = _71;
-    bool _73 = _67 != _71;
-    bool d = _73;
-    bool _77 = false;
-    if (_67)
-    {
-        _77 = _71;
-    }
-    else
-    {
-        _77 = false;
-    }
-    bool e = _77;
-    bool _81 = false;
-    if (_67)
-    {
-        _81 = true;
-    }
-    else
-    {
-        _81 = _71;
-    }
-    bool f = _81;
-    float _83 = _40 + 12.0f;
-    x = _83;
-    float _84 = _83 - 12.0f;
-    x = _84;
-    float _86 = _42 / 10.0f;
-    y = _86;
-    x = _84 * _86;
-    x = 6.0f;
-    y = (((float(_67) * float(_71)) * float(_73)) * float(_77)) * float(_81);
-    y = 6.0f;
-    z = _48 - 1;
-    z = 6;
-    bool _103 = false;
-    if (true)
-    {
-        _103 = true;
-    }
-    else
-    {
-        _103 = false;
-    }
-    bool _106 = false;
-    if (_103)
-    {
-        _106 = true;
-    }
-    else
-    {
-        _106 = false;
-    }
-    float4 _107 = 0.0f.xxxx;
-    if (_106)
-    {
-        _107 = _10_colorGreen;
-    }
-    else
-    {
-        _107 = _10_colorRed;
-    }
-    return _107;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/OperatorsES3.hlsl b/tests/sksl/shared/OperatorsES3.hlsl
deleted file mode 100644
index d591cc2..0000000
--- a/tests/sksl/shared/OperatorsES3.hlsl
+++ /dev/null
@@ -1,156 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float _10_unknownInput : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float x = 1.0f;
-    float y = 2.0f;
-    int z = 3;
-    float _40 = (1.0f - 1.0f) + (((2.0f * 1.0f) * 1.0f) * (2.0f - 1.0f));
-    x = _40;
-    float _42 = (_40 / 2.0f) / _40;
-    y = _42;
-    int _50 = ((((3 / 2) % 3) << 4) >> 2) << 1;
-    z = _50;
-    bool _69 = false;
-    if ((_40 > 4.0f) == (_40 < 2.0f))
-    {
-        _69 = true;
-    }
-    else
-    {
-        bool _68 = false;
-        if (2.0f >= _10_unknownInput)
-        {
-            _68 = _42 <= _40;
-        }
-        else
-        {
-            _68 = false;
-        }
-        _69 = _68;
-    }
-    bool b = _69;
-    bool _73 = _10_unknownInput > 2.0f;
-    bool c = _73;
-    bool _75 = _69 != _73;
-    bool d = _75;
-    bool _79 = false;
-    if (_69)
-    {
-        _79 = _73;
-    }
-    else
-    {
-        _79 = false;
-    }
-    bool e = _79;
-    bool _83 = false;
-    if (_69)
-    {
-        _83 = true;
-    }
-    else
-    {
-        _83 = _73;
-    }
-    bool f = _83;
-    float _85 = _40 + 12.0f;
-    x = _85;
-    float _86 = _85 - 12.0f;
-    x = _86;
-    float _88 = _42 / 10.0f;
-    y = _88;
-    x = _86 * _88;
-    int _91 = _50 | 0;
-    z = _91;
-    int _93 = _91 & (-1);
-    z = _93;
-    int _94 = _93 ^ 0;
-    z = _94;
-    int _95 = _94 >> 2;
-    z = _95;
-    int _96 = _95 << 4;
-    z = _96;
-    z = _96 % 5;
-    float _104 = float(6);
-    x = _104;
-    y = 6.0f;
-    z = 6;
-    int2 _122 = (~5).xx;
-    int2 w = _122;
-    int2 _123 = ~_122;
-    w = _123;
-    bool _130 = false;
-    if (_123.x == 5)
-    {
-        _130 = _123.y == 5;
-    }
-    else
-    {
-        _130 = false;
-    }
-    bool _134 = false;
-    if (_130)
-    {
-        _134 = _104 == 6.0f;
-    }
-    else
-    {
-        _134 = false;
-    }
-    bool _137 = false;
-    if (_134)
-    {
-        _137 = true;
-    }
-    else
-    {
-        _137 = false;
-    }
-    bool _140 = false;
-    if (_137)
-    {
-        _140 = true;
-    }
-    else
-    {
-        _140 = false;
-    }
-    float4 _141 = 0.0f.xxxx;
-    if (_140)
-    {
-        _141 = _10_colorGreen;
-    }
-    else
-    {
-        _141 = _10_colorRed;
-    }
-    return _141;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Ossfuzz26167.hlsl b/tests/sksl/shared/Ossfuzz26167.hlsl
deleted file mode 100644
index 3b50282..0000000
--- a/tests/sksl/shared/Ossfuzz26167.hlsl
+++ /dev/null
@@ -1,8 +0,0 @@
-void frag_main()
-{
-}
-
-void main()
-{
-    frag_main();
-}
diff --git a/tests/sksl/shared/Ossfuzz26759.hlsl b/tests/sksl/shared/Ossfuzz26759.hlsl
deleted file mode 100644
index db67767..0000000
--- a/tests/sksl/shared/Ossfuzz26759.hlsl
+++ /dev/null
@@ -1,11 +0,0 @@
-void frag_main()
-{
-    int i = 0;
-    int _12 = i;
-    i = _12 - 1;
-}
-
-void main()
-{
-    frag_main();
-}
diff --git a/tests/sksl/shared/Ossfuzz28794.hlsl b/tests/sksl/shared/Ossfuzz28794.hlsl
deleted file mode 100644
index 5b43dda..0000000
--- a/tests/sksl/shared/Ossfuzz28794.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    int i = 1;
-    i = 3;
-    sk_FragColor.x = float(3);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Ossfuzz28904.hlsl b/tests/sksl/shared/Ossfuzz28904.hlsl
deleted file mode 100644
index 22761f4..0000000
--- a/tests/sksl/shared/Ossfuzz28904.hlsl
+++ /dev/null
@@ -1,19 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = 0.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Ossfuzz29085.hlsl b/tests/sksl/shared/Ossfuzz29085.hlsl
deleted file mode 100644
index 3b50282..0000000
--- a/tests/sksl/shared/Ossfuzz29085.hlsl
+++ /dev/null
@@ -1,8 +0,0 @@
-void frag_main()
-{
-}
-
-void main()
-{
-    frag_main();
-}
diff --git a/tests/sksl/shared/Ossfuzz29494.hlsl b/tests/sksl/shared/Ossfuzz29494.hlsl
deleted file mode 100644
index 22761f4..0000000
--- a/tests/sksl/shared/Ossfuzz29494.hlsl
+++ /dev/null
@@ -1,19 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = 0.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Ossfuzz36770.hlsl b/tests/sksl/shared/Ossfuzz36770.hlsl
deleted file mode 100644
index cc3e16b..0000000
--- a/tests/sksl/shared/Ossfuzz36770.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-### Compilation failed:
-
-error: SPIR-V validation error: [VUID-StandaloneSpirv-Location-04919] Member index 0 is missing a location assignment
-  %T = OpTypeStruct %int
-
-OpCapability Shader
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main" %3 %sk_Clockwise
-OpExecutionMode %main OriginUpperLeft
-OpName %T "T"
-OpMemberName %T 0 "x"
-OpName %sk_Clockwise "sk_Clockwise"
-OpName %main "main"
-OpMemberDecorate %T 0 Offset 0
-OpDecorate %T Block
-OpDecorate %sk_Clockwise BuiltIn FrontFacing
-%int = OpTypeInt 32 1
-%T = OpTypeStruct %int
-%_ptr_Input_T = OpTypePointer Input %T
-%3 = OpVariable %_ptr_Input_T Input
-%bool = OpTypeBool
-%_ptr_Input_bool = OpTypePointer Input %bool
-%sk_Clockwise = OpVariable %_ptr_Input_bool Input
-%void = OpTypeVoid
-%11 = OpTypeFunction %void
-%main = OpFunction %void None %11
-%12 = OpLabel
-OpReturn
-OpFunctionEnd
-
-1 error
diff --git a/tests/sksl/shared/Ossfuzz36852.hlsl b/tests/sksl/shared/Ossfuzz36852.hlsl
deleted file mode 100644
index dd639db..0000000
--- a/tests/sksl/shared/Ossfuzz36852.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float2x2 x = float2x2(float2(0.0f, 1.0f), float2(2.0f, 3.0f));
-    float2 y = float4(0.0f, 1.0f, 2.0f, 3.0f).xy;
-    return float4(float4(0.0f, 1.0f, 2.0f, 3.0f).xy, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Ossfuzz37466.hlsl b/tests/sksl/shared/Ossfuzz37466.hlsl
deleted file mode 100644
index 513ff19..0000000
--- a/tests/sksl/shared/Ossfuzz37466.hlsl
+++ /dev/null
@@ -1,11 +0,0 @@
-void frag_main()
-{
-    float y[2] = { 0.0f, 0.0f };
-    float _RESERVED_IDENTIFIER_FIXUP_0_v[2] = y;
-    _RESERVED_IDENTIFIER_FIXUP_0_v[0] = _RESERVED_IDENTIFIER_FIXUP_0_v[1];
-}
-
-void main()
-{
-    frag_main();
-}
diff --git a/tests/sksl/shared/Ossfuzz37677.hlsl b/tests/sksl/shared/Ossfuzz37677.hlsl
deleted file mode 100644
index c2d4bfa..0000000
--- a/tests/sksl/shared/Ossfuzz37677.hlsl
+++ /dev/null
@@ -1,31 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Ossfuzz37900.hlsl b/tests/sksl/shared/Ossfuzz37900.hlsl
deleted file mode 100644
index 9751821..0000000
--- a/tests/sksl/shared/Ossfuzz37900.hlsl
+++ /dev/null
@@ -1,6 +0,0 @@
-### Compilation failed:
-
-error: 2: variable 'a' exceeds the stack size limit
-    int[2147483646] a, b=a, c=a, d=a, e=a, f=a, g=a, h=a, i=a, j=a, k=a;
-    ^^^^^^^^^^^^^^^^^
-1 error
diff --git a/tests/sksl/shared/Ossfuzz41000.hlsl b/tests/sksl/shared/Ossfuzz41000.hlsl
deleted file mode 100644
index 06d568d..0000000
--- a/tests/sksl/shared/Ossfuzz41000.hlsl
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: program does not contain a main() function
-1 error
diff --git a/tests/sksl/shared/Ossfuzz50636.hlsl b/tests/sksl/shared/Ossfuzz50636.hlsl
deleted file mode 100644
index 06d568d..0000000
--- a/tests/sksl/shared/Ossfuzz50636.hlsl
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: program does not contain a main() function
-1 error
diff --git a/tests/sksl/shared/OutParams.hlsl b/tests/sksl/shared/OutParams.hlsl
deleted file mode 100644
index f817ab0..0000000
--- a/tests/sksl/shared/OutParams.hlsl
+++ /dev/null
@@ -1,325 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _32_colorGreen : packoffset(c0);
-    float4 _32_colorRed : packoffset(c1);
-    float4 _32_colorWhite : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void out_half_vh(out float _47)
-{
-    _47 = _32_colorWhite.x;
-}
-
-void out_half2_vh2(out float2 _56)
-{
-    _56 = _32_colorWhite.y.xx;
-}
-
-void out_half3_vh3(out float3 _65)
-{
-    _65 = _32_colorWhite.z.xxx;
-}
-
-void out_half4_vh4(out float4 _73)
-{
-    _73 = _32_colorWhite.w.xxxx;
-}
-
-void out_half2x2_vh22(out float2x2 _82)
-{
-    _82 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
-}
-
-void out_half3x3_vh33(out float3x3 _93)
-{
-    _93 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
-}
-
-void out_half4x4_vh44(out float4x4 _105)
-{
-    _105 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
-}
-
-void out_int_vi(out int _117)
-{
-    _117 = int(_32_colorWhite.x);
-}
-
-void out_int2_vi2(out int2 _126)
-{
-    _126 = int(_32_colorWhite.y).xx;
-}
-
-void out_int3_vi3(out int3 _136)
-{
-    _136 = int(_32_colorWhite.z).xxx;
-}
-
-void out_int4_vi4(out int4 _146)
-{
-    _146 = int(_32_colorWhite.w).xxxx;
-}
-
-void out_float_vf(out float _153)
-{
-    _153 = _32_colorWhite.x;
-}
-
-void out_float2_vf2(out float2 _158)
-{
-    _158 = _32_colorWhite.y.xx;
-}
-
-void out_float3_vf3(out float3 _164)
-{
-    _164 = _32_colorWhite.z.xxx;
-}
-
-void out_float4_vf4(out float4 _170)
-{
-    _170 = _32_colorWhite.w.xxxx;
-}
-
-void out_float2x2_vf22(out float2x2 _176)
-{
-    _176 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
-}
-
-void out_float3x3_vf33(out float3x3 _184)
-{
-    _184 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
-}
-
-void out_float4x4_vf44(out float4x4 _193)
-{
-    _193 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
-}
-
-void out_bool_vb(out bool _205)
-{
-    _205 = _32_colorWhite.x != 0.0f;
-}
-
-void out_bool2_vb2(out bool2 _214)
-{
-    _214 = (_32_colorWhite.y != 0.0f).xx;
-}
-
-void out_bool3_vb3(out bool3 _224)
-{
-    _224 = (_32_colorWhite.z != 0.0f).xxx;
-}
-
-void out_bool4_vb4(out bool4 _234)
-{
-    _234 = (_32_colorWhite.w != 0.0f).xxxx;
-}
-
-float4 main(float2 _242)
-{
-    float _245 = 0.0f;
-    out_half_vh(_245);
-    float h = _245;
-    float2 _249 = 0.0f.xx;
-    out_half2_vh2(_249);
-    float2 h2 = _249;
-    float3 _253 = 0.0f.xxx;
-    out_half3_vh3(_253);
-    float3 h3 = _253;
-    float4 _257 = 0.0f.xxxx;
-    out_half4_vh4(_257);
-    float4 h4 = _257;
-    float _262 = 0.0f;
-    out_half_vh(_262);
-    h3.y = _262;
-    float2 _265 = 0.0f.xx;
-    out_half2_vh2(_265);
-    h3 = float3(_265.x, h3.y, _265.y);
-    float4 _270 = 0.0f.xxxx;
-    out_half4_vh4(_270);
-    h4 = float4(_270.z, _270.w, _270.x, _270.y);
-    float2x2 _276 = float2x2(0.0f.xx, 0.0f.xx);
-    out_half2x2_vh22(_276);
-    float2x2 h2x2 = _276;
-    float3x3 _280 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
-    out_half3x3_vh33(_280);
-    float3x3 h3x3 = _280;
-    float4x4 _284 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
-    out_half4x4_vh44(_284);
-    float4x4 h4x4 = _284;
-    float3 _288 = 0.0f.xxx;
-    out_half3_vh3(_288);
-    h3x3[1] = _288;
-    float _294 = 0.0f;
-    out_half_vh(_294);
-    h4x4[3].w = _294;
-    float _300 = 0.0f;
-    out_half_vh(_300);
-    h2x2[0].x = _300;
-    int _304 = 0;
-    out_int_vi(_304);
-    int i = _304;
-    int2 _308 = int2(0, 0);
-    out_int2_vi2(_308);
-    int2 i2 = _308;
-    int3 _312 = int3(0, 0, 0);
-    out_int3_vi3(_312);
-    int3 i3 = _312;
-    int4 _316 = int4(0, 0, 0, 0);
-    out_int4_vi4(_316);
-    int4 i4 = _316;
-    int3 _319 = int3(0, 0, 0);
-    out_int3_vi3(_319);
-    i4 = int4(_319.x, _319.y, _319.z, i4.w);
-    int _325 = 0;
-    out_int_vi(_325);
-    i2.y = _325;
-    float _329 = 0.0f;
-    out_float_vf(_329);
-    float f = _329;
-    float2 _333 = 0.0f.xx;
-    out_float2_vf2(_333);
-    float2 f2 = _333;
-    float3 _337 = 0.0f.xxx;
-    out_float3_vf3(_337);
-    float3 f3 = _337;
-    float4 _341 = 0.0f.xxxx;
-    out_float4_vf4(_341);
-    float4 f4 = _341;
-    float2 _344 = 0.0f.xx;
-    out_float2_vf2(_344);
-    f3 = float3(_344.x, _344.y, f3.z);
-    float _350 = 0.0f;
-    out_float_vf(_350);
-    f2.x = _350;
-    float2x2 _354 = float2x2(0.0f.xx, 0.0f.xx);
-    out_float2x2_vf22(_354);
-    float2x2 f2x2 = _354;
-    float3x3 _358 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
-    out_float3x3_vf33(_358);
-    float3x3 f3x3 = _358;
-    float4x4 _362 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
-    out_float4x4_vf44(_362);
-    float4x4 f4x4 = _362;
-    float _367 = 0.0f;
-    out_float_vf(_367);
-    f2x2[0].x = _367;
-    bool _371 = false;
-    out_bool_vb(_371);
-    bool b = _371;
-    bool2 _375 = bool2(false, false);
-    out_bool2_vb2(_375);
-    bool2 b2 = _375;
-    bool3 _379 = bool3(false, false, false);
-    out_bool3_vb3(_379);
-    bool3 b3 = _379;
-    bool4 _383 = bool4(false, false, false, false);
-    out_bool4_vb4(_383);
-    bool4 b4 = _383;
-    bool2 _386 = bool2(false, false);
-    out_bool2_vb2(_386);
-    b4 = bool4(_386.x, b4.y, b4.z, _386.y);
-    bool _392 = false;
-    out_bool_vb(_392);
-    b3.z = _392;
-    bool ok = true;
-    bool _424 = false;
-    if (true)
-    {
-        _424 = 1.0f == ((((((h * h2.x) * h3.x) * h4.x) * h2x2[0].x) * h3x3[0].x) * h4x4[0].x);
-    }
-    else
-    {
-        _424 = false;
-    }
-    ok = _424;
-    bool _450 = false;
-    if (_424)
-    {
-        _450 = 1.0f == ((((((f * f2.x) * f3.x) * f4.x) * f2x2[0].x) * f3x3[0].x) * f4x4[0].x);
-    }
-    else
-    {
-        _450 = false;
-    }
-    ok = _450;
-    bool _464 = false;
-    if (_450)
-    {
-        _464 = 1 == (((i * i2.x) * i3.x) * i4.x);
-    }
-    else
-    {
-        _464 = false;
-    }
-    ok = _464;
-    bool _483 = false;
-    if (_464)
-    {
-        bool _472 = false;
-        if (b)
-        {
-            _472 = b2.x;
-        }
-        else
-        {
-            _472 = false;
-        }
-        bool _477 = false;
-        if (_472)
-        {
-            _477 = b3.x;
-        }
-        else
-        {
-            _477 = false;
-        }
-        bool _482 = false;
-        if (_477)
-        {
-            _482 = b4.x;
-        }
-        else
-        {
-            _482 = false;
-        }
-        _483 = _482;
-    }
-    else
-    {
-        _483 = false;
-    }
-    ok = _483;
-    float4 _484 = 0.0f.xxxx;
-    if (_483)
-    {
-        _484 = _32_colorGreen;
-    }
-    else
-    {
-        _484 = _32_colorRed;
-    }
-    return _484;
-}
-
-void frag_main()
-{
-    float2 _42 = 0.0f.xx;
-    sk_FragColor = main(_42);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/OutParamsAreDistinct.hlsl b/tests/sksl/shared/OutParamsAreDistinct.hlsl
deleted file mode 100644
index cd0bb06..0000000
--- a/tests/sksl/shared/OutParamsAreDistinct.hlsl
+++ /dev/null
@@ -1,63 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool out_params_are_distinct_bhh(out float _26, out float _27)
-{
-    _26 = 1.0f;
-    _27 = 2.0f;
-    bool _35 = false;
-    if (true)
-    {
-        _35 = true;
-    }
-    else
-    {
-        _35 = false;
-    }
-    return _35;
-}
-
-float4 main(float2 _37)
-{
-    float x = 0.0f;
-    float _40 = 0.0f;
-    float _41 = 0.0f;
-    bool _42 = out_params_are_distinct_bhh(_40, _41);
-    x = _40;
-    x = _41;
-    float4 _45 = 0.0f.xxxx;
-    if (_42)
-    {
-        _45 = _11_colorGreen;
-    }
-    else
-    {
-        _45 = _11_colorRed;
-    }
-    return _45;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl b/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl
deleted file mode 100644
index af4ccfe..0000000
--- a/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl
+++ /dev/null
@@ -1,63 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _14_colorGreen : packoffset(c0);
-    float4 _14_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static float x = 0.0f;
-
-bool out_params_are_distinct_from_global_bh(out float _29)
-{
-    _29 = 2.0f;
-    bool _38 = false;
-    if (x == 1.0f)
-    {
-        _38 = true;
-    }
-    else
-    {
-        _38 = false;
-    }
-    return _38;
-}
-
-float4 main(float2 _40)
-{
-    x = 1.0f;
-    float _42 = 0.0f;
-    bool _43 = out_params_are_distinct_from_global_bh(_42);
-    x = _42;
-    float4 _45 = 0.0f.xxxx;
-    if (_43)
-    {
-        _45 = _14_colorGreen;
-    }
-    else
-    {
-        _45 = _14_colorRed;
-    }
-    return _45;
-}
-
-void frag_main()
-{
-    float2 _24 = 0.0f.xx;
-    float4 _26 = main(_24);
-    sk_FragColor = _26;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/OutParamsNoInline.hlsl b/tests/sksl/shared/OutParamsNoInline.hlsl
deleted file mode 100644
index 1e23a33..0000000
--- a/tests/sksl/shared/OutParamsNoInline.hlsl
+++ /dev/null
@@ -1,303 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _32_colorGreen : packoffset(c0);
-    float4 _32_colorRed : packoffset(c1);
-    float4 _32_colorWhite : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void out_half_vh(out float _47)
-{
-    _47 = _32_colorWhite.x;
-}
-
-void out_half2_vh2(out float2 _56)
-{
-    _56 = _32_colorWhite.y.xx;
-}
-
-void out_half3_vh3(out float3 _65)
-{
-    _65 = _32_colorWhite.z.xxx;
-}
-
-void out_half4_vh4(out float4 _73)
-{
-    _73 = _32_colorWhite.w.xxxx;
-}
-
-void out_half2x2_vh22(out float2x2 _82)
-{
-    _82 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
-}
-
-void out_half3x3_vh33(out float3x3 _93)
-{
-    _93 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
-}
-
-void out_half4x4_vh44(out float4x4 _105)
-{
-    _105 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
-}
-
-void out_int_vi(out int _117)
-{
-    _117 = int(_32_colorWhite.x);
-}
-
-void out_int2_vi2(out int2 _126)
-{
-    _126 = int(_32_colorWhite.y).xx;
-}
-
-void out_int3_vi3(out int3 _136)
-{
-    _136 = int(_32_colorWhite.z).xxx;
-}
-
-void out_int4_vi4(out int4 _146)
-{
-    _146 = int(_32_colorWhite.w).xxxx;
-}
-
-void out_float_vf(out float _153)
-{
-    _153 = _32_colorWhite.x;
-}
-
-void out_float2_vf2(out float2 _158)
-{
-    _158 = _32_colorWhite.y.xx;
-}
-
-void out_float3_vf3(out float3 _164)
-{
-    _164 = _32_colorWhite.z.xxx;
-}
-
-void out_float4_vf4(out float4 _170)
-{
-    _170 = _32_colorWhite.w.xxxx;
-}
-
-void out_float2x2_vf22(out float2x2 _176)
-{
-    _176 = float2x2(float2(_32_colorWhite.x, 0.0f), float2(0.0f, _32_colorWhite.x));
-}
-
-void out_float3x3_vf33(out float3x3 _184)
-{
-    _184 = float3x3(float3(_32_colorWhite.y, 0.0f, 0.0f), float3(0.0f, _32_colorWhite.y, 0.0f), float3(0.0f, 0.0f, _32_colorWhite.y));
-}
-
-void out_float4x4_vf44(out float4x4 _193)
-{
-    _193 = float4x4(float4(_32_colorWhite.z, 0.0f, 0.0f, 0.0f), float4(0.0f, _32_colorWhite.z, 0.0f, 0.0f), float4(0.0f, 0.0f, _32_colorWhite.z, 0.0f), float4(0.0f, 0.0f, 0.0f, _32_colorWhite.z));
-}
-
-void out_bool_vb(out bool _205)
-{
-    _205 = _32_colorWhite.x != 0.0f;
-}
-
-void out_bool2_vb2(out bool2 _214)
-{
-    _214 = (_32_colorWhite.y != 0.0f).xx;
-}
-
-void out_bool3_vb3(out bool3 _224)
-{
-    _224 = (_32_colorWhite.z != 0.0f).xxx;
-}
-
-void out_bool4_vb4(out bool4 _234)
-{
-    _234 = (_32_colorWhite.w != 0.0f).xxxx;
-}
-
-float4 main(float2 _242)
-{
-    float h = 0.0f;
-    out_half_vh(h);
-    float2 h2 = 0.0f.xx;
-    out_half2_vh2(h2);
-    float3 h3 = 0.0f.xxx;
-    out_half3_vh3(h3);
-    float4 h4 = 0.0f.xxxx;
-    out_half4_vh4(h4);
-    float _254 = 0.0f;
-    out_half_vh(_254);
-    h3.y = _254;
-    float2 _257 = 0.0f.xx;
-    out_half2_vh2(_257);
-    h3 = float3(_257.x, h3.y, _257.y);
-    float4 _262 = 0.0f.xxxx;
-    out_half4_vh4(_262);
-    h4 = float4(_262.z, _262.w, _262.x, _262.y);
-    float2x2 h2x2 = float2x2(0.0f.xx, 0.0f.xx);
-    out_half2x2_vh22(h2x2);
-    float3x3 h3x3 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
-    out_half3x3_vh33(h3x3);
-    float4x4 h4x4 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
-    out_half4x4_vh44(h4x4);
-    float3 _274 = 0.0f.xxx;
-    out_half3_vh3(_274);
-    h3x3[1] = _274;
-    float _280 = 0.0f;
-    out_half_vh(_280);
-    h4x4[3].w = _280;
-    float _286 = 0.0f;
-    out_half_vh(_286);
-    h2x2[0].x = _286;
-    int i = 0;
-    out_int_vi(i);
-    int2 i2 = int2(0, 0);
-    out_int2_vi2(i2);
-    int3 i3 = int3(0, 0, 0);
-    out_int3_vi3(i3);
-    int4 i4 = int4(0, 0, 0, 0);
-    out_int4_vi4(i4);
-    int3 _297 = int3(0, 0, 0);
-    out_int3_vi3(_297);
-    i4 = int4(_297.x, _297.y, _297.z, i4.w);
-    int _303 = 0;
-    out_int_vi(_303);
-    i2.y = _303;
-    float f = 0.0f;
-    out_float_vf(f);
-    float2 f2 = 0.0f.xx;
-    out_float2_vf2(f2);
-    float3 f3 = 0.0f.xxx;
-    out_float3_vf3(f3);
-    float4 f4 = 0.0f.xxxx;
-    out_float4_vf4(f4);
-    float2 _314 = 0.0f.xx;
-    out_float2_vf2(_314);
-    f3 = float3(_314.x, _314.y, f3.z);
-    float _320 = 0.0f;
-    out_float_vf(_320);
-    f2.x = _320;
-    float2x2 f2x2 = float2x2(0.0f.xx, 0.0f.xx);
-    out_float2x2_vf22(f2x2);
-    float3x3 f3x3 = float3x3(0.0f.xxx, 0.0f.xxx, 0.0f.xxx);
-    out_float3x3_vf33(f3x3);
-    float4x4 f4x4 = float4x4(0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx, 0.0f.xxxx);
-    out_float4x4_vf44(f4x4);
-    float _331 = 0.0f;
-    out_float_vf(_331);
-    f2x2[0].x = _331;
-    bool b = false;
-    out_bool_vb(b);
-    bool2 b2 = bool2(false, false);
-    out_bool2_vb2(b2);
-    bool3 b3 = bool3(false, false, false);
-    out_bool3_vb3(b3);
-    bool4 b4 = bool4(false, false, false, false);
-    out_bool4_vb4(b4);
-    bool2 _342 = bool2(false, false);
-    out_bool2_vb2(_342);
-    b4 = bool4(_342.x, b4.y, b4.z, _342.y);
-    bool _348 = false;
-    out_bool_vb(_348);
-    b3.z = _348;
-    bool ok = true;
-    bool _381 = false;
-    if (ok)
-    {
-        _381 = 1.0f == ((((((h * h2.x) * h3.x) * h4.x) * h2x2[0].x) * h3x3[0].x) * h4x4[0].x);
-    }
-    else
-    {
-        _381 = false;
-    }
-    ok = _381;
-    bool _408 = false;
-    if (ok)
-    {
-        _408 = 1.0f == ((((((f * f2.x) * f3.x) * f4.x) * f2x2[0].x) * f3x3[0].x) * f4x4[0].x);
-    }
-    else
-    {
-        _408 = false;
-    }
-    ok = _408;
-    bool _423 = false;
-    if (ok)
-    {
-        _423 = 1 == (((i * i2.x) * i3.x) * i4.x);
-    }
-    else
-    {
-        _423 = false;
-    }
-    ok = _423;
-    bool _443 = false;
-    if (ok)
-    {
-        bool _432 = false;
-        if (b)
-        {
-            _432 = b2.x;
-        }
-        else
-        {
-            _432 = false;
-        }
-        bool _437 = false;
-        if (_432)
-        {
-            _437 = b3.x;
-        }
-        else
-        {
-            _437 = false;
-        }
-        bool _442 = false;
-        if (_437)
-        {
-            _442 = b4.x;
-        }
-        else
-        {
-            _442 = false;
-        }
-        _443 = _442;
-    }
-    else
-    {
-        _443 = false;
-    }
-    ok = _443;
-    float4 _445 = 0.0f.xxxx;
-    if (ok)
-    {
-        _445 = _32_colorGreen;
-    }
-    else
-    {
-        _445 = _32_colorRed;
-    }
-    return _445;
-}
-
-void frag_main()
-{
-    float2 _42 = 0.0f.xx;
-    sk_FragColor = main(_42);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/OutParamsTricky.hlsl b/tests/sksl/shared/OutParamsTricky.hlsl
deleted file mode 100644
index 5c87a4f..0000000
--- a/tests/sksl/shared/OutParamsTricky.hlsl
+++ /dev/null
@@ -1,63 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _12_colorGreen : packoffset(c0);
-    float4 _12_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float2 tricky_h2hhh2h(float _27, float _28, inout float2 _29, float _30)
-{
-    _29 = _29.yx;
-    return float2(_27 + _28, _30);
-}
-
-void func_vh4(inout float4 _41)
-{
-    float _45 = 1.0f;
-    float _47 = 2.0f;
-    float2 _50 = _41.xz;
-    float _52 = 5.0f;
-    float2 _53 = tricky_h2hhh2h(_45, _47, _50, _52);
-    _41 = float4(_50.x, _41.y, _50.y, _41.w);
-    float2 t = _53;
-    _41 = float4(_41.x, _53.x, _41.z, _53.y);
-}
-
-float4 main(float2 _60)
-{
-    float4 result = float4(0.0f, 1.0f, 2.0f, 3.0f);
-    float4 _65 = float4(0.0f, 1.0f, 2.0f, 3.0f);
-    func_vh4(_65);
-    result = _65;
-    float4 _72 = 0.0f.xxxx;
-    if (all(bool4(_65.x == float4(2.0f, 3.0f, 0.0f, 5.0f).x, _65.y == float4(2.0f, 3.0f, 0.0f, 5.0f).y, _65.z == float4(2.0f, 3.0f, 0.0f, 5.0f).z, _65.w == float4(2.0f, 3.0f, 0.0f, 5.0f).w)))
-    {
-        _72 = _12_colorGreen;
-    }
-    else
-    {
-        _72 = _12_colorRed;
-    }
-    return _72;
-}
-
-void frag_main()
-{
-    float2 _22 = 0.0f.xx;
-    sk_FragColor = main(_22);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Overflow.hlsl b/tests/sksl/shared/Overflow.hlsl
deleted file mode 100644
index 65781c3..0000000
--- a/tests/sksl/shared/Overflow.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float _39 = (((((((((9.0000007644071214079894667114892e+35f * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f) * 1000000000.0f;
-    float huge = _39;
-    int _64 = (((((((((((((((((((1073741824 * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
-    int hugeI = _64;
-    uint _88 = ((((((((((((((((((2147483648u * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u;
-    uint hugeU = _88;
-    int _107 = ((((((((((((((((16384 * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
-    int hugeS = _107;
-    uint _125 = (((((((((((((((32768u * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u) * 2u;
-    uint hugeUS = _125;
-    int _146 = ((((((((((((((((((int(0x80000000) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
-    int hugeNI = _146;
-    int _164 = ((((((((((((((((-32768) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2) * 2;
-    int hugeNS = _164;
-    int4 _184 = ((((((((((((((int4(1073741824, 1073741824, 1073741824, 1073741824) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2)) * int4(2, 2, 2, 2);
-    int4 hugeIvec = _184;
-    uint4 _203 = (((((((((((((uint4(2147483648u, 2147483648u, 2147483648u, 2147483648u) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u)) * uint4(2u, 2u, 2u, 2u);
-    uint4 hugeUvec = _203;
-    return ((((((((_10_colorGreen * clamp(_39, 0.0f, 1.0f)) * clamp(float(_64), 0.0f, 1.0f)) * clamp(float(_88), 0.0f, 1.0f)) * clamp(float(_107), 0.0f, 1.0f)) * clamp(float(_125), 0.0f, 1.0f)) * clamp(float(_146), 0.0f, 1.0f)) * clamp(float(_164), 0.0f, 1.0f)) * clamp(float4(float(_184.x), float(_184.y), float(_184.z), float(_184.w)), 0.0f.xxxx, 1.0f.xxxx)) * clamp(float4(float(_203.x), float(_203.y), float(_203.z), float(_203.w)), 0.0f.xxxx, 1.0f.xxxx);
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/RectangleTexture.hlsl b/tests/sksl/shared/RectangleTexture.hlsl
deleted file mode 100644
index 8a47a62..0000000
--- a/tests/sksl/shared/RectangleTexture.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-Texture2D<float4> test2D : register(t0, space0);
-SamplerState _test2D_sampler : register(s0, space0);
-Texture2D<float4> test2DRect : register(t1, space0);
-SamplerState _test2DRect_sampler : register(s1, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = test2D.Sample(_test2D_sampler, 0.5f.xx);
-    sk_FragColor = test2DRect.Sample(_test2DRect_sampler, 0.5f.xx);
-    sk_FragColor = test2DRect.Sample(_test2DRect_sampler, 0.5f.xxx.xy / 0.5f.xxx.z);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ResizeMatrix.hlsl b/tests/sksl/shared/ResizeMatrix.hlsl
deleted file mode 100644
index 4af7952..0000000
--- a/tests/sksl/shared/ResizeMatrix.hlsl
+++ /dev/null
@@ -1,60 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float result = 0.0f;
-    float2x2 a = float2x2(float3(1.0f, 0.0f, 0.0f).xy, float3(0.0f, 1.0f, 0.0f).xy);
-    float _46 = 0.0f + a[0].x;
-    result = _46;
-    float2x2 b = float2x2(float4(1.0f, 0.0f, 0.0f, 0.0f).xy, float4(0.0f, 1.0f, 0.0f, 0.0f).xy);
-    float _60 = _46 + b[0].x;
-    result = _60;
-    float3x3 c = float3x3(float4(1.0f, 0.0f, 0.0f, 0.0f).xyz, float4(0.0f, 1.0f, 0.0f, 0.0f).xyz, float4(0.0f, 0.0f, 1.0f, 0.0f).xyz);
-    float _71 = _60 + c[0].x;
-    result = _71;
-    float3x3 d = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
-    float _79 = _71 + d[0].x;
-    result = _79;
-    float4x4 e = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
-    float _86 = _79 + e[0].x;
-    result = _86;
-    float2x2 f = float2x2(float4(1.0f, 0.0f, 0.0f, 0.0f).xyz.xy, float4(0.0f, 1.0f, 0.0f, 0.0f).xyz.xy);
-    float _98 = _86 + f[0].x;
-    result = _98;
-    float4 _101 = 0.0f.xxxx;
-    if (_98 == 6.0f)
-    {
-        _101 = _10_colorGreen;
-    }
-    else
-    {
-        _101 = _10_colorRed;
-    }
-    return _101;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ResizeMatrixNonsquare.hlsl b/tests/sksl/shared/ResizeMatrixNonsquare.hlsl
deleted file mode 100644
index 2696269..0000000
--- a/tests/sksl/shared/ResizeMatrixNonsquare.hlsl
+++ /dev/null
@@ -1,60 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float result = 0.0f;
-    float3x3 g = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
-    float _45 = 0.0f + g[0].x;
-    result = _45;
-    float3x3 h = float3x3(float3(1.0f, 0.0f, 0.0f), float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f));
-    float _54 = _45 + h[0].x;
-    result = _54;
-    float4x4 i = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
-    float _72 = _54 + i[0].x;
-    result = _72;
-    float4x4 j = float4x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f), float4(0.0f, 0.0f, 1.0f, 0.0f), float4(0.0f, 0.0f, 0.0f, 1.0f));
-    float _81 = _72 + j[0].x;
-    result = _81;
-    float2x4 k = float2x4(float4(1.0f, 0.0f, 0.0f, 0.0f), float4(0.0f, 1.0f, 0.0f, 0.0f));
-    float _87 = _81 + k[0].x;
-    result = _87;
-    float4x2 l = float4x2(float4(1.0f, 0.0f, 0.0f, 0.0f).xy, float4(0.0f, 1.0f, 0.0f, 0.0f).xy, 0.0f.xx, 0.0f.xx);
-    float _96 = _87 + l[0].x;
-    result = _96;
-    float4 _99 = 0.0f.xxxx;
-    if (_96 == 6.0f)
-    {
-        _99 = _10_colorGreen;
-    }
-    else
-    {
-        _99 = _10_colorRed;
-    }
-    return _99;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ReturnBadTypeFromMain.hlsl b/tests/sksl/shared/ReturnBadTypeFromMain.hlsl
deleted file mode 100644
index a149e76..0000000
--- a/tests/sksl/shared/ReturnBadTypeFromMain.hlsl
+++ /dev/null
@@ -1,29 +0,0 @@
-### Compilation failed:
-
-error: SPIR-V validation error: [VUID-StandaloneSpirv-None-04633] OpEntryPoint Entry Point <id> '2[%main]'s function return type is not void.
-  OpEntryPoint Fragment %main "main" %sk_Clockwise
-
-OpCapability Shader
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main" %sk_Clockwise
-OpExecutionMode %main OriginUpperLeft
-OpName %sk_Clockwise "sk_Clockwise"
-OpName %main "main"
-OpDecorate %sk_Clockwise BuiltIn FrontFacing
-%bool = OpTypeBool
-%_ptr_Input_bool = OpTypePointer Input %bool
-%sk_Clockwise = OpVariable %_ptr_Input_bool Input
-%int = OpTypeInt 32 1
-%v3int = OpTypeVector %int 3
-%8 = OpTypeFunction %v3int
-%int_1 = OpConstant %int 1
-%int_2 = OpConstant %int 2
-%int_3 = OpConstant %int 3
-%13 = OpConstantComposite %v3int %int_1 %int_2 %int_3
-%main = OpFunction %v3int None %8
-%9 = OpLabel
-OpReturnValue %13
-OpFunctionEnd
-
-1 error
diff --git a/tests/sksl/shared/ReturnColorFromMain.hlsl b/tests/sksl/shared/ReturnColorFromMain.hlsl
deleted file mode 100644
index 3edcf24..0000000
--- a/tests/sksl/shared/ReturnColorFromMain.hlsl
+++ /dev/null
@@ -1,25 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    return float4(1.0f, 2.0f, 3.0f, 4.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl b/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl
deleted file mode 100644
index bb2612c..0000000
--- a/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl
+++ /dev/null
@@ -1,163 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _15_colorGreen : packoffset(c0);
-    float4 _15_colorRed : packoffset(c1);
-    float _15_unknownInput : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool return_on_both_sides_b()
-{
-    if (_15_unknownInput == 1.0f)
-    {
-        return true;
-    }
-    else
-    {
-        return true;
-    }
-}
-
-bool for_inside_body_b()
-{
-    for (int x = 0; x <= 10; x++)
-    {
-        return true;
-    }
-}
-
-bool after_for_body_b()
-{
-    for (int x = 0; x <= 10; x++)
-    {
-    }
-    return true;
-}
-
-bool for_with_double_sided_conditional_return_b()
-{
-    for (int x = 0; x <= 10; x++)
-    {
-        if (_15_unknownInput == 1.0f)
-        {
-            return true;
-        }
-        else
-        {
-            return true;
-        }
-    }
-}
-
-bool if_else_chain_b()
-{
-    if (_15_unknownInput == 1.0f)
-    {
-        return true;
-    }
-    else
-    {
-        if (_15_unknownInput == 2.0f)
-        {
-            return false;
-        }
-        else
-        {
-            if (_15_unknownInput == 3.0f)
-            {
-                return true;
-            }
-            else
-            {
-                if (_15_unknownInput == 4.0f)
-                {
-                    return false;
-                }
-                else
-                {
-                    return true;
-                }
-            }
-        }
-    }
-}
-
-float4 main(float2 _114)
-{
-    bool _119 = false;
-    if (true)
-    {
-        _119 = return_on_both_sides_b();
-    }
-    else
-    {
-        _119 = false;
-    }
-    bool _123 = false;
-    if (_119)
-    {
-        _123 = for_inside_body_b();
-    }
-    else
-    {
-        _123 = false;
-    }
-    bool _127 = false;
-    if (_123)
-    {
-        _127 = after_for_body_b();
-    }
-    else
-    {
-        _127 = false;
-    }
-    bool _131 = false;
-    if (_127)
-    {
-        _131 = for_with_double_sided_conditional_return_b();
-    }
-    else
-    {
-        _131 = false;
-    }
-    bool _135 = false;
-    if (_131)
-    {
-        _135 = if_else_chain_b();
-    }
-    else
-    {
-        _135 = false;
-    }
-    float4 _136 = 0.0f.xxxx;
-    if (_135)
-    {
-        _136 = _15_colorGreen;
-    }
-    else
-    {
-        _136 = _15_colorRed;
-    }
-    return _136;
-}
-
-void frag_main()
-{
-    float2 _25 = 0.0f.xx;
-    sk_FragColor = main(_25);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl b/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl
deleted file mode 100644
index ef14708..0000000
--- a/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl
+++ /dev/null
@@ -1,320 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _22_colorGreen : packoffset(c0);
-    float4 _22_colorRed : packoffset(c1);
-    float _22_unknownInput : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool inside_while_loop_b()
-{
-    while (_22_unknownInput == 123.0f)
-    {
-        return false;
-    }
-    return true;
-}
-
-bool inside_infinite_do_loop_b()
-{
-    do
-    {
-        return true;
-    } while (true);
-}
-
-bool inside_infinite_while_loop_b()
-{
-    while (true)
-    {
-        return true;
-    }
-}
-
-bool after_do_loop_b()
-{
-    do
-    {
-        break;
-    } while (true);
-    return true;
-}
-
-bool after_while_loop_b()
-{
-    while (!true)
-    {
-        break;
-    }
-    return true;
-}
-
-bool switch_with_all_returns_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            return true;
-        }
-        case 2:
-        {
-            return false;
-        }
-        default:
-        {
-            return false;
-        }
-    }
-}
-
-bool switch_fallthrough_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            return true;
-        }
-        case 2:
-        {
-            return false;
-        }
-        default:
-        {
-            return false;
-        }
-    }
-}
-
-bool switch_fallthrough_twice_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            return true;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool switch_with_break_in_loop_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            for (int x = 0; !(x <= 10); x++)
-            {
-                break;
-            }
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool switch_with_continue_in_loop_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            for (int x = 0; x <= 10; x++)
-            {
-            }
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool switch_with_if_that_returns_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            if (_22_unknownInput == 123.0f)
-            {
-                return false;
-            }
-            else
-            {
-                return true;
-            }
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool switch_with_one_sided_if_then_fallthrough_b()
-{
-    switch (int(_22_unknownInput))
-    {
-        case 1:
-        {
-            if (_22_unknownInput == 123.0f)
-            {
-                return false;
-            }
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-float4 main(float2 _163)
-{
-    bool _169 = false;
-    if (inside_while_loop_b())
-    {
-        _169 = inside_infinite_do_loop_b();
-    }
-    else
-    {
-        _169 = false;
-    }
-    bool _173 = false;
-    if (_169)
-    {
-        _173 = inside_infinite_while_loop_b();
-    }
-    else
-    {
-        _173 = false;
-    }
-    bool _177 = false;
-    if (_173)
-    {
-        _177 = after_do_loop_b();
-    }
-    else
-    {
-        _177 = false;
-    }
-    bool _181 = false;
-    if (_177)
-    {
-        _181 = after_while_loop_b();
-    }
-    else
-    {
-        _181 = false;
-    }
-    bool _185 = false;
-    if (_181)
-    {
-        _185 = switch_with_all_returns_b();
-    }
-    else
-    {
-        _185 = false;
-    }
-    bool _189 = false;
-    if (_185)
-    {
-        _189 = switch_fallthrough_b();
-    }
-    else
-    {
-        _189 = false;
-    }
-    bool _193 = false;
-    if (_189)
-    {
-        _193 = switch_fallthrough_twice_b();
-    }
-    else
-    {
-        _193 = false;
-    }
-    bool _197 = false;
-    if (_193)
-    {
-        _197 = switch_with_break_in_loop_b();
-    }
-    else
-    {
-        _197 = false;
-    }
-    bool _201 = false;
-    if (_197)
-    {
-        _201 = switch_with_continue_in_loop_b();
-    }
-    else
-    {
-        _201 = false;
-    }
-    bool _205 = false;
-    if (_201)
-    {
-        _205 = switch_with_if_that_returns_b();
-    }
-    else
-    {
-        _205 = false;
-    }
-    bool _209 = false;
-    if (_205)
-    {
-        _209 = switch_with_one_sided_if_then_fallthrough_b();
-    }
-    else
-    {
-        _209 = false;
-    }
-    float4 _210 = 0.0f.xxxx;
-    if (_209)
-    {
-        _210 = _22_colorGreen;
-    }
-    else
-    {
-        _210 = _22_colorRed;
-    }
-    return _210;
-}
-
-void frag_main()
-{
-    float2 _32 = 0.0f.xx;
-    sk_FragColor = main(_32);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SampleLocations.hlsl b/tests/sksl/shared/SampleLocations.hlsl
deleted file mode 100644
index 37572a9..0000000
--- a/tests/sksl/shared/SampleLocations.hlsl
+++ /dev/null
@@ -1,84 +0,0 @@
-static float4 gl_Position;
-static int gl_VertexIndex;
-static int gl_InstanceIndex;
-static float2 vcoord_Stage0;
-
-struct SPIRV_Cross_Input
-{
-    uint gl_VertexIndex : SV_VertexID;
-    uint gl_InstanceIndex : SV_InstanceID;
-};
-
-struct SPIRV_Cross_Output
-{
-    noperspective float2 vcoord_Stage0 : TEXCOORD1;
-    float4 gl_Position : SV_Position;
-};
-
-void vert_main()
-{
-    int _22 = gl_InstanceIndex % 200;
-    int x = _22;
-    int _25 = gl_InstanceIndex / 200;
-    int y = _25;
-    int _31 = (gl_InstanceIndex * 929) % 17;
-    int ileft = _31;
-    int _40 = (_31 + 1) + ((gl_InstanceIndex * 1637) % (17 - _31));
-    int iright = _40;
-    int _45 = (gl_InstanceIndex * 313) % 17;
-    int itop = _45;
-    int _53 = (_45 + 1) + ((gl_InstanceIndex * 1901) % (17 - _45));
-    int ibot = _53;
-    float outset = 0.03125f;
-    float _63 = 0.0f;
-    if (0 == ((_22 + _25) % 2))
-    {
-        _63 = -0.03125f;
-    }
-    else
-    {
-        _63 = 0.03125f;
-    }
-    outset = _63;
-    float _73 = (float(_31) * 0.0625f) - _63;
-    float l = _73;
-    float _77 = (float(_40) * 0.0625f) + _63;
-    float r = _77;
-    float t = (float(_45) * 0.0625f) - _63;
-    float b = (float(_53) * 0.0625f) + _63;
-    float _92 = 0.0f;
-    if (0 == (gl_VertexIndex % 2))
-    {
-        _92 = _73;
-    }
-    else
-    {
-        _92 = _77;
-    }
-    float2 vertexpos = 0.0f.xx;
-    vertexpos.x = float(_22) + _92;
-    float _104 = 0.0f;
-    if (0 == (gl_VertexIndex / 2))
-    {
-        _104 = t;
-    }
-    else
-    {
-        _104 = b;
-    }
-    vertexpos.y = float(y) + _104;
-    vcoord_Stage0.x = float((0 == (gl_VertexIndex % 2)) ? (-1) : 1);
-    vcoord_Stage0.y = float((0 == (gl_VertexIndex / 2)) ? (-1) : 1);
-    gl_Position = float4(vertexpos.x, vertexpos.y, 0.0f, 1.0f);
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_VertexIndex = int(stage_input.gl_VertexIndex);
-    gl_InstanceIndex = int(stage_input.gl_InstanceIndex);
-    vert_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.gl_Position = gl_Position;
-    stage_output.vcoord_Stage0 = vcoord_Stage0;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl b/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl
deleted file mode 100644
index 84f9097..0000000
--- a/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl
+++ /dev/null
@@ -1,61 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float f = _10_colorGreen.y;
-    int _39 = int(_10_colorGreen.y);
-    int i = _39;
-    bool _45 = _10_colorGreen.y != 0.0f;
-    bool b = _45;
-    float f1 = _10_colorGreen.y;
-    float _48 = float(_39);
-    float f2 = _48;
-    float _50 = float(_45);
-    float f3 = _50;
-    int _53 = int(_10_colorGreen.y);
-    int i1 = _53;
-    int i2 = _39;
-    int _56 = int(_45);
-    int i3 = _56;
-    bool _59 = _10_colorGreen.y != 0.0f;
-    bool b1 = _59;
-    bool _61 = _39 != 0;
-    bool b2 = _61;
-    bool b3 = _45;
-    float4 _79 = 0.0f.xxxx;
-    if (((((((((_10_colorGreen.y + _48) + _50) + float(_53)) + float(_39)) + float(_56)) + float(_59)) + float(_61)) + float(_45)) == 9.0f)
-    {
-        _79 = _10_colorGreen;
-    }
-    else
-    {
-        _79 = _10_colorRed;
-    }
-    return _79;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl b/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl
deleted file mode 100644
index 19885ce..0000000
--- a/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl
+++ /dev/null
@@ -1,76 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float f = _10_colorGreen.y;
-    int _39 = int(_10_colorGreen.y);
-    int i = _39;
-    uint _46 = uint(_10_colorGreen.y);
-    uint u = _46;
-    bool _52 = _10_colorGreen.y != 0.0f;
-    bool b = _52;
-    float f1 = _10_colorGreen.y;
-    float _55 = float(_39);
-    float f2 = _55;
-    float _57 = float(_46);
-    float f3 = _57;
-    float _59 = float(_52);
-    float f4 = _59;
-    int _62 = int(_10_colorGreen.y);
-    int i1 = _62;
-    int i2 = _39;
-    int _65 = int(_46);
-    int i3 = _65;
-    int _67 = int(_52);
-    int i4 = _67;
-    uint _70 = uint(_10_colorGreen.y);
-    uint u1 = _70;
-    uint _72 = uint(_39);
-    uint u2 = _72;
-    uint u3 = _46;
-    uint _75 = uint(_52);
-    uint u4 = _75;
-    bool _79 = _10_colorGreen.y != 0.0f;
-    bool b1 = _79;
-    bool _81 = _39 != 0;
-    bool b2 = _81;
-    bool _83 = _46 != 0u;
-    bool b3 = _83;
-    bool b4 = _52;
-    float4 _114 = 0.0f.xxxx;
-    if ((((((((((((((((_10_colorGreen.y + _55) + _57) + _59) + float(_62)) + float(_39)) + float(_65)) + float(_67)) + float(_70)) + float(_72)) + float(_46)) + float(_75)) + float(_79)) + float(_81)) + float(_83)) + float(_52)) == 16.0f)
-    {
-        _114 = _10_colorGreen;
-    }
-    else
-    {
-        _114 = _10_colorRed;
-    }
-    return _114;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/ScopedSymbol.hlsl b/tests/sksl/shared/ScopedSymbol.hlsl
deleted file mode 100644
index 683e5c0..0000000
--- a/tests/sksl/shared/ScopedSymbol.hlsl
+++ /dev/null
@@ -1,110 +0,0 @@
-struct S
-{
-    int i;
-};
-
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _17_colorGreen : packoffset(c0);
-    float4 _17_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static int glob = 0;
-
-bool block_variable_hides_global_variable_b()
-{
-    return glob == 2;
-}
-
-bool local_variable_hides_struct_b()
-{
-    bool S_1 = true;
-    return true;
-}
-
-bool local_struct_variable_hides_struct_type_b()
-{
-    S _44 = { 1 };
-    S S_1 = _44;
-    return S_1.i == 1;
-}
-
-bool local_variable_hides_global_variable_b()
-{
-    int glob_1 = 1;
-    return true;
-}
-
-float4 main(float2 _53)
-{
-    glob = 2;
-    bool _59 = false;
-    if (true)
-    {
-        _59 = block_variable_hides_global_variable_b();
-    }
-    else
-    {
-        _59 = false;
-    }
-    bool _63 = false;
-    if (_59)
-    {
-        _63 = local_variable_hides_struct_b();
-    }
-    else
-    {
-        _63 = false;
-    }
-    bool _67 = false;
-    if (_63)
-    {
-        _67 = local_struct_variable_hides_struct_type_b();
-    }
-    else
-    {
-        _67 = false;
-    }
-    bool _71 = false;
-    if (_67)
-    {
-        _71 = local_variable_hides_global_variable_b();
-    }
-    else
-    {
-        _71 = false;
-    }
-    float4 _72 = 0.0f.xxxx;
-    if (_71)
-    {
-        _72 = _17_colorGreen;
-    }
-    else
-    {
-        _72 = _17_colorRed;
-    }
-    return _72;
-}
-
-void frag_main()
-{
-    float2 _27 = 0.0f.xx;
-    float4 _29 = main(_27);
-    sk_FragColor = _29;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StackingVectorCasts.hlsl b/tests/sksl/shared/StackingVectorCasts.hlsl
deleted file mode 100644
index dc4144d..0000000
--- a/tests/sksl/shared/StackingVectorCasts.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticIf.hlsl b/tests/sksl/shared/StaticIf.hlsl
deleted file mode 100644
index 524eb58..0000000
--- a/tests/sksl/shared/StaticIf.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorRed : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 result = _10_colorRed;
-    result = _10_colorGreen;
-    return result;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitch.hlsl b/tests/sksl/shared/StaticSwitch.hlsl
deleted file mode 100644
index dc4144d..0000000
--- a/tests/sksl/shared/StaticSwitch.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithBreak.hlsl b/tests/sksl/shared/StaticSwitchWithBreak.hlsl
deleted file mode 100644
index 5402da6..0000000
--- a/tests/sksl/shared/StaticSwitchWithBreak.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float x = 0.0f;
-    x = 0.0f;
-    sk_FragColor = 0.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl b/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl
deleted file mode 100644
index 5402da6..0000000
--- a/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float x = 0.0f;
-    x = 0.0f;
-    sk_FragColor = 0.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl b/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl
deleted file mode 100644
index 48352ca..0000000
--- a/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float value = 0.0f;
-    switch (0)
-    {
-        case 0:
-        {
-            value = 0.0f;
-            if (_10_unknownInput == 2.0f)
-            {
-                break;
-            }
-            value = 1.0f;
-            break;
-        }
-        case 1:
-        {
-            value = 1.0f;
-            break;
-        }
-    }
-    sk_FragColor = value.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl b/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl
deleted file mode 100644
index c5a8118..0000000
--- a/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float value = 0.0f;
-    switch (0)
-    {
-        case 0:
-        {
-            value = 0.0f;
-            if (_10_unknownInput == 2.0f)
-            {
-                sk_FragColor = 0.0f.xxxx;
-                break;
-            }
-            value = 1.0f;
-            break;
-        }
-        case 1:
-        {
-            value = 1.0f;
-            break;
-        }
-    }
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithContinue.hlsl b/tests/sksl/shared/StaticSwitchWithContinue.hlsl
deleted file mode 100644
index ff10238..0000000
--- a/tests/sksl/shared/StaticSwitchWithContinue.hlsl
+++ /dev/null
@@ -1,46 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float result = 0.0f;
-    for (int x = 0; x <= 1; x++)
-    {
-        result = 2.0f;
-    }
-    float4 _45 = 0.0f.xxxx;
-    if (result == 2.0f)
-    {
-        _45 = _10_colorGreen;
-    }
-    else
-    {
-        _45 = _10_colorRed;
-    }
-    return _45;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl b/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl
deleted file mode 100644
index 522f1e4..0000000
--- a/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl
+++ /dev/null
@@ -1,22 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float x = 0.0f;
-    x = 0.0f;
-    x = 1.0f;
-    sk_FragColor = 1.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl b/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl
deleted file mode 100644
index e943e26..0000000
--- a/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl
+++ /dev/null
@@ -1,21 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float x = 0.0f;
-    x = 1.0f;
-    sk_FragColor = 1.0f.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl
deleted file mode 100644
index 3fa6465..0000000
--- a/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl
+++ /dev/null
@@ -1,38 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float x = 0.0f;
-    switch (0)
-    {
-        case 0:
-        {
-            x = 0.0f;
-            if (0.0f < 1.0f)
-            {
-                break;
-            }
-            x = 1.0f;
-            break;
-        }
-        case 1:
-        {
-            x = 1.0f;
-            break;
-        }
-    }
-    sk_FragColor = x.xxxx;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl
deleted file mode 100644
index 004579f..0000000
--- a/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl
+++ /dev/null
@@ -1,38 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float x = 0.0f;
-    switch (0)
-    {
-        case 0:
-        {
-            x = 0.0f;
-            if (0.0f < 1.0f)
-            {
-                sk_FragColor = 0.0f.xxxx;
-                break;
-            }
-            x = 1.0f;
-            break;
-        }
-        case 1:
-        {
-            x = 1.0f;
-            break;
-        }
-    }
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StructArrayFollowedByScalar.hlsl b/tests/sksl/shared/StructArrayFollowedByScalar.hlsl
deleted file mode 100644
index 4843554..0000000
--- a/tests/sksl/shared/StructArrayFollowedByScalar.hlsl
+++ /dev/null
@@ -1,36 +0,0 @@
-struct S
-{
-    float rgb[3];
-    float a;
-};
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    S s = { { 0.0f, 0.0f, 0.0f }, 0.0f };
-    s.rgb[0] = 0.0f;
-    s.rgb[1] = 1.0f;
-    s.rgb[2] = 0.0f;
-    s.a = 1.0f;
-    return float4(s.rgb[0], s.rgb[1], s.rgb[2], s.a);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StructComparison.hlsl b/tests/sksl/shared/StructComparison.hlsl
deleted file mode 100644
index e6bc15f..0000000
--- a/tests/sksl/shared/StructComparison.hlsl
+++ /dev/null
@@ -1,67 +0,0 @@
-struct S
-{
-    int x;
-    int y;
-    row_major float2x2 m;
-    float a[5];
-};
-
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float _10_testArray[5] : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    float _36[5] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
-    float array[5] = _36;
-    S _46 = { 1, 2, float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), _36 };
-    S s1 = _46;
-    S _51 = { 1, 2, float2x2(float2(1.0f, 0.0f), float2(0.0f, 1.0f)), _10_testArray };
-    S s2 = _51;
-    S _56 = { 1, 2, float2x2(float2(2.0f, 0.0f), float2(0.0f, 2.0f)), _36 };
-    S s3 = _56;
-    bool _96 = false;
-    if (((5.0f == _10_testArray[4]) && ((4.0f == _10_testArray[3]) && ((3.0f == _10_testArray[2]) && ((2.0f == _10_testArray[1]) && (1.0f == _10_testArray[0]))))) && ((all(bool2(float2(1.0f, 0.0f).x == float2(1.0f, 0.0f).x, float2(1.0f, 0.0f).y == float2(1.0f, 0.0f).y)) && all(bool2(float2(0.0f, 1.0f).x == float2(0.0f, 1.0f).x, float2(0.0f, 1.0f).y == float2(0.0f, 1.0f).y))) && (true && true)))
-    {
-        _96 = (false || (false || (false || (false || false)))) || ((any(bool2(float2(1.0f, 0.0f).x != float2(2.0f, 0.0f).x, float2(1.0f, 0.0f).y != float2(2.0f, 0.0f).y)) || any(bool2(float2(0.0f, 1.0f).x != float2(0.0f, 2.0f).x, float2(0.0f, 1.0f).y != float2(0.0f, 2.0f).y))) || (false || false));
-    }
-    else
-    {
-        _96 = false;
-    }
-    float4 _97 = 0.0f.xxxx;
-    if (_96)
-    {
-        _97 = _10_colorGreen;
-    }
-    else
-    {
-        _97 = _10_colorRed;
-    }
-    return _97;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StructMaxDepth.hlsl b/tests/sksl/shared/StructMaxDepth.hlsl
deleted file mode 100644
index 06d568d..0000000
--- a/tests/sksl/shared/StructMaxDepth.hlsl
+++ /dev/null
@@ -1,4 +0,0 @@
-### Compilation failed:
-
-error: program does not contain a main() function
-1 error
diff --git a/tests/sksl/shared/Structs.hlsl b/tests/sksl/shared/Structs.hlsl
deleted file mode 100644
index 8836141..0000000
--- a/tests/sksl/shared/Structs.hlsl
+++ /dev/null
@@ -1,37 +0,0 @@
-struct A
-{
-    int x;
-    int y;
-};
-
-struct B
-{
-    float x;
-    float y[2];
-    A z;
-};
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-static A a1 = { 0, 0 };
-static B b1 = { 0.0f, { 0.0f, 0.0f }, { 0, 0 } };
-
-void frag_main()
-{
-    a1.x = 0;
-    b1.x = 0.0f;
-    sk_FragColor.x = float(a1.x) + b1.x;
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/StructsInFunctions.hlsl b/tests/sksl/shared/StructsInFunctions.hlsl
deleted file mode 100644
index ebbf13c..0000000
--- a/tests/sksl/shared/StructsInFunctions.hlsl
+++ /dev/null
@@ -1,204 +0,0 @@
-struct S
-{
-    float x;
-    int y;
-};
-
-struct Nested
-{
-    S a;
-    S b;
-};
-
-struct Compound
-{
-    float4 f4;
-    int3 i3;
-};
-
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _14_colorRed : packoffset(c0);
-    float4 _14_colorGreen : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-S returns_a_struct_S()
-{
-    S s = { 0.0f, 0 };
-    s.x = 1.0f;
-    s.y = 2;
-    return s;
-}
-
-float accepts_a_struct_fS(S _47)
-{
-    return _47.x + float(_47.y);
-}
-
-void modifies_a_struct_vS(inout S _56)
-{
-    _56.x += 1.0f;
-    _56.y++;
-}
-
-S constructs_a_struct_S()
-{
-    S _45 = { 2.0f, 3 };
-    return _45;
-}
-
-float4 main(float2 _65)
-{
-    S _68 = returns_a_struct_S();
-    S s = _68;
-    S _70 = _68;
-    float x = accepts_a_struct_fS(_70);
-    S _72 = _68;
-    modifies_a_struct_vS(_72);
-    s = _72;
-    S expected = constructs_a_struct_S();
-    Nested n1 = { { 0.0f, 0 }, { 0.0f, 0 } };
-    n1.a = returns_a_struct_S();
-    n1.b = n1.a;
-    Nested n2 = n1;
-    Nested n3 = n1;
-    S _90 = n3.b;
-    modifies_a_struct_vS(_90);
-    n3.b = _90;
-    Compound _104 = { float4(1.0f, 2.0f, 3.0f, 4.0f), int3(5, 6, 7) };
-    Compound c1 = _104;
-    float4 _110 = float4(_14_colorGreen.y, 2.0f, 3.0f, 4.0f);
-    Compound _111 = { _110, int3(5, 6, 7) };
-    Compound c2 = _111;
-    float4 _116 = float4(_14_colorGreen.x, 2.0f, 3.0f, 4.0f);
-    Compound _117 = { _116, int3(5, 6, 7) };
-    Compound c3 = _117;
-    bool _128 = false;
-    if (x == 3.0f)
-    {
-        _128 = s.x == 2.0f;
-    }
-    else
-    {
-        _128 = false;
-    }
-    bool _134 = false;
-    if (_128)
-    {
-        _134 = s.y == 3;
-    }
-    else
-    {
-        _134 = false;
-    }
-    bool _146 = false;
-    if (_134)
-    {
-        _146 = (s.y == expected.y) && (s.x == expected.x);
-    }
-    else
-    {
-        _146 = false;
-    }
-    bool _156 = false;
-    if (_146)
-    {
-        S _150 = { 2.0f, 3 };
-        _156 = (s.y == 3) && (s.x == 2.0f);
-    }
-    else
-    {
-        _156 = false;
-    }
-    bool _168 = false;
-    if (_156)
-    {
-        S _160 = returns_a_struct_S();
-        _168 = (s.y != _160.y) || (s.x != _160.x);
-    }
-    else
-    {
-        _168 = false;
-    }
-    bool _192 = false;
-    if (_168)
-    {
-        _192 = ((n1.b.y == n2.b.y) && (n1.b.x == n2.b.x)) && ((n1.a.y == n2.a.y) && (n1.a.x == n2.a.x));
-    }
-    else
-    {
-        _192 = false;
-    }
-    bool _216 = false;
-    if (_192)
-    {
-        _216 = ((n1.b.y != n3.b.y) || (n1.b.x != n3.b.x)) || ((n1.a.y != n3.a.y) || (n1.a.x != n3.a.x));
-    }
-    else
-    {
-        _216 = false;
-    }
-    bool _236 = false;
-    if (_216)
-    {
-        S _220 = { 1.0f, 2 };
-        S _221 = { 2.0f, 3 };
-        Nested _222 = { _220, _221 };
-        _236 = ((n3.b.y == 3) && (n3.b.x == 2.0f)) && ((n3.a.y == 2) && (n3.a.x == 1.0f));
-    }
-    else
-    {
-        _236 = false;
-    }
-    bool _244 = false;
-    if (_236)
-    {
-        _244 = true && all(bool4(float4(1.0f, 2.0f, 3.0f, 4.0f).x == _110.x, float4(1.0f, 2.0f, 3.0f, 4.0f).y == _110.y, float4(1.0f, 2.0f, 3.0f, 4.0f).z == _110.z, float4(1.0f, 2.0f, 3.0f, 4.0f).w == _110.w));
-    }
-    else
-    {
-        _244 = false;
-    }
-    bool _250 = false;
-    if (_244)
-    {
-        _250 = false || any(bool4(_110.x != _116.x, _110.y != _116.y, _110.z != _116.z, _110.w != _116.w));
-    }
-    else
-    {
-        _250 = false;
-    }
-    bool valid = _250;
-    float4 _251 = 0.0f.xxxx;
-    if (_250)
-    {
-        _251 = _14_colorGreen;
-    }
-    else
-    {
-        _251 = _14_colorRed;
-    }
-    return _251;
-}
-
-void frag_main()
-{
-    float2 _24 = 0.0f.xx;
-    sk_FragColor = main(_24);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwitchWithEarlyReturn.hlsl b/tests/sksl/shared/SwitchWithEarlyReturn.hlsl
deleted file mode 100644
index 74abc03..0000000
--- a/tests/sksl/shared/SwitchWithEarlyReturn.hlsl
+++ /dev/null
@@ -1,456 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _24_colorGreen : packoffset(c0);
-    float4 _24_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool return_in_one_case_bi(int _40)
-{
-    int val = 0;
-    switch (_40)
-    {
-        case 1:
-        {
-            val = 0 + 1;
-            return false;
-        }
-        default:
-        {
-            val++;
-            break;
-        }
-    }
-    return val == 1;
-}
-
-bool return_in_default_bi(int _55)
-{
-    do
-    {
-        return true;
-    } while(false);
-}
-
-bool return_in_every_case_bi(int _61)
-{
-    switch (_61)
-    {
-        case 1:
-        {
-            return false;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool return_in_every_case_no_default_bi(int _67)
-{
-    int val = 0;
-    switch (_67)
-    {
-        case 1:
-        {
-            return false;
-        }
-        case 2:
-        {
-            return true;
-        }
-    }
-    int _74 = 0 + 1;
-    val = _74;
-    return _74 == 1;
-}
-
-bool case_has_break_before_return_bi(int _76)
-{
-    int val = 0;
-    switch (_76)
-    {
-        case 1:
-        {
-            break;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-    int _84 = 0 + 1;
-    val = _84;
-    return _84 == 1;
-}
-
-bool case_has_break_after_return_bi(int _86)
-{
-    switch (_86)
-    {
-        case 1:
-        {
-            return false;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool no_return_in_default_bi(int _93)
-{
-    int val = 0;
-    switch (_93)
-    {
-        case 1:
-        {
-            return false;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            break;
-        }
-    }
-    int _101 = 0 + 1;
-    val = _101;
-    return _101 == 1;
-}
-
-bool empty_default_bi(int _103)
-{
-    int val = 0;
-    switch (_103)
-    {
-        case 1:
-        {
-            return false;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            break;
-        }
-    }
-    int _111 = 0 + 1;
-    val = _111;
-    return _111 == 1;
-}
-
-bool return_with_fallthrough_bi(int _113)
-{
-    switch (_113)
-    {
-        case 1:
-        {
-            return true;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return false;
-        }
-    }
-}
-
-bool fallthrough_ends_in_break_bi(int _120)
-{
-    int val = 0;
-    switch (_120)
-    {
-        case 1:
-        {
-            break;
-        }
-        case 2:
-        {
-            break;
-        }
-        default:
-        {
-            return false;
-        }
-    }
-    int _128 = 0 + 1;
-    val = _128;
-    return _128 == 1;
-}
-
-bool fallthrough_to_default_with_break_bi(int _130)
-{
-    int val = 0;
-    switch (_130)
-    {
-        case 1:
-        {
-            break;
-        }
-        case 2:
-        {
-            break;
-        }
-        default:
-        {
-            break;
-        }
-    }
-    int _138 = 0 + 1;
-    val = _138;
-    return _138 == 1;
-}
-
-bool fallthrough_to_default_with_return_bi(int _140)
-{
-    switch (_140)
-    {
-        case 1:
-        {
-            return true;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool fallthrough_with_loop_break_bi(int _147)
-{
-    int val = 0;
-    switch (_147)
-    {
-        case 1:
-        {
-            for (int i = 0; i < 5; i++)
-            {
-                val++;
-                break;
-            }
-            return true;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-bool fallthrough_with_loop_continue_bi(int _168)
-{
-    int val = 0;
-    switch (_168)
-    {
-        case 1:
-        {
-            for (int i = 0; i < 5; i++)
-            {
-                val++;
-            }
-            return true;
-        }
-        case 2:
-        {
-            return true;
-        }
-        default:
-        {
-            return true;
-        }
-    }
-}
-
-float4 main(float2 _189)
-{
-    int _196 = int(_24_colorGreen.y);
-    int x = _196;
-    int _197 = _196;
-    bool _203 = false;
-    if (return_in_one_case_bi(_197))
-    {
-        int _201 = _196;
-        _203 = return_in_default_bi(_201);
-    }
-    else
-    {
-        _203 = false;
-    }
-    bool _208 = false;
-    if (_203)
-    {
-        int _206 = _196;
-        _208 = return_in_every_case_bi(_206);
-    }
-    else
-    {
-        _208 = false;
-    }
-    bool _213 = false;
-    if (_208)
-    {
-        int _211 = _196;
-        _213 = return_in_every_case_no_default_bi(_211);
-    }
-    else
-    {
-        _213 = false;
-    }
-    bool _218 = false;
-    if (_213)
-    {
-        int _216 = _196;
-        _218 = case_has_break_before_return_bi(_216);
-    }
-    else
-    {
-        _218 = false;
-    }
-    bool _223 = false;
-    if (_218)
-    {
-        int _221 = _196;
-        _223 = case_has_break_after_return_bi(_221);
-    }
-    else
-    {
-        _223 = false;
-    }
-    bool _228 = false;
-    if (_223)
-    {
-        int _226 = _196;
-        _228 = no_return_in_default_bi(_226);
-    }
-    else
-    {
-        _228 = false;
-    }
-    bool _233 = false;
-    if (_228)
-    {
-        int _231 = _196;
-        _233 = empty_default_bi(_231);
-    }
-    else
-    {
-        _233 = false;
-    }
-    bool _238 = false;
-    if (_233)
-    {
-        int _236 = _196;
-        _238 = return_with_fallthrough_bi(_236);
-    }
-    else
-    {
-        _238 = false;
-    }
-    bool _243 = false;
-    if (_238)
-    {
-        int _241 = _196;
-        _243 = fallthrough_ends_in_break_bi(_241);
-    }
-    else
-    {
-        _243 = false;
-    }
-    bool _248 = false;
-    if (_243)
-    {
-        int _246 = _196;
-        _248 = fallthrough_to_default_with_break_bi(_246);
-    }
-    else
-    {
-        _248 = false;
-    }
-    bool _253 = false;
-    if (_248)
-    {
-        int _251 = _196;
-        _253 = fallthrough_to_default_with_return_bi(_251);
-    }
-    else
-    {
-        _253 = false;
-    }
-    bool _258 = false;
-    if (_253)
-    {
-        int _256 = _196;
-        _258 = fallthrough_with_loop_break_bi(_256);
-    }
-    else
-    {
-        _258 = false;
-    }
-    bool _263 = false;
-    if (_258)
-    {
-        int _261 = _196;
-        _263 = fallthrough_with_loop_continue_bi(_261);
-    }
-    else
-    {
-        _263 = false;
-    }
-    float4 _264 = 0.0f.xxxx;
-    if (_263)
-    {
-        _264 = _24_colorGreen;
-    }
-    else
-    {
-        _264 = _24_colorRed;
-    }
-    return _264;
-}
-
-void frag_main()
-{
-    float2 _34 = 0.0f.xx;
-    sk_FragColor = main(_34);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleBoolConstants.hlsl b/tests/sksl/shared/SwizzleBoolConstants.hlsl
deleted file mode 100644
index 07c250c..0000000
--- a/tests/sksl/shared/SwizzleBoolConstants.hlsl
+++ /dev/null
@@ -1,75 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool4 _36 = (_10_colorGreen.y != 0.0f).xxxx;
-    bool4 v = _36;
-    bool _38 = _36.x;
-    bool4 result = bool4(_38, true, true, true);
-    result = bool4(_36.xy, false, true);
-    result = bool4(_38, true, true, false);
-    bool _48 = _36.y;
-    result = bool4(false, _48, true, true);
-    result = bool4(_36.xyz, true);
-    result = bool4(_36.xy, true, true);
-    bool _60 = _36.z;
-    bool4 _61 = bool4(_38, false, _60, true);
-    result = _61;
-    result = bool4(_38, true, false, false);
-    result = bool4(true, _36.yz, false);
-    result = bool4(false, _48, true, false);
-    result = bool4(true, true, _60, false);
-    result = _36;
-    result = bool4(_36.xyz, true);
-    bool _77 = _36.w;
-    result = bool4(_36.xy, false, _77);
-    result = bool4(_36.xy, true, false);
-    result = bool4(_38, true, _36.zw);
-    result = _61;
-    result = bool4(_38, true, true, _77);
-    result = bool4(_38, true, false, true);
-    result = bool4(true, _36.yzw);
-    result = bool4(false, _36.yz, true);
-    result = bool4(false, _48, true, _77);
-    result = bool4(true, _48, true, true);
-    result = bool4(false, false, _36.zw);
-    result = bool4(false, false, _60, true);
-    bool4 _105 = bool4(false, true, true, _77);
-    result = _105;
-    float4 _107 = 0.0f.xxxx;
-    if (any(_105))
-    {
-        _107 = _10_colorGreen;
-    }
-    else
-    {
-        _107 = _10_colorRed;
-    }
-    return _107;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleByConstantIndex.hlsl b/tests/sksl/shared/SwizzleByConstantIndex.hlsl
deleted file mode 100644
index efb5c1f..0000000
--- a/tests/sksl/shared/SwizzleByConstantIndex.hlsl
+++ /dev/null
@@ -1,74 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _RESERVED_IDENTIFIER_FIXUP_0_v = _10_testInputs;
-    float _RESERVED_IDENTIFIER_FIXUP_1_x = _10_testInputs.x;
-    float _RESERVED_IDENTIFIER_FIXUP_2_y = _10_testInputs.y;
-    float _RESERVED_IDENTIFIER_FIXUP_3_z = _10_testInputs.z;
-    float _RESERVED_IDENTIFIER_FIXUP_4_w = _10_testInputs.w;
-    float4 _43 = float4(_10_testInputs);
-    float4 a = _43;
-    float _RESERVED_IDENTIFIER_FIXUP_9_x = _10_testInputs.x;
-    float _RESERVED_IDENTIFIER_FIXUP_10_y = _10_testInputs.y;
-    float _RESERVED_IDENTIFIER_FIXUP_11_z = _10_testInputs.z;
-    float _RESERVED_IDENTIFIER_FIXUP_12_w = _10_testInputs.w;
-    float4 _61 = float4(_10_testInputs.x, _10_testInputs.y, _10_testInputs.z, _10_testInputs.w);
-    float4 b = _61;
-    float4 c = float4(0.0f, 1.0f, 2.0f, 3.0f);
-    bool _79 = false;
-    if (all(bool4(_43.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _43.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _43.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _43.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w)))
-    {
-        _79 = all(bool4(_61.x == float4(-1.25f, 0.0f, 0.75f, 2.25f).x, _61.y == float4(-1.25f, 0.0f, 0.75f, 2.25f).y, _61.z == float4(-1.25f, 0.0f, 0.75f, 2.25f).z, _61.w == float4(-1.25f, 0.0f, 0.75f, 2.25f).w));
-    }
-    else
-    {
-        _79 = false;
-    }
-    bool _83 = false;
-    if (_79)
-    {
-        _83 = true;
-    }
-    else
-    {
-        _83 = false;
-    }
-    float4 _84 = 0.0f.xxxx;
-    if (_83)
-    {
-        _84 = _10_colorGreen;
-    }
-    else
-    {
-        _84 = _10_colorRed;
-    }
-    return _84;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleByIndex.hlsl b/tests/sksl/shared/SwizzleByIndex.hlsl
deleted file mode 100644
index 42982fe..0000000
--- a/tests/sksl/shared/SwizzleByIndex.hlsl
+++ /dev/null
@@ -1,55 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorBlack : packoffset(c1);
-    float4 _10_colorGreen : packoffset(c2);
-    float4 _10_colorRed : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 _RESERVED_IDENTIFIER_FIXUP_0_v = _10_testInputs;
-    int4 _47 = int4(int(_10_colorBlack.x), int(_10_colorBlack.y), int(_10_colorBlack.z), int(_10_colorBlack.w));
-    int4 _RESERVED_IDENTIFIER_FIXUP_1_i = _47;
-    float _51 = _10_testInputs[_47.x];
-    float _RESERVED_IDENTIFIER_FIXUP_2_x = _51;
-    float _54 = _10_testInputs[_47.y];
-    float _RESERVED_IDENTIFIER_FIXUP_3_y = _54;
-    float _57 = _10_testInputs[_47.z];
-    float _RESERVED_IDENTIFIER_FIXUP_4_z = _57;
-    float _60 = _10_testInputs[_47.w];
-    float _RESERVED_IDENTIFIER_FIXUP_5_w = _60;
-    float4 _61 = float4(_51, _54, _57, _60);
-    float4 _67 = 0.0f.xxxx;
-    if (all(bool4(_61.x == float4(-1.25f, -1.25f, -1.25f, 0.0f).x, _61.y == float4(-1.25f, -1.25f, -1.25f, 0.0f).y, _61.z == float4(-1.25f, -1.25f, -1.25f, 0.0f).z, _61.w == float4(-1.25f, -1.25f, -1.25f, 0.0f).w)))
-    {
-        _67 = _10_colorGreen;
-    }
-    else
-    {
-        _67 = _10_colorRed;
-    }
-    return _67;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleConstants.hlsl b/tests/sksl/shared/SwizzleConstants.hlsl
deleted file mode 100644
index 51e7eed..0000000
--- a/tests/sksl/shared/SwizzleConstants.hlsl
+++ /dev/null
@@ -1,91 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_testInputs : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c1);
-    float4 _10_colorRed : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 v = _10_testInputs;
-    float4 _35 = float4(_10_testInputs.x, 1.0f, 1.0f, 1.0f);
-    v = _35;
-    float2 _36 = _35.xy;
-    float _37 = _36.x;
-    v = float4(_37, _36.y, 1.0f, 1.0f);
-    v = float4(_37, 1.0f, 1.0f, 1.0f);
-    v = float4(0.0f, 1.0f, 1.0f, 1.0f);
-    float4 _47 = float4(float4(0.0f, 1.0f, 1.0f, 1.0f).xyz, 1.0f);
-    v = _47;
-    float2 _48 = _47.xy;
-    float _49 = _48.x;
-    v = float4(_49, _48.y, 1.0f, 1.0f);
-    v = float4(_49, 0.0f, 1.0f, 1.0f);
-    float4 _53 = float4(_49, 1.0f, 0.0f, 1.0f);
-    v = _53;
-    float2 _54 = _53.yz;
-    float _55 = _54.x;
-    v = float4(1.0f, _55, _54.y, 1.0f);
-    v = float4(0.0f, _55, 1.0f, 1.0f);
-    v = 1.0f.xxxx;
-    float4 _64 = float4(1.0f.xxxx.xyz, 1.0f);
-    v = _64;
-    float4 _68 = float4(_64.xy, 0.0f, 1.0f);
-    v = _68;
-    float2 _69 = _68.xy;
-    float _70 = _69.x;
-    float4 _72 = float4(_70, _69.y, 1.0f, 0.0f);
-    v = _72;
-    float2 _73 = _72.zw;
-    float _74 = _73.x;
-    v = float4(_70, 1.0f, _74, _73.y);
-    v = float4(_70, 0.0f, _74, 1.0f);
-    v = float4(_70, 1.0f, 1.0f, 1.0f);
-    float4 _79 = float4(_70, 1.0f, 0.0f, 1.0f);
-    v = _79;
-    float4 _84 = float4(1.0f, _79.yzw);
-    v = _84;
-    float2 _85 = _84.yz;
-    float _86 = _85.x;
-    v = float4(0.0f, _86, _85.y, 1.0f);
-    v = float4(0.0f, _86, 1.0f, 1.0f);
-    float4 _90 = float4(1.0f, _86, 1.0f, 1.0f);
-    v = _90;
-    float2 _91 = _90.zw;
-    float _92 = _91.x;
-    v = float4(0.0f, 0.0f, _92, _91.y);
-    v = float4(0.0f, 0.0f, _92, 1.0f);
-    v = float4(0.0f, 1.0f, 1.0f, 1.0f);
-    float4 _97 = 0.0f.xxxx;
-    if (true)
-    {
-        _97 = _10_colorGreen;
-    }
-    else
-    {
-        _97 = _10_colorRed;
-    }
-    return _97;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleLTRB.hlsl b/tests/sksl/shared/SwizzleLTRB.hlsl
deleted file mode 100644
index d92f29e..0000000
--- a/tests/sksl/shared/SwizzleLTRB.hlsl
+++ /dev/null
@@ -1,31 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorRed : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_colorRed.zwyx;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleOpt.hlsl b/tests/sksl/shared/SwizzleOpt.hlsl
deleted file mode 100644
index 8682952..0000000
--- a/tests/sksl/shared/SwizzleOpt.hlsl
+++ /dev/null
@@ -1,95 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorRed : packoffset(c0);
-    float4 _11_colorGreen : packoffset(c1);
-    float4 _11_testInputs : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float fn_hh4(float4 _26)
-{
-    for (int x = 1; x <= 2; x++)
-    {
-        return _26.x;
-    }
-}
-
-float4 main(float2 _45)
-{
-    float4 v = _11_testInputs;
-    float4 _56 = float4(0.0f, _11_testInputs.zyx);
-    v = _56;
-    float4 _60 = float4(0.0f, 0.0f, _56.xw);
-    v = _60;
-    float4 _65 = float4(1.0f, 1.0f, _60.wx);
-    v = _65;
-    float4 _69 = float4(_65.zy, 1.0f, 1.0f);
-    v = _69;
-    float4 _73 = float4(_69.xx, 1.0f, 1.0f);
-    v = _73;
-    float4 _74 = _73.wzwz;
-    v = _74;
-    float4 _75 = _74;
-    float4 _80 = float3(fn_hh4(_75), 123.0f, 456.0f).yyzz;
-    v = _80;
-    float4 _81 = _80;
-    float4 _84 = float3(fn_hh4(_81), 123.0f, 456.0f).yyzz;
-    v = _84;
-    float4 _85 = _84;
-    float4 _87 = float4(123.0f, 456.0f, 456.0f, fn_hh4(_85));
-    v = _87;
-    float4 _88 = _87;
-    float4 _90 = float4(123.0f, 456.0f, 456.0f, fn_hh4(_88));
-    v = _90;
-    float4 _91 = _90;
-    float4 _94 = float3(fn_hh4(_91), 123.0f, 456.0f).yxxz;
-    v = _94;
-    float4 _95 = _94;
-    v = float3(fn_hh4(_95), 123.0f, 456.0f).yxxz;
-    v = float4(1.0f, 1.0f, 2.0f, 3.0f);
-    v = float4(_11_colorRed.xyz, 1.0f);
-    float4 _118 = float4(_11_colorRed.x, 1.0f, _11_colorRed.yz);
-    v = _118;
-    float4 _119 = v;
-    float4 _120 = float4(_118.w, _118.z, _118.y, _118.x);
-    v = _120;
-    float2 _121 = _120.yz;
-    float4 _122 = v;
-    float4 _123 = float4(_121.x, _122.y, _122.z, _121.y);
-    v = _123;
-    float3 _127 = float3(_123.ww, 1.0f);
-    float4 _128 = v;
-    float4 _129 = float4(_127.z, _127.y, _127.x, _128.w);
-    v = _129;
-    float4 _134 = 0.0f.xxxx;
-    if (all(bool4(_129.x == 1.0f.xxxx.x, _129.y == 1.0f.xxxx.y, _129.z == 1.0f.xxxx.z, _129.w == 1.0f.xxxx.w)))
-    {
-        _134 = _11_colorGreen;
-    }
-    else
-    {
-        _134 = _11_colorRed;
-    }
-    return _134;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleScalar.hlsl b/tests/sksl/shared/SwizzleScalar.hlsl
deleted file mode 100644
index f0f2d0d..0000000
--- a/tests/sksl/shared/SwizzleScalar.hlsl
+++ /dev/null
@@ -1,36 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float4 h4 = _10_unknownInput.xxxx;
-    h4 = float4(_10_unknownInput.xx, 0.0f, 1.0f);
-    h4 = float4(0.0f, _10_unknownInput, 1.0f, 0.0f);
-    float4 _48 = float4(0.0f, _10_unknownInput, 0.0f, _10_unknownInput);
-    h4 = _48;
-    return _48;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleScalarBool.hlsl b/tests/sksl/shared/SwizzleScalarBool.hlsl
deleted file mode 100644
index 8e7ec38..0000000
--- a/tests/sksl/shared/SwizzleScalarBool.hlsl
+++ /dev/null
@@ -1,38 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool _33 = _10_unknownInput != 0.0f;
-    bool b = _33;
-    bool4 b4 = _33.xxxx;
-    b4 = bool4(_33.xx, false, true);
-    b4 = bool4(false, _33, true, false);
-    bool4 _46 = bool4(false, _33, false, _33);
-    b4 = _46;
-    return float4(float(false), float(_46.y), float(_46.z), float(_46.w));
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/SwizzleScalarInt.hlsl b/tests/sksl/shared/SwizzleScalarInt.hlsl
deleted file mode 100644
index 07f7ff8..0000000
--- a/tests/sksl/shared/SwizzleScalarInt.hlsl
+++ /dev/null
@@ -1,38 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    int _33 = int(_10_unknownInput);
-    int i = _33;
-    int4 i4 = _33.xxxx;
-    i4 = int4(_33.xx, 0, 1);
-    i4 = int4(0, _33, 1, 0);
-    int4 _45 = int4(0, _33, 0, _33);
-    i4 = _45;
-    return float4(float(0), float(_45.y), float(_45.z), float(_45.w));
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl b/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl
deleted file mode 100644
index cb8be58..0000000
--- a/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl
+++ /dev/null
@@ -1,27 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float r = 0.0f;
-    float g = 1.0f;
-    return float4(0.0f, 1.0f, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl b/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl
deleted file mode 100644
index 4e0e5f6..0000000
--- a/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl
+++ /dev/null
@@ -1,34 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_unknownInput : packoffset(c0);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    float _35 = 1.0f - _10_unknownInput;
-    float r = _35;
-    float g = _10_unknownInput;
-    return float4(_35, _10_unknownInput, 0.0f, 1.0f);
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/TernaryExpression.hlsl b/tests/sksl/shared/TernaryExpression.hlsl
deleted file mode 100644
index f40edd7..0000000
--- a/tests/sksl/shared/TernaryExpression.hlsl
+++ /dev/null
@@ -1,62 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool ok = true;
-    bool _41 = false;
-    if (true)
-    {
-        _41 = (_10_colorGreen.y == 1.0f) ? true : false;
-    }
-    else
-    {
-        _41 = false;
-    }
-    ok = _41;
-    bool _49 = false;
-    if (_41)
-    {
-        _49 = (_10_colorGreen.x == 1.0f) ? false : true;
-    }
-    else
-    {
-        _49 = false;
-    }
-    ok = _49;
-    float4 _50 = 0.0f.xxxx;
-    if (_49)
-    {
-        _50 = _10_colorGreen;
-    }
-    else
-    {
-        _50 = _10_colorRed;
-    }
-    return _50;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Texture1D.hlsl b/tests/sksl/shared/Texture1D.hlsl
deleted file mode 100644
index 7be07a6..0000000
--- a/tests/sksl/shared/Texture1D.hlsl
+++ /dev/null
@@ -1,71 +0,0 @@
-### Compilation failed:
-
-error: SPIR-V validation error: Operand 3 of TypeImage requires one of these capabilities: Sampled1D Image1D 
-  %13 = OpTypeImage %float 1D 0 0 0 1 Unknown
-
-OpCapability Shader
-%1 = OpExtInstImport "GLSL.std.450"
-OpMemoryModel Logical GLSL450
-OpEntryPoint Fragment %main "main" %sk_FragColor %sk_Clockwise
-OpExecutionMode %main OriginUpperLeft
-OpName %sk_FragColor "sk_FragColor"
-OpName %sk_Clockwise "sk_Clockwise"
-OpName %tex "tex"
-OpName %main "main"
-OpName %a "a"
-OpName %b "b"
-OpDecorate %sk_FragColor RelaxedPrecision
-OpDecorate %sk_FragColor Location 0
-OpDecorate %sk_FragColor Index 0
-OpDecorate %sk_Clockwise BuiltIn FrontFacing
-OpDecorate %tex RelaxedPrecision
-OpDecorate %tex Binding 0
-OpDecorate %tex DescriptorSet 0
-OpDecorate %20 RelaxedPrecision
-OpDecorate %24 RelaxedPrecision
-OpDecorate %29 RelaxedPrecision
-OpDecorate %30 RelaxedPrecision
-OpDecorate %33 RelaxedPrecision
-OpDecorate %34 RelaxedPrecision
-OpDecorate %35 RelaxedPrecision
-%float = OpTypeFloat 32
-%v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
-%sk_FragColor = OpVariable %_ptr_Output_v4float Output
-%bool = OpTypeBool
-%_ptr_Input_bool = OpTypePointer Input %bool
-%sk_Clockwise = OpVariable %_ptr_Input_bool Input
-%13 = OpTypeImage %float 1D 0 0 0 1 Unknown
-%12 = OpTypeSampledImage %13
-%_ptr_UniformConstant_12 = OpTypePointer UniformConstant %12
-%tex = OpVariable %_ptr_UniformConstant_12 UniformConstant
-%void = OpTypeVoid
-%15 = OpTypeFunction %void
-%_ptr_Function_v4float = OpTypePointer Function %v4float
-%float_0 = OpConstant %float 0
-%v2float = OpTypeVector %float 2
-%26 = OpConstantComposite %v2float %float_0 %float_0
-%main = OpFunction %void None %15
-%16 = OpLabel
-%a = OpVariable %_ptr_Function_v4float Function
-%b = OpVariable %_ptr_Function_v4float Function
-%20 = OpLoad %12 %tex
-%19 = OpImageSampleImplicitLod %v4float %20 %float_0
-OpStore %a %19
-%24 = OpLoad %12 %tex
-%23 = OpImageSampleProjImplicitLod %v4float %24 %26
-OpStore %b %23
-%27 = OpLoad %v4float %a
-%28 = OpVectorShuffle %v2float %27 %27 0 1
-%29 = OpCompositeExtract %float %28 0
-%30 = OpCompositeExtract %float %28 1
-%31 = OpLoad %v4float %b
-%32 = OpVectorShuffle %v2float %31 %31 2 3
-%33 = OpCompositeExtract %float %32 0
-%34 = OpCompositeExtract %float %32 1
-%35 = OpCompositeConstruct %v4float %29 %30 %33 %34
-OpStore %sk_FragColor %35
-OpReturn
-OpFunctionEnd
-
-1 error
diff --git a/tests/sksl/shared/Texture2D.hlsl b/tests/sksl/shared/Texture2D.hlsl
deleted file mode 100644
index 1163521..0000000
--- a/tests/sksl/shared/Texture2D.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-Texture2D<float4> tex : register(t0, space0);
-SamplerState _tex_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _19 = tex.Sample(_tex_sampler, 0.0f.xx);
-    float4 a = _19;
-    float4 _25 = tex.Sample(_tex_sampler, 0.0f.xxx.xy / 0.0f.xxx.z);
-    float4 b = _25;
-    sk_FragColor = float4(_19.xy, _25.zw);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/TextureSharpen.hlsl b/tests/sksl/shared/TextureSharpen.hlsl
deleted file mode 100644
index b79e83d..0000000
--- a/tests/sksl/shared/TextureSharpen.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-Texture2D<float4> s : register(t0, space0);
-SamplerState _s_sampler : register(s0, space0);
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    float4 _19 = s.SampleBias(_s_sampler, 0.0f.xx, -0.4749999940395355224609375f);
-    float4 a = _19;
-    float4 _26 = s.SampleBias(_s_sampler, 0.0f.xxx.xy / 0.0f.xxx.z, -0.4749999940395355224609375f);
-    float4 b = _26;
-    sk_FragColor = float4(_19.xy, _26.xy);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/UnaryPositiveNegative.hlsl b/tests/sksl/shared/UnaryPositiveNegative.hlsl
deleted file mode 100644
index e96dd15..0000000
--- a/tests/sksl/shared/UnaryPositiveNegative.hlsl
+++ /dev/null
@@ -1,161 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _16_colorWhite : packoffset(c0);
-    float4 _16_colorGreen : packoffset(c1);
-    float4 _16_colorRed : packoffset(c2);
-    row_major float2x2 _16_testMatrix2x2 : packoffset(c3);
-    row_major float3x3 _16_testMatrix3x3 : packoffset(c5);
-    row_major float4x4 _16_testMatrix4x4 : packoffset(c8);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_iscalar_b()
-{
-    int _43 = int(_16_colorWhite.x);
-    int x = _43;
-    int _44 = -_43;
-    x = _44;
-    return _44 == (-1);
-}
-
-bool test_fvec_b()
-{
-    float2 x = _16_colorWhite.xy;
-    float2 _52 = -_16_colorWhite.xy;
-    x = _52;
-    return all(bool2(_52.x == (-1.0f).xx.x, _52.y == (-1.0f).xx.y));
-}
-
-bool test_ivec_b()
-{
-    int2 _66 = int(_16_colorWhite.x).xx;
-    int2 x = _66;
-    int2 _67 = -_66;
-    x = _67;
-    return all(bool2(_67.x == int2(-1, -1).x, _67.y == int2(-1, -1).y));
-}
-
-bool test_mat2_b()
-{
-    float2x2 negated = float2x2(float2(-1.0f, -2.0f), float2(-3.0f, -4.0f));
-    float2x2 x = _16_testMatrix2x2;
-    float2 _86 = -_16_testMatrix2x2[0];
-    float2 _88 = -_16_testMatrix2x2[1];
-    x = float2x2(_86, _88);
-    return all(bool2(_86.x == float2(-1.0f, -2.0f).x, _86.y == float2(-1.0f, -2.0f).y)) && all(bool2(_88.x == float2(-3.0f, -4.0f).x, _88.y == float2(-3.0f, -4.0f).y));
-}
-
-bool test_mat3_b()
-{
-    float3x3 negated = float3x3(float3(-1.0f, -2.0f, -3.0f), float3(-4.0f, -5.0f, -6.0f), float3(-7.0f, -8.0f, -9.0f));
-    float3x3 x = _16_testMatrix3x3;
-    float3 _113 = -_16_testMatrix3x3[0];
-    float3 _115 = -_16_testMatrix3x3[1];
-    float3 _117 = -_16_testMatrix3x3[2];
-    x = float3x3(_113, _115, _117);
-    return (all(bool3(_113.x == float3(-1.0f, -2.0f, -3.0f).x, _113.y == float3(-1.0f, -2.0f, -3.0f).y, _113.z == float3(-1.0f, -2.0f, -3.0f).z)) && all(bool3(_115.x == float3(-4.0f, -5.0f, -6.0f).x, _115.y == float3(-4.0f, -5.0f, -6.0f).y, _115.z == float3(-4.0f, -5.0f, -6.0f).z))) && all(bool3(_117.x == float3(-7.0f, -8.0f, -9.0f).x, _117.y == float3(-7.0f, -8.0f, -9.0f).y, _117.z == float3(-7.0f, -8.0f, -9.0f).z));
-}
-
-bool test_mat4_b()
-{
-    float4x4 negated = float4x4(float4(-1.0f, -2.0f, -3.0f, -4.0f), float4(-5.0f, -6.0f, -7.0f, -8.0f), float4(-9.0f, -10.0f, -11.0f, -12.0f), float4(-13.0f, -14.0f, -15.0f, -16.0f));
-    float4x4 x = _16_testMatrix4x4;
-    float4 _149 = -_16_testMatrix4x4[0];
-    float4 _151 = -_16_testMatrix4x4[1];
-    float4 _153 = -_16_testMatrix4x4[2];
-    float4 _155 = -_16_testMatrix4x4[3];
-    x = float4x4(_149, _151, _153, _155);
-    return ((all(bool4(_149.x == float4(-1.0f, -2.0f, -3.0f, -4.0f).x, _149.y == float4(-1.0f, -2.0f, -3.0f, -4.0f).y, _149.z == float4(-1.0f, -2.0f, -3.0f, -4.0f).z, _149.w == float4(-1.0f, -2.0f, -3.0f, -4.0f).w)) && all(bool4(_151.x == float4(-5.0f, -6.0f, -7.0f, -8.0f).x, _151.y == float4(-5.0f, -6.0f, -7.0f, -8.0f).y, _151.z == float4(-5.0f, -6.0f, -7.0f, -8.0f).z, _151.w == float4(-5.0f, -6.0f, -7.0f, -8.0f).w))) && all(bool4(_153.x == float4(-9.0f, -10.0f, -11.0f, -12.0f).x, _153.y == float4(-9.0f, -10.0f, -11.0f, -12.0f).y, _153.z == float4(-9.0f, -10.0f, -11.0f, -12.0f).z, _153.w == float4(-9.0f, -10.0f, -11.0f, -12.0f).w))) && all(bool4(_155.x == float4(-13.0f, -14.0f, -15.0f, -16.0f).x, _155.y == float4(-13.0f, -14.0f, -15.0f, -16.0f).y, _155.z == float4(-13.0f, -14.0f, -15.0f, -16.0f).z, _155.w == float4(-13.0f, -14.0f, -15.0f, -16.0f).w));
-}
-
-float4 main(float2 _170)
-{
-    float _RESERVED_IDENTIFIER_FIXUP_0_x = _16_colorWhite.x;
-    float _177 = -_16_colorWhite.x;
-    _RESERVED_IDENTIFIER_FIXUP_0_x = _177;
-    bool _183 = false;
-    if (_177 == (-1.0f))
-    {
-        _183 = test_iscalar_b();
-    }
-    else
-    {
-        _183 = false;
-    }
-    bool _187 = false;
-    if (_183)
-    {
-        _187 = test_fvec_b();
-    }
-    else
-    {
-        _187 = false;
-    }
-    bool _191 = false;
-    if (_187)
-    {
-        _191 = test_ivec_b();
-    }
-    else
-    {
-        _191 = false;
-    }
-    bool _195 = false;
-    if (_191)
-    {
-        _195 = test_mat2_b();
-    }
-    else
-    {
-        _195 = false;
-    }
-    bool _199 = false;
-    if (_195)
-    {
-        _199 = test_mat3_b();
-    }
-    else
-    {
-        _199 = false;
-    }
-    bool _203 = false;
-    if (_199)
-    {
-        _203 = test_mat4_b();
-    }
-    else
-    {
-        _203 = false;
-    }
-    float4 _204 = 0.0f.xxxx;
-    if (_203)
-    {
-        _204 = _16_colorGreen;
-    }
-    else
-    {
-        _204 = _16_colorRed;
-    }
-    return _204;
-}
-
-void frag_main()
-{
-    float2 _30 = 0.0f.xx;
-    sk_FragColor = main(_30);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/UniformArray.hlsl b/tests/sksl/shared/UniformArray.hlsl
deleted file mode 100644
index 9f55b50..0000000
--- a/tests/sksl/shared/UniformArray.hlsl
+++ /dev/null
@@ -1,40 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_testArray[5] : packoffset(c0);
-    float4 _10_colorGreen : packoffset(c5);
-    float4 _10_colorRed : packoffset(c6);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _27)
-{
-    for (int index = 0; index < 5; index++)
-    {
-        if (_10_testArray[index] != float(index + 1))
-        {
-            return _10_colorRed;
-        }
-    }
-    return _10_colorGreen;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/UniformBuffers.hlsl b/tests/sksl/shared/UniformBuffers.hlsl
deleted file mode 100644
index 54dd8fc..0000000
--- a/tests/sksl/shared/UniformBuffers.hlsl
+++ /dev/null
@@ -1,28 +0,0 @@
-cbuffer testBlock : register(b0, space0)
-{
-    float _3_x : packoffset(c0);
-    int _3_w : packoffset(c0.y);
-    float _3_y[2] : packoffset(c1);
-    row_major float3x3 _3_z : packoffset(c3);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-void frag_main()
-{
-    sk_FragColor = float4(_3_x, _3_y[0], _3_y[1], 0.0f);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/UniformMatrixResize.hlsl b/tests/sksl/shared/UniformMatrixResize.hlsl
deleted file mode 100644
index d3d84c5..0000000
--- a/tests/sksl/shared/UniformMatrixResize.hlsl
+++ /dev/null
@@ -1,50 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    row_major float3x3 _11_testMatrix3x3 : packoffset(c0);
-    float4 _11_colorGreen : packoffset(c3);
-    float4 _11_colorRed : packoffset(c4);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float2x2 resizeMatrix_f22()
-{
-    return float2x2(_11_testMatrix3x3[0].xy, _11_testMatrix3x3[1].xy);
-}
-
-float4 main(float2 _41)
-{
-    float2x2 _43 = resizeMatrix_f22();
-    float2 _51 = _43[0];
-    float2 _54 = _43[1];
-    float4 _58 = 0.0f.xxxx;
-    if (all(bool2(_51.x == float2(1.0f, 2.0f).x, _51.y == float2(1.0f, 2.0f).y)) && all(bool2(_54.x == float2(4.0f, 5.0f).x, _54.y == float2(4.0f, 5.0f).y)))
-    {
-        _58 = _11_colorGreen;
-    }
-    else
-    {
-        _58 = _11_colorRed;
-    }
-    return _58;
-}
-
-void frag_main()
-{
-    float2 _23 = 0.0f.xx;
-    sk_FragColor = main(_23);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/Uniforms.hlsl b/tests/sksl/shared/Uniforms.hlsl
deleted file mode 100644
index 04f3e59..0000000
--- a/tests/sksl/shared/Uniforms.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float _10_myHalf : packoffset(c0);
-    float4 _10_myHalf4 : packoffset(c1);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    return _10_myHalf4 * _10_myHalf;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/UnusedVariables.hlsl b/tests/sksl/shared/UnusedVariables.hlsl
deleted file mode 100644
index b99a0f4..0000000
--- a/tests/sksl/shared/UnusedVariables.hlsl
+++ /dev/null
@@ -1,48 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float userfunc_ff(float _23)
-{
-    return _23 + 1.0f;
-}
-
-float4 main(float2 _29)
-{
-    float b = 2.0f;
-    float c = 3.0f;
-    b = 2.0f;
-    b = 3.0f + 77.0f;
-    b = sin(3.0f + 77.0f);
-    float _40 = 3.0f + 77.0f;
-    float _43 = 3.0f + 77.0f;
-    b = userfunc_ff(_43);
-    float _45 = cos(3.0f);
-    b = _45;
-    b = _45;
-    for (int x = 0; x < 1; x++)
-    {
-    }
-    float d = c;
-    b = 3.0f;
-    float _62 = c + 1.0f;
-    d = _62;
-    return float4(float(3.0f == 2.0f), float(true), float(_62 == 5.0f), float(_62 == 4.0f));
-}
-
-void frag_main()
-{
-    float2 _18 = 0.0f.xx;
-    sk_FragColor = main(_18);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/VectorConstructors.hlsl b/tests/sksl/shared/VectorConstructors.hlsl
deleted file mode 100644
index 72860af..0000000
--- a/tests/sksl/shared/VectorConstructors.hlsl
+++ /dev/null
@@ -1,84 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorGreen : packoffset(c0);
-    float4 _11_colorRed : packoffset(c1);
-    float _11_unknownInput : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool check_bf2f2f2f3i2i2f2f2f4i2b4f2f2f2b2b2b3(float2 _37, float2 _38, float2 _39, float3 _40, int2 _41, int2 _42, float2 _43, float2 _44, float4 _45, int2 _46, bool4 _47, float2 _48, float2 _49, float2 _50, bool2 _51, bool2 _52, bool3 _53)
-{
-    return ((((((((((((((((_37.x + _38.x) + _39.x) + _40.x) + float(_41.x)) + float(_42.x)) + _43.x) + _44.x) + _45.x) + float(_46.x)) + float(_47.x)) + _48.x) + _49.x) + _50.x) + float(_51.x)) + float(_52.x)) + float(_53.x)) == 17.0f;
-}
-
-float4 main(float2 _116)
-{
-    float2 v1 = 1.0f.xx;
-    float2 v2 = float2(1.0f, 2.0f);
-    float2 v3 = 1.0f.xx;
-    float3 v4 = 1.0f.xxx;
-    int2 v5 = int2(1, 1);
-    int2 v6 = int2(1, 2);
-    float2 v7 = float2(1.0f, 2.0f);
-    float2 _136 = float2(float(1), float(1));
-    float2 v8 = _136;
-    float4 _144 = float4(float(1), _11_unknownInput, 3.0f, 4.0f);
-    float4 v9 = _144;
-    int2 _148 = int2(3, int(1.0f));
-    int2 v10 = _148;
-    bool4 v11 = bool4(true, false, true, false);
-    float2 v12 = float2(1.0f, 0.0f);
-    float2 v13 = 0.0f.xx;
-    float2 v14 = 0.0f.xx;
-    bool2 v15 = bool2(true, true);
-    bool2 v16 = bool2(true, true);
-    bool3 v17 = bool3(true, true, true);
-    float2 _162 = 1.0f.xx;
-    float2 _163 = float2(1.0f, 2.0f);
-    float2 _164 = 1.0f.xx;
-    float3 _165 = 1.0f.xxx;
-    int2 _166 = int2(1, 1);
-    int2 _167 = int2(1, 2);
-    float2 _168 = float2(1.0f, 2.0f);
-    float2 _169 = _136;
-    float4 _170 = _144;
-    int2 _171 = _148;
-    bool4 _172 = bool4(true, false, true, false);
-    float2 _173 = float2(1.0f, 0.0f);
-    float2 _174 = 0.0f.xx;
-    float2 _175 = 0.0f.xx;
-    bool2 _176 = bool2(true, true);
-    bool2 _177 = bool2(true, true);
-    bool3 _178 = bool3(true, true, true);
-    float4 _180 = 0.0f.xxxx;
-    if (check_bf2f2f2f3i2i2f2f2f4i2b4f2f2f2b2b2b3(_162, _163, _164, _165, _166, _167, _168, _169, _170, _171, _172, _173, _174, _175, _176, _177, _178))
-    {
-        _180 = _11_colorGreen;
-    }
-    else
-    {
-        _180 = _11_colorRed;
-    }
-    return _180;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/VectorScalarMath.hlsl b/tests/sksl/shared/VectorScalarMath.hlsl
deleted file mode 100644
index 4bb7c7c..0000000
--- a/tests/sksl/shared/VectorScalarMath.hlsl
+++ /dev/null
@@ -1,440 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _11_colorRed : packoffset(c0);
-    float4 _11_colorGreen : packoffset(c1);
-    float _11_unknownInput : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-bool test_int_b()
-{
-    bool ok = true;
-    int4 _45 = int4(int(_11_colorRed.x), int(_11_colorRed.y), int(_11_colorRed.z), int(_11_colorRed.w));
-    int4 inputRed = _45;
-    int4 _58 = int4(int(_11_colorGreen.x), int(_11_colorGreen.y), int(_11_colorGreen.z), int(_11_colorGreen.w));
-    int4 inputGreen = _58;
-    int4 _62 = _45 + int4(2, 2, 2, 2);
-    int4 x = _62;
-    bool _71 = false;
-    if (true)
-    {
-        _71 = all(bool4(_62.x == int4(3, 2, 2, 3).x, _62.y == int4(3, 2, 2, 3).y, _62.z == int4(3, 2, 2, 3).z, _62.w == int4(3, 2, 2, 3).w));
-    }
-    else
-    {
-        _71 = false;
-    }
-    ok = _71;
-    int4 _73 = _58.ywxz - int4(2, 2, 2, 2);
-    x = _73;
-    bool _81 = false;
-    if (_71)
-    {
-        _81 = all(bool4(_73.x == int4(-1, -1, -2, -2).x, _73.y == int4(-1, -1, -2, -2).y, _73.z == int4(-1, -1, -2, -2).z, _73.w == int4(-1, -1, -2, -2).w));
-    }
-    else
-    {
-        _81 = false;
-    }
-    ok = _81;
-    int4 _84 = _45 + _58.y.xxxx;
-    x = _84;
-    bool _90 = false;
-    if (_81)
-    {
-        _90 = all(bool4(_84.x == int4(2, 1, 1, 2).x, _84.y == int4(2, 1, 1, 2).y, _84.z == int4(2, 1, 1, 2).z, _84.w == int4(2, 1, 1, 2).w));
-    }
-    else
-    {
-        _90 = false;
-    }
-    ok = _90;
-    int3 _95 = _58.wyw * int3(9, 9, 9);
-    int4 _96 = x;
-    int4 _97 = int4(_95.x, _95.y, _95.z, _96.w);
-    x = _97;
-    bool _103 = false;
-    if (_90)
-    {
-        _103 = all(bool4(_97.x == int4(9, 9, 9, 2).x, _97.y == int4(9, 9, 9, 2).y, _97.z == int4(9, 9, 9, 2).z, _97.w == int4(9, 9, 9, 2).w));
-    }
-    else
-    {
-        _103 = false;
-    }
-    ok = _103;
-    int2 _108 = _97.zw / int2(4, 4);
-    int4 _109 = x;
-    int4 _110 = int4(_108.x, _108.y, _109.z, _109.w);
-    x = _110;
-    bool _116 = false;
-    if (_103)
-    {
-        _116 = all(bool4(_110.x == int4(2, 0, 9, 2).x, _110.y == int4(2, 0, 9, 2).y, _110.z == int4(2, 0, 9, 2).z, _110.w == int4(2, 0, 9, 2).w));
-    }
-    else
-    {
-        _116 = false;
-    }
-    ok = _116;
-    int4 _120 = (_45 * int4(5, 5, 5, 5)).yxwz;
-    x = _120;
-    bool _126 = false;
-    if (_116)
-    {
-        _126 = all(bool4(_120.x == int4(0, 5, 5, 0).x, _120.y == int4(0, 5, 5, 0).y, _120.z == int4(0, 5, 5, 0).z, _120.w == int4(0, 5, 5, 0).w));
-    }
-    else
-    {
-        _126 = false;
-    }
-    ok = _126;
-    int4 _127 = int4(2, 2, 2, 2) + _45;
-    x = _127;
-    bool _132 = false;
-    if (_126)
-    {
-        _132 = all(bool4(_127.x == int4(3, 2, 2, 3).x, _127.y == int4(3, 2, 2, 3).y, _127.z == int4(3, 2, 2, 3).z, _127.w == int4(3, 2, 2, 3).w));
-    }
-    else
-    {
-        _132 = false;
-    }
-    ok = _132;
-    int4 _136 = int4(10, 10, 10, 10) - _58.ywxz;
-    x = _136;
-    bool _142 = false;
-    if (_132)
-    {
-        _142 = all(bool4(_136.x == int4(9, 9, 10, 10).x, _136.y == int4(9, 9, 10, 10).y, _136.z == int4(9, 9, 10, 10).z, _136.w == int4(9, 9, 10, 10).w));
-    }
-    else
-    {
-        _142 = false;
-    }
-    ok = _142;
-    int4 _145 = _45.x.xxxx + _58;
-    x = _145;
-    bool _151 = false;
-    if (_142)
-    {
-        _151 = all(bool4(_145.x == int4(1, 2, 1, 2).x, _145.y == int4(1, 2, 1, 2).y, _145.z == int4(1, 2, 1, 2).z, _145.w == int4(1, 2, 1, 2).w));
-    }
-    else
-    {
-        _151 = false;
-    }
-    ok = _151;
-    int3 _155 = int3(8, 8, 8) * _58.wyw;
-    int4 _156 = x;
-    int4 _157 = int4(_155.x, _155.y, _155.z, _156.w);
-    x = _157;
-    bool _163 = false;
-    if (_151)
-    {
-        _163 = all(bool4(_157.x == int4(8, 8, 8, 2).x, _157.y == int4(8, 8, 8, 2).y, _157.z == int4(8, 8, 8, 2).z, _157.w == int4(8, 8, 8, 2).w));
-    }
-    else
-    {
-        _163 = false;
-    }
-    ok = _163;
-    int2 _167 = int2(36, 36) / _157.zw;
-    int4 _168 = x;
-    int4 _169 = int4(_167.x, _167.y, _168.z, _168.w);
-    x = _169;
-    bool _176 = false;
-    if (_163)
-    {
-        _176 = all(bool4(_169.x == int4(4, 18, 8, 2).x, _169.y == int4(4, 18, 8, 2).y, _169.z == int4(4, 18, 8, 2).z, _169.w == int4(4, 18, 8, 2).w));
-    }
-    else
-    {
-        _176 = false;
-    }
-    ok = _176;
-    int4 _180 = (int4(37, 37, 37, 37) / _169).yxwz;
-    x = _180;
-    bool _186 = false;
-    if (_176)
-    {
-        _186 = all(bool4(_180.x == int4(2, 9, 18, 4).x, _180.y == int4(2, 9, 18, 4).y, _180.z == int4(2, 9, 18, 4).z, _180.w == int4(2, 9, 18, 4).w));
-    }
-    else
-    {
-        _186 = false;
-    }
-    ok = _186;
-    int4 _187 = _180 + int4(2, 2, 2, 2);
-    x = _187;
-    int4 _188 = _187 * int4(2, 2, 2, 2);
-    x = _188;
-    int4 _190 = _188 - int4(4, 4, 4, 4);
-    x = _190;
-    int4 _191 = _190 / int4(2, 2, 2, 2);
-    x = _191;
-    bool _196 = false;
-    if (_186)
-    {
-        _196 = all(bool4(_191.x == int4(2, 9, 18, 4).x, _191.y == int4(2, 9, 18, 4).y, _191.z == int4(2, 9, 18, 4).z, _191.w == int4(2, 9, 18, 4).w));
-    }
-    else
-    {
-        _196 = false;
-    }
-    ok = _196;
-    int4 _197 = _191 + int4(2, 2, 2, 2);
-    x = _197;
-    int4 _198 = _197 * int4(2, 2, 2, 2);
-    x = _198;
-    int4 _199 = _198 - int4(4, 4, 4, 4);
-    x = _199;
-    int4 _200 = _199 / int4(2, 2, 2, 2);
-    x = _200;
-    bool _205 = false;
-    if (_196)
-    {
-        _205 = all(bool4(_200.x == int4(2, 9, 18, 4).x, _200.y == int4(2, 9, 18, 4).y, _200.z == int4(2, 9, 18, 4).z, _200.w == int4(2, 9, 18, 4).w));
-    }
-    else
-    {
-        _205 = false;
-    }
-    ok = _205;
-    return _205;
-}
-
-float4 main(float2 _207)
-{
-    bool _RESERVED_IDENTIFIER_FIXUP_0_ok = true;
-    float4 _RESERVED_IDENTIFIER_FIXUP_1_inputRed = _11_colorRed;
-    float4 _RESERVED_IDENTIFIER_FIXUP_2_inputGreen = _11_colorGreen;
-    float4 _220 = _11_colorRed + 2.0f.xxxx;
-    float4 _RESERVED_IDENTIFIER_FIXUP_3_x = _220;
-    bool _227 = false;
-    if (true)
-    {
-        _227 = all(bool4(_220.x == float4(3.0f, 2.0f, 2.0f, 3.0f).x, _220.y == float4(3.0f, 2.0f, 2.0f, 3.0f).y, _220.z == float4(3.0f, 2.0f, 2.0f, 3.0f).z, _220.w == float4(3.0f, 2.0f, 2.0f, 3.0f).w));
-    }
-    else
-    {
-        _227 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _227;
-    float4 _229 = _11_colorGreen.ywxz - 2.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _229;
-    bool _237 = false;
-    if (_227)
-    {
-        _237 = all(bool4(_229.x == float4(-1.0f, -1.0f, -2.0f, -2.0f).x, _229.y == float4(-1.0f, -1.0f, -2.0f, -2.0f).y, _229.z == float4(-1.0f, -1.0f, -2.0f, -2.0f).z, _229.w == float4(-1.0f, -1.0f, -2.0f, -2.0f).w));
-    }
-    else
-    {
-        _237 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _237;
-    float4 _240 = _11_colorRed + _11_colorGreen.y.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _240;
-    bool _247 = false;
-    if (_237)
-    {
-        _247 = all(bool4(_240.x == float4(2.0f, 1.0f, 1.0f, 2.0f).x, _240.y == float4(2.0f, 1.0f, 1.0f, 2.0f).y, _240.z == float4(2.0f, 1.0f, 1.0f, 2.0f).z, _240.w == float4(2.0f, 1.0f, 1.0f, 2.0f).w));
-    }
-    else
-    {
-        _247 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _247;
-    float3 _251 = _11_colorGreen.wyw * 9.0f;
-    float4 _252 = _RESERVED_IDENTIFIER_FIXUP_3_x;
-    float4 _253 = float4(_251.x, _251.y, _251.z, _252.w);
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _253;
-    bool _259 = false;
-    if (_247)
-    {
-        _259 = all(bool4(_253.x == float4(9.0f, 9.0f, 9.0f, 2.0f).x, _253.y == float4(9.0f, 9.0f, 9.0f, 2.0f).y, _253.z == float4(9.0f, 9.0f, 9.0f, 2.0f).z, _253.w == float4(9.0f, 9.0f, 9.0f, 2.0f).w));
-    }
-    else
-    {
-        _259 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _259;
-    float2 _261 = _253.zw * 2.0f;
-    float4 _262 = _RESERVED_IDENTIFIER_FIXUP_3_x;
-    float4 _263 = float4(_261.x, _261.y, _262.z, _262.w);
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _263;
-    bool _271 = false;
-    if (_259)
-    {
-        _271 = all(bool4(_263.x == float4(18.0f, 4.0f, 9.0f, 2.0f).x, _263.y == float4(18.0f, 4.0f, 9.0f, 2.0f).y, _263.z == float4(18.0f, 4.0f, 9.0f, 2.0f).z, _263.w == float4(18.0f, 4.0f, 9.0f, 2.0f).w));
-    }
-    else
-    {
-        _271 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _271;
-    float4 _274 = (_11_colorRed * 5.0f).yxwz;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _274;
-    bool _280 = false;
-    if (_271)
-    {
-        _280 = all(bool4(_274.x == float4(0.0f, 5.0f, 5.0f, 0.0f).x, _274.y == float4(0.0f, 5.0f, 5.0f, 0.0f).y, _274.z == float4(0.0f, 5.0f, 5.0f, 0.0f).z, _274.w == float4(0.0f, 5.0f, 5.0f, 0.0f).w));
-    }
-    else
-    {
-        _280 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _280;
-    float4 _281 = 2.0f.xxxx + _11_colorRed;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _281;
-    bool _286 = false;
-    if (_280)
-    {
-        _286 = all(bool4(_281.x == float4(3.0f, 2.0f, 2.0f, 3.0f).x, _281.y == float4(3.0f, 2.0f, 2.0f, 3.0f).y, _281.z == float4(3.0f, 2.0f, 2.0f, 3.0f).z, _281.w == float4(3.0f, 2.0f, 2.0f, 3.0f).w));
-    }
-    else
-    {
-        _286 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _286;
-    float4 _290 = 10.0f.xxxx - _11_colorGreen.ywxz;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _290;
-    bool _296 = false;
-    if (_286)
-    {
-        _296 = all(bool4(_290.x == float4(9.0f, 9.0f, 10.0f, 10.0f).x, _290.y == float4(9.0f, 9.0f, 10.0f, 10.0f).y, _290.z == float4(9.0f, 9.0f, 10.0f, 10.0f).z, _290.w == float4(9.0f, 9.0f, 10.0f, 10.0f).w));
-    }
-    else
-    {
-        _296 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _296;
-    float4 _299 = _11_colorRed.x.xxxx + _11_colorGreen;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _299;
-    bool _305 = false;
-    if (_296)
-    {
-        _305 = all(bool4(_299.x == float4(1.0f, 2.0f, 1.0f, 2.0f).x, _299.y == float4(1.0f, 2.0f, 1.0f, 2.0f).y, _299.z == float4(1.0f, 2.0f, 1.0f, 2.0f).z, _299.w == float4(1.0f, 2.0f, 1.0f, 2.0f).w));
-    }
-    else
-    {
-        _305 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _305;
-    float3 _308 = _11_colorGreen.wyw * 8.0f;
-    float4 _309 = _RESERVED_IDENTIFIER_FIXUP_3_x;
-    float4 _310 = float4(_308.x, _308.y, _308.z, _309.w);
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _310;
-    bool _316 = false;
-    if (_305)
-    {
-        _316 = all(bool4(_310.x == float4(8.0f, 8.0f, 8.0f, 2.0f).x, _310.y == float4(8.0f, 8.0f, 8.0f, 2.0f).y, _310.z == float4(8.0f, 8.0f, 8.0f, 2.0f).z, _310.w == float4(8.0f, 8.0f, 8.0f, 2.0f).w));
-    }
-    else
-    {
-        _316 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _316;
-    float2 _320 = 32.0f.xx / _310.zw;
-    float4 _321 = _RESERVED_IDENTIFIER_FIXUP_3_x;
-    float4 _322 = float4(_320.x, _320.y, _321.z, _321.w);
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _322;
-    bool _329 = false;
-    if (_316)
-    {
-        _329 = all(bool4(_322.x == float4(4.0f, 16.0f, 8.0f, 2.0f).x, _322.y == float4(4.0f, 16.0f, 8.0f, 2.0f).y, _322.z == float4(4.0f, 16.0f, 8.0f, 2.0f).z, _322.w == float4(4.0f, 16.0f, 8.0f, 2.0f).w));
-    }
-    else
-    {
-        _329 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _329;
-    float4 _332 = (32.0f.xxxx / _322).yxwz;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _332;
-    bool _338 = false;
-    if (_329)
-    {
-        _338 = all(bool4(_332.x == float4(2.0f, 8.0f, 16.0f, 4.0f).x, _332.y == float4(2.0f, 8.0f, 16.0f, 4.0f).y, _332.z == float4(2.0f, 8.0f, 16.0f, 4.0f).z, _332.w == float4(2.0f, 8.0f, 16.0f, 4.0f).w));
-    }
-    else
-    {
-        _338 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _338;
-    float4 _339 = _332 + 2.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _339;
-    float4 _340 = _339 * 2.0f;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _340;
-    float4 _342 = _340 - 4.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _342;
-    float4 _344 = _342 * (1.0f / 2.0f);
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _344;
-    bool _349 = false;
-    if (_338)
-    {
-        _349 = all(bool4(_344.x == float4(2.0f, 8.0f, 16.0f, 4.0f).x, _344.y == float4(2.0f, 8.0f, 16.0f, 4.0f).y, _344.z == float4(2.0f, 8.0f, 16.0f, 4.0f).z, _344.w == float4(2.0f, 8.0f, 16.0f, 4.0f).w));
-    }
-    else
-    {
-        _349 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _349;
-    float4 _350 = _344 + 2.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _350;
-    float4 _351 = _350 * 2.0f;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _351;
-    float4 _352 = _351 - 4.0f.xxxx;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _352;
-    float4 _354 = _352 * 0.5f;
-    _RESERVED_IDENTIFIER_FIXUP_3_x = _354;
-    bool _359 = false;
-    if (_349)
-    {
-        _359 = all(bool4(_354.x == float4(2.0f, 8.0f, 16.0f, 4.0f).x, _354.y == float4(2.0f, 8.0f, 16.0f, 4.0f).y, _354.z == float4(2.0f, 8.0f, 16.0f, 4.0f).z, _354.w == float4(2.0f, 8.0f, 16.0f, 4.0f).w));
-    }
-    else
-    {
-        _359 = false;
-    }
-    _RESERVED_IDENTIFIER_FIXUP_0_ok = _359;
-    bool _363 = false;
-    if (_359)
-    {
-        _363 = test_int_b();
-    }
-    else
-    {
-        _363 = false;
-    }
-    float4 _364 = 0.0f.xxxx;
-    if (_363)
-    {
-        _364 = _11_colorGreen;
-    }
-    else
-    {
-        _364 = _11_colorRed;
-    }
-    return _364;
-}
-
-void frag_main()
-{
-    float2 _21 = 0.0f.xx;
-    sk_FragColor = main(_21);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/VectorToMatrixCast.hlsl b/tests/sksl/shared/VectorToMatrixCast.hlsl
deleted file mode 100644
index bda499e..0000000
--- a/tests/sksl/shared/VectorToMatrixCast.hlsl
+++ /dev/null
@@ -1,169 +0,0 @@
-cbuffer _UniformBuffer : register(b0, space0)
-{
-    float4 _10_colorGreen : packoffset(c0);
-    float4 _10_colorRed : packoffset(c1);
-    float4 _10_testInputs : packoffset(c2);
-};
-
-
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _24)
-{
-    bool ok = true;
-    bool _57 = false;
-    if (true)
-    {
-        float2 _41 = float2(_10_testInputs.xy);
-        float2 _42 = float2(_10_testInputs.zw);
-        _57 = all(bool2(_41.x == float2(-1.25f, 0.0f).x, _41.y == float2(-1.25f, 0.0f).y)) && all(bool2(_42.x == float2(0.75f, 2.25f).x, _42.y == float2(0.75f, 2.25f).y));
-    }
-    else
-    {
-        _57 = false;
-    }
-    ok = _57;
-    bool _74 = false;
-    if (_57)
-    {
-        float2 _66 = float2(_10_testInputs.xy);
-        float2 _67 = float2(_10_testInputs.zw);
-        _74 = all(bool2(_66.x == float2(-1.25f, 0.0f).x, _66.y == float2(-1.25f, 0.0f).y)) && all(bool2(_67.x == float2(0.75f, 2.25f).x, _67.y == float2(0.75f, 2.25f).y));
-    }
-    else
-    {
-        _74 = false;
-    }
-    ok = _74;
-    bool _95 = false;
-    if (_74)
-    {
-        float2 _84 = float2(_10_colorGreen.xy);
-        float2 _85 = float2(_10_colorGreen.zw);
-        _95 = all(bool2(_84.x == float2(0.0f, 1.0f).x, _84.y == float2(0.0f, 1.0f).y)) && all(bool2(_85.x == float2(0.0f, 1.0f).x, _85.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _95 = false;
-    }
-    ok = _95;
-    bool _112 = false;
-    if (_95)
-    {
-        float2 _104 = float2(_10_colorGreen.xy);
-        float2 _105 = float2(_10_colorGreen.zw);
-        _112 = all(bool2(_104.x == float2(0.0f, 1.0f).x, _104.y == float2(0.0f, 1.0f).y)) && all(bool2(_105.x == float2(0.0f, 1.0f).x, _105.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _112 = false;
-    }
-    ok = _112;
-    bool _148 = false;
-    if (_112)
-    {
-        int4 _126 = int4(int(_10_colorGreen.x), int(_10_colorGreen.y), int(_10_colorGreen.z), int(_10_colorGreen.w));
-        float4 _135 = float4(float(_126.x), float(_126.y), float(_126.z), float(_126.w));
-        float2 _140 = float2(_135.xy);
-        float2 _141 = float2(_135.zw);
-        _148 = all(bool2(_140.x == float2(0.0f, 1.0f).x, _140.y == float2(0.0f, 1.0f).y)) && all(bool2(_141.x == float2(0.0f, 1.0f).x, _141.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _148 = false;
-    }
-    ok = _148;
-    bool _165 = false;
-    if (_148)
-    {
-        float2 _157 = float2(_10_colorGreen.xy);
-        float2 _158 = float2(_10_colorGreen.zw);
-        _165 = all(bool2(_157.x == float2(0.0f, 1.0f).x, _157.y == float2(0.0f, 1.0f).y)) && all(bool2(_158.x == float2(0.0f, 1.0f).x, _158.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _165 = false;
-    }
-    ok = _165;
-    bool _182 = false;
-    if (_165)
-    {
-        float2 _174 = float2(_10_colorGreen.xy);
-        float2 _175 = float2(_10_colorGreen.zw);
-        _182 = all(bool2(_174.x == float2(0.0f, 1.0f).x, _174.y == float2(0.0f, 1.0f).y)) && all(bool2(_175.x == float2(0.0f, 1.0f).x, _175.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _182 = false;
-    }
-    ok = _182;
-    bool _218 = false;
-    if (_182)
-    {
-        bool4 _196 = bool4(_10_colorGreen.x != 0.0f, _10_colorGreen.y != 0.0f, _10_colorGreen.z != 0.0f, _10_colorGreen.w != 0.0f);
-        float4 _205 = float4(float(_196.x), float(_196.y), float(_196.z), float(_196.w));
-        float2 _210 = float2(_205.xy);
-        float2 _211 = float2(_205.zw);
-        _218 = all(bool2(_210.x == float2(0.0f, 1.0f).x, _210.y == float2(0.0f, 1.0f).y)) && all(bool2(_211.x == float2(0.0f, 1.0f).x, _211.y == float2(0.0f, 1.0f).y));
-    }
-    else
-    {
-        _218 = false;
-    }
-    ok = _218;
-    bool _242 = false;
-    if (_218)
-    {
-        float4 _226 = _10_colorGreen - _10_colorRed;
-        float2 _231 = float2(_226.xy);
-        float2 _232 = float2(_226.zw);
-        _242 = all(bool2(_231.x == float2(-1.0f, 1.0f).x, _231.y == float2(-1.0f, 1.0f).y)) && all(bool2(_232.x == 0.0f.xx.x, _232.y == 0.0f.xx.y));
-    }
-    else
-    {
-        _242 = false;
-    }
-    ok = _242;
-    bool _265 = false;
-    if (_242)
-    {
-        float4 _249 = _10_colorGreen + 5.0f.xxxx;
-        float2 _254 = float2(_249.xy);
-        float2 _255 = float2(_249.zw);
-        _265 = all(bool2(_254.x == float2(5.0f, 6.0f).x, _254.y == float2(5.0f, 6.0f).y)) && all(bool2(_255.x == float2(5.0f, 6.0f).x, _255.y == float2(5.0f, 6.0f).y));
-    }
-    else
-    {
-        _265 = false;
-    }
-    ok = _265;
-    float4 _266 = 0.0f.xxxx;
-    if (_265)
-    {
-        _266 = _10_colorGreen;
-    }
-    else
-    {
-        _266 = _10_colorRed;
-    }
-    return _266;
-}
-
-void frag_main()
-{
-    float2 _20 = 0.0f.xx;
-    sk_FragColor = main(_20);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/VertexID.hlsl b/tests/sksl/shared/VertexID.hlsl
deleted file mode 100644
index c8ad185..0000000
--- a/tests/sksl/shared/VertexID.hlsl
+++ /dev/null
@@ -1,26 +0,0 @@
-static int gl_VertexIndex;
-static int id;
-
-struct SPIRV_Cross_Input
-{
-    uint gl_VertexIndex : SV_VertexID;
-};
-
-struct SPIRV_Cross_Output
-{
-    int id : TEXCOORD1;
-};
-
-void vert_main()
-{
-    id = gl_VertexIndex;
-}
-
-SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
-{
-    gl_VertexIndex = int(stage_input.gl_VertexIndex);
-    vert_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.id = id;
-    return stage_output;
-}
diff --git a/tests/sksl/shared/WhileLoopControlFlow.hlsl b/tests/sksl/shared/WhileLoopControlFlow.hlsl
deleted file mode 100644
index 3dcb6d7..0000000
--- a/tests/sksl/shared/WhileLoopControlFlow.hlsl
+++ /dev/null
@@ -1,43 +0,0 @@
-static float4 sk_FragColor;
-
-struct SPIRV_Cross_Output
-{
-    float4 sk_FragColor : SV_Target0;
-};
-
-float4 main(float2 _21)
-{
-    float4 x = 1.0f.xxxx;
-    while (x.w == 1.0f)
-    {
-        x.x -= 0.25f;
-        if (x.x <= 0.0f)
-        {
-            break;
-        }
-    }
-    while (x.z > 0.0f)
-    {
-        x.z -= 0.25f;
-        if (x.w == 1.0f)
-        {
-            continue;
-        }
-        x.y = 0.0f;
-    }
-    return x;
-}
-
-void frag_main()
-{
-    float2 _17 = 0.0f.xx;
-    sk_FragColor = main(_17);
-}
-
-SPIRV_Cross_Output main()
-{
-    frag_main();
-    SPIRV_Cross_Output stage_output;
-    stage_output.sk_FragColor = sk_FragColor;
-    return stage_output;
-}
diff --git a/tools/skslc/BUILD.bazel b/tools/skslc/BUILD.bazel
index 4d5eb36..a84a448 100644
--- a/tools/skslc/BUILD.bazel
+++ b/tools/skslc/BUILD.bazel
@@ -78,12 +78,6 @@
 )
 
 compile_sksl(
-    name = "hlsl_tests",
-    inputs = "//resources/sksl:sksl_hlsl_tests_sources",
-    lang = "hlsl",
-)
-
-compile_sksl(
     name = "wgsl_tests",
     inputs = "//resources/sksl:sksl_wgsl_tests_sources",
     lang = "wgsl",
diff --git a/tools/skslc/Makefile b/tools/skslc/Makefile
index e01b594..35c7bcd 100644
--- a/tools/skslc/Makefile
+++ b/tools/skslc/Makefile
@@ -6,5 +6,4 @@
 	bazel run //tools/skslc:compile_skvm_tests --config=release
 	bazel run //tools/skslc:compile_stage_tests --config=release
 	bazel run //tools/skslc:compile_spirv_tests --config=release
-	bazel run //tools/skslc:compile_wgsl_tests --config=release
-	bazel run //tools/skslc:compile_hlsl_tests --config=release
+	bazel run //tools/skslc:compile_wgsl_tests --config=release
\ No newline at end of file
