Reland "Reland: [skslc] Generate .hlsl test output files"

Reland with fixed gni_exporter.go

Bug: skia:12691, skia:12352

Description of original change:
> This is a reland of a change originally reviewed on
> https://skia-review.googlesource.com/c/skia/+/482778.
>
> - The build now generates HLSL output when `skia_compile_sksl_tests` is
> enabled.
> - The "blend" and "shared" tests have been enabled for HLSL with the
> exception of 6 tests that exercise intrinsic inverse hyperbolic
> functions, which don't have HLSL equivalents.
>
> Bug: skia:12691, skia:12352
> Change-Id: I7188b75dcdec5edffe60004b283ba84e3ac16fc1
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/609218
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Arman Uguray <armansito@google.com>

Change-Id: I8b0b59a7d85303fee5bf5488b4e552af635473e0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/609698
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Arman Uguray <armansito@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 02fd884..f37264b 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -916,6 +916,12 @@
     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" ]
@@ -947,6 +953,8 @@
   }
   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 1238c0b..9d7dcb5 100644
--- a/bazel/exporter/gni_exporter.go
+++ b/bazel/exporter/gni_exporter.go
@@ -84,17 +84,22 @@
 // The footer written to gn/sksl_tests.gni.
 const skslTestsFooter = `sksl_glsl_tests_sources =
     sksl_error_tests + sksl_glsl_tests + sksl_inliner_tests +
-    sksl_folding_tests + sksl_shared_tests
+    sksl_folding_tests + sksl_shared_tests +
+    sksl_inverse_hyperbolic_intrinsics_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_metal_tests + sksl_blend_tests + sksl_shared_tests +
+    sksl_inverse_hyperbolic_intrinsics_tests
+
+sksl_hlsl_tests_sources = sksl_blend_tests + sksl_shared_tests
 
 sksl_wgsl_tests_sources = sksl_wgsl_tests
 
 sksl_spirv_tests_sources =
-    sksl_blend_tests + sksl_shared_tests + sksl_spirv_tests
+    sksl_blend_tests + sksl_shared_tests +
+    sksl_inverse_hyperbolic_intrinsics_tests + sksl_spirv_tests
 
 sksl_skvm_tests_sources = sksl_rte_tests + sksl_rte_error_tests
 
diff --git a/bazel/exporter_tool/main.go b/bazel/exporter_tool/main.go
index 83aa508..a64f916 100644
--- a/bazel/exporter_tool/main.go
+++ b/bazel/exporter_tool/main.go
@@ -142,6 +142,8 @@
 		{Var: "sksl_metal_tests", Rules: []string{"//resources/sksl:sksl_metal_tests"}},
 		{Var: "sksl_spirv_tests", Rules: []string{"//resources/sksl:sksl_spirv_tests"}},
 		{Var: "sksl_wgsl_tests", Rules: []string{"//resources/sksl:sksl_wgsl_tests"}},
+		{Var: "sksl_inverse_hyperbolic_intrinsics_tests",
+			Rules: []string{"//resources/sksl:sksl_inverse_hyperbolic_intrinsics_tests"}},
 		{Var: "sksl_shared_tests", Rules: []string{"//resources/sksl:sksl_shared_tests"}},
 		{Var: "sksl_folding_tests", Rules: []string{"//resources/sksl:sksl_folding_tests"}},
 		{Var: "sksl_inliner_tests", Rules: []string{"//resources/sksl:sksl_inliner_tests"}},
diff --git a/gn/compile_sksl_tests.py b/gn/compile_sksl_tests.py
index 72f6ea8..be8573d 100755
--- a/gn/compile_sksl_tests.py
+++ b/gn/compile_sksl_tests.py
@@ -71,6 +71,10 @@
         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")
@@ -88,7 +92,7 @@
         worklist.write(target + ".wgsl\n")
         worklist.write(settings + "\n\n")
     else:
-        sys.exit("### Expected one of: --glsl --metal --spirv --wgsl --skvm --stage --dsl, got " + lang)
+        sys.exit("### Expected one of: --glsl --metal --hlsl --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 7f91960..6fc8198 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -377,17 +377,20 @@
   "wgsl/VertexPositionOutputIsAlwaysDeclared.vert",
 ]
 
+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",
@@ -838,17 +841,22 @@
 
 sksl_glsl_tests_sources =
     sksl_error_tests + sksl_glsl_tests + sksl_inliner_tests +
-    sksl_folding_tests + sksl_shared_tests
+    sksl_folding_tests + sksl_shared_tests +
+    sksl_inverse_hyperbolic_intrinsics_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_metal_tests + sksl_blend_tests + sksl_shared_tests +
+    sksl_inverse_hyperbolic_intrinsics_tests
+
+sksl_hlsl_tests_sources = sksl_blend_tests + sksl_shared_tests
 
 sksl_wgsl_tests_sources = sksl_wgsl_tests
 
 sksl_spirv_tests_sources =
-    sksl_blend_tests + sksl_shared_tests + sksl_spirv_tests
+    sksl_blend_tests + sksl_shared_tests +
+    sksl_inverse_hyperbolic_intrinsics_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 66467b5..8246984 100644
--- a/resources/sksl/BUILD.bazel
+++ b/resources/sksl/BUILD.bazel
@@ -20,6 +20,7 @@
         ":sksl_folding_tests",
         ":sksl_glsl_tests",
         ":sksl_inliner_tests",
+        ":sksl_inverse_hyperbolic_intrinsics_tests",
         ":sksl_shared_tests",
     ],
     visibility = ["//tools/skslc:__pkg__"],
@@ -42,6 +43,7 @@
     name = "sksl_metal_tests_sources",
     srcs = [
         ":sksl_blend_tests",
+        ":sksl_inverse_hyperbolic_intrinsics_tests",
         ":sksl_metal_tests",
         ":sksl_shared_tests",
     ],
@@ -75,12 +77,24 @@
     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
@@ -670,19 +684,27 @@
     ],
 )
 
+# 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
new file mode 100644
index 0000000..a412270
--- /dev/null
+++ b/tests/sksl/blend/BlendClear.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..bdc90ad
--- /dev/null
+++ b/tests/sksl/blend/BlendColor.hlsl
@@ -0,0 +1,126 @@
+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
new file mode 100644
index 0000000..4c09abf
--- /dev/null
+++ b/tests/sksl/blend/BlendColorBurn.hlsl
@@ -0,0 +1,56 @@
+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
new file mode 100644
index 0000000..b2e25e5
--- /dev/null
+++ b/tests/sksl/blend/BlendColorDodge.hlsl
@@ -0,0 +1,58 @@
+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
new file mode 100644
index 0000000..09ab9aa
--- /dev/null
+++ b/tests/sksl/blend/BlendDarken.hlsl
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000..c2296ec
--- /dev/null
+++ b/tests/sksl/blend/BlendDifference.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..8f4b8a9
--- /dev/null
+++ b/tests/sksl/blend/BlendDst.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..733e26d
--- /dev/null
+++ b/tests/sksl/blend/BlendDstAtop.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..931b9db
--- /dev/null
+++ b/tests/sksl/blend/BlendDstIn.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..6fba931
--- /dev/null
+++ b/tests/sksl/blend/BlendDstOut.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..614462b
--- /dev/null
+++ b/tests/sksl/blend/BlendDstOver.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..693850b
--- /dev/null
+++ b/tests/sksl/blend/BlendExclusion.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..00a9284
--- /dev/null
+++ b/tests/sksl/blend/BlendHardLight.hlsl
@@ -0,0 +1,59 @@
+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
new file mode 100644
index 0000000..67c4afd
--- /dev/null
+++ b/tests/sksl/blend/BlendHue.hlsl
@@ -0,0 +1,126 @@
+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
new file mode 100644
index 0000000..b6028f9
--- /dev/null
+++ b/tests/sksl/blend/BlendLighten.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..f275e8e
--- /dev/null
+++ b/tests/sksl/blend/BlendLuminosity.hlsl
@@ -0,0 +1,126 @@
+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
new file mode 100644
index 0000000..e6c30f8
--- /dev/null
+++ b/tests/sksl/blend/BlendModulate.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..aa9116e
--- /dev/null
+++ b/tests/sksl/blend/BlendMultiply.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..982e987
--- /dev/null
+++ b/tests/sksl/blend/BlendOverlay.hlsl
@@ -0,0 +1,52 @@
+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
new file mode 100644
index 0000000..6cbdb71
--- /dev/null
+++ b/tests/sksl/blend/BlendPlus.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..6cdaeae
--- /dev/null
+++ b/tests/sksl/blend/BlendSaturation.hlsl
@@ -0,0 +1,126 @@
+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
new file mode 100644
index 0000000..a27811c
--- /dev/null
+++ b/tests/sksl/blend/BlendScreen.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..2d227cf
--- /dev/null
+++ b/tests/sksl/blend/BlendSoftLight.hlsl
@@ -0,0 +1,71 @@
+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
new file mode 100644
index 0000000..46b767c
--- /dev/null
+++ b/tests/sksl/blend/BlendSrc.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..733e26d
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcAtop.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..d1f16bb
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcIn.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..27894a8
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcOut.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..4ed9ba5
--- /dev/null
+++ b/tests/sksl/blend/BlendSrcOver.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..37a93a5
--- /dev/null
+++ b/tests/sksl/blend/BlendXor.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..5de06af
--- /dev/null
+++ b/tests/sksl/intrinsics/AbsFloat.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..5ec6c91
--- /dev/null
+++ b/tests/sksl/intrinsics/AbsInt.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..b6a773a
--- /dev/null
+++ b/tests/sksl/intrinsics/Acos.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..d70cfa7
--- /dev/null
+++ b/tests/sksl/intrinsics/All.hlsl
@@ -0,0 +1,93 @@
+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
new file mode 100644
index 0000000..528a98d
--- /dev/null
+++ b/tests/sksl/intrinsics/Any.hlsl
@@ -0,0 +1,93 @@
+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
new file mode 100644
index 0000000..d2c89f8
--- /dev/null
+++ b/tests/sksl/intrinsics/Asin.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..380448c
--- /dev/null
+++ b/tests/sksl/intrinsics/Atan.hlsl
@@ -0,0 +1,184 @@
+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
new file mode 100644
index 0000000..f23ca4e
--- /dev/null
+++ b/tests/sksl/intrinsics/BitCount.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..2a6f3ce
--- /dev/null
+++ b/tests/sksl/intrinsics/Ceil.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..356b721
--- /dev/null
+++ b/tests/sksl/intrinsics/ClampFloat.hlsl
@@ -0,0 +1,185 @@
+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
new file mode 100644
index 0000000..a771d42
--- /dev/null
+++ b/tests/sksl/intrinsics/ClampInt.hlsl
@@ -0,0 +1,189 @@
+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
new file mode 100644
index 0000000..5cdf90b
--- /dev/null
+++ b/tests/sksl/intrinsics/ClampUInt.hlsl
@@ -0,0 +1,189 @@
+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
new file mode 100644
index 0000000..dd74512
--- /dev/null
+++ b/tests/sksl/intrinsics/Cos.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..69c9582
--- /dev/null
+++ b/tests/sksl/intrinsics/Cosh.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..7689c2c
--- /dev/null
+++ b/tests/sksl/intrinsics/Cross.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..28a039b
--- /dev/null
+++ b/tests/sksl/intrinsics/CrossNoInline.hlsl
@@ -0,0 +1,43 @@
+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
new file mode 100644
index 0000000..3e6169b
--- /dev/null
+++ b/tests/sksl/intrinsics/DFdx.hlsl
@@ -0,0 +1,103 @@
+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
new file mode 100644
index 0000000..b436642
--- /dev/null
+++ b/tests/sksl/intrinsics/DFdy.hlsl
@@ -0,0 +1,104 @@
+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
new file mode 100644
index 0000000..05ad24b
--- /dev/null
+++ b/tests/sksl/intrinsics/DFdyNoRTFlip.hlsl
@@ -0,0 +1,103 @@
+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
new file mode 100644
index 0000000..b99be45
--- /dev/null
+++ b/tests/sksl/intrinsics/Degrees.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..2f7be95
--- /dev/null
+++ b/tests/sksl/intrinsics/Determinant.hlsl
@@ -0,0 +1,42 @@
+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
new file mode 100644
index 0000000..e1af17e
--- /dev/null
+++ b/tests/sksl/intrinsics/Distance.hlsl
@@ -0,0 +1,107 @@
+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
new file mode 100644
index 0000000..ba03ea2
--- /dev/null
+++ b/tests/sksl/intrinsics/Dot.hlsl
@@ -0,0 +1,107 @@
+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
new file mode 100644
index 0000000..0ff6659
--- /dev/null
+++ b/tests/sksl/intrinsics/Equal.hlsl
@@ -0,0 +1,54 @@
+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
new file mode 100644
index 0000000..b6deea2
--- /dev/null
+++ b/tests/sksl/intrinsics/Exp.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..f577435
--- /dev/null
+++ b/tests/sksl/intrinsics/Exp2.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..9c71cf3
--- /dev/null
+++ b/tests/sksl/intrinsics/FaceForward.hlsl
@@ -0,0 +1,117 @@
+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
new file mode 100644
index 0000000..6517685
--- /dev/null
+++ b/tests/sksl/intrinsics/FindLSB.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..30ea09e
--- /dev/null
+++ b/tests/sksl/intrinsics/FindMSB.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..c9687fa
--- /dev/null
+++ b/tests/sksl/intrinsics/FloatBitsToInt.hlsl
@@ -0,0 +1,75 @@
+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
new file mode 100644
index 0000000..f8eff1c
--- /dev/null
+++ b/tests/sksl/intrinsics/FloatBitsToUint.hlsl
@@ -0,0 +1,75 @@
+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
new file mode 100644
index 0000000..54dac70
--- /dev/null
+++ b/tests/sksl/intrinsics/Floor.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..d1a84b8
--- /dev/null
+++ b/tests/sksl/intrinsics/Fma.hlsl
@@ -0,0 +1,56 @@
+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
new file mode 100644
index 0000000..f91ad22
--- /dev/null
+++ b/tests/sksl/intrinsics/Fract.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..11be8a4
--- /dev/null
+++ b/tests/sksl/intrinsics/Frexp.hlsl
@@ -0,0 +1,106 @@
+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
new file mode 100644
index 0000000..3f140fd
--- /dev/null
+++ b/tests/sksl/intrinsics/Fwidth.hlsl
@@ -0,0 +1,123 @@
+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
new file mode 100644
index 0000000..1ef3875
--- /dev/null
+++ b/tests/sksl/intrinsics/GreaterThan.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..9b42fce
--- /dev/null
+++ b/tests/sksl/intrinsics/GreaterThanEqual.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..2e91e35
--- /dev/null
+++ b/tests/sksl/intrinsics/IntBitsToFloat.hlsl
@@ -0,0 +1,78 @@
+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
new file mode 100644
index 0000000..f8cd0da
--- /dev/null
+++ b/tests/sksl/intrinsics/Inverse.hlsl
@@ -0,0 +1,108 @@
+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
new file mode 100644
index 0000000..1f6a12d
--- /dev/null
+++ b/tests/sksl/intrinsics/Inversesqrt.hlsl
@@ -0,0 +1,148 @@
+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
new file mode 100644
index 0000000..5c4bce1
--- /dev/null
+++ b/tests/sksl/intrinsics/IsInf.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..4a16b54
--- /dev/null
+++ b/tests/sksl/intrinsics/IsNan.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..c99d8a2
--- /dev/null
+++ b/tests/sksl/intrinsics/Ldexp.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..dc0397f
--- /dev/null
+++ b/tests/sksl/intrinsics/Length.hlsl
@@ -0,0 +1,106 @@
+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
new file mode 100644
index 0000000..1c83bf1
--- /dev/null
+++ b/tests/sksl/intrinsics/LessThan.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..5d921dd
--- /dev/null
+++ b/tests/sksl/intrinsics/LessThanEqual.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..a0dba64
--- /dev/null
+++ b/tests/sksl/intrinsics/Log.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..14bad78
--- /dev/null
+++ b/tests/sksl/intrinsics/Log2.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..0689052
--- /dev/null
+++ b/tests/sksl/intrinsics/MatrixCompMultES2.hlsl
@@ -0,0 +1,69 @@
+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
new file mode 100644
index 0000000..a52b88c0
--- /dev/null
+++ b/tests/sksl/intrinsics/MatrixCompMultES3.hlsl
@@ -0,0 +1,72 @@
+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
new file mode 100644
index 0000000..533ad33
--- /dev/null
+++ b/tests/sksl/intrinsics/MaxFloat.hlsl
@@ -0,0 +1,185 @@
+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
new file mode 100644
index 0000000..aca4bc2
--- /dev/null
+++ b/tests/sksl/intrinsics/MaxInt.hlsl
@@ -0,0 +1,192 @@
+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
new file mode 100644
index 0000000..ec4668c
--- /dev/null
+++ b/tests/sksl/intrinsics/MinFloat.hlsl
@@ -0,0 +1,185 @@
+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
new file mode 100644
index 0000000..c95a6e2
--- /dev/null
+++ b/tests/sksl/intrinsics/MinInt.hlsl
@@ -0,0 +1,192 @@
+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
new file mode 100644
index 0000000..e6886c1
--- /dev/null
+++ b/tests/sksl/intrinsics/MixBool.hlsl
@@ -0,0 +1,359 @@
+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
new file mode 100644
index 0000000..bdd8ed4
--- /dev/null
+++ b/tests/sksl/intrinsics/MixFloat.hlsl
@@ -0,0 +1,227 @@
+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
new file mode 100644
index 0000000..3b46785
--- /dev/null
+++ b/tests/sksl/intrinsics/Mod.hlsl
@@ -0,0 +1,206 @@
+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
new file mode 100644
index 0000000..b011bae
--- /dev/null
+++ b/tests/sksl/intrinsics/Modf.hlsl
@@ -0,0 +1,105 @@
+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
new file mode 100644
index 0000000..fa5b8af
--- /dev/null
+++ b/tests/sksl/intrinsics/Normalize.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..c2cc98a
--- /dev/null
+++ b/tests/sksl/intrinsics/Not.hlsl
@@ -0,0 +1,101 @@
+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
new file mode 100644
index 0000000..9019850
--- /dev/null
+++ b/tests/sksl/intrinsics/NotEqual.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..db9fb31
--- /dev/null
+++ b/tests/sksl/intrinsics/OuterProduct.hlsl
@@ -0,0 +1,113 @@
+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
new file mode 100644
index 0000000..09d9200
--- /dev/null
+++ b/tests/sksl/intrinsics/Pack.hlsl
@@ -0,0 +1,91 @@
+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
new file mode 100644
index 0000000..e40a51a
--- /dev/null
+++ b/tests/sksl/intrinsics/PackHalf2x16.hlsl
@@ -0,0 +1,68 @@
+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
new file mode 100644
index 0000000..c16e9d8
--- /dev/null
+++ b/tests/sksl/intrinsics/PackSnorm2x16.hlsl
@@ -0,0 +1,70 @@
+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
new file mode 100644
index 0000000..7297d99
--- /dev/null
+++ b/tests/sksl/intrinsics/PackUnorm2x16.hlsl
@@ -0,0 +1,69 @@
+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
new file mode 100644
index 0000000..705f896
--- /dev/null
+++ b/tests/sksl/intrinsics/Pow.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..72fca52
--- /dev/null
+++ b/tests/sksl/intrinsics/Radians.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..21559d6
--- /dev/null
+++ b/tests/sksl/intrinsics/Reflect.hlsl
@@ -0,0 +1,118 @@
+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
new file mode 100644
index 0000000..80e4dbd
--- /dev/null
+++ b/tests/sksl/intrinsics/Refract.hlsl
@@ -0,0 +1,48 @@
+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
new file mode 100644
index 0000000..4479268
--- /dev/null
+++ b/tests/sksl/intrinsics/Round.hlsl
@@ -0,0 +1,72 @@
+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
new file mode 100644
index 0000000..4479268
--- /dev/null
+++ b/tests/sksl/intrinsics/RoundEven.hlsl
@@ -0,0 +1,72 @@
+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
new file mode 100644
index 0000000..d987263
--- /dev/null
+++ b/tests/sksl/intrinsics/Sample.hlsl
@@ -0,0 +1,24 @@
+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
new file mode 100644
index 0000000..43ad520
--- /dev/null
+++ b/tests/sksl/intrinsics/SampleGrad.hlsl
@@ -0,0 +1,33 @@
+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
new file mode 100644
index 0000000..9e826e5
--- /dev/null
+++ b/tests/sksl/intrinsics/SampleLod.hlsl
@@ -0,0 +1,24 @@
+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
new file mode 100644
index 0000000..220b49f
--- /dev/null
+++ b/tests/sksl/intrinsics/Saturate.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..62ea826
--- /dev/null
+++ b/tests/sksl/intrinsics/SignFloat.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..35f183c
--- /dev/null
+++ b/tests/sksl/intrinsics/SignInt.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..f583319
--- /dev/null
+++ b/tests/sksl/intrinsics/Sin.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..254a95f
--- /dev/null
+++ b/tests/sksl/intrinsics/Sinh.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..a7000b4
--- /dev/null
+++ b/tests/sksl/intrinsics/Smoothstep.hlsl
@@ -0,0 +1,221 @@
+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
new file mode 100644
index 0000000..dfc6d7a
--- /dev/null
+++ b/tests/sksl/intrinsics/Sqrt.hlsl
@@ -0,0 +1,148 @@
+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
new file mode 100644
index 0000000..75f1d03
--- /dev/null
+++ b/tests/sksl/intrinsics/Step.hlsl
@@ -0,0 +1,185 @@
+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
new file mode 100644
index 0000000..54ab0d3
--- /dev/null
+++ b/tests/sksl/intrinsics/Tan.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..2dba513
--- /dev/null
+++ b/tests/sksl/intrinsics/Tanh.hlsl
@@ -0,0 +1,109 @@
+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
new file mode 100644
index 0000000..24bf05a
--- /dev/null
+++ b/tests/sksl/intrinsics/Transpose.hlsl
@@ -0,0 +1,73 @@
+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
new file mode 100644
index 0000000..51b44ef
--- /dev/null
+++ b/tests/sksl/intrinsics/Trunc.hlsl
@@ -0,0 +1,72 @@
+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
new file mode 100644
index 0000000..889189f
--- /dev/null
+++ b/tests/sksl/intrinsics/UintBitsToFloat.hlsl
@@ -0,0 +1,78 @@
+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
new file mode 100644
index 0000000..b3079c4
--- /dev/null
+++ b/tests/sksl/intrinsics/Unpack.hlsl
@@ -0,0 +1,93 @@
+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
new file mode 100644
index 0000000..5c06de9
--- /dev/null
+++ b/tests/sksl/shared/ArrayCast.hlsl
@@ -0,0 +1,74 @@
+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
new file mode 100644
index 0000000..7e08abb
--- /dev/null
+++ b/tests/sksl/shared/ArrayComparison.hlsl
@@ -0,0 +1,181 @@
+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
new file mode 100644
index 0000000..fd28e30
--- /dev/null
+++ b/tests/sksl/shared/ArrayConstructors.hlsl
@@ -0,0 +1,47 @@
+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
new file mode 100644
index 0000000..b68202e
--- /dev/null
+++ b/tests/sksl/shared/ArrayFollowedByScalar.hlsl
@@ -0,0 +1,30 @@
+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
new file mode 100644
index 0000000..3af3cc9
--- /dev/null
+++ b/tests/sksl/shared/ArrayIndexTypes.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..9ea63a4
--- /dev/null
+++ b/tests/sksl/shared/ArrayNarrowingConversions.hlsl
@@ -0,0 +1,81 @@
+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
new file mode 100644
index 0000000..84267d3
--- /dev/null
+++ b/tests/sksl/shared/ArrayTypes.hlsl
@@ -0,0 +1,45 @@
+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
new file mode 100644
index 0000000..d98683a
--- /dev/null
+++ b/tests/sksl/shared/Assignment.hlsl
@@ -0,0 +1,113 @@
+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
new file mode 100644
index 0000000..b52493a
--- /dev/null
+++ b/tests/sksl/shared/Caps.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..af5dd9b
--- /dev/null
+++ b/tests/sksl/shared/CastsRoundTowardZero.hlsl
@@ -0,0 +1,42 @@
+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
new file mode 100644
index 0000000..fe0e651
--- /dev/null
+++ b/tests/sksl/shared/Clockwise.hlsl
@@ -0,0 +1,41 @@
+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
new file mode 100644
index 0000000..fea761c
--- /dev/null
+++ b/tests/sksl/shared/ClockwiseNoRTFlip.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..ae38d44
--- /dev/null
+++ b/tests/sksl/shared/CommaMixedTypes.hlsl
@@ -0,0 +1,37 @@
+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
new file mode 100644
index 0000000..0c39c92
--- /dev/null
+++ b/tests/sksl/shared/CommaSideEffects.hlsl
@@ -0,0 +1,89 @@
+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
new file mode 100644
index 0000000..e45d215
--- /dev/null
+++ b/tests/sksl/shared/CompileTimeConstantVariables.hlsl
@@ -0,0 +1,68 @@
+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
new file mode 100644
index 0000000..ba145b0
--- /dev/null
+++ b/tests/sksl/shared/ComplexDelete.hlsl
@@ -0,0 +1,39 @@
+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
new file mode 100644
index 0000000..77290f9
--- /dev/null
+++ b/tests/sksl/shared/ConstArray.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..0742b9a
--- /dev/null
+++ b/tests/sksl/shared/ConstGlobal.hlsl
@@ -0,0 +1,57 @@
+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
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/ConstVariableComparison.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..8d59cff
--- /dev/null
+++ b/tests/sksl/shared/ConstantCompositeAccessViaConstantIndex.hlsl
@@ -0,0 +1,92 @@
+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
new file mode 100644
index 0000000..12b79be
--- /dev/null
+++ b/tests/sksl/shared/ConstantCompositeAccessViaDynamicIndex.hlsl
@@ -0,0 +1,37 @@
+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
new file mode 100644
index 0000000..05e2c97
--- /dev/null
+++ b/tests/sksl/shared/ConstantIf.hlsl
@@ -0,0 +1,75 @@
+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
new file mode 100644
index 0000000..6dfb1cd
--- /dev/null
+++ b/tests/sksl/shared/Control.hlsl
@@ -0,0 +1,60 @@
+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
new file mode 100644
index 0000000..e982fe5
--- /dev/null
+++ b/tests/sksl/shared/DeadDoWhileLoop.hlsl
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/DeadGlobals.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/DeadIfStatement.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..57b7aac
--- /dev/null
+++ b/tests/sksl/shared/DeadLoopVariable.hlsl
@@ -0,0 +1,36 @@
+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
new file mode 100644
index 0000000..5b4614d
--- /dev/null
+++ b/tests/sksl/shared/DeadReturn.hlsl
@@ -0,0 +1,122 @@
+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
new file mode 100644
index 0000000..9dd05f2
--- /dev/null
+++ b/tests/sksl/shared/DeadReturnES3.hlsl
@@ -0,0 +1,190 @@
+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
new file mode 100644
index 0000000..a036937
--- /dev/null
+++ b/tests/sksl/shared/DeadStripFunctions.hlsl
@@ -0,0 +1,67 @@
+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
new file mode 100644
index 0000000..547682f
--- /dev/null
+++ b/tests/sksl/shared/DependentInitializers.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..12edad8
--- /dev/null
+++ b/tests/sksl/shared/DerivativesUnused.hlsl
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..8da6875
--- /dev/null
+++ b/tests/sksl/shared/Discard.hlsl
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..f6005a3
--- /dev/null
+++ b/tests/sksl/shared/DoWhileControlFlow.hlsl
@@ -0,0 +1,43 @@
+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
new file mode 100644
index 0000000..16365bb
--- /dev/null
+++ b/tests/sksl/shared/DoubleNegation.hlsl
@@ -0,0 +1,31 @@
+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
new file mode 100644
index 0000000..376aad2
--- /dev/null
+++ b/tests/sksl/shared/EmptyBlocksES2.hlsl
@@ -0,0 +1,43 @@
+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
new file mode 100644
index 0000000..f619a16
--- /dev/null
+++ b/tests/sksl/shared/EmptyBlocksES3.hlsl
@@ -0,0 +1,49 @@
+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
new file mode 100644
index 0000000..75f9659
--- /dev/null
+++ b/tests/sksl/shared/ForLoopControlFlow.hlsl
@@ -0,0 +1,49 @@
+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
new file mode 100644
index 0000000..7d21e1a
--- /dev/null
+++ b/tests/sksl/shared/ForLoopMultipleInit.hlsl
@@ -0,0 +1,73 @@
+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
new file mode 100644
index 0000000..7fc9187
--- /dev/null
+++ b/tests/sksl/shared/FragCoords.hlsl
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000..4d779d5
--- /dev/null
+++ b/tests/sksl/shared/FragCoordsNoRTFlip.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..c13f36a
--- /dev/null
+++ b/tests/sksl/shared/FunctionAnonymousParameters.hlsl
@@ -0,0 +1,62 @@
+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
new file mode 100644
index 0000000..03c51a9
--- /dev/null
+++ b/tests/sksl/shared/FunctionArgTypeMatch.hlsl
@@ -0,0 +1,385 @@
+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
new file mode 100644
index 0000000..d917e8f
--- /dev/null
+++ b/tests/sksl/shared/FunctionPrototype.hlsl
@@ -0,0 +1,37 @@
+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
new file mode 100644
index 0000000..04f0874
--- /dev/null
+++ b/tests/sksl/shared/FunctionReturnTypeMatch.hlsl
@@ -0,0 +1,393 @@
+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
new file mode 100644
index 0000000..34d9caa
--- /dev/null
+++ b/tests/sksl/shared/Functions.hlsl
@@ -0,0 +1,59 @@
+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
new file mode 100644
index 0000000..3d70411
--- /dev/null
+++ b/tests/sksl/shared/GaussianBlur.hlsl
@@ -0,0 +1,252 @@
+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
new file mode 100644
index 0000000..f9aee29
--- /dev/null
+++ b/tests/sksl/shared/GeometricIntrinsics.hlsl
@@ -0,0 +1,47 @@
+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
new file mode 100644
index 0000000..77290f9
--- /dev/null
+++ b/tests/sksl/shared/HelloWorld.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..18ffcd2
--- /dev/null
+++ b/tests/sksl/shared/Hex.hlsl
@@ -0,0 +1,41 @@
+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
new file mode 100644
index 0000000..18f7abe
--- /dev/null
+++ b/tests/sksl/shared/HexUnsigned.hlsl
@@ -0,0 +1,41 @@
+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
new file mode 100644
index 0000000..832b97a
--- /dev/null
+++ b/tests/sksl/shared/InoutParameters.hlsl
@@ -0,0 +1,67 @@
+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
new file mode 100644
index 0000000..69b16bf
--- /dev/null
+++ b/tests/sksl/shared/InoutParamsAreDistinct.hlsl
@@ -0,0 +1,63 @@
+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
new file mode 100644
index 0000000..e95d9be
--- /dev/null
+++ b/tests/sksl/shared/InstanceID.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..7098d35
--- /dev/null
+++ b/tests/sksl/shared/IntegerDivisionES3.hlsl
@@ -0,0 +1,51 @@
+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
new file mode 100644
index 0000000..e77feb6
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockBuffer.hlsl
@@ -0,0 +1,48 @@
+### 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
new file mode 100644
index 0000000..86f4fa9
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockMultipleAnonymous.hlsl
@@ -0,0 +1,30 @@
+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
new file mode 100644
index 0000000..ea3b2a5
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockNamed.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..0f5372d
--- /dev/null
+++ b/tests/sksl/shared/InterfaceBlockNamedArray.hlsl
@@ -0,0 +1,53 @@
+### 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
new file mode 100644
index 0000000..91d46a7
--- /dev/null
+++ b/tests/sksl/shared/Matrices.hlsl
@@ -0,0 +1,277 @@
+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
new file mode 100644
index 0000000..dad6e4e
--- /dev/null
+++ b/tests/sksl/shared/MatricesNonsquare.hlsl
@@ -0,0 +1,279 @@
+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
new file mode 100644
index 0000000..e71f8af
--- /dev/null
+++ b/tests/sksl/shared/MatrixConstructorsES2.hlsl
@@ -0,0 +1,78 @@
+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
new file mode 100644
index 0000000..917742a
--- /dev/null
+++ b/tests/sksl/shared/MatrixConstructorsES3.hlsl
@@ -0,0 +1,107 @@
+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
new file mode 100644
index 0000000..7fb2bc0
--- /dev/null
+++ b/tests/sksl/shared/MatrixEquality.hlsl
@@ -0,0 +1,84 @@
+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
new file mode 100644
index 0000000..9467d34
--- /dev/null
+++ b/tests/sksl/shared/MatrixOpEqualsES3.hlsl
@@ -0,0 +1,357 @@
+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
new file mode 100644
index 0000000..297ee8b
--- /dev/null
+++ b/tests/sksl/shared/MatrixScalarMath.hlsl
@@ -0,0 +1,185 @@
+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
new file mode 100644
index 0000000..7653483
--- /dev/null
+++ b/tests/sksl/shared/MatrixScalarSplat.hlsl
@@ -0,0 +1,371 @@
+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
new file mode 100644
index 0000000..1eecbcd
--- /dev/null
+++ b/tests/sksl/shared/MatrixToVectorCast.hlsl
@@ -0,0 +1,87 @@
+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
new file mode 100644
index 0000000..19c7e2f
--- /dev/null
+++ b/tests/sksl/shared/MultipleAssignments.hlsl
@@ -0,0 +1,30 @@
+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
new file mode 100644
index 0000000..d712440
--- /dev/null
+++ b/tests/sksl/shared/Negation.hlsl
@@ -0,0 +1,111 @@
+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
new file mode 100644
index 0000000..10867c9
--- /dev/null
+++ b/tests/sksl/shared/NoFragCoordsPos.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..5590eee
--- /dev/null
+++ b/tests/sksl/shared/NoFragCoordsPosRT.hlsl
@@ -0,0 +1,33 @@
+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
new file mode 100644
index 0000000..49fddb6
--- /dev/null
+++ b/tests/sksl/shared/NormalizationVert.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..c17cb5a
--- /dev/null
+++ b/tests/sksl/shared/NumberCasts.hlsl
@@ -0,0 +1,55 @@
+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
new file mode 100644
index 0000000..0cc92f9
--- /dev/null
+++ b/tests/sksl/shared/NumberConversions.hlsl
@@ -0,0 +1,84 @@
+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
new file mode 100644
index 0000000..0454677
--- /dev/null
+++ b/tests/sksl/shared/Octal.hlsl
@@ -0,0 +1,72 @@
+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
new file mode 100644
index 0000000..a97967c
--- /dev/null
+++ b/tests/sksl/shared/Offset.hlsl
@@ -0,0 +1,28 @@
+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
new file mode 100644
index 0000000..7a1d40d
--- /dev/null
+++ b/tests/sksl/shared/OperatorsES2.hlsl
@@ -0,0 +1,124 @@
+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
new file mode 100644
index 0000000..d591cc2
--- /dev/null
+++ b/tests/sksl/shared/OperatorsES3.hlsl
@@ -0,0 +1,156 @@
+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
new file mode 100644
index 0000000..3b50282
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz26167.hlsl
@@ -0,0 +1,8 @@
+void frag_main()
+{
+}
+
+void main()
+{
+    frag_main();
+}
diff --git a/tests/sksl/shared/Ossfuzz26759.hlsl b/tests/sksl/shared/Ossfuzz26759.hlsl
new file mode 100644
index 0000000..db67767
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz26759.hlsl
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000..5b43dda
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz28794.hlsl
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..22761f4
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz28904.hlsl
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..3b50282
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz29085.hlsl
@@ -0,0 +1,8 @@
+void frag_main()
+{
+}
+
+void main()
+{
+    frag_main();
+}
diff --git a/tests/sksl/shared/Ossfuzz29494.hlsl b/tests/sksl/shared/Ossfuzz29494.hlsl
new file mode 100644
index 0000000..22761f4
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz29494.hlsl
@@ -0,0 +1,19 @@
+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
new file mode 100644
index 0000000..cc3e16b
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz36770.hlsl
@@ -0,0 +1,32 @@
+### 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
new file mode 100644
index 0000000..dd639db
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz36852.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..513ff19
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz37466.hlsl
@@ -0,0 +1,11 @@
+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
new file mode 100644
index 0000000..c2d4bfa
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz37677.hlsl
@@ -0,0 +1,31 @@
+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
new file mode 100644
index 0000000..9751821
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz37900.hlsl
@@ -0,0 +1,6 @@
+### 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
new file mode 100644
index 0000000..06d568d
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz41000.hlsl
@@ -0,0 +1,4 @@
+### 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
new file mode 100644
index 0000000..06d568d
--- /dev/null
+++ b/tests/sksl/shared/Ossfuzz50636.hlsl
@@ -0,0 +1,4 @@
+### 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
new file mode 100644
index 0000000..f817ab0
--- /dev/null
+++ b/tests/sksl/shared/OutParams.hlsl
@@ -0,0 +1,325 @@
+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
new file mode 100644
index 0000000..cd0bb06
--- /dev/null
+++ b/tests/sksl/shared/OutParamsAreDistinct.hlsl
@@ -0,0 +1,63 @@
+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
new file mode 100644
index 0000000..af4ccfe
--- /dev/null
+++ b/tests/sksl/shared/OutParamsAreDistinctFromGlobal.hlsl
@@ -0,0 +1,63 @@
+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
new file mode 100644
index 0000000..1e23a33
--- /dev/null
+++ b/tests/sksl/shared/OutParamsNoInline.hlsl
@@ -0,0 +1,303 @@
+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
new file mode 100644
index 0000000..5c87a4f
--- /dev/null
+++ b/tests/sksl/shared/OutParamsTricky.hlsl
@@ -0,0 +1,63 @@
+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
new file mode 100644
index 0000000..65781c3
--- /dev/null
+++ b/tests/sksl/shared/Overflow.hlsl
@@ -0,0 +1,49 @@
+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
new file mode 100644
index 0000000..8a47a62
--- /dev/null
+++ b/tests/sksl/shared/RectangleTexture.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..4af7952
--- /dev/null
+++ b/tests/sksl/shared/ResizeMatrix.hlsl
@@ -0,0 +1,60 @@
+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
new file mode 100644
index 0000000..2696269
--- /dev/null
+++ b/tests/sksl/shared/ResizeMatrixNonsquare.hlsl
@@ -0,0 +1,60 @@
+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
new file mode 100644
index 0000000..a149e76
--- /dev/null
+++ b/tests/sksl/shared/ReturnBadTypeFromMain.hlsl
@@ -0,0 +1,29 @@
+### 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
new file mode 100644
index 0000000..3edcf24
--- /dev/null
+++ b/tests/sksl/shared/ReturnColorFromMain.hlsl
@@ -0,0 +1,25 @@
+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
new file mode 100644
index 0000000..bb2612c
--- /dev/null
+++ b/tests/sksl/shared/ReturnsValueOnEveryPathES2.hlsl
@@ -0,0 +1,163 @@
+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
new file mode 100644
index 0000000..ef14708
--- /dev/null
+++ b/tests/sksl/shared/ReturnsValueOnEveryPathES3.hlsl
@@ -0,0 +1,320 @@
+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
new file mode 100644
index 0000000..37572a9
--- /dev/null
+++ b/tests/sksl/shared/SampleLocations.hlsl
@@ -0,0 +1,84 @@
+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
new file mode 100644
index 0000000..84f9097
--- /dev/null
+++ b/tests/sksl/shared/ScalarConversionConstructorsES2.hlsl
@@ -0,0 +1,61 @@
+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
new file mode 100644
index 0000000..19885ce
--- /dev/null
+++ b/tests/sksl/shared/ScalarConversionConstructorsES3.hlsl
@@ -0,0 +1,76 @@
+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
new file mode 100644
index 0000000..683e5c0
--- /dev/null
+++ b/tests/sksl/shared/ScopedSymbol.hlsl
@@ -0,0 +1,110 @@
+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
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/StackingVectorCasts.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..524eb58
--- /dev/null
+++ b/tests/sksl/shared/StaticIf.hlsl
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000..dc4144d
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitch.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..5402da6
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithBreak.hlsl
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..5402da6
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithBreakInsideBlock.hlsl
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..48352ca
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithConditionalBreak.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..c5a8118
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithConditionalBreakInsideBlock.hlsl
@@ -0,0 +1,44 @@
+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
new file mode 100644
index 0000000..ff10238
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithContinue.hlsl
@@ -0,0 +1,46 @@
+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
new file mode 100644
index 0000000..522f1e4
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithFallthroughA.hlsl
@@ -0,0 +1,22 @@
+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
new file mode 100644
index 0000000..e943e26
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithFallthroughB.hlsl
@@ -0,0 +1,21 @@
+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
new file mode 100644
index 0000000..3fa6465
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreak.hlsl
@@ -0,0 +1,38 @@
+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
new file mode 100644
index 0000000..004579f
--- /dev/null
+++ b/tests/sksl/shared/StaticSwitchWithStaticConditionalBreakInsideBlock.hlsl
@@ -0,0 +1,38 @@
+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
new file mode 100644
index 0000000..4843554
--- /dev/null
+++ b/tests/sksl/shared/StructArrayFollowedByScalar.hlsl
@@ -0,0 +1,36 @@
+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
new file mode 100644
index 0000000..e6bc15f
--- /dev/null
+++ b/tests/sksl/shared/StructComparison.hlsl
@@ -0,0 +1,67 @@
+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
new file mode 100644
index 0000000..06d568d
--- /dev/null
+++ b/tests/sksl/shared/StructMaxDepth.hlsl
@@ -0,0 +1,4 @@
+### 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
new file mode 100644
index 0000000..8836141
--- /dev/null
+++ b/tests/sksl/shared/Structs.hlsl
@@ -0,0 +1,37 @@
+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
new file mode 100644
index 0000000..ebbf13c
--- /dev/null
+++ b/tests/sksl/shared/StructsInFunctions.hlsl
@@ -0,0 +1,204 @@
+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
new file mode 100644
index 0000000..74abc03
--- /dev/null
+++ b/tests/sksl/shared/SwitchWithEarlyReturn.hlsl
@@ -0,0 +1,456 @@
+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
new file mode 100644
index 0000000..07c250c
--- /dev/null
+++ b/tests/sksl/shared/SwizzleBoolConstants.hlsl
@@ -0,0 +1,75 @@
+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
new file mode 100644
index 0000000..efb5c1f
--- /dev/null
+++ b/tests/sksl/shared/SwizzleByConstantIndex.hlsl
@@ -0,0 +1,74 @@
+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
new file mode 100644
index 0000000..42982fe
--- /dev/null
+++ b/tests/sksl/shared/SwizzleByIndex.hlsl
@@ -0,0 +1,55 @@
+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
new file mode 100644
index 0000000..51e7eed
--- /dev/null
+++ b/tests/sksl/shared/SwizzleConstants.hlsl
@@ -0,0 +1,91 @@
+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
new file mode 100644
index 0000000..d92f29e
--- /dev/null
+++ b/tests/sksl/shared/SwizzleLTRB.hlsl
@@ -0,0 +1,31 @@
+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
new file mode 100644
index 0000000..8682952
--- /dev/null
+++ b/tests/sksl/shared/SwizzleOpt.hlsl
@@ -0,0 +1,95 @@
+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
new file mode 100644
index 0000000..f0f2d0d
--- /dev/null
+++ b/tests/sksl/shared/SwizzleScalar.hlsl
@@ -0,0 +1,36 @@
+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
new file mode 100644
index 0000000..8e7ec38
--- /dev/null
+++ b/tests/sksl/shared/SwizzleScalarBool.hlsl
@@ -0,0 +1,38 @@
+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
new file mode 100644
index 0000000..07f7ff8
--- /dev/null
+++ b/tests/sksl/shared/SwizzleScalarInt.hlsl
@@ -0,0 +1,38 @@
+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
new file mode 100644
index 0000000..cb8be58
--- /dev/null
+++ b/tests/sksl/shared/TernaryAsLValueEntirelyFoldable.hlsl
@@ -0,0 +1,27 @@
+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
new file mode 100644
index 0000000..4e0e5f6
--- /dev/null
+++ b/tests/sksl/shared/TernaryAsLValueFoldableTest.hlsl
@@ -0,0 +1,34 @@
+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
new file mode 100644
index 0000000..f40edd7
--- /dev/null
+++ b/tests/sksl/shared/TernaryExpression.hlsl
@@ -0,0 +1,62 @@
+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
new file mode 100644
index 0000000..7be07a6
--- /dev/null
+++ b/tests/sksl/shared/Texture1D.hlsl
@@ -0,0 +1,71 @@
+### 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
new file mode 100644
index 0000000..1163521
--- /dev/null
+++ b/tests/sksl/shared/Texture2D.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..b79e83d
--- /dev/null
+++ b/tests/sksl/shared/TextureSharpen.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..e96dd15
--- /dev/null
+++ b/tests/sksl/shared/UnaryPositiveNegative.hlsl
@@ -0,0 +1,161 @@
+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
new file mode 100644
index 0000000..9f55b50
--- /dev/null
+++ b/tests/sksl/shared/UniformArray.hlsl
@@ -0,0 +1,40 @@
+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
new file mode 100644
index 0000000..54dd8fc
--- /dev/null
+++ b/tests/sksl/shared/UniformBuffers.hlsl
@@ -0,0 +1,28 @@
+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
new file mode 100644
index 0000000..d3d84c5
--- /dev/null
+++ b/tests/sksl/shared/UniformMatrixResize.hlsl
@@ -0,0 +1,50 @@
+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
new file mode 100644
index 0000000..04f3e59
--- /dev/null
+++ b/tests/sksl/shared/Uniforms.hlsl
@@ -0,0 +1,32 @@
+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
new file mode 100644
index 0000000..b99a0f4
--- /dev/null
+++ b/tests/sksl/shared/UnusedVariables.hlsl
@@ -0,0 +1,48 @@
+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
new file mode 100644
index 0000000..72860af
--- /dev/null
+++ b/tests/sksl/shared/VectorConstructors.hlsl
@@ -0,0 +1,84 @@
+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
new file mode 100644
index 0000000..4bb7c7c
--- /dev/null
+++ b/tests/sksl/shared/VectorScalarMath.hlsl
@@ -0,0 +1,440 @@
+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
new file mode 100644
index 0000000..bda499e
--- /dev/null
+++ b/tests/sksl/shared/VectorToMatrixCast.hlsl
@@ -0,0 +1,169 @@
+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
new file mode 100644
index 0000000..c8ad185
--- /dev/null
+++ b/tests/sksl/shared/VertexID.hlsl
@@ -0,0 +1,26 @@
+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
new file mode 100644
index 0000000..3dcb6d7
--- /dev/null
+++ b/tests/sksl/shared/WhileLoopControlFlow.hlsl
@@ -0,0 +1,43 @@
+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 a84a448..4d5eb36 100644
--- a/tools/skslc/BUILD.bazel
+++ b/tools/skslc/BUILD.bazel
@@ -78,6 +78,12 @@
 )
 
 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 35c7bcd..e01b594 100644
--- a/tools/skslc/Makefile
+++ b/tools/skslc/Makefile
@@ -6,4 +6,5 @@
 	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
\ No newline at end of file
+	bazel run //tools/skslc:compile_wgsl_tests --config=release
+	bazel run //tools/skslc:compile_hlsl_tests --config=release