Implement initial Subzero based Reactor.

Bug swiftshader:6

Change-Id: I1de2fe8983c7b8d29e0295e5b4705697e5dd6df1
Reviewed-on: https://swiftshader-review.googlesource.com/7292
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/SwiftShader.sln b/SwiftShader.sln
index d09eb80..f5285a5 100644
--- a/SwiftShader.sln
+++ b/SwiftShader.sln
@@ -257,6 +257,10 @@
 EndProject

 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "D3D8", "src\D3D8\D3D8.vcxproj", "{F18D5ABF-CA3A-4B74-BDB2-4A1956C86F18}"

 EndProject

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Subzero", "src\Reactor\Subzero.vcxproj", "{0EB31AEC-B020-46AB-BA05-730F6D01C29B}"

+EndProject

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SubzeroTest", "src\Reactor\SubzeroTest.vcxproj", "{4EC107AB-89E8-4A0B-8366-B3E81085AE07}"

+EndProject

 Global

 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

 		Debug|Win32 = Debug|Win32

@@ -732,6 +736,30 @@
 		{F18D5ABF-CA3A-4B74-BDB2-4A1956C86F18}.Release|Win32.ActiveCfg = Release|Win32

 		{F18D5ABF-CA3A-4B74-BDB2-4A1956C86F18}.Release|Win32.Build.0 = Release|Win32

 		{F18D5ABF-CA3A-4B74-BDB2-4A1956C86F18}.Release|x64.ActiveCfg = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|Win32.ActiveCfg = Debug|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|Win32.Build.0 = Debug|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|x64.ActiveCfg = Debug|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|x64.Build.0 = Debug|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|Win32.ActiveCfg = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|Win32.Build.0 = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|x64.ActiveCfg = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|x64.Build.0 = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|Win32.ActiveCfg = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|Win32.Build.0 = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|x64.ActiveCfg = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|x64.Build.0 = Release|x64

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Debug|Win32.ActiveCfg = Debug|Win32

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Debug|Win32.Build.0 = Debug|Win32

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Debug|x64.ActiveCfg = Debug|x64

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Debug|x64.Build.0 = Debug|x64

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Profile|Win32.ActiveCfg = Release|Win32

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Profile|Win32.Build.0 = Release|Win32

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Profile|x64.ActiveCfg = Release|x64

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Profile|x64.Build.0 = Release|x64

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Release|Win32.ActiveCfg = Release|Win32

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Release|Win32.Build.0 = Release|Win32

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Release|x64.ActiveCfg = Release|x64

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07}.Release|x64.Build.0 = Release|x64

 	EndGlobalSection

 	GlobalSection(SolutionProperties) = preSolution

 		HideSolutionNode = FALSE

@@ -773,5 +801,6 @@
 		{04FC5430-3F1B-42A2-A18A-D8BB7E5B2733} = {ED25C308-5BDB-43A7-BED6-C2C059FC2D7D}

 		{09ABE661-9BC0-4152-A820-1FB0522CAC01} = {B7E24D8E-6BE9-4DEF-A8B9-6A6E60CA60E9}

 		{9088FC9E-9843-4E0D-85D0-1B657AFC480A} = {B7E24D8E-6BE9-4DEF-A8B9-6A6E60CA60E9}

+		{4EC107AB-89E8-4A0B-8366-B3E81085AE07} = {ED25C308-5BDB-43A7-BED6-C2C059FC2D7D}

 	EndGlobalSection

 EndGlobal

diff --git a/src/Reactor/Main.cpp b/src/Reactor/Main.cpp
new file mode 100644
index 0000000..afdc73f
--- /dev/null
+++ b/src/Reactor/Main.cpp
@@ -0,0 +1,49 @@
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "Reactor.hpp"
+
+#include <cassert>
+
+using namespace sw;
+
+int main()
+{
+	Routine *routine = nullptr;
+
+	{
+		Function<Int(Int, Int)> function;
+		{
+			Int x = function.Arg<0>();
+			Int y = function.Arg<1>();
+   
+			Int sum = x + y;
+   
+			Return(sum);
+		}
+
+		routine = function(L"one");
+
+		if(routine)
+		{
+			int (*add)(int, int) = (int(*)(int,int))routine->getEntry();
+			int result = add(1, 2);
+			assert(result == 3);
+		}
+	}
+
+	delete routine;
+
+	return 0;
+}
diff --git a/src/Reactor/Subzero.sln b/src/Reactor/Subzero.sln
new file mode 100644
index 0000000..921cdb5
--- /dev/null
+++ b/src/Reactor/Subzero.sln
@@ -0,0 +1,34 @@
+

+Microsoft Visual Studio Solution File, Format Version 12.00

+# Visual Studio 14

+VisualStudioVersion = 14.0.25420.1

+MinimumVisualStudioVersion = 10.0.40219.1

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Subzero", "Subzero.vcxproj", "{0EB31AEC-B020-46AB-BA05-730F6D01C29B}"

+EndProject

+Global

+	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+		Debug|x64 = Debug|x64

+		Debug|x86 = Debug|x86

+		Profile|x64 = Profile|x64

+		Profile|x86 = Profile|x86

+		Release|x64 = Release|x64

+		Release|x86 = Release|x86

+	EndGlobalSection

+	GlobalSection(ProjectConfigurationPlatforms) = postSolution

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|x64.ActiveCfg = Debug|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|x64.Build.0 = Debug|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|x86.ActiveCfg = Debug|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Debug|x86.Build.0 = Debug|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|x64.ActiveCfg = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|x64.Build.0 = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|x86.ActiveCfg = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Profile|x86.Build.0 = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|x64.ActiveCfg = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|x64.Build.0 = Release|x64

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|x86.ActiveCfg = Release|Win32

+		{0EB31AEC-B020-46AB-BA05-730F6D01C29B}.Release|x86.Build.0 = Release|Win32

+	EndGlobalSection

+	GlobalSection(SolutionProperties) = preSolution

+		HideSolutionNode = FALSE

+	EndGlobalSection

+EndGlobal

diff --git a/src/Reactor/Subzero.vcxproj b/src/Reactor/Subzero.vcxproj
new file mode 100644
index 0000000..7bf864c
--- /dev/null
+++ b/src/Reactor/Subzero.vcxproj
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|x64">

+      <Configuration>Debug</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|x64">

+      <Configuration>Release</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{0EB31AEC-B020-46AB-BA05-730F6D01C29B}</ProjectGuid>

+    <Keyword>Win32Proj</Keyword>

+    <RootNamespace>Subzero</RootNamespace>

+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <CharacterSet>NotSet</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

+    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <CharacterSet>NotSet</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <CharacterSet>NotSet</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

+    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <CharacterSet>NotSet</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <LinkIncremental>true</LinkIncremental>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <LinkIncremental>true</LinkIncremental>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <LinkIncremental>false</LinkIncremental>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <LinkIncremental>false</LinkIncremental>

+  </PropertyGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <WarningLevel>Level3</WarningLevel>

+      <Optimization>Disabled</Optimization>

+      <PreprocessorDefinitions>SZTARGET=X8632;ALLOW_DUMP=0;ALLOW_TIMERS=0;ALLOW_LLVM_CL=0;ALLOW_LLVM_IR=0;ALLOW_LLVM_IR_AS_INPUT=0;ALLOW_MINIMAL_BUILD=0;ALLOW_WASM=0;ICE_THREAD_LOCAL_HACK=0;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>

+      <AdditionalIncludeDirectories>..\;$(SolutionDir)third_party\pnacl-subzero;$(SolutionDir)third_party\llvm-subzero\include;$(SolutionDir)third_party\pnacl-subzero\pnacl-llvm\include</AdditionalIncludeDirectories>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <WarningLevel>Level3</WarningLevel>

+      <Optimization>Disabled</Optimization>

+      <PreprocessorDefinitions>SZTARGET=X8664;ALLOW_DUMP=0;ALLOW_TIMERS=0;ALLOW_LLVM_CL=0;ALLOW_LLVM_IR=0;ALLOW_LLVM_IR_AS_INPUT=0;ALLOW_MINIMAL_BUILD=0;ALLOW_WASM=0;ICE_THREAD_LOCAL_HACK=0;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>

+      <AdditionalIncludeDirectories>..\;$(SolutionDir)third_party\pnacl-subzero;$(SolutionDir)third_party\llvm-subzero\include;$(SolutionDir)third_party\pnacl-subzero\pnacl-llvm\include</AdditionalIncludeDirectories>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <ClCompile>

+      <WarningLevel>Level3</WarningLevel>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <Optimization>MaxSpeed</Optimization>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <IntrinsicFunctions>true</IntrinsicFunctions>

+      <PreprocessorDefinitions>SZTARGET=X8632;ALLOW_DUMP=0;ALLOW_TIMERS=0;ALLOW_LLVM_CL=0;ALLOW_LLVM_IR=0;ALLOW_LLVM_IR_AS_INPUT=0;ALLOW_MINIMAL_BUILD=0;ALLOW_WASM=0;ICE_THREAD_LOCAL_HACK=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>

+      <AdditionalIncludeDirectories>..\;$(SolutionDir)third_party\pnacl-subzero;$(SolutionDir)third_party\llvm-subzero\include;$(SolutionDir)third_party\pnacl-subzero\pnacl-llvm\include</AdditionalIncludeDirectories>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+      <EnableCOMDATFolding>true</EnableCOMDATFolding>

+      <OptimizeReferences>true</OptimizeReferences>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <ClCompile>

+      <WarningLevel>Level3</WarningLevel>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <Optimization>Full</Optimization>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <IntrinsicFunctions>true</IntrinsicFunctions>

+      <PreprocessorDefinitions>SZTARGET=X8664;ALLOW_DUMP=0;ALLOW_TIMERS=0;ALLOW_LLVM_CL=0;ALLOW_LLVM_IR=0;ALLOW_LLVM_IR_AS_INPUT=0;ALLOW_MINIMAL_BUILD=0;ALLOW_WASM=0;ICE_THREAD_LOCAL_HACK=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>

+      <AdditionalIncludeDirectories>..\;$(SolutionDir)third_party\pnacl-subzero;$(SolutionDir)third_party\llvm-subzero\include;$(SolutionDir)third_party\pnacl-subzero\pnacl-llvm\include</AdditionalIncludeDirectories>

+      <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>

+      <OmitFramePointers>true</OmitFramePointers>

+      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>

+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+      <EnableCOMDATFolding>true</EnableCOMDATFolding>

+      <OptimizeReferences>true</OptimizeReferences>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\APInt.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Atomic.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\circular_raw_ostream.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\CommandLine.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ConvertUTF.c" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ConvertUTFWrapper.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Debug.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ErrorHandling.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\FoldingSet.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Hashing.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Host.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ManagedStatic.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\MemoryBuffer.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Mutex.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Path.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Process.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Program.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\raw_ostream.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\raw_os_ostream.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Signals.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\SmallPtrSet.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\SmallVector.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringExtras.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringMap.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringRef.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringSaver.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\TargetParser.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Threading.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Timer.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\TimeValue.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Triple.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Twine.cpp" />

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceInstX8632.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceInstX8664.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8632.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8664.cpp">

+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssembler.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfg.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfgNode.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFObjectWriter.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFSection.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceFixups.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalContext.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalInits.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInst.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstrumentation.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceIntrinsics.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLiveness.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLoopAnalyzer.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMangling.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMemory.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceOperand.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRangeSpec.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegAlloc.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRevision.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRNG.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceSwitchLowering.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLowering.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX86.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceThreading.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTimerTree.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTypes.cpp" />

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceVariableSplitting.cpp" />

+    <ClCompile Include="Routine.cpp" />

+    <ClCompile Include="SubzeroReactor.cpp" />

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssembler.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX8632.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX86Base.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX86BaseImpl.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceBitVector.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceBuildDefs.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfg.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfgNode.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceConditionCodesX8632.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceDefs.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFObjectWriter.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFSection.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFStreamer.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceFixups.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalContext.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalInits.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInst.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstrumentation.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstVarIter.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstX8632.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstX86Base.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\iceinstx86baseimpl.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceIntrinsics.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLiveness.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLoopAnalyzer.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMangling.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMemory.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceOperand.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IcePhiLoweringImpl.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRangeSpec.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegAlloc.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegistersX8632.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegList.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRevision.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRNG.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceStringPool.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceSwitchLowering.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLowering.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8632.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8632Traits.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX86Base.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\icetargetloweringx86baseimpl.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX86RegClass.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceThreading.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTimerTree.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTLS.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTypes.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceUtils.h" />

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceVariableSplitting.h" />

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.def" />

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInst.def" />

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLowering.def" />

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTimerTree.def" />

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTypes.def" />

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\SZTargets.def" />

+    <None Include="..\..\third_party\pnacl-subzero\src\IceInstX8632.def" />

+    <None Include="..\..\third_party\pnacl-subzero\src\IceInstX8664.def" />

+    <None Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8632.def" />

+    <None Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8664.def" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/src/Reactor/Subzero.vcxproj.filters b/src/Reactor/Subzero.vcxproj.filters
new file mode 100644
index 0000000..89b2c4d
--- /dev/null
+++ b/src/Reactor/Subzero.vcxproj.filters
@@ -0,0 +1,404 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Source Files">

+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

+    </Filter>

+    <Filter Include="Header Files">

+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>

+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>

+    </Filter>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>

+    </Filter>

+    <Filter Include="Source Files\LLVM">

+      <UniqueIdentifier>{af578803-bb6c-4fb6-a852-956e276b0b41}</UniqueIdentifier>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssembler.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfg.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfgNode.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFObjectWriter.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFSection.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceFixups.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalContext.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalInits.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInst.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstrumentation.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceIntrinsics.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLiveness.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLoopAnalyzer.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMangling.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMemory.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceOperand.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRangeSpec.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegAlloc.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRevision.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRNG.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceSwitchLowering.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLowering.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX86.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceThreading.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTimerTree.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTypes.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\pnacl-subzero\src\IceVariableSplitting.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\APInt.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Atomic.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\circular_raw_ostream.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\CommandLine.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ConvertUTF.c">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ConvertUTFWrapper.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Debug.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ErrorHandling.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\FoldingSet.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Hashing.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Host.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\ManagedStatic.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\MemoryBuffer.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Mutex.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Path.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Process.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Program.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\raw_os_ostream.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\raw_ostream.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Signals.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\SmallPtrSet.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\SmallVector.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringExtras.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringMap.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringRef.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\StringSaver.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\TargetParser.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Threading.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Timer.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\TimeValue.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Triple.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="$(SolutionDir)third_party\llvm-subzero\lib\Support\Twine.cpp">

+      <Filter>Source Files\LLVM</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceInstX8664.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8664.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceInstX8632.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8632.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="SubzeroReactor.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="Routine.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+  </ItemGroup>

+  <ItemGroup>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssembler.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX8632.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX86Base.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceAssemblerX86BaseImpl.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceBitVector.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceBuildDefs.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfg.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceCfgNode.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceConditionCodesX8632.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceDefs.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFObjectWriter.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFSection.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceELFStreamer.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceFixups.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalContext.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceGlobalInits.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInst.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstrumentation.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstVarIter.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstX8632.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInstX86Base.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\iceinstx86baseimpl.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceIntrinsics.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLiveness.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceLoopAnalyzer.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMangling.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceMemory.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceOperand.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IcePhiLoweringImpl.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRangeSpec.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegAlloc.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegistersX8632.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRegList.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRevision.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceRNG.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceStringPool.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceSwitchLowering.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLowering.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8632.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX8632Traits.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX86Base.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\icetargetloweringx86baseimpl.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLoweringX86RegClass.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceThreading.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTimerTree.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTLS.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTypes.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceUtils.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="$(SolutionDir)third_party\pnacl-subzero\src\IceVariableSplitting.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+  </ItemGroup>

+  <ItemGroup>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceClFlags.def">

+      <Filter>Source Files</Filter>

+    </None>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceInst.def">

+      <Filter>Source Files</Filter>

+    </None>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTargetLowering.def">

+      <Filter>Source Files</Filter>

+    </None>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTimerTree.def">

+      <Filter>Source Files</Filter>

+    </None>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\IceTypes.def">

+      <Filter>Source Files</Filter>

+    </None>

+    <None Include="$(SolutionDir)third_party\pnacl-subzero\src\SZTargets.def">

+      <Filter>Source Files</Filter>

+    </None>

+    <None Include="..\..\third_party\pnacl-subzero\src\IceInstX8664.def">

+      <Filter>Header Files</Filter>

+    </None>

+    <None Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8664.def">

+      <Filter>Header Files</Filter>

+    </None>

+    <None Include="..\..\third_party\pnacl-subzero\src\IceInstX8632.def">

+      <Filter>Header Files</Filter>

+    </None>

+    <None Include="..\..\third_party\pnacl-subzero\src\IceTargetLoweringX8632.def">

+      <Filter>Header Files</Filter>

+    </None>

+  </ItemGroup>

+</Project>
\ No newline at end of file
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
new file mode 100644
index 0000000..9adc3fb
--- /dev/null
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -0,0 +1,5685 @@
+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "Nucleus.hpp"
+
+#include "Reactor.hpp"
+#include "Routine.hpp"
+
+#include "src/IceTypes.h"
+#include "src/IceCfg.h"
+#include "src/IceELFStreamer.h"
+#include "src/IceGlobalContext.h"
+#include "src/IceCfgNode.h"
+#include "src/IceELFObjectWriter.h"
+
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/raw_os_ostream.h"
+
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX
+#include <Windows.h>
+
+#include <mutex>
+#include <limits>
+#include <iostream>
+#include <cassert>
+
+namespace
+{
+	Ice::GlobalContext *context = nullptr;
+	Ice::Cfg *function = nullptr;
+	Ice::CfgNode *basicBlock = nullptr;
+	Ice::CfgLocalAllocatorScope *allocator = nullptr;
+	sw::Routine *routine = nullptr;
+
+	std::mutex codegenMutex;
+
+	Ice::ELFFileStreamer *elfFile = nullptr;
+	Ice::Fdstream *out = nullptr;
+}
+
+namespace sw
+{
+	class Value : public Ice::Variable {};
+	class BasicBlock : public Ice::CfgNode {};
+
+	Ice::Type T(Type *t)
+	{
+		return (Ice::Type)reinterpret_cast<std::intptr_t>(t);
+	}
+
+	Type *T(Ice::Type t)
+	{
+		return reinterpret_cast<Type*>(t);
+	}
+
+	Value *V(Ice::Variable *v)
+	{
+		return reinterpret_cast<Value*>(v);
+	}
+
+	Optimization optimization[10] = {InstructionCombining, Disabled};
+
+	void *loadImage(uint8_t *const elfImage)
+	{
+		using ElfHeader = std::conditional<sizeof(void*) == 8, Elf64_Ehdr, Elf32_Ehdr>::type;
+		ElfHeader *elfHeader = (ElfHeader*)elfImage;
+
+		if(!elfHeader->checkMagic())
+		{
+			return nullptr;
+		}
+
+		using SectionHeader = std::conditional<sizeof(void*) == 8, Elf64_Shdr, Elf32_Shdr>::type;
+		SectionHeader *sectionHeader = (SectionHeader*)(elfImage + elfHeader->e_shoff);
+		void *entry = nullptr;
+
+		for(int i = 0; i < elfHeader->e_shnum; i++)
+		{
+			if(sectionHeader[i].sh_type == SHT_PROGBITS && sectionHeader[i].sh_flags & SHF_EXECINSTR)
+			{
+				entry = elfImage + sectionHeader[i].sh_offset;
+			}
+		}
+
+		return entry;
+	}
+
+	template<typename T>
+	struct ExecutableAllocator
+	{
+		ExecutableAllocator() {};
+		template<class U> ExecutableAllocator(const ExecutableAllocator<U> &other) {};
+
+		using value_type = T;
+		using size_type = std::size_t;
+
+		T *allocate(size_type n)
+		{
+			return (T*)VirtualAlloc(NULL, sizeof(T) * n, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+		}
+
+		void deallocate(T *p, size_type n)
+		{
+			VirtualFree(p, 0, MEM_RELEASE);
+		}
+	};
+
+	class ELFMemoryStreamer : public Ice::ELFStreamer, public Routine
+	{
+		ELFMemoryStreamer(const ELFMemoryStreamer &) = delete;
+		ELFMemoryStreamer &operator=(const ELFMemoryStreamer &) = delete;
+
+	public:
+		ELFMemoryStreamer() : Routine()
+		{
+			position = 0;
+			buffer.reserve(0x1000);
+		}
+
+		virtual ~ELFMemoryStreamer()
+		{
+			if(buffer.size() != 0)
+			{
+				DWORD exeProtection;
+				VirtualProtect(&buffer[0], buffer.size(), oldProtection, &exeProtection);
+			}
+		}
+
+		void write8(uint8_t Value) override
+		{
+			if(position == (uint64_t)buffer.size())
+			{
+				buffer.push_back(Value);
+				position++;
+			}
+			else if(position < (uint64_t)buffer.size())
+			{
+				buffer[position] = Value;
+				position++;
+			}
+			else assert(false && "UNIMPLEMENTED");
+		}
+
+		void writeBytes(llvm::StringRef Bytes) override
+		{
+			std::size_t oldSize = buffer.size();
+			buffer.resize(oldSize + Bytes.size());
+			memcpy(&buffer[oldSize], Bytes.begin(), Bytes.size());
+			position += Bytes.size();
+		}
+
+		uint64_t tell() const override { return position; }
+
+		void seek(uint64_t Off) override { position = Off; }
+
+		const void *getEntry() override
+		{
+			VirtualProtect(&buffer[0], buffer.size(), PAGE_EXECUTE_READ, &oldProtection);
+			position = std::numeric_limits<std::size_t>::max();  // Can't write more data after this
+
+			return loadImage(&buffer[0]);
+		}
+
+	private:
+		std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer;
+		std::size_t position;
+		DWORD oldProtection;
+	};
+
+	Nucleus::Nucleus()
+	{
+		::codegenMutex.lock();   // Reactor is currently not thread safe
+
+		Ice::ClFlags::Flags.setTargetArch(sizeof(void*) == 8 ? Ice::Target_X8664 : Ice::Target_X8632);
+		Ice::ClFlags::Flags.setOutFileType(Ice::FT_Elf);
+		Ice::ClFlags::Flags.setOptLevel(Ice::Opt_2);
+		Ice::ClFlags::Flags.setApplicationBinaryInterface(Ice::ABI_Platform);
+
+		std::unique_ptr<Ice::Ostream> cout(new llvm::raw_os_ostream(std::cout));
+
+		if(false)   // Write out to a file
+		{
+			std::error_code errorCode;
+			::out = new Ice::Fdstream("out.o", errorCode, llvm::sys::fs::F_None);
+			::elfFile = new Ice::ELFFileStreamer(*out);
+			::context = new Ice::GlobalContext(cout.get(), cout.get(), cout.get(), elfFile);
+		}
+		else
+		{
+			ELFMemoryStreamer *elfMemory = new ELFMemoryStreamer();
+			::context = new Ice::GlobalContext(cout.get(), cout.get(), cout.get(), elfMemory);
+			::routine = elfMemory;
+		}
+	}
+
+	Nucleus::~Nucleus()
+	{
+		delete ::allocator;
+		delete ::function;
+		delete ::context;
+
+		delete ::elfFile;
+		delete ::out;
+
+		::codegenMutex.unlock();
+	}
+
+	Routine *Nucleus::acquireRoutine(const wchar_t *name, bool runOptimizations)
+	{
+		if(basicBlock->getInsts().empty() || basicBlock->getInsts().back().getKind() != Ice::Inst::Ret)
+		{
+			createRetVoid();
+		}
+
+		std::wstring wideName(name);
+		std::string asciiName(wideName.begin(), wideName.end());
+		::function->setFunctionName(Ice::GlobalString::createWithString(::context, asciiName));
+
+		::function->translate();
+
+		::context->emitFileHeader();
+		::function->emitIAS();
+		auto assembler = ::function->releaseAssembler();
+		::context->getObjectWriter()->writeFunctionCode(::function->getFunctionName(), false, assembler.get());
+		::context->getObjectWriter()->writeNonUserSections();
+
+		return ::routine;
+	}
+
+	void Nucleus::optimize()
+	{
+	}
+
+	Value *Nucleus::allocateStackVariable(Type *t, int arraySize)
+	{
+		Ice::Type type = T(t);
+		Ice::Variable *value = ::function->makeVariable(type);
+		assert(type == Ice::IceType_i32 && arraySize == 0 && "UNIMPLEMENTED");
+		auto bytes = Ice::ConstantInteger32::create(::context, type, 4);
+		auto alloca = Ice::InstAlloca::create(::function, value, bytes, 4);
+		::function->getEntryNode()->appendInst(alloca);
+		return V(value);
+	}
+
+	BasicBlock *Nucleus::createBasicBlock()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	BasicBlock *Nucleus::getInsertBlock()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	void Nucleus::setInsertBlock(BasicBlock *basicBlock)
+	{
+		assert(!basicBlock->getInsts().back().getTerminatorEdges().empty() && "Previous basic block must have a terminator");
+		assert(false && "UNIMPLEMENTED"); return;
+	}
+
+	BasicBlock *Nucleus::getPredecessor(BasicBlock *basicBlock)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	void Nucleus::createFunction(Type *ReturnType, std::vector<Type*> &Params)
+	{
+		uint32_t sequenceNumber = 0;
+		::function = Ice::Cfg::create(::context, sequenceNumber).release();
+		::allocator = new Ice::CfgLocalAllocatorScope(::function);
+
+		for(Type *type : Params)
+		{
+			Ice::Variable *arg = ::function->makeVariable(T(type));
+			::function->addArg(arg);
+		}
+
+		Ice::CfgNode *node = ::function->makeNode();
+		::function->setEntryNode(node);
+		::basicBlock = node;
+	}
+
+	Value *Nucleus::getArgument(unsigned int index)
+	{
+		return V(::function->getArgs()[index]);
+	}
+
+	void Nucleus::createRetVoid()
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	void Nucleus::createRet(Value *v)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	void Nucleus::createBr(BasicBlock *dest)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	void Nucleus::createCondBr(Value *cond, BasicBlock *ifTrue, BasicBlock *ifFalse)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Value *Nucleus::createAdd(Value *lhs, Value *rhs)
+	{
+		Ice::Variable *sum = ::function->makeVariable(Ice::IceType_i32);
+		Ice::InstArithmetic *add = Ice::InstArithmetic::create(::function, Ice::InstArithmetic::Add, sum, lhs, rhs);
+		::basicBlock->appendInst(add);
+		return V(sum);
+	}
+
+	Value *Nucleus::createSub(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createMul(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createUDiv(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createSDiv(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFAdd(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFSub(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFMul(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFDiv(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createURem(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createSRem(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFRem(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createShl(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createLShr(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createAShr(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createAnd(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createOr(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createXor(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createNeg(Value *v)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFNeg(Value *v)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createNot(Value *v)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createLoad(Value *ptr, bool isVolatile, unsigned int align)
+	{
+		Ice::Variable *value = ::function->makeVariable(ptr->getType());
+		auto load = Ice::InstLoad::create(::function, value, ptr, align);
+		::basicBlock->appendInst(load);
+		return V(value);
+	}
+
+	Value *Nucleus::createStore(Value *value, Value *ptr, bool isVolatile, unsigned int align)
+	{
+		auto store = Ice::InstStore::create(::function, value, ptr, align);
+		::basicBlock->appendInst(store);
+		return value;
+	}
+
+	Value *Nucleus::createStore(Constant *constant, Value *ptr, bool isVolatile, unsigned int align)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createGEP(Value *ptr, Value *index)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createAtomicAdd(Value *ptr, Value *value)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createTrunc(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createZExt(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createSExt(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFPToSI(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createUIToFP(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createSIToFP(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFPTrunc(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFPExt(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createPtrToInt(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createIntToPtr(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createBitCast(Value *v, Type *destType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createIntCast(Value *v, Type *destType, bool isSigned)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpEQ(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpNE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpUGT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpUGE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpULT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpULE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpSGT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpSGE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpSLT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createICmpSLE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpOEQ(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpOGT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpOGE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpOLT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpOLE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpONE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpORD(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpUNO(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpUEQ(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpUGT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpUGE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpULT(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpULE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createFCmpUNE(Value *lhs, Value *rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createExtractElement(Value *vector, int index)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createInsertElement(Value *vector, Value *element, int index)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createShuffleVector(Value *V1, Value *V2, Value *mask)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createSelect(Value *C, Value *ifTrue, Value *ifFalse)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createSwitch(Value *v, BasicBlock *Dest, unsigned NumCases)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	void Nucleus::addSwitchCase(Value *Switch, int Case, BasicBlock *Branch)
+	{
+		assert(false && "UNIMPLEMENTED"); return;
+	}
+
+	void Nucleus::createUnreachable()
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Value *Nucleus::createSwizzle(Value *val, unsigned char select)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Value *Nucleus::createMask(Value *lhs, Value *rhs, unsigned char select)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantPointer(const void *address, Type *Ty, bool isConstant, unsigned int Align)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Type *Nucleus::getPointerType(Type *ElementType)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createNullValue(Type *Ty)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantInt(int64_t i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantInt(int i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantInt(unsigned int i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantBool(bool b)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantByte(signed char i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantByte(unsigned char i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantShort(short i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantShort(unsigned short i)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantFloat(float x)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createNullPointer(Type *Ty)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Constant *Nucleus::createConstantVector(Constant *const *Vals, unsigned NumVals)
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Type *Void::getType()
+	{
+		return T(Ice::IceType_void);
+	}
+
+	LValue::LValue(Type *type, int arraySize)
+	{
+		address = Nucleus::allocateStackVariable(type, arraySize);
+	}
+
+	Value *LValue::loadValue(unsigned int alignment) const
+	{
+		return Nucleus::createLoad(address, false, alignment);
+	}
+
+	Value *LValue::storeValue(Value *value, unsigned int alignment) const
+	{
+		return Nucleus::createStore(value, address, false, alignment);
+	}
+
+	Value *LValue::storeValue(Constant *constant, unsigned int alignment) const
+	{
+		return Nucleus::createStore(constant, address, false, alignment);
+	}
+
+	Value *LValue::getAddress(Value *index) const
+	{
+		return Nucleus::createGEP(address, index);
+	}
+
+	Bool::Bool(Argument<Bool> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	Bool::Bool()
+	{
+	}
+
+	Bool::Bool(bool x)
+	{
+		storeValue(Nucleus::createConstantBool(x));
+	}
+
+	Bool::Bool(RValue<Bool> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Bool::Bool(const Bool &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Bool::Bool(const Reference<Bool> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Bool> Bool::operator=(RValue<Bool> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Bool> Bool::operator=(const Bool &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Bool>(value);
+	}
+
+	RValue<Bool> Bool::operator=(const Reference<Bool> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Bool>(value);
+	}
+
+	RValue<Bool> operator!(RValue<Bool> val)
+	{
+		return RValue<Bool>(Nucleus::createNot(val.value));
+	}
+
+	RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs)
+	{
+		return RValue<Bool>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs)
+	{
+		return RValue<Bool>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	Type *Bool::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Byte::Byte(Argument<Byte> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	Byte::Byte(RValue<Int> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
+
+		storeValue(integer);
+	}
+
+	Byte::Byte(RValue<UInt> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
+
+		storeValue(integer);
+	}
+
+	Byte::Byte(RValue<UShort> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, Byte::getType());
+
+		storeValue(integer);
+	}
+
+	Byte::Byte()
+	{
+	}
+
+	Byte::Byte(int x)
+	{
+		storeValue(Nucleus::createConstantByte((unsigned char)x));
+	}
+
+	Byte::Byte(unsigned char x)
+	{
+		storeValue(Nucleus::createConstantByte(x));
+	}
+
+	Byte::Byte(RValue<Byte> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Byte::Byte(const Byte &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Byte::Byte(const Reference<Byte> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Byte> Byte::operator=(RValue<Byte> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Byte> Byte::operator=(const Byte &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Byte>(value);
+	}
+
+	RValue<Byte> Byte::operator=(const Reference<Byte> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Byte>(value);
+	}
+
+	RValue<Byte> operator+(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator-(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator*(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator/(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createUDiv(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator%(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createURem(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator&(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator|(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator^(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator<<(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator>>(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Byte>(Nucleus::createLShr(lhs.value, rhs.value));
+	}
+
+	RValue<Byte> operator+=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Byte> operator-=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Byte> operator*=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<Byte> operator/=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<Byte> operator%=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<Byte> operator&=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Byte> operator|=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Byte> operator^=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<Byte> operator<<=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Byte> operator>>=(const Byte &lhs, RValue<Byte> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<Byte> operator+(RValue<Byte> val)
+	{
+		return val;
+	}
+
+	RValue<Byte> operator-(RValue<Byte> val)
+	{
+		return RValue<Byte>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<Byte> operator~(RValue<Byte> val)
+	{
+		return RValue<Byte>(Nucleus::createNot(val.value));
+	}
+
+	RValue<Byte> operator++(const Byte &val, int)   // Post-increment
+	{
+		RValue<Byte> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const Byte &operator++(const Byte &val)   // Pre-increment
+	{
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<Byte> operator--(const Byte &val, int)   // Post-decrement
+	{
+		RValue<Byte> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const Byte &operator--(const Byte &val)   // Pre-decrement
+	{
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<Bool> operator<(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	}
+
+	Type *Byte::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	SByte::SByte(Argument<SByte> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	SByte::SByte(RValue<Int> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
+
+		storeValue(integer);
+	}
+
+	SByte::SByte(RValue<Short> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, SByte::getType());
+
+		storeValue(integer);
+	}
+
+	SByte::SByte()
+	{
+	}
+
+	SByte::SByte(signed char x)
+	{
+		storeValue(Nucleus::createConstantByte(x));
+	}
+
+	SByte::SByte(RValue<SByte> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	SByte::SByte(const SByte &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	SByte::SByte(const Reference<SByte> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<SByte> SByte::operator=(RValue<SByte> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<SByte> SByte::operator=(const SByte &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<SByte>(value);
+	}
+
+	RValue<SByte> SByte::operator=(const Reference<SByte> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<SByte>(value);
+	}
+
+	RValue<SByte> operator+(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator-(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator*(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator/(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createSDiv(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator%(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createSRem(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator&(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator|(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator^(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator<<(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator>>(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<SByte>(Nucleus::createAShr(lhs.value, rhs.value));
+	}
+
+	RValue<SByte> operator+=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<SByte> operator-=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<SByte> operator*=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<SByte> operator/=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<SByte> operator%=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<SByte> operator&=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<SByte> operator|=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<SByte> operator^=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<SByte> operator<<=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<SByte> operator>>=(const SByte &lhs, RValue<SByte> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<SByte> operator+(RValue<SByte> val)
+	{
+		return val;
+	}
+
+	RValue<SByte> operator-(RValue<SByte> val)
+	{
+		return RValue<SByte>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<SByte> operator~(RValue<SByte> val)
+	{
+		return RValue<SByte>(Nucleus::createNot(val.value));
+	}
+
+	RValue<SByte> operator++(const SByte &val, int)   // Post-increment
+	{
+		RValue<SByte> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const SByte &operator++(const SByte &val)   // Pre-increment
+	{
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<SByte> operator--(const SByte &val, int)   // Post-decrement
+	{
+		RValue<SByte> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const SByte &operator--(const SByte &val)   // Pre-decrement
+	{
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<Bool> operator<(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	}
+
+	Type *SByte::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Short::Short(Argument<Short> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	Short::Short(RValue<Int> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, Short::getType());
+
+		storeValue(integer);
+	}
+
+	Short::Short()
+	{
+	}
+
+	Short::Short(short x)
+	{
+		storeValue(Nucleus::createConstantShort(x));
+	}
+
+	Short::Short(RValue<Short> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Short::Short(const Short &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Short::Short(const Reference<Short> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Short> Short::operator=(RValue<Short> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Short> Short::operator=(const Short &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Short>(value);
+	}
+
+	RValue<Short> Short::operator=(const Reference<Short> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Short>(value);
+	}
+
+	RValue<Short> operator+(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator-(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator*(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator/(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createSDiv(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator%(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createSRem(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator&(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator|(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator^(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator<<(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator>>(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Short>(Nucleus::createAShr(lhs.value, rhs.value));
+	}
+
+	RValue<Short> operator+=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Short> operator-=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Short> operator*=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<Short> operator/=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<Short> operator%=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<Short> operator&=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Short> operator|=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Short> operator^=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<Short> operator<<=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Short> operator>>=(const Short &lhs, RValue<Short> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<Short> operator+(RValue<Short> val)
+	{
+		return val;
+	}
+
+	RValue<Short> operator-(RValue<Short> val)
+	{
+		return RValue<Short>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<Short> operator~(RValue<Short> val)
+	{
+		return RValue<Short>(Nucleus::createNot(val.value));
+	}
+
+	RValue<Short> operator++(const Short &val, int)   // Post-increment
+	{
+		RValue<Short> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const Short &operator++(const Short &val)   // Pre-increment
+	{
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<Short> operator--(const Short &val, int)   // Post-decrement
+	{
+		RValue<Short> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const Short &operator--(const Short &val)   // Pre-decrement
+	{
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<Bool> operator<(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	}
+
+	Type *Short::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	UShort::UShort(Argument<UShort> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	UShort::UShort(RValue<UInt> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
+
+		storeValue(integer);
+	}
+
+	UShort::UShort(RValue<Int> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, UShort::getType());
+
+		storeValue(integer);
+	}
+
+	UShort::UShort()
+	{
+	}
+
+	UShort::UShort(unsigned short x)
+	{
+		storeValue(Nucleus::createConstantShort(x));
+	}
+
+	UShort::UShort(RValue<UShort> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	UShort::UShort(const UShort &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UShort::UShort(const Reference<UShort> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<UShort> UShort::operator=(RValue<UShort> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<UShort> UShort::operator=(const UShort &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort>(value);
+	}
+
+	RValue<UShort> UShort::operator=(const Reference<UShort> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort>(value);
+	}
+
+	RValue<UShort> operator+(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator-(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator*(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator/(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createUDiv(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator%(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createURem(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator&(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator|(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator^(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator<<(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator>>(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<UShort>(Nucleus::createLShr(lhs.value, rhs.value));
+	}
+
+	RValue<UShort> operator+=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<UShort> operator-=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<UShort> operator*=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<UShort> operator/=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<UShort> operator%=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<UShort> operator&=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<UShort> operator|=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<UShort> operator^=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<UShort> operator<<=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UShort> operator>>=(const UShort &lhs, RValue<UShort> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<UShort> operator+(RValue<UShort> val)
+	{
+		return val;
+	}
+
+	RValue<UShort> operator-(RValue<UShort> val)
+	{
+		return RValue<UShort>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<UShort> operator~(RValue<UShort> val)
+	{
+		return RValue<UShort>(Nucleus::createNot(val.value));
+	}
+
+	RValue<UShort> operator++(const UShort &val, int)   // Post-increment
+	{
+		RValue<UShort> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const UShort &operator++(const UShort &val)   // Pre-increment
+	{
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<UShort> operator--(const UShort &val, int)   // Post-decrement
+	{
+		RValue<UShort> res = val;
+
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return res;
+	}
+
+	const UShort &operator--(const UShort &val)   // Pre-decrement
+	{
+		assert(false && "UNIMPLEMENTED");
+		assert(false && "UNIMPLEMENTED");
+
+		return val;
+	}
+
+	RValue<Bool> operator<(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	}
+
+	Type *UShort::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Type *Byte4::getType()
+	{
+		#if 0
+			return VectorType::get(Byte::getType(), 4);
+		#else
+			return UInt::getType();   // FIXME
+		#endif
+	}
+
+	Type *SByte4::getType()
+	{
+		#if 0
+			return VectorType::get(SByte::getType(), 4);
+		#else
+			return Int::getType();   // FIXME
+		#endif
+	}
+
+	Byte8::Byte8()
+	{
+	//	xyzw.parent = this;
+	}
+
+	Byte8::Byte8(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7)
+	{
+	//	xyzw.parent = this;
+	}
+
+	Byte8::Byte8(int64_t x)
+	{
+	//	xyzw.parent = this;
+	}
+
+	Byte8::Byte8(RValue<Byte8> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Byte8::Byte8(const Byte8 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Byte8::Byte8(const Reference<Byte8> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Byte8> Byte8::operator=(RValue<Byte8> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Byte8> Byte8::operator=(const Byte8 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Byte8>(value);
+	}
+
+	RValue<Byte8> Byte8::operator=(const Reference<Byte8> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Byte8>(value);
+	}
+
+	RValue<Byte8> operator+(RValue<Byte8> lhs, RValue<Byte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	RValue<Byte8> operator-(RValue<Byte8> lhs, RValue<Byte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+//	RValue<Byte8> operator*(RValue<Byte8> lhs, RValue<Byte8> rhs)
+//	{
+//		return RValue<Byte8>(Nucleus::createMul(lhs.value, rhs.value));
+//	}
+
+//	RValue<Byte8> operator/(RValue<Byte8> lhs, RValue<Byte8> rhs)
+//	{
+//		return RValue<Byte8>(Nucleus::createUDiv(lhs.value, rhs.value));
+//	}
+
+//	RValue<Byte8> operator%(RValue<Byte8> lhs, RValue<Byte8> rhs)
+//	{
+//		return RValue<Byte8>(Nucleus::createURem(lhs.value, rhs.value));
+//	}
+
+	RValue<Byte8> operator&(RValue<Byte8> lhs, RValue<Byte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	RValue<Byte8> operator|(RValue<Byte8> lhs, RValue<Byte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	RValue<Byte8> operator^(RValue<Byte8> lhs, RValue<Byte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+//	RValue<Byte8> operator<<(RValue<Byte8> lhs, unsigned char rhs)
+//	{
+//		return RValue<Byte8>(Nucleus::createShl(lhs.value, rhs.value));
+//	}
+
+//	RValue<Byte8> operator>>(RValue<Byte8> lhs, unsigned char rhs)
+//	{
+//		return RValue<Byte8>(Nucleus::createLShr(lhs.value, rhs.value));
+//	}
+
+	RValue<Byte8> operator+=(const Byte8 &lhs, RValue<Byte8> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Byte8> operator-=(const Byte8 &lhs, RValue<Byte8> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+//	RValue<Byte8> operator*=(const Byte8 &lhs, RValue<Byte8> rhs)
+//	{
+//		return lhs = lhs * rhs;
+//	}
+
+//	RValue<Byte8> operator/=(const Byte8 &lhs, RValue<Byte8> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<Byte8> operator%=(const Byte8 &lhs, RValue<Byte8> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<Byte8> operator&=(const Byte8 &lhs, RValue<Byte8> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Byte8> operator|=(const Byte8 &lhs, RValue<Byte8> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Byte8> operator^=(const Byte8 &lhs, RValue<Byte8> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+//	RValue<Byte8> operator<<=(const Byte8 &lhs, RValue<Byte8> rhs)
+//	{
+//		return lhs = lhs << rhs;
+//	}
+
+//	RValue<Byte8> operator>>=(const Byte8 &lhs, RValue<Byte8> rhs)
+//	{
+//		return lhs = lhs >> rhs;
+//	}
+
+//	RValue<Byte8> operator+(RValue<Byte8> val)
+//	{
+//		return val;
+//	}
+
+//	RValue<Byte8> operator-(RValue<Byte8> val)
+//	{
+//		return RValue<Byte8>(Nucleus::createNeg(val.value));
+//	}
+
+	RValue<Byte8> operator~(RValue<Byte8> val)
+	{
+		return RValue<Byte8>(Nucleus::createNot(val.value));
+	}
+
+	RValue<Byte8> AddSat(RValue<Byte8> x, RValue<Byte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	RValue<Byte8> SubSat(RValue<Byte8> x, RValue<Byte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	RValue<Short4> Unpack(RValue<Byte4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> UnpackLow(RValue<Byte8> x, RValue<Byte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> UnpackHigh(RValue<Byte8> x, RValue<Byte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Int> SignMask(RValue<Byte8> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+//	RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y)
+//	{
+//		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+//	}
+
+	RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	Type *Byte8::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	SByte8::SByte8()
+	{
+	//	xyzw.parent = this;
+	}
+
+	SByte8::SByte8(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3, uint8_t x4, uint8_t x5, uint8_t x6, uint8_t x7)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	SByte8::SByte8(int64_t x)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	SByte8::SByte8(RValue<SByte8> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	SByte8::SByte8(const SByte8 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	SByte8::SByte8(const Reference<SByte8> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<SByte8> SByte8::operator=(RValue<SByte8> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<SByte8> SByte8::operator=(const SByte8 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<SByte8>(value);
+	}
+
+	RValue<SByte8> SByte8::operator=(const Reference<SByte8> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<SByte8>(value);
+	}
+
+	RValue<SByte8> operator+(RValue<SByte8> lhs, RValue<SByte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(nullptr);
+	}
+
+	RValue<SByte8> operator-(RValue<SByte8> lhs, RValue<SByte8> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(nullptr);
+	}
+
+//	RValue<SByte8> operator*(RValue<SByte8> lhs, RValue<SByte8> rhs)
+//	{
+//		return RValue<SByte8>(Nucleus::createMul(lhs.value, rhs.value));
+//	}
+
+//	RValue<SByte8> operator/(RValue<SByte8> lhs, RValue<SByte8> rhs)
+//	{
+//		return RValue<SByte8>(Nucleus::createSDiv(lhs.value, rhs.value));
+//	}
+
+//	RValue<SByte8> operator%(RValue<SByte8> lhs, RValue<SByte8> rhs)
+//	{
+//		return RValue<SByte8>(Nucleus::createSRem(lhs.value, rhs.value));
+//	}
+
+	RValue<SByte8> operator&(RValue<SByte8> lhs, RValue<SByte8> rhs)
+	{
+		return RValue<SByte8>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<SByte8> operator|(RValue<SByte8> lhs, RValue<SByte8> rhs)
+	{
+		return RValue<SByte8>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<SByte8> operator^(RValue<SByte8> lhs, RValue<SByte8> rhs)
+	{
+		return RValue<SByte8>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+//	RValue<SByte8> operator<<(RValue<SByte8> lhs, unsigned char rhs)
+//	{
+//		return RValue<SByte8>(Nucleus::createShl(lhs.value, rhs.value));
+//	}
+
+//	RValue<SByte8> operator>>(RValue<SByte8> lhs, unsigned char rhs)
+//	{
+//		return RValue<SByte8>(Nucleus::createAShr(lhs.value, rhs.value));
+//	}
+
+	RValue<SByte8> operator+=(const SByte8 &lhs, RValue<SByte8> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<SByte8> operator-=(const SByte8 &lhs, RValue<SByte8> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+//	RValue<SByte8> operator*=(const SByte8 &lhs, RValue<SByte8> rhs)
+//	{
+//		return lhs = lhs * rhs;
+//	}
+
+//	RValue<SByte8> operator/=(const SByte8 &lhs, RValue<SByte8> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<SByte8> operator%=(const SByte8 &lhs, RValue<SByte8> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<SByte8> operator&=(const SByte8 &lhs, RValue<SByte8> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<SByte8> operator|=(const SByte8 &lhs, RValue<SByte8> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<SByte8> operator^=(const SByte8 &lhs, RValue<SByte8> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+//	RValue<SByte8> operator<<=(const SByte8 &lhs, RValue<SByte8> rhs)
+//	{
+//		return lhs = lhs << rhs;
+//	}
+
+//	RValue<SByte8> operator>>=(const SByte8 &lhs, RValue<SByte8> rhs)
+//	{
+//		return lhs = lhs >> rhs;
+//	}
+
+//	RValue<SByte8> operator+(RValue<SByte8> val)
+//	{
+//		return val;
+//	}
+
+//	RValue<SByte8> operator-(RValue<SByte8> val)
+//	{
+//		return RValue<SByte8>(Nucleus::createNeg(val.value));
+//	}
+
+	RValue<SByte8> operator~(RValue<SByte8> val)
+	{
+		return RValue<SByte8>(Nucleus::createNot(val.value));
+	}
+
+	RValue<SByte8> AddSat(RValue<SByte8> x, RValue<SByte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(nullptr);
+	}
+
+	RValue<SByte8> SubSat(RValue<SByte8> x, RValue<SByte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(nullptr);
+	}
+
+	RValue<Short4> UnpackLow(RValue<SByte8> x, RValue<SByte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> UnpackHigh(RValue<SByte8> x, RValue<SByte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Int> SignMask(RValue<SByte8> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	Type *SByte8::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Byte16::Byte16(RValue<Byte16> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Byte16::Byte16(const Byte16 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Byte16::Byte16(const Reference<Byte16> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Byte16> Byte16::operator=(RValue<Byte16> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Byte16> Byte16::operator=(const Byte16 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Byte16>(value);
+	}
+
+	RValue<Byte16> Byte16::operator=(const Reference<Byte16> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Byte16>(value);
+	}
+
+	Type *Byte16::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Type *SByte16::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Short4::Short4(RValue<Int> cast)
+	{
+		Value *extend = Nucleus::createZExt(cast.value, Long::getType());
+		Value *swizzle = Swizzle(RValue<Short4>(extend), 0x00).value;
+
+		storeValue(swizzle);
+	}
+
+	Short4::Short4(RValue<Int4> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+//	Short4::Short4(RValue<Float> cast)
+//	{
+//	}
+
+	Short4::Short4(RValue<Float4> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Short4::Short4()
+	{
+	//	xyzw.parent = this;
+	}
+
+	Short4::Short4(short xyzw)
+	{
+		//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Short4::Short4(short x, short y, short z, short w)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Short4::Short4(RValue<Short4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Short4::Short4(const Short4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Short4::Short4(const Reference<Short4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Short4::Short4(RValue<UShort4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Short4::Short4(const UShort4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.loadValue());
+	}
+
+	Short4::Short4(const Reference<UShort4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.loadValue());
+	}
+
+	RValue<Short4> Short4::operator=(RValue<Short4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Short4> Short4::operator=(const Short4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Short4>(value);
+	}
+
+	RValue<Short4> Short4::operator=(const Reference<Short4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Short4>(value);
+	}
+
+	RValue<Short4> Short4::operator=(RValue<UShort4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return RValue<Short4>(rhs);
+	}
+
+	RValue<Short4> Short4::operator=(const UShort4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Short4>(value);
+	}
+
+	RValue<Short4> Short4::operator=(const Reference<UShort4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Short4>(value);
+	}
+
+	RValue<Short4> operator+(RValue<Short4> lhs, RValue<Short4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator-(RValue<Short4> lhs, RValue<Short4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator*(RValue<Short4> lhs, RValue<Short4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+//	RValue<Short4> operator/(RValue<Short4> lhs, RValue<Short4> rhs)
+//	{
+//		return RValue<Short4>(Nucleus::createSDiv(lhs.value, rhs.value));
+//	}
+
+//	RValue<Short4> operator%(RValue<Short4> lhs, RValue<Short4> rhs)
+//	{
+//		return RValue<Short4>(Nucleus::createSRem(lhs.value, rhs.value));
+//	}
+
+	RValue<Short4> operator&(RValue<Short4> lhs, RValue<Short4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator|(RValue<Short4> lhs, RValue<Short4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator^(RValue<Short4> lhs, RValue<Short4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator<<(RValue<Short4> lhs, unsigned char rhs)
+	{
+	//	return RValue<Short4>(Nucleus::createShl(lhs.value, rhs.value));
+
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator>>(RValue<Short4> lhs, unsigned char rhs)
+	{
+	//	return RValue<Short4>(Nucleus::createAShr(lhs.value, rhs.value));
+
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator<<(RValue<Short4> lhs, RValue<Long1> rhs)
+	{
+	//	return RValue<Short4>(Nucleus::createShl(lhs.value, rhs.value));
+
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator>>(RValue<Short4> lhs, RValue<Long1> rhs)
+	{
+	//	return RValue<Short4>(Nucleus::createAShr(lhs.value, rhs.value));
+
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator+=(const Short4 &lhs, RValue<Short4> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Short4> operator-=(const Short4 &lhs, RValue<Short4> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Short4> operator*=(const Short4 &lhs, RValue<Short4> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+//	RValue<Short4> operator/=(const Short4 &lhs, RValue<Short4> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<Short4> operator%=(const Short4 &lhs, RValue<Short4> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<Short4> operator&=(const Short4 &lhs, RValue<Short4> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Short4> operator|=(const Short4 &lhs, RValue<Short4> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Short4> operator^=(const Short4 &lhs, RValue<Short4> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<Short4> operator<<=(const Short4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Short4> operator>>=(const Short4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<Short4> operator<<=(const Short4 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Short4> operator>>=(const Short4 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+//	RValue<Short4> operator+(RValue<Short4> val)
+//	{
+//		return val;
+//	}
+
+	RValue<Short4> operator-(RValue<Short4> val)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> operator~(RValue<Short4> val)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> RoundShort4(RValue<Float4> cast)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> Max(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> Min(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> AddSat(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> SubSat(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> MulHigh(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Int2> MulAdd(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<SByte8> Pack(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<SByte8>(nullptr);
+	}
+
+	RValue<Int2> UnpackLow(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> UnpackHigh(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Short4> Swizzle(RValue<Short4> x, unsigned char select)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> Insert(RValue<Short4> val, RValue<Short> element, int i)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short> Extract(RValue<Short4> val, int i)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short>(nullptr);
+	}
+
+	RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short4>(nullptr);
+	}
+
+	Type *Short4::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	UShort4::UShort4(RValue<Int4> cast)
+	{
+		*this = Short4(cast);
+	}
+
+	UShort4::UShort4(RValue<Float4> cast, bool saturate)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UShort4::UShort4()
+	{
+	//	xyzw.parent = this;
+	}
+
+	UShort4::UShort4(unsigned short xyzw)
+	{
+		//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UShort4::UShort4(unsigned short x, unsigned short y, unsigned short z, unsigned short w)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UShort4::UShort4(RValue<UShort4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	UShort4::UShort4(const UShort4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UShort4::UShort4(const Reference<UShort4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UShort4::UShort4(RValue<Short4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	UShort4::UShort4(const Short4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UShort4::UShort4(const Reference<Short4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<UShort4> UShort4::operator=(RValue<UShort4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<UShort4> UShort4::operator=(const UShort4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort4>(value);
+	}
+
+	RValue<UShort4> UShort4::operator=(const Reference<UShort4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort4>(value);
+	}
+
+	RValue<UShort4> UShort4::operator=(RValue<Short4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return RValue<UShort4>(rhs);
+	}
+
+	RValue<UShort4> UShort4::operator=(const Short4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort4>(value);
+	}
+
+	RValue<UShort4> UShort4::operator=(const Reference<Short4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort4>(value);
+	}
+
+	RValue<UShort4> operator+(RValue<UShort4> lhs, RValue<UShort4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator-(RValue<UShort4> lhs, RValue<UShort4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator*(RValue<UShort4> lhs, RValue<UShort4> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator<<(RValue<UShort4> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator>>(RValue<UShort4> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator<<(RValue<UShort4> lhs, RValue<Long1> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator>>(RValue<UShort4> lhs, RValue<Long1> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> operator<<=(const UShort4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UShort4> operator>>=(const UShort4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<UShort4> operator<<=(const UShort4 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UShort4> operator>>=(const UShort4 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<UShort4> operator~(RValue<UShort4> val)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> Max(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> Min(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> AddSat(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> SubSat(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> MulHigh(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<UShort4> Average(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort4>(nullptr);
+	}
+
+	RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Byte8>(nullptr);
+	}
+
+	Type *UShort4::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Short8::Short8(short c0, short c1, short c2, short c3, short c4, short c5, short c6, short c7)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Short8::Short8(RValue<Short8> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Short8::Short8(const Reference<Short8> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
+	{
+		return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Short8> operator&(RValue<Short8> lhs, RValue<Short8> rhs)
+	{
+		return RValue<Short8>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<Short8> operator<<(RValue<Short8> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short8>(nullptr);
+	}
+
+	RValue<Short8> operator>>(RValue<Short8> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short8>(nullptr);
+	}
+
+	RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Int4> Abs(RValue<Int4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short8>(nullptr);
+	}
+
+	Type *Short8::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	UShort8::UShort8(unsigned short c0, unsigned short c1, unsigned short c2, unsigned short c3, unsigned short c4, unsigned short c5, unsigned short c6, unsigned short c7)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UShort8::UShort8(RValue<UShort8> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	UShort8::UShort8(const Reference<UShort8> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<UShort8> UShort8::operator=(const UShort8 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort8>(value);
+	}
+
+	RValue<UShort8> UShort8::operator=(const Reference<UShort8> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UShort8>(value);
+	}
+
+	RValue<UShort8> operator&(RValue<UShort8> lhs, RValue<UShort8> rhs)
+	{
+		return RValue<UShort8>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<UShort8> operator<<(RValue<UShort8> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(nullptr);
+	}
+
+	RValue<UShort8> operator>>(RValue<UShort8> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(nullptr);
+	}
+
+	RValue<UShort8> operator+(RValue<UShort8> lhs, RValue<UShort8> rhs)
+	{
+		return RValue<UShort8>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<UShort8> operator*(RValue<UShort8> lhs, RValue<UShort8> rhs)
+	{
+		return RValue<UShort8>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<UShort8> operator+=(const UShort8 &lhs, RValue<UShort8> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<UShort8> operator~(RValue<UShort8> val)
+	{
+		return RValue<UShort8>(Nucleus::createNot(val.value));
+	}
+
+	RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(nullptr);
+	}
+
+	RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(nullptr);
+	}
+
+	// FIXME: Implement as Shuffle(x, y, Select(i0, ..., i16)) and Shuffle(x, y, SELECT_PACK_REPEAT(element))
+//	RValue<UShort8> PackRepeat(RValue<Byte16> x, RValue<Byte16> y, int element)
+//	{
+//		assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(nullptr);
+//	}
+
+	Type *UShort8::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Int::Int(Argument<Int> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	Int::Int(RValue<Byte> cast)
+	{
+		Value *integer = Nucleus::createZExt(cast.value, Int::getType());
+
+		storeValue(integer);
+	}
+
+	Int::Int(RValue<SByte> cast)
+	{
+		Value *integer = Nucleus::createSExt(cast.value, Int::getType());
+
+		storeValue(integer);
+	}
+
+	Int::Int(RValue<Short> cast)
+	{
+		Value *integer = Nucleus::createSExt(cast.value, Int::getType());
+
+		storeValue(integer);
+	}
+
+	Int::Int(RValue<UShort> cast)
+	{
+		Value *integer = Nucleus::createZExt(cast.value, Int::getType());
+
+		storeValue(integer);
+	}
+
+	Int::Int(RValue<Int2> cast)
+	{
+		*this = Extract(cast, 0);
+	}
+
+	Int::Int(RValue<Long> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, Int::getType());
+
+		storeValue(integer);
+	}
+
+	Int::Int(RValue<Float> cast)
+	{
+		Value *integer = Nucleus::createFPToSI(cast.value, Int::getType());
+
+		storeValue(integer);
+	}
+
+	Int::Int()
+	{
+	}
+
+	Int::Int(int x)
+	{
+		storeValue(Nucleus::createConstantInt(x));
+	}
+
+	Int::Int(RValue<Int> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Int::Int(RValue<UInt> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Int::Int(const Int &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int::Int(const Reference<Int> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int::Int(const UInt &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int::Int(const Reference<UInt> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Int> Int::operator=(int rhs) const
+	{
+		return RValue<Int>(storeValue(Nucleus::createConstantInt(rhs)));
+	}
+
+	RValue<Int> Int::operator=(RValue<Int> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Int> Int::operator=(RValue<UInt> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return RValue<Int>(rhs);
+	}
+
+	RValue<Int> Int::operator=(const Int &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int>(value);
+	}
+
+	RValue<Int> Int::operator=(const Reference<Int> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int>(value);
+	}
+
+	RValue<Int> Int::operator=(const UInt &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int>(value);
+	}
+
+	RValue<Int> Int::operator=(const Reference<UInt> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int>(value);
+	}
+
+	RValue<Int> operator+(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator-(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator*(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator/(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createSDiv(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator%(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createSRem(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator&(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator|(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator^(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator<<(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator>>(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Int>(Nucleus::createAShr(lhs.value, rhs.value));
+	}
+
+	RValue<Int> operator+=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Int> operator-=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Int> operator*=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<Int> operator/=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<Int> operator%=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<Int> operator&=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Int> operator|=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Int> operator^=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<Int> operator<<=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Int> operator>>=(const Int &lhs, RValue<Int> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<Int> operator+(RValue<Int> val)
+	{
+		return val;
+	}
+
+	RValue<Int> operator-(RValue<Int> val)
+	{
+		return RValue<Int>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<Int> operator~(RValue<Int> val)
+	{
+		return RValue<Int>(Nucleus::createNot(val.value));
+	}
+
+	RValue<Int> operator++(const Int &val, int)   // Post-increment
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	const Int &operator++(const Int &val)   // Pre-increment
+	{
+		assert(false && "UNIMPLEMENTED"); return val;
+	}
+
+	RValue<Int> operator--(const Int &val, int)   // Post-decrement
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	const Int &operator--(const Int &val)   // Pre-decrement
+	{
+		assert(false && "UNIMPLEMENTED"); return val;
+	}
+
+	RValue<Bool> operator<(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSLT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSLE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpSGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<Int> lhs, RValue<Int> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	}
+
+	RValue<Int> Max(RValue<Int> x, RValue<Int> y)
+	{
+		return IfThenElse(x > y, x, y);
+	}
+
+	RValue<Int> Min(RValue<Int> x, RValue<Int> y)
+	{
+		return IfThenElse(x < y, x, y);
+	}
+
+	RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max)
+	{
+		return Min(Max(x, min), max);
+	}
+
+	RValue<Int> RoundInt(RValue<Float> cast)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	Type *Int::getType()
+	{
+		return T(Ice::IceType_i32);
+	}
+
+	Long::Long(RValue<Int> cast)
+	{
+		Value *integer = Nucleus::createSExt(cast.value, Long::getType());
+
+		storeValue(integer);
+	}
+
+	Long::Long(RValue<UInt> cast)
+	{
+		Value *integer = Nucleus::createZExt(cast.value, Long::getType());
+
+		storeValue(integer);
+	}
+
+	Long::Long()
+	{
+	}
+
+	Long::Long(RValue<Long> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	RValue<Long> Long::operator=(int64_t rhs) const
+	{
+		return RValue<Long>(storeValue(Nucleus::createConstantInt(rhs)));
+	}
+
+	RValue<Long> Long::operator=(RValue<Long> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Long> Long::operator=(const Long &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Long>(value);
+	}
+
+	RValue<Long> Long::operator=(const Reference<Long> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Long>(value);
+	}
+
+	RValue<Long> operator+(RValue<Long> lhs, RValue<Long> rhs)
+	{
+		return RValue<Long>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Long> operator-(RValue<Long> lhs, RValue<Long> rhs)
+	{
+		return RValue<Long>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<Long> operator+=(const Long &lhs, RValue<Long> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Long> operator-=(const Long &lhs, RValue<Long> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Long> AddAtomic(RValue<Pointer<Long> > x, RValue<Long> y)
+	{
+		return RValue<Long>(Nucleus::createAtomicAdd(x.value, y.value));
+	}
+
+	Type *Long::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Long1::Long1(const RValue<UInt> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Long1::Long1(RValue<Long1> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Type *Long1::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	RValue<Long2> UnpackHigh(RValue<Long2> x, RValue<Long2> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Long2>(nullptr);
+	}
+
+	Type *Long2::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	UInt::UInt(Argument<UInt> argument)
+	{
+		storeValue(argument.value);
+	}
+
+	UInt::UInt(RValue<UShort> cast)
+	{
+		Value *integer = Nucleus::createZExt(cast.value, UInt::getType());
+
+		storeValue(integer);
+	}
+
+	UInt::UInt(RValue<Long> cast)
+	{
+		Value *integer = Nucleus::createTrunc(cast.value, UInt::getType());
+
+		storeValue(integer);
+	}
+
+	UInt::UInt(RValue<Float> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UInt::UInt()
+	{
+	}
+
+	UInt::UInt(int x)
+	{
+		storeValue(Nucleus::createConstantInt(x));
+	}
+
+	UInt::UInt(unsigned int x)
+	{
+		storeValue(Nucleus::createConstantInt(x));
+	}
+
+	UInt::UInt(RValue<UInt> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	UInt::UInt(RValue<Int> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	UInt::UInt(const UInt &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt::UInt(const Reference<UInt> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt::UInt(const Int &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt::UInt(const Reference<Int> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<UInt> UInt::operator=(unsigned int rhs) const
+	{
+		return RValue<UInt>(storeValue(Nucleus::createConstantInt(rhs)));
+	}
+
+	RValue<UInt> UInt::operator=(RValue<UInt> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<UInt> UInt::operator=(RValue<Int> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return RValue<UInt>(rhs);
+	}
+
+	RValue<UInt> UInt::operator=(const UInt &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt>(value);
+	}
+
+	RValue<UInt> UInt::operator=(const Reference<UInt> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt>(value);
+	}
+
+	RValue<UInt> UInt::operator=(const Int &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt>(value);
+	}
+
+	RValue<UInt> UInt::operator=(const Reference<Int> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt>(value);
+	}
+
+	RValue<UInt> operator+(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator-(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator*(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator/(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createUDiv(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator%(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createURem(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator&(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator|(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator^(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator<<(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator>>(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<UInt>(Nucleus::createLShr(lhs.value, rhs.value));
+	}
+
+	RValue<UInt> operator+=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<UInt> operator-=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<UInt> operator*=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<UInt> operator/=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<UInt> operator%=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<UInt> operator&=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<UInt> operator|=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<UInt> operator^=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<UInt> operator<<=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UInt> operator>>=(const UInt &lhs, RValue<UInt> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<UInt> operator+(RValue<UInt> val)
+	{
+		return val;
+	}
+
+	RValue<UInt> operator-(RValue<UInt> val)
+	{
+		return RValue<UInt>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<UInt> operator~(RValue<UInt> val)
+	{
+		return RValue<UInt>(Nucleus::createNot(val.value));
+	}
+
+	RValue<UInt> operator++(const UInt &val, int)   // Post-increment
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt>(nullptr);
+	}
+
+	const UInt &operator++(const UInt &val)   // Pre-increment
+	{
+		assert(false && "UNIMPLEMENTED"); return val;
+	}
+
+	RValue<UInt> operator--(const UInt &val, int)   // Post-decrement
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt>(nullptr);
+	}
+
+	const UInt &operator--(const UInt &val)   // Pre-decrement
+	{
+		assert(false && "UNIMPLEMENTED"); return val;
+	}
+
+	RValue<UInt> Max(RValue<UInt> x, RValue<UInt> y)
+	{
+		return IfThenElse(x > y, x, y);
+	}
+
+	RValue<UInt> Min(RValue<UInt> x, RValue<UInt> y)
+	{
+		return IfThenElse(x < y, x, y);
+	}
+
+	RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max)
+	{
+		return Min(Max(x, min), max);
+	}
+
+	RValue<Bool> operator<(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpULT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpULE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpUGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpUGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpNE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<UInt> lhs, RValue<UInt> rhs)
+	{
+		return RValue<Bool>(Nucleus::createICmpEQ(lhs.value, rhs.value));
+	}
+
+//	RValue<UInt> RoundUInt(RValue<Float> cast)
+//	{
+//		assert(false && "UNIMPLEMENTED"); return RValue<UInt>(nullptr);
+//	}
+
+	Type *UInt::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+//	Int2::Int2(RValue<Int> cast)
+//	{
+//		Value *extend = Nucleus::createZExt(cast.value, Long::getType());
+//		Value *vector = Nucleus::createBitCast(extend, Int2::getType());
+//
+//		Constant *shuffle[2];
+//		shuffle[0] = Nucleus::createConstantInt(0);
+//		shuffle[1] = Nucleus::createConstantInt(0);
+//
+//		Value *replicate = Nucleus::createShuffleVector(vector, UndefValue::get(Int2::getType()), Nucleus::createConstantVector(shuffle, 2));
+//
+//		storeValue(replicate);
+//	}
+
+	Int2::Int2(RValue<Int4> cast)
+	{
+		Value *long2 = Nucleus::createBitCast(cast.value, Long2::getType());
+		Value *element = Nucleus::createExtractElement(long2, 0);
+		Value *int2 = Nucleus::createBitCast(element, Int2::getType());
+
+		storeValue(int2);
+	}
+
+	Int2::Int2()
+	{
+	//	xy.parent = this;
+	}
+
+	Int2::Int2(int x, int y)
+	{
+	//	xy.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int2::Int2(RValue<Int2> rhs)
+	{
+	//	xy.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Int2::Int2(const Int2 &rhs)
+	{
+	//	xy.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int2::Int2(const Reference<Int2> &rhs)
+	{
+	//	xy.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int2::Int2(RValue<Int> lo, RValue<Int> hi)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	RValue<Int2> Int2::operator=(RValue<Int2> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Int2> Int2::operator=(const Int2 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int2>(value);
+	}
+
+	RValue<Int2> Int2::operator=(const Reference<Int2> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int2>(value);
+	}
+
+	RValue<Int2> operator+(RValue<Int2> lhs, RValue<Int2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator-(RValue<Int2> lhs, RValue<Int2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+//	RValue<Int2> operator*(RValue<Int2> lhs, RValue<Int2> rhs)
+//	{
+//		return RValue<Int2>(Nucleus::createMul(lhs.value, rhs.value));
+//	}
+
+//	RValue<Int2> operator/(RValue<Int2> lhs, RValue<Int2> rhs)
+//	{
+//		return RValue<Int2>(Nucleus::createSDiv(lhs.value, rhs.value));
+//	}
+
+//	RValue<Int2> operator%(RValue<Int2> lhs, RValue<Int2> rhs)
+//	{
+//		return RValue<Int2>(Nucleus::createSRem(lhs.value, rhs.value));
+//	}
+
+	RValue<Int2> operator&(RValue<Int2> lhs, RValue<Int2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator|(RValue<Int2> lhs, RValue<Int2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator^(RValue<Int2> lhs, RValue<Int2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator<<(RValue<Int2> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator>>(RValue<Int2> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator<<(RValue<Int2> lhs, RValue<Long1> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator>>(RValue<Int2> lhs, RValue<Long1> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Int2> operator+=(const Int2 &lhs, RValue<Int2> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Int2> operator-=(const Int2 &lhs, RValue<Int2> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+//	RValue<Int2> operator*=(const Int2 &lhs, RValue<Int2> rhs)
+//	{
+//		return lhs = lhs * rhs;
+//	}
+
+//	RValue<Int2> operator/=(const Int2 &lhs, RValue<Int2> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<Int2> operator%=(const Int2 &lhs, RValue<Int2> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<Int2> operator&=(const Int2 &lhs, RValue<Int2> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Int2> operator|=(const Int2 &lhs, RValue<Int2> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Int2> operator^=(const Int2 &lhs, RValue<Int2> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<Int2> operator<<=(const Int2 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Int2> operator>>=(const Int2 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<Int2> operator<<=(const Int2 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Int2> operator>>=(const Int2 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+//	RValue<Int2> operator+(RValue<Int2> val)
+//	{
+//		return val;
+//	}
+
+//	RValue<Int2> operator-(RValue<Int2> val)
+//	{
+//		return RValue<Int2>(Nucleus::createNeg(val.value));
+//	}
+
+	RValue<Int2> operator~(RValue<Int2> val)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	RValue<Long1> UnpackLow(RValue<Int2> x, RValue<Int2> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Long1>(nullptr);
+	}
+
+	RValue<Long1> UnpackHigh(RValue<Int2> x, RValue<Int2> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Long1>(nullptr);
+	}
+
+	RValue<Int> Extract(RValue<Int2> val, int i)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int2>(nullptr);
+	}
+
+	Type *Int2::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	UInt2::UInt2()
+	{
+	//	xy.parent = this;
+	}
+
+	UInt2::UInt2(unsigned int x, unsigned int y)
+	{
+	//	xy.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UInt2::UInt2(RValue<UInt2> rhs)
+	{
+	//	xy.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	UInt2::UInt2(const UInt2 &rhs)
+	{
+	//	xy.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt2::UInt2(const Reference<UInt2> &rhs)
+	{
+	//	xy.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<UInt2> UInt2::operator=(RValue<UInt2> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<UInt2> UInt2::operator=(const UInt2 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt2>(value);
+	}
+
+	RValue<UInt2> UInt2::operator=(const Reference<UInt2> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt2>(value);
+	}
+
+	RValue<UInt2> operator+(RValue<UInt2> lhs, RValue<UInt2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator-(RValue<UInt2> lhs, RValue<UInt2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+//	RValue<UInt2> operator*(RValue<UInt2> lhs, RValue<UInt2> rhs)
+//	{
+//		return RValue<UInt2>(Nucleus::createMul(lhs.value, rhs.value));
+//	}
+
+//	RValue<UInt2> operator/(RValue<UInt2> lhs, RValue<UInt2> rhs)
+//	{
+//		return RValue<UInt2>(Nucleus::createUDiv(lhs.value, rhs.value));
+//	}
+
+//	RValue<UInt2> operator%(RValue<UInt2> lhs, RValue<UInt2> rhs)
+//	{
+//		return RValue<UInt2>(Nucleus::createURem(lhs.value, rhs.value));
+//	}
+
+	RValue<UInt2> operator&(RValue<UInt2> lhs, RValue<UInt2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator|(RValue<UInt2> lhs, RValue<UInt2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator^(RValue<UInt2> lhs, RValue<UInt2> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator<<(RValue<UInt2> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator>>(RValue<UInt2> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator<<(RValue<UInt2> lhs, RValue<Long1> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator>>(RValue<UInt2> lhs, RValue<Long1> rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt2>(nullptr);
+	}
+
+	RValue<UInt2> operator+=(const UInt2 &lhs, RValue<UInt2> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<UInt2> operator-=(const UInt2 &lhs, RValue<UInt2> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+//	RValue<UInt2> operator*=(const UInt2 &lhs, RValue<UInt2> rhs)
+//	{
+//		return lhs = lhs * rhs;
+//	}
+
+//	RValue<UInt2> operator/=(const UInt2 &lhs, RValue<UInt2> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<UInt2> operator%=(const UInt2 &lhs, RValue<UInt2> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<UInt2> operator&=(const UInt2 &lhs, RValue<UInt2> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<UInt2> operator|=(const UInt2 &lhs, RValue<UInt2> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<UInt2> operator^=(const UInt2 &lhs, RValue<UInt2> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<UInt2> operator<<=(const UInt2 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UInt2> operator>>=(const UInt2 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<UInt2> operator<<=(const UInt2 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UInt2> operator>>=(const UInt2 &lhs, RValue<Long1> rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+//	RValue<UInt2> operator+(RValue<UInt2> val)
+//	{
+//		return val;
+//	}
+
+//	RValue<UInt2> operator-(RValue<UInt2> val)
+//	{
+//		return RValue<UInt2>(Nucleus::createNeg(val.value));
+//	}
+
+	RValue<UInt2> operator~(RValue<UInt2> val)
+	{
+		return RValue<UInt2>(Nucleus::createNot(val.value));
+	}
+
+	Type *UInt2::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Int4::Int4(RValue<Byte4> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int4::Int4(RValue<SByte4> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int4::Int4(RValue<Float4> cast)
+	{
+	//	xyzw.parent = this;
+
+		Value *xyzw = Nucleus::createFPToSI(cast.value, Int4::getType());
+
+		storeValue(xyzw);
+	}
+
+	Int4::Int4(RValue<Short4> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int4::Int4(RValue<UShort4> cast)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int4::Int4()
+	{
+	//	xyzw.parent = this;
+	}
+
+	Int4::Int4(int xyzw)
+	{
+		constant(xyzw, xyzw, xyzw, xyzw);
+	}
+
+	Int4::Int4(int x, int yzw)
+	{
+		constant(x, yzw, yzw, yzw);
+	}
+
+	Int4::Int4(int x, int y, int zw)
+	{
+		constant(x, y, zw, zw);
+	}
+
+	Int4::Int4(int x, int y, int z, int w)
+	{
+		constant(x, y, z, w);
+	}
+
+	void Int4::constant(int x, int y, int z, int w)
+	{
+	//	xyzw.parent = this;
+
+		Constant *constantVector[4];
+		constantVector[0] = Nucleus::createConstantInt(x);
+		constantVector[1] = Nucleus::createConstantInt(y);
+		constantVector[2] = Nucleus::createConstantInt(z);
+		constantVector[3] = Nucleus::createConstantInt(w);
+
+		storeValue(Nucleus::createConstantVector(constantVector, 4));
+	}
+
+	Int4::Int4(RValue<Int4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Int4::Int4(const Int4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int4::Int4(const Reference<Int4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int4::Int4(RValue<UInt4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Int4::Int4(const UInt4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int4::Int4(const Reference<UInt4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int4::Int4(RValue<Int> rhs)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Int4::Int4(const Int &rhs)
+	{
+	//	xyzw.parent = this;
+
+		*this = RValue<Int>(rhs.loadValue());
+	}
+
+	Int4::Int4(const Reference<Int> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		*this = RValue<Int>(rhs.loadValue());
+	}
+
+	RValue<Int4> Int4::operator=(RValue<Int4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Int4> Int4::operator=(const Int4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int4>(value);
+	}
+
+	RValue<Int4> Int4::operator=(const Reference<Int4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Int4>(value);
+	}
+
+	RValue<Int4> operator+(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator-(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator*(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator/(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createSDiv(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator%(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createSRem(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator&(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator|(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator^(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator<<(RValue<Int4> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Int4> operator>>(RValue<Int4> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Int4> operator<<(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator>>(RValue<Int4> lhs, RValue<Int4> rhs)
+	{
+		return RValue<Int4>(Nucleus::createAShr(lhs.value, rhs.value));
+	}
+
+	RValue<Int4> operator+=(const Int4 &lhs, RValue<Int4> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Int4> operator-=(const Int4 &lhs, RValue<Int4> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Int4> operator*=(const Int4 &lhs, RValue<Int4> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+//	RValue<Int4> operator/=(const Int4 &lhs, RValue<Int4> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<Int4> operator%=(const Int4 &lhs, RValue<Int4> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<Int4> operator&=(const Int4 &lhs, RValue<Int4> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<Int4> operator|=(const Int4 &lhs, RValue<Int4> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<Int4> operator^=(const Int4 &lhs, RValue<Int4> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<Int4> operator<<=(const Int4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<Int4> operator>>=(const Int4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<Int4> operator+(RValue<Int4> val)
+	{
+		return val;
+	}
+
+	RValue<Int4> operator-(RValue<Int4> val)
+	{
+		return RValue<Int4>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<Int4> operator~(RValue<Int4> val)
+	{
+		return RValue<Int4>(Nucleus::createNot(val.value));
+	}
+
+	RValue<Int4> CmpEQ(RValue<Int4> x, RValue<Int4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpLT(RValue<Int4> x, RValue<Int4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLT(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpLE(RValue<Int4> x, RValue<Int4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSLE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpNEQ(RValue<Int4> x, RValue<Int4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpNLT(RValue<Int4> x, RValue<Int4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpNLE(RValue<Int4> x, RValue<Int4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createICmpSGT(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> Max(RValue<Int4> x, RValue<Int4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Int4> RoundInt(RValue<Float4> cast)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int4>(nullptr);
+	}
+
+	RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Short8>(nullptr);
+	}
+
+	RValue<Int> Extract(RValue<Int4> x, int i)
+	{
+		return RValue<Int>(Nucleus::createExtractElement(x.value, i));
+	}
+
+	RValue<Int4> Insert(RValue<Int4> x, RValue<Int> element, int i)
+	{
+		return RValue<Int4>(Nucleus::createInsertElement(x.value, element.value, i));
+	}
+
+	RValue<Int> SignMask(RValue<Int4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select)
+	{
+		return RValue<Int4>(Nucleus::createSwizzle(x.value, select));
+	}
+
+	Type *Int4::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	UInt4::UInt4(RValue<Float4> cast)
+	{
+	//	xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	UInt4::UInt4()
+	{
+	//	xyzw.parent = this;
+	}
+
+	UInt4::UInt4(int xyzw)
+	{
+		constant(xyzw, xyzw, xyzw, xyzw);
+	}
+
+	UInt4::UInt4(int x, int yzw)
+	{
+		constant(x, yzw, yzw, yzw);
+	}
+
+	UInt4::UInt4(int x, int y, int zw)
+	{
+		constant(x, y, zw, zw);
+	}
+
+	UInt4::UInt4(int x, int y, int z, int w)
+	{
+		constant(x, y, z, w);
+	}
+
+	void UInt4::constant(int x, int y, int z, int w)
+	{
+	//	xyzw.parent = this;
+
+		Constant *constantVector[4];
+		constantVector[0] = Nucleus::createConstantInt(x);
+		constantVector[1] = Nucleus::createConstantInt(y);
+		constantVector[2] = Nucleus::createConstantInt(z);
+		constantVector[3] = Nucleus::createConstantInt(w);
+
+		storeValue(Nucleus::createConstantVector(constantVector, 4));
+	}
+
+	UInt4::UInt4(RValue<UInt4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	UInt4::UInt4(const UInt4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt4::UInt4(const Reference<UInt4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt4::UInt4(RValue<Int4> rhs)
+	{
+	//	xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	UInt4::UInt4(const Int4 &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt4::UInt4(const Reference<Int4> &rhs)
+	{
+	//	xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
+	{
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<UInt4> UInt4::operator=(const UInt4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt4>(value);
+	}
+
+	RValue<UInt4> UInt4::operator=(const Reference<UInt4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<UInt4>(value);
+	}
+
+	RValue<UInt4> operator+(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createAdd(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator-(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createSub(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator*(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createMul(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator/(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createUDiv(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator%(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createURem(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator&(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createAnd(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator|(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createOr(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator^(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createXor(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator<<(RValue<UInt4> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt4>(nullptr);
+	}
+
+	RValue<UInt4> operator>>(RValue<UInt4> lhs, unsigned char rhs)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt4>(nullptr);
+	}
+
+	RValue<UInt4> operator<<(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createShl(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator>>(RValue<UInt4> lhs, RValue<UInt4> rhs)
+	{
+		return RValue<UInt4>(Nucleus::createLShr(lhs.value, rhs.value));
+	}
+
+	RValue<UInt4> operator+=(const UInt4 &lhs, RValue<UInt4> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<UInt4> operator-=(const UInt4 &lhs, RValue<UInt4> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<UInt4> operator*=(const UInt4 &lhs, RValue<UInt4> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+//	RValue<UInt4> operator/=(const UInt4 &lhs, RValue<UInt4> rhs)
+//	{
+//		return lhs = lhs / rhs;
+//	}
+
+//	RValue<UInt4> operator%=(const UInt4 &lhs, RValue<UInt4> rhs)
+//	{
+//		return lhs = lhs % rhs;
+//	}
+
+	RValue<UInt4> operator&=(const UInt4 &lhs, RValue<UInt4> rhs)
+	{
+		return lhs = lhs & rhs;
+	}
+
+	RValue<UInt4> operator|=(const UInt4 &lhs, RValue<UInt4> rhs)
+	{
+		return lhs = lhs | rhs;
+	}
+
+	RValue<UInt4> operator^=(const UInt4 &lhs, RValue<UInt4> rhs)
+	{
+		return lhs = lhs ^ rhs;
+	}
+
+	RValue<UInt4> operator<<=(const UInt4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs << rhs;
+	}
+
+	RValue<UInt4> operator>>=(const UInt4 &lhs, unsigned char rhs)
+	{
+		return lhs = lhs >> rhs;
+	}
+
+	RValue<UInt4> operator+(RValue<UInt4> val)
+	{
+		return val;
+	}
+
+	RValue<UInt4> operator-(RValue<UInt4> val)
+	{
+		return RValue<UInt4>(Nucleus::createNeg(val.value));
+	}
+
+	RValue<UInt4> operator~(RValue<UInt4> val)
+	{
+		return RValue<UInt4>(Nucleus::createNot(val.value));
+	}
+
+	RValue<UInt4> CmpEQ(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpEQ(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<UInt4> CmpLT(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULT(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<UInt4> CmpLE(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpULE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<UInt4> CmpNEQ(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpNE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<UInt4> CmpNLT(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<UInt4> CmpNLE(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		return RValue<UInt4>(Nucleus::createSExt(Nucleus::createICmpUGT(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<UInt4> Max(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt4>(nullptr);
+	}
+
+	RValue<UInt4> Min(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UInt4>(nullptr);
+	}
+
+	RValue<UShort8> Pack(RValue<UInt4> x, RValue<UInt4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<UShort8>(nullptr);
+	}
+
+	Type *UInt4::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Float::Float(RValue<Int> cast)
+	{
+		Value *integer = Nucleus::createSIToFP(cast.value, Float::getType());
+
+		storeValue(integer);
+	}
+
+	Float::Float()
+	{
+	}
+
+	Float::Float(float x)
+	{
+		storeValue(Nucleus::createConstantFloat(x));
+	}
+
+	Float::Float(RValue<Float> rhs)
+	{
+		storeValue(rhs.value);
+	}
+
+	Float::Float(const Float &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Float::Float(const Reference<Float> &rhs)
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	RValue<Float> Float::operator=(RValue<Float> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Float> Float::operator=(const Float &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Float>(value);
+	}
+
+	RValue<Float> Float::operator=(const Reference<Float> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Float>(value);
+	}
+
+	RValue<Float> operator+(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Float>(Nucleus::createFAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Float> operator-(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Float>(Nucleus::createFSub(lhs.value, rhs.value));
+	}
+
+	RValue<Float> operator*(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Float>(Nucleus::createFMul(lhs.value, rhs.value));
+	}
+
+	RValue<Float> operator/(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Float>(Nucleus::createFDiv(lhs.value, rhs.value));
+	}
+
+	RValue<Float> operator+=(const Float &lhs, RValue<Float> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Float> operator-=(const Float &lhs, RValue<Float> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Float> operator*=(const Float &lhs, RValue<Float> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<Float> operator/=(const Float &lhs, RValue<Float> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<Float> operator+(RValue<Float> val)
+	{
+		return val;
+	}
+
+	RValue<Float> operator-(RValue<Float> val)
+	{
+		return RValue<Float>(Nucleus::createFNeg(val.value));
+	}
+
+	RValue<Bool> operator<(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Bool>(Nucleus::createFCmpOLT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator<=(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Bool>(Nucleus::createFCmpOLE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Bool>(Nucleus::createFCmpOGT(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator>=(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Bool>(Nucleus::createFCmpOGE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator!=(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Bool>(Nucleus::createFCmpONE(lhs.value, rhs.value));
+	}
+
+	RValue<Bool> operator==(RValue<Float> lhs, RValue<Float> rhs)
+	{
+		return RValue<Bool>(Nucleus::createFCmpOEQ(lhs.value, rhs.value));
+	}
+
+	RValue<Float> Abs(RValue<Float> x)
+	{
+		return IfThenElse(x > 0.0f, x, -x);
+	}
+
+	RValue<Float> Max(RValue<Float> x, RValue<Float> y)
+	{
+		return IfThenElse(x > y, x, y);
+	}
+
+	RValue<Float> Min(RValue<Float> x, RValue<Float> y)
+	{
+		return IfThenElse(x < y, x, y);
+	}
+
+	RValue<Float> Rcp_pp(RValue<Float> x, bool exactAtPow2)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> RcpSqrt_pp(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> Sqrt(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> Round(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> Trunc(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> Frac(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> Floor(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	RValue<Float> Ceil(RValue<Float> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float>(nullptr);
+	}
+
+	Type *Float::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Float2::Float2(RValue<Float4> cast)
+	{
+	//	xyzw.parent = this;
+
+		Value *int64x2 = Nucleus::createBitCast(cast.value, Long2::getType());
+		Value *int64 = Nucleus::createExtractElement(int64x2, 0);
+		Value *float2 = Nucleus::createBitCast(int64, Float2::getType());
+
+		storeValue(float2);
+	}
+
+	Type *Float2::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	Float4::Float4(RValue<Byte4> cast)
+	{
+		xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Float4::Float4(RValue<SByte4> cast)
+	{
+		xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Float4::Float4(RValue<Short4> cast)
+	{
+		xyzw.parent = this;
+
+		Int4 c(cast);
+		storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
+	}
+
+	Float4::Float4(RValue<UShort4> cast)
+	{
+		xyzw.parent = this;
+
+		Int4 c(cast);
+		storeValue(Nucleus::createSIToFP(RValue<Int4>(c).value, Float4::getType()));
+	}
+
+	Float4::Float4(RValue<Int4> cast)
+	{
+		xyzw.parent = this;
+
+		Value *xyzw = Nucleus::createSIToFP(cast.value, Float4::getType());
+
+		storeValue(xyzw);
+	}
+
+	Float4::Float4(RValue<UInt4> cast)
+	{
+		xyzw.parent = this;
+
+		Value *xyzw = Nucleus::createUIToFP(cast.value, Float4::getType());
+
+		storeValue(xyzw);
+	}
+
+	Float4::Float4()
+	{
+		xyzw.parent = this;
+	}
+
+	Float4::Float4(float xyzw)
+	{
+		constant(xyzw, xyzw, xyzw, xyzw);
+	}
+
+	Float4::Float4(float x, float yzw)
+	{
+		constant(x, yzw, yzw, yzw);
+	}
+
+	Float4::Float4(float x, float y, float zw)
+	{
+		constant(x, y, zw, zw);
+	}
+
+	Float4::Float4(float x, float y, float z, float w)
+	{
+		constant(x, y, z, w);
+	}
+
+	void Float4::constant(float x, float y, float z, float w)
+	{
+		xyzw.parent = this;
+
+		Constant *constantVector[4];
+		constantVector[0] = Nucleus::createConstantFloat(x);
+		constantVector[1] = Nucleus::createConstantFloat(y);
+		constantVector[2] = Nucleus::createConstantFloat(z);
+		constantVector[3] = Nucleus::createConstantFloat(w);
+
+		storeValue(Nucleus::createConstantVector(constantVector, 4));
+	}
+
+	Float4::Float4(RValue<Float4> rhs)
+	{
+		xyzw.parent = this;
+
+		storeValue(rhs.value);
+	}
+
+	Float4::Float4(const Float4 &rhs)
+	{
+		xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Float4::Float4(const Reference<Float4> &rhs)
+	{
+		xyzw.parent = this;
+
+		Value *value = rhs.loadValue();
+		storeValue(value);
+	}
+
+	Float4::Float4(RValue<Float> rhs)
+	{
+		xyzw.parent = this;
+
+		assert(false && "UNIMPLEMENTED");
+	}
+
+	Float4::Float4(const Float &rhs)
+	{
+		xyzw.parent = this;
+
+		*this = RValue<Float>(rhs.loadValue());
+	}
+
+	Float4::Float4(const Reference<Float> &rhs)
+	{
+		xyzw.parent = this;
+
+		*this = RValue<Float>(rhs.loadValue());
+	}
+
+	RValue<Float4> Float4::operator=(float x) const
+	{
+		return *this = Float4(x, x, x, x);
+	}
+
+	RValue<Float4> Float4::operator=(RValue<Float4> rhs) const
+	{
+		storeValue(rhs.value);
+
+		return rhs;
+	}
+
+	RValue<Float4> Float4::operator=(const Float4 &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Float4>(value);
+	}
+
+	RValue<Float4> Float4::operator=(const Reference<Float4> &rhs) const
+	{
+		Value *value = rhs.loadValue();
+		storeValue(value);
+
+		return RValue<Float4>(value);
+	}
+
+	RValue<Float4> Float4::operator=(RValue<Float> rhs) const
+	{
+		return *this = Float4(rhs);
+	}
+
+	RValue<Float4> Float4::operator=(const Float &rhs) const
+	{
+		return *this = Float4(rhs);
+	}
+
+	RValue<Float4> Float4::operator=(const Reference<Float> &rhs) const
+	{
+		return *this = Float4(rhs);
+	}
+
+	RValue<Float4> operator+(RValue<Float4> lhs, RValue<Float4> rhs)
+	{
+		return RValue<Float4>(Nucleus::createFAdd(lhs.value, rhs.value));
+	}
+
+	RValue<Float4> operator-(RValue<Float4> lhs, RValue<Float4> rhs)
+	{
+		return RValue<Float4>(Nucleus::createFSub(lhs.value, rhs.value));
+	}
+
+	RValue<Float4> operator*(RValue<Float4> lhs, RValue<Float4> rhs)
+	{
+		return RValue<Float4>(Nucleus::createFMul(lhs.value, rhs.value));
+	}
+
+	RValue<Float4> operator/(RValue<Float4> lhs, RValue<Float4> rhs)
+	{
+		return RValue<Float4>(Nucleus::createFDiv(lhs.value, rhs.value));
+	}
+
+	RValue<Float4> operator%(RValue<Float4> lhs, RValue<Float4> rhs)
+	{
+		return RValue<Float4>(Nucleus::createFRem(lhs.value, rhs.value));
+	}
+
+	RValue<Float4> operator+=(const Float4 &lhs, RValue<Float4> rhs)
+	{
+		return lhs = lhs + rhs;
+	}
+
+	RValue<Float4> operator-=(const Float4 &lhs, RValue<Float4> rhs)
+	{
+		return lhs = lhs - rhs;
+	}
+
+	RValue<Float4> operator*=(const Float4 &lhs, RValue<Float4> rhs)
+	{
+		return lhs = lhs * rhs;
+	}
+
+	RValue<Float4> operator/=(const Float4 &lhs, RValue<Float4> rhs)
+	{
+		return lhs = lhs / rhs;
+	}
+
+	RValue<Float4> operator%=(const Float4 &lhs, RValue<Float4> rhs)
+	{
+		return lhs = lhs % rhs;
+	}
+
+	RValue<Float4> operator+(RValue<Float4> val)
+	{
+		return val;
+	}
+
+	RValue<Float4> operator-(RValue<Float4> val)
+	{
+		return RValue<Float4>(Nucleus::createFNeg(val.value));
+	}
+
+	RValue<Float4> Abs(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Max(RValue<Float4> x, RValue<Float4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Min(RValue<Float4> x, RValue<Float4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Rcp_pp(RValue<Float4> x, bool exactAtPow2)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> RcpSqrt_pp(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Sqrt(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Insert(const Float4 &val, RValue<Float> element, int i)
+	{
+		Value *value = val.loadValue();
+		Value *insert = Nucleus::createInsertElement(value, element.value, i);
+
+		val = RValue<Float4>(insert);
+
+		return val;
+	}
+
+	RValue<Float> Extract(RValue<Float4> x, int i)
+	{
+		return RValue<Float>(Nucleus::createExtractElement(x.value, i));
+	}
+
+	RValue<Float4> Swizzle(RValue<Float4> x, unsigned char select)
+	{
+		return RValue<Float4>(Nucleus::createSwizzle(x.value, select));
+	}
+
+	RValue<Float4> ShuffleLowHigh(RValue<Float4> x, RValue<Float4> y, unsigned char imm)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> UnpackLow(RValue<Float4> x, RValue<Float4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> UnpackHigh(RValue<Float4> x, RValue<Float4> y)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Mask(Float4 &lhs, RValue<Float4> rhs, unsigned char select)
+	{
+		Value *vector = lhs.loadValue();
+		Value *shuffle = Nucleus::createMask(vector, rhs.value, select);
+		lhs.storeValue(shuffle);
+
+		return RValue<Float4>(shuffle);
+	}
+
+	RValue<Int> SignMask(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Int>(nullptr);
+	}
+
+	RValue<Int4> CmpEQ(RValue<Float4> x, RValue<Float4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOEQ(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpLT(RValue<Float4> x, RValue<Float4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLT(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpLE(RValue<Float4> x, RValue<Float4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOLE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpNEQ(RValue<Float4> x, RValue<Float4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpONE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpNLT(RValue<Float4> x, RValue<Float4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGE(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Int4> CmpNLE(RValue<Float4> x, RValue<Float4> y)
+	{
+		return RValue<Int4>(Nucleus::createSExt(Nucleus::createFCmpOGT(x.value, y.value), Int4::getType()));
+	}
+
+	RValue<Float4> Round(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Trunc(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Frac(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Floor(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	RValue<Float4> Ceil(RValue<Float4> x)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Float4>(nullptr);
+	}
+
+	Type *Float4::getType()
+	{
+		assert(false && "UNIMPLEMENTED"); return nullptr;
+	}
+
+	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, int offset)
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Pointer<Byte>>(nullptr);
+	}
+
+	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
+	{
+		return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, offset.value));
+	}
+
+	RValue<Pointer<Byte>> operator+(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
+	{
+		return RValue<Pointer<Byte>>(Nucleus::createGEP(lhs.value, offset.value));
+	}
+
+	RValue<Pointer<Byte>> operator+=(const Pointer<Byte> &lhs, int offset)
+	{
+		return lhs = lhs + offset;
+	}
+
+	RValue<Pointer<Byte>> operator+=(const Pointer<Byte> &lhs, RValue<Int> offset)
+	{
+		return lhs = lhs + offset;
+	}
+
+	RValue<Pointer<Byte>> operator+=(const Pointer<Byte> &lhs, RValue<UInt> offset)
+	{
+		return lhs = lhs + offset;
+	}
+
+	RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, int offset)
+	{
+		return lhs + -offset;
+	}
+
+	RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<Int> offset)
+	{
+		return lhs + -offset;
+	}
+
+	RValue<Pointer<Byte>> operator-(RValue<Pointer<Byte>> lhs, RValue<UInt> offset)
+	{
+		return lhs + -offset;
+	}
+
+	RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, int offset)
+	{
+		return lhs = lhs - offset;
+	}
+
+	RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, RValue<Int> offset)
+	{
+		return lhs = lhs - offset;
+	}
+
+	RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, RValue<UInt> offset)
+	{
+		return lhs = lhs - offset;
+	}
+
+	void Return()
+	{
+		Nucleus::createRetVoid();
+		Nucleus::setInsertBlock(Nucleus::createBasicBlock());
+		Nucleus::createUnreachable();
+	}
+
+	void Return(bool ret)
+	{
+		Ice::Operand *Ret = Ice::ConstantInteger32::create(::context, Ice::IceType_i32, ret ? 1 : 0);
+		Ice::InstRet *retu = Ice::InstRet::create(::function, Ret);
+		::basicBlock->appendInst(retu);
+	}
+
+	void Return(const Int &ret)
+	{
+		Ice::InstRet *retu = Ice::InstRet::create(::function, ret.loadValue());
+		::basicBlock->appendInst(retu);
+	}
+
+	BasicBlock *beginLoop()
+	{
+		BasicBlock *loopBB = Nucleus::createBasicBlock();
+
+		Nucleus::createBr(loopBB);
+		Nucleus::setInsertBlock(loopBB);
+
+		return loopBB;
+	}
+
+	bool branch(RValue<Bool> cmp, BasicBlock *bodyBB, BasicBlock *endBB)
+	{
+		Nucleus::createCondBr(cmp.value, bodyBB, endBB);
+		Nucleus::setInsertBlock(bodyBB);
+
+		return true;
+	}
+
+	bool elseBlock(BasicBlock *falseBB)
+	{
+		Nucleus::setInsertBlock(falseBB);
+
+		return true;
+	}
+
+	RValue<Long> Ticks()
+	{
+		assert(false && "UNIMPLEMENTED"); return RValue<Long>(nullptr);
+	}
+}
+
diff --git a/src/Reactor/SubzeroTest.vcxproj b/src/Reactor/SubzeroTest.vcxproj
new file mode 100644
index 0000000..6f27954
--- /dev/null
+++ b/src/Reactor/SubzeroTest.vcxproj
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|x64">

+      <Configuration>Debug</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|x64">

+      <Configuration>Release</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{4EC107AB-89E8-4A0B-8366-B3E81085AE07}</ProjectGuid>

+    <Keyword>Win32Proj</Keyword>

+    <RootNamespace>SubzeroTest</RootNamespace>

+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <CharacterSet>Unicode</CharacterSet>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+  <ImportGroup Label="Shared">

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+  <PropertyGroup Label="UserMacros" />

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <LinkIncremental>true</LinkIncremental>

+    <IncludePath>$(IncludePath)</IncludePath>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <LinkIncremental>true</LinkIncremental>

+    <IncludePath>$(IncludePath)</IncludePath>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <LinkIncremental>false</LinkIncremental>

+    <IncludePath>$(IncludePath)</IncludePath>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <LinkIncremental>false</LinkIncremental>

+    <IncludePath>$(IncludePath)</IncludePath>

+  </PropertyGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <WarningLevel>Level3</WarningLevel>

+      <Optimization>Disabled</Optimization>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <ClCompile>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <WarningLevel>Level3</WarningLevel>

+      <Optimization>Disabled</Optimization>

+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <ClCompile>

+      <WarningLevel>Level3</WarningLevel>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <Optimization>MaxSpeed</Optimization>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <IntrinsicFunctions>true</IntrinsicFunctions>

+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <EnableCOMDATFolding>true</EnableCOMDATFolding>

+      <OptimizeReferences>true</OptimizeReferences>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <ClCompile>

+      <WarningLevel>Level3</WarningLevel>

+      <PrecompiledHeader>

+      </PrecompiledHeader>

+      <Optimization>MaxSpeed</Optimization>

+      <FunctionLevelLinking>true</FunctionLevelLinking>

+      <IntrinsicFunctions>true</IntrinsicFunctions>

+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

+    </ClCompile>

+    <Link>

+      <SubSystem>Console</SubSystem>

+      <EnableCOMDATFolding>true</EnableCOMDATFolding>

+      <OptimizeReferences>true</OptimizeReferences>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+    </Link>

+  </ItemDefinitionGroup>

+  <ItemGroup>

+    <ProjectReference Include="Subzero.vcxproj">

+      <Project>{0eb31aec-b020-46ab-ba05-730f6d01c29b}</Project>

+    </ProjectReference>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="Main.cpp" />

+  </ItemGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+</Project>
\ No newline at end of file
diff --git a/src/Reactor/SubzeroTest.vcxproj.filters b/src/Reactor/SubzeroTest.vcxproj.filters
new file mode 100644
index 0000000..661f3fb
--- /dev/null
+++ b/src/Reactor/SubzeroTest.vcxproj.filters
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Source Files">

+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>

+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>

+    </Filter>

+    <Filter Include="Header Files">

+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>

+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>

+    </Filter>

+    <Filter Include="Resource Files">

+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>

+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>

+    </Filter>

+  </ItemGroup>

+  <ItemGroup>

+    <ClCompile Include="Main.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+  </ItemGroup>

+</Project>
\ No newline at end of file