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/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