Bläddra i källkod

add oop jit support for simd

Michael Holman 9 år sedan
förälder
incheckning
b43cd1a0b3

+ 70 - 26
Build/Chakra.Core.sln

@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
+VisualStudioVersion = 14.0.25123.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraCore", "..\bin\ChakraCore\ChakraCore.vcxproj", "{EA882C8D-81FC-42FE-ABD5-2666DB933FDB}"
 	ProjectSection(ProjectDependencies) = postProject
@@ -27,7 +27,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraCore", "..\bin\Chakra
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{D8216B93-BD6E-4293-8D98-79CEF7CF66BC}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Codex", "..\lib\common\Codex\Chakra.Common.Codex.vcxproj", "{1876E800-AD77-48C4-A2F7-E5265F24AC38}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Codex", "..\lib\Common\Codex\Chakra.Common.Codex.vcxproj", "{1876E800-AD77-48C4-A2F7-E5265F24AC38}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Runtime.ByteCode", "..\lib\Runtime\ByteCode\Chakra.Runtime.ByteCode.vcxproj", "{706083F7-6AA4-4558-A153-6352EF9110F5}"
 EndProject
@@ -39,19 +39,19 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Runtime.Library", ".
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Runtime.Types", "..\lib\Runtime\Types\Chakra.Runtime.Types.vcxproj", "{706083F7-6AA4-4558-A153-6352EF9110F6}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Common", "..\lib\common\Common\Chakra.Common.Common.vcxproj", "{BB4153FF-AC3E-4734-B562-CC23812DF31B}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Common", "..\lib\Common\Common\Chakra.Common.Common.vcxproj", "{BB4153FF-AC3E-4734-B562-CC23812DF31B}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Runtime", "Runtime", "{DDF436E7-0A8E-41AA-82B3-902B5D2D0809}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{546172B2-F084-4363-BE35-06010663D319}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Core", "..\lib\common\Core\Chakra.Common.Core.vcxproj", "{CC4153FF-AC3E-4734-B562-CC23812DF31B}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Core", "..\lib\Common\Core\Chakra.Common.Core.vcxproj", "{CC4153FF-AC3E-4734-B562-CC23812DF31B}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.DataStructures", "..\lib\common\DataStructures\Chakra.Common.DataStructures.vcxproj", "{5643D42A-C38D-4D82-9662-58470B3AC9F7}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.DataStructures", "..\lib\Common\DataStructures\Chakra.Common.DataStructures.vcxproj", "{5643D42A-C38D-4D82-9662-58470B3AC9F7}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Exceptions", "..\lib\common\Exceptions\Chakra.Common.Exceptions.vcxproj", "{FD8EEC40-4141-448A-BF4B-1589FBE4F60D}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Exceptions", "..\lib\Common\Exceptions\Chakra.Common.Exceptions.vcxproj", "{FD8EEC40-4141-448A-BF4B-1589FBE4F60D}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Memory", "..\lib\common\Memory\Chakra.Common.Memory.vcxproj", "{BB4153FF-AC3E-4734-B562-FF23812DF31B}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Memory", "..\lib\Common\Memory\Chakra.Common.Memory.vcxproj", "{BB4153FF-AC3E-4734-B562-FF23812DF31B}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Backend", "..\lib\Backend\Chakra.Backend.vcxproj", "{18CF279F-188D-4655-B03D-74F65388E7D1}"
 EndProject
@@ -63,7 +63,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Jsrt.Core", "..\lib\
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Runtime.Math", "..\lib\Runtime\Math\Chakra.Runtime.Math.vcxproj", "{ABC904AD-9415-46F8-AA23-E33193F81F7C}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Util", "..\lib\common\util\Chakra.Common.Util.vcxproj", "{6979EC58-7A28-465C-A694-F3323A1F5401}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Common.Util", "..\lib\Common\Util\Chakra.Common.Util.vcxproj", "{6979EC58-7A28-465C-A694-F3323A1F5401}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{158C8616-750C-4E0E-BD3D-5721D3C555E6}"
 EndProject
@@ -84,7 +84,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GCStress", "..\bin\GCStress
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.Runtime.PlatformAgnostic", "..\lib\Runtime\PlatformAgnostic\Chakra.Runtime.PlatformAgnostic.vcxproj", "{129AC184-877C-441F-AC49-A692CE700E62}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ChakraCodeGen", "..\bin\ChakraCodeGen\ChakraCodeGen.vcxproj", "{C273DF53-FE83-4A1F-8D66-E3F169412BD2}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.JITClient", "..\lib\JITClient\Chakra.JITClient.vcxproj", "{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.JITIDL", "..\lib\JITIDL\Chakra.JITIDL.vcxproj", "{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra.JITServer", "..\lib\JITServer\Chakra.JITServer.vcxproj", "{31024620-7B97-4EC7-96E8-E7B296A17DF4}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -477,22 +481,6 @@ Global
 		{706083F7-6AA4-4558-A153-6352EF9110EE}.Test|x64.Build.0 = Test|x64
 		{706083F7-6AA4-4558-A153-6352EF9110EE}.Test|x86.ActiveCfg = Test|Win32
 		{706083F7-6AA4-4558-A153-6352EF9110EE}.Test|x86.Build.0 = Test|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Debug|ARM.ActiveCfg = Debug|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Debug|x64.ActiveCfg = Debug|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Debug|x64.Build.0 = Debug|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Debug|x86.ActiveCfg = Debug|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Debug|x86.Build.0 = Debug|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Release|ARM.ActiveCfg = Release|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Release|x64.ActiveCfg = Release|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Release|x64.Build.0 = Release|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Release|x86.ActiveCfg = Release|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Release|x86.Build.0 = Release|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Test|ARM.ActiveCfg = Release|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Test|ARM.Build.0 = Release|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Test|x64.ActiveCfg = Release|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Test|x64.Build.0 = Release|x64
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Test|x86.ActiveCfg = Release|Win32
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2}.Test|x86.Build.0 = Release|Win32
 		{73CE5C59-E0BA-413D-A73C-3EECE067891B}.Debug|ARM.ActiveCfg = Debug|ARM
 		{73CE5C59-E0BA-413D-A73C-3EECE067891B}.Debug|ARM.Build.0 = Debug|ARM
 		{73CE5C59-E0BA-413D-A73C-3EECE067891B}.Debug|x64.ActiveCfg = Debug|x64
@@ -529,6 +517,60 @@ Global
 		{129AC184-877C-441F-AC49-A692CE700E62}.Test|x64.Build.0 = Test|x64
 		{129AC184-877C-441F-AC49-A692CE700E62}.Test|x86.ActiveCfg = Test|Win32
 		{129AC184-877C-441F-AC49-A692CE700E62}.Test|x86.Build.0 = Test|Win32
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Debug|ARM.ActiveCfg = Debug|ARM
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Debug|ARM.Build.0 = Debug|ARM
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Debug|x64.ActiveCfg = Debug|x64
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Debug|x64.Build.0 = Debug|x64
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Debug|x86.ActiveCfg = Debug|Win32
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Debug|x86.Build.0 = Debug|Win32
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Release|ARM.ActiveCfg = Release|ARM
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Release|ARM.Build.0 = Release|ARM
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Release|x64.ActiveCfg = Release|x64
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Release|x64.Build.0 = Release|x64
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Release|x86.ActiveCfg = Release|Win32
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Release|x86.Build.0 = Release|Win32
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Test|ARM.ActiveCfg = Test|ARM
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Test|ARM.Build.0 = Test|ARM
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Test|x64.ActiveCfg = Test|x64
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Test|x64.Build.0 = Test|x64
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Test|x86.ActiveCfg = Test|Win32
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC}.Test|x86.Build.0 = Test|Win32
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Debug|ARM.ActiveCfg = Debug|ARM
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Debug|ARM.Build.0 = Debug|ARM
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Debug|x64.ActiveCfg = Debug|x64
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Debug|x64.Build.0 = Debug|x64
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Debug|x86.ActiveCfg = Debug|Win32
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Debug|x86.Build.0 = Debug|Win32
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Release|ARM.ActiveCfg = Release|ARM
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Release|ARM.Build.0 = Release|ARM
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Release|x64.ActiveCfg = Release|x64
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Release|x64.Build.0 = Release|x64
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Release|x86.ActiveCfg = Release|Win32
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Release|x86.Build.0 = Release|Win32
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Test|ARM.ActiveCfg = Test|ARM
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Test|ARM.Build.0 = Test|ARM
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Test|x64.ActiveCfg = Test|x64
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Test|x64.Build.0 = Test|x64
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Test|x86.ActiveCfg = Test|Win32
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719}.Test|x86.Build.0 = Test|Win32
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Debug|ARM.ActiveCfg = Debug|ARM
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Debug|ARM.Build.0 = Debug|ARM
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Debug|x64.ActiveCfg = Debug|x64
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Debug|x64.Build.0 = Debug|x64
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Debug|x86.ActiveCfg = Debug|Win32
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Debug|x86.Build.0 = Debug|Win32
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Release|ARM.ActiveCfg = Release|ARM
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Release|ARM.Build.0 = Release|ARM
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Release|x64.ActiveCfg = Release|x64
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Release|x64.Build.0 = Release|x64
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Release|x86.ActiveCfg = Release|Win32
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Release|x86.Build.0 = Release|Win32
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Test|ARM.ActiveCfg = Test|ARM
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Test|ARM.Build.0 = Test|ARM
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Test|x64.ActiveCfg = Test|x64
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Test|x64.Build.0 = Test|x64
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Test|x86.ActiveCfg = Test|Win32
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4}.Test|x86.Build.0 = Test|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -560,8 +602,10 @@ Global
 		{0216C4BE-86CE-478D-A134-23EAEE545B9D} = {D3BA0BFC-4757-4B73-994F-3556950884A1}
 		{80A70F57-0F89-458F-AFD3-CE2159EB9BB1} = {D3BA0BFC-4757-4B73-994F-3556950884A1}
 		{706083F7-6AA4-4558-A153-6352EF9110EE} = {DDF436E7-0A8E-41AA-82B3-902B5D2D0809}
-		{C273DF53-FE83-4A1F-8D66-E3F169412BD2} = {D3BA0BFC-4757-4B73-994F-3556950884A1}
 		{73CE5C59-E0BA-413D-A73C-3EECE067891B} = {D3BA0BFC-4757-4B73-994F-3556950884A1}
 		{129AC184-877C-441F-AC49-A692CE700E62} = {DDF436E7-0A8E-41AA-82B3-902B5D2D0809}
+		{FFD0FA88-7A39-407E-A92D-D3A06273E1AC} = {D8216B93-BD6E-4293-8D98-79CEF7CF66BC}
+		{0DB5ECBC-9385-4A65-BE2C-4EF7C65CB719} = {D8216B93-BD6E-4293-8D98-79CEF7CF66BC}
+		{31024620-7B97-4EC7-96E8-E7B296A17DF4} = {D8216B93-BD6E-4293-8D98-79CEF7CF66BC}
 	EndGlobalSection
 EndGlobal

+ 9 - 0
bin/ChakraCore/ChakraCore.vcxproj

@@ -90,6 +90,15 @@
     </ClCompile>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\lib\JITClient\Chakra.JITClient.vcxproj">
+      <Project>{ffd0fa88-7a39-407e-a92d-d3a06273e1ac}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\lib\JITIDL\Chakra.JITIDL.vcxproj">
+      <Project>{0db5ecbc-9385-4a65-be2c-4ef7c65cb719}</Project>
+    </ProjectReference>
+    <ProjectReference Include="..\..\lib\JITServer\Chakra.JITServer.vcxproj">
+      <Project>{31024620-7b97-4ec7-96e8-e7b296a17df4}</Project>
+    </ProjectReference>
     <ProjectReference Include="..\..\lib\Jsrt\Chakra.Jsrt.vcxproj">
       <Project>{706083f7-6aa4-4558-a153-6352ef9220f5}</Project>
     </ProjectReference>

+ 1 - 3
lib/Backend/Func.h

@@ -297,9 +297,7 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece;
 
     bool IsSIMDEnabled() const
     {
-        // TODO: michhol OOP JIT, this flag is accessed in a weird way, temporarily completely disable
-        // m_func->GetScriptContext()->GetConfig()->IsSimdjsEnabled()
-        return false;
+        return GetScriptContextInfo()->IsSIMDEnabled();
     }
     uint32 GetInstrCount();
     inline Js::ScriptContext* GetScriptContext() const

+ 76 - 56
lib/Backend/LowerMDSharedSimd128.cpp

@@ -49,23 +49,23 @@ bool LowererMD::Simd128TryLowerMappedInstruction(IR::Instr *instr)
     {
     case Js::OpCode::Simd128_Abs_F4:
         Assert(opcode == Js::OpCode::ANDPS);
-        instr->SetSrc2(IR::MemRefOpnd::New((void*)&X86_ABS_MASK_F4, instr->GetSrc1()->GetType(), m_func));
+        instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AbsMaskF4Addr(), instr->GetSrc1()->GetType(), m_func));
         break;
 #if 0
     case Js::OpCode::Simd128_Abs_D2:
         Assert(opcode == Js::OpCode::ANDPD);
-        instr->SetSrc2(IR::MemRefOpnd::New((void*)&X86_ABS_MASK_D2, instr->GetSrc1()->GetType(), m_func));
+        instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AbsMaskD2Addr(), instr->GetSrc1()->GetType(), m_func));
         break;
 #endif // 0
 
     case Js::OpCode::Simd128_Neg_F4:
         Assert(opcode == Js::OpCode::XORPS);
-        instr->SetSrc2(IR::MemRefOpnd::New((void*)&X86_NEG_MASK_F4, instr->GetSrc1()->GetType(), m_func));
+        instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegMaskF4Addr(), instr->GetSrc1()->GetType(), m_func));
         break;
 #if 0
     case Js::OpCode::Simd128_Neg_D2:
         Assert(opcode == Js::OpCode::XORPS);
-        instr->SetSrc2(IR::MemRefOpnd::New((void*)&X86_NEG_MASK_D2, instr->GetSrc1()->GetType(), m_func));
+        instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegMaskD2Addr(), instr->GetSrc1()->GetType(), m_func));
         break;
 #endif // 0
 
@@ -79,7 +79,7 @@ bool LowererMD::Simd128TryLowerMappedInstruction(IR::Instr *instr)
     case Js::OpCode::Simd128_Not_B8:
     case Js::OpCode::Simd128_Not_B16:
         Assert(opcode == Js::OpCode::XORPS);
-        instr->SetSrc2(IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, instr->GetSrc1()->GetType(), m_func));
+        instr->SetSrc2(IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), instr->GetSrc1()->GetType(), m_func));
         break;
     case Js::OpCode::Simd128_Gt_F4:
     //case Js::OpCode::Simd128_Gt_D2:
@@ -373,12 +373,34 @@ IR::Instr* LowererMD::Simd128LoadConst(IR::Instr* instr)
     AsmJsSIMDValue value = instr->GetSrc1()->AsSimd128ConstOpnd()->m_value;
 
     // MOVUPS dst, [const]
-    AsmJsSIMDValue *pValue = NativeCodeDataNewNoFixup(instr->m_func->GetNativeCodeDataAllocator(), AsmJsSIMDValue);
-    pValue->SetValue(value);
-    IR::Opnd * opnd = IR::MemRefOpnd::New((void *)pValue, instr->GetDst()->GetType(), instr->m_func);
-    instr->ReplaceSrc1(opnd);
+    
+    void *pValue = NativeCodeDataNewNoFixup(this->m_func->GetNativeCodeDataAllocator(), SIMDType<DataDesc_LowererMD_Simd128LoadConst>, value);
+    IR::Opnd * simdRef;
+    if (!m_func->IsOOPJIT())
+    {
+        simdRef = IR::MemRefOpnd::New((void *)pValue, instr->GetDst()->GetType(), instr->m_func);
+    }
+    else
+    {
+        int offset = NativeCodeData::GetDataTotalOffset(pValue);
+        IR::RegOpnd * addressRegOpnd = IR::RegOpnd::New(TyMachPtr, m_func);
+
+        Lowerer::InsertMove(
+            addressRegOpnd,
+            IR::MemRefOpnd::New((void*)m_func->GetWorkItem()->GetWorkItemData()->nativeDataAddr, TyMachPtr, m_func, IR::AddrOpndKindDynamicNativeCodeDataRef),
+            instr);
+
+        simdRef = IR::IndirOpnd::New(addressRegOpnd, offset, TyMachDouble,
+#if DBG
+            NativeCodeData::GetDataDescription(pValue, m_func->m_alloc),
+#endif
+            m_func);
+    }
+
+    instr->ReplaceSrc1(simdRef);
     instr->m_opcode = LowererMDArch::GetAssignOp(instr->GetDst()->GetType());
     Legalize(instr);
+
     return instr->m_prev;
 }
 
@@ -388,11 +410,11 @@ IR::Instr* LowererMD::Simd128CanonicalizeToBools(IR::Instr* instr, const Js::OpC
            instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B4 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B8 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B16);
     IR::Instr *pInstr;
     //dst = cmpOpcode dst, X86_ALL_ZEROS
-    pInstr = IR::Instr::New(cmpOpcode, &dstOpnd, &dstOpnd, IR::MemRefOpnd::New((void*)&X86_ALL_ZEROS, TySimd128I4, m_func), m_func);
+    pInstr = IR::Instr::New(cmpOpcode, &dstOpnd, &dstOpnd, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllZerosAddr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(pInstr);
     Legalize(pInstr);
     // dst = PANDN dst, X86_ALL_NEG_ONES
-    pInstr = IR::Instr::New(Js::OpCode::PANDN, &dstOpnd, &dstOpnd, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+    pInstr = IR::Instr::New(Js::OpCode::PANDN, &dstOpnd, &dstOpnd, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(pInstr);
     Legalize(pInstr);
     return instr;
@@ -438,12 +460,12 @@ IR::Instr* LowererMD::Simd128LowerConstructor_16(IR::Instr *instr)
     //Simd128_IntsToI16/U16/B16
     Assert(instr->m_opcode == Js::OpCode::Simd128_IntsToU16 || instr->m_opcode == Js::OpCode::Simd128_IntsToI16 || instr->m_opcode == Js::OpCode::Simd128_IntsToB16);
     SList<IR::Opnd*> *args = Simd128GetExtendedArgs(instr);
-    uint8 *tempSIMD = (uint8*)(instr->m_func->GetScriptContext()->GetThreadContext()->GetSimdTempArea());
+    intptr_t tempSIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(0);
 #if DBG
     // using only one SIMD temp
-    intptr_t endAddrSIMD = (intptr_t)(tempSIMD + sizeof(X86SIMDValue));
+    intptr_t endAddrSIMD = tempSIMD + sizeof(X86SIMDValue);
 #endif
-    void * address;
+    intptr_t address;
     IR::Instr * newInstr;
 
     Assert(args->Count() == 17);
@@ -457,17 +479,17 @@ IR::Instr* LowererMD::Simd128LowerConstructor_16(IR::Instr *instr)
         srcs[i] = EnregisterIntConst(instr, srcs[i], TyInt8);
         Assert(srcs[i]->GetType() == TyInt8 && srcs[i]->IsRegOpnd());
 
-        address = (void*)(tempSIMD + i);
+        address = tempSIMD + i;
         // check for buffer overrun
         Assert((intptr_t)address < endAddrSIMD);
         // MOV [temp + i], src[i] (TyInt8)
-        newInstr = IR::Instr::New(Js::OpCode::MOV, IR::MemRefOpnd::New((void*)(tempSIMD + i), TyInt8, m_func), srcs[i], m_func);
+        newInstr = IR::Instr::New(Js::OpCode::MOV, IR::MemRefOpnd::New(tempSIMD + i, TyInt8, m_func), srcs[i], m_func);
         instr->InsertBefore(newInstr);
         Legalize(newInstr);
         i++;
     }
     // MOVUPS dst, [temp]
-    newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::MemRefOpnd::New((void*)(tempSIMD), TySimd128U16, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::MemRefOpnd::New(tempSIMD, TySimd128U16, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -874,7 +896,7 @@ IR::Instr* LowererMD::Simd128LowerSplat(IR::Instr *instr)
         //JEQ       $labelZero
         instr->InsertBefore(IR::BranchInstr::New(Js::OpCode::JEQ, labelZero, m_func));
         // MOVAPS   dst, xmmword ptr[X86_ALL_NEG_ONES]
-        pInstr = IR::Instr::New(Js::OpCode::MOVAPS, dst, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::MOVAPS, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
         // JMP      $labelDone
@@ -933,7 +955,7 @@ IR::Instr* LowererMD::Simd128LowerRcp(IR::Instr *instr, bool removeInstr)
 #endif // 0
 
     IR::RegOpnd* tmp = IR::RegOpnd::New(src1->GetType(), m_func);
-    IR::Instr* movInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp, IR::MemRefOpnd::New((void*)(&X86_ALL_ONES_F4), src1->GetType(), m_func), m_func);
+    IR::Instr* movInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllOnesF4Addr(), src1->GetType(), m_func), m_func);
     instr->InsertBefore(movInstr);
     Legalize(movInstr);
 
@@ -1072,7 +1094,7 @@ IR::Instr* LowererMD::Simd128LowerNeg(IR::Instr *instr)
     instr->InsertBefore(pInstr);
 
     // PANDN dst, dst, 0xfff...f
-    pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, src1->GetType(), m_func), m_func);
+    pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), src1->GetType(), m_func), m_func);
     instr->InsertBefore(pInstr);
     Legalize(pInstr);
 
@@ -1175,7 +1197,7 @@ IR::Instr* LowererMD::Simd128LowerMulI16(IR::Instr *instr)
     instr->InsertBefore(pInstr);
     Legalize(pInstr);
     //PAND temp1 {0x00ff00ff00ff00ff00ff00ff00ff00ff}  :To zero out bytes 1,3,5...
-    pInstr = IR::Instr::New(Js::OpCode::PAND, temp1, temp1, IR::MemRefOpnd::New((void*)&X86_LOWBYTES_MASK, simdType, m_func), m_func);
+    pInstr = IR::Instr::New(Js::OpCode::PAND, temp1, temp1, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86LowBytesMaskAddr(), simdType, m_func), m_func);
     instr->InsertBefore(pInstr);
     Legalize(pInstr);
     //PSRLW src1, 8
@@ -1296,7 +1318,7 @@ IR::Instr* LowererMD::Simd128LowerShift(IR::Instr *instr)
         pInstr = IR::Instr::New(Js::OpCode::MOVAPS, dst, src1, m_func);
         instr->InsertBefore(pInstr);
         // PAND     tmp1, [X86_HIGHBYTES_MASK]
-        pInstr = IR::Instr::New(Js::OpCode::PAND, tmp1, tmp1, IR::MemRefOpnd::New((void*)&X86_HIGHBYTES_MASK, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PAND, tmp1, tmp1, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86HighBytesMaskAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
         // PSLLW  tmp1, tmp0
@@ -1308,7 +1330,7 @@ IR::Instr* LowererMD::Simd128LowerShift(IR::Instr *instr)
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
         // PAND   dst, [X86_LOWBYTES_MASK]
-        pInstr = IR::Instr::New(Js::OpCode::PAND, dst, dst, IR::MemRefOpnd::New((void*)&X86_LOWBYTES_MASK, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PAND, dst, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86LowBytesMaskAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
         // POR    dst,  tmp1
@@ -1332,13 +1354,13 @@ IR::Instr* LowererMD::Simd128LowerShift(IR::Instr *instr)
         // PSRAW    dst, tmp0
         instr->InsertBefore(IR::Instr::New(Js::OpCode::PSRAW, dst, dst, tmp2, m_func));
         // PAND     dst, [X86_LOWBYTES_MASK]
-        pInstr = IR::Instr::New(Js::OpCode::PAND, dst, dst, IR::MemRefOpnd::New((void*)&X86_LOWBYTES_MASK, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PAND, dst, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86LowBytesMaskAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
         // PSRAW    tmp1, tmp0
         instr->InsertBefore(IR::Instr::New(Js::OpCode::PSRAW, tmp1, tmp1, tmp0, m_func));
         // PAND     tmp1, [X86_HIGHBYTES_MASK]
-        pInstr = IR::Instr::New(Js::OpCode::PAND, tmp1, tmp1, IR::MemRefOpnd::New((void*)&X86_HIGHBYTES_MASK, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PAND, tmp1, tmp1, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86HighBytesMaskAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
         // POR      dst, tmp1
@@ -1454,22 +1476,21 @@ IR::Instr* LowererMD::SIMD128LowerReplaceLane_16(IR::Instr* instr)
     Assert(lane >= 0 && lane < 16);
 
     IR::Opnd* laneValue = EnregisterIntConst(instr, src3, TyInt8);
-    uint8 *tempSIMD = (uint8*)(instr->m_func->GetScriptContext()->GetThreadContext()->GetSimdTempArea());
+    intptr_t tempSIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(0);
 #if DBG
     // using only one SIMD temp
-    intptr_t endAddrSIMD = (intptr_t) (tempSIMD + sizeof(X86SIMDValue));
+    intptr_t endAddrSIMD = tempSIMD + sizeof(X86SIMDValue);
 #endif
-    void *address = nullptr;
 
     Assert(instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_I16 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_U16 || instr->m_opcode == Js::OpCode::Simd128_ReplaceLane_B16);
     // MOVUPS [temp], src1
-    address = (void*)tempSIMD;
+    intptr_t address = tempSIMD;
     newInstr = IR::Instr::New(Js::OpCode::MOVUPS, IR::MemRefOpnd::New(address, TySimd128I16, m_func), src1, m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
     // MOV [temp+offset], laneValue
-    address = (void*)(tempSIMD + lane);
+    address = tempSIMD + lane;
     // check for buffer overrun
     Assert((intptr_t)address < endAddrSIMD);
     newInstr = IR::Instr::New(Js::OpCode::MOV, IR::MemRefOpnd::New(address, TyInt8, m_func), laneValue, m_func);
@@ -1477,7 +1498,7 @@ IR::Instr* LowererMD::SIMD128LowerReplaceLane_16(IR::Instr* instr)
     Legalize(newInstr);
 
     // MOVUPS dst, [temp]
-    address = (void*)tempSIMD;
+    address = tempSIMD;
     newInstr = IR::Instr::New(Js::OpCode::MOVUPS, dst, IR::MemRefOpnd::New(address, TySimd128I16, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
@@ -1757,7 +1778,7 @@ IR::Instr* LowererMD::Simd128LowerShuffle_4(IR::Instr* instr)
                 break;
             }
         }
-        IR::MemRefOpnd * laneMask = IR::MemRefOpnd::New((void*)&X86_4LANES_MASKS[minorityLane], dst->GetType(), m_func);
+        IR::MemRefOpnd * laneMask = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86FourLanesMaskAddr(minorityLane), dst->GetType(), m_func);
 
         InsertShufps(lanes, temp1, majSrc, majSrc, instr);
         InsertShufps(lanes, temp2, minSrc, minSrc, instr);
@@ -1790,10 +1811,9 @@ IR::Instr* LowererMD::Simd128LowerShuffle(IR::Instr* instr)
     uint8 lanes[16], laneCount = 0, scale = 1;
     bool isShuffle = false;
     IRType laneType = TyInt16;
-    X86SIMDValue * const tempSIMD = (instr->m_func->GetScriptContext()->GetThreadContext()->GetSimdTempArea());
-    uint8 *temp1SIMD = (uint8 *) (&tempSIMD[0]);
-    uint8 *temp2SIMD = (uint8 *) (&tempSIMD[1]);
-    uint8 *dstSIMD   = (uint8 *) (&tempSIMD[2]);
+    intptr_t temp1SIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(0);
+    intptr_t temp2SIMD = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(1);
+    intptr_t dstSIMD   = m_func->GetThreadContextInfo()->GetSimdTempAreaAddr(2);
 #if DBG
     intptr_t endAddrSIMD = (intptr_t)(temp1SIMD + sizeof(X86SIMDValue) * SIMD_TEMP_SIZE);
 #endif
@@ -1922,7 +1942,7 @@ IR::Instr* LowererMD::Simd128LowerNotEqual(IR::Instr* instr)
     Legalize(pInstr);
 
     // dst = PANDN dst, X86_ALL_NEG_ONES
-    pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst,  IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+    pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst,  IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(pInstr);
     //MakeDstEquSrc1(pInstr);
     Legalize(pInstr);
@@ -1949,19 +1969,19 @@ IR::Instr* LowererMD::Simd128LowerLessThan(IR::Instr* instr)
     IR::RegOpnd* tmpa = IR::RegOpnd::New(src1->GetType(), m_func);
     IR::RegOpnd* tmpb = IR::RegOpnd::New(src1->GetType(), m_func);
 
-    IR::MemRefOpnd* signBits = IR::MemRefOpnd::New((void*)&X86_DWORD_SIGNBITS, TySimd128I4, m_func);
+    IR::MemRefOpnd* signBits = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86DoubleWordSignBitsAddr(), TySimd128I4, m_func);
     IR::RegOpnd * mask = IR::RegOpnd::New(TySimd128I4, m_func);
 
     Js::OpCode cmpOpcode = Js::OpCode::PCMPGTD;
     if (instr->m_opcode == Js::OpCode::Simd128_Lt_U8 || instr->m_opcode == Js::OpCode::Simd128_GtEq_U8)
     {
         cmpOpcode = Js::OpCode::PCMPGTW;
-        signBits = IR::MemRefOpnd::New((void*)&X86_WORD_SIGNBITS, TySimd128I4, m_func);
+        signBits = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86WordSignBitsAddr(), TySimd128I4, m_func);
     }
     else if (instr->m_opcode == Js::OpCode::Simd128_Lt_U16 || instr->m_opcode == Js::OpCode::Simd128_GtEq_U16)
     {
         cmpOpcode = Js::OpCode::PCMPGTB;
-        signBits = IR::MemRefOpnd::New((void*)&X86_BYTE_SIGNBITS, TySimd128I4, m_func);
+        signBits = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86ByteSignBitsAddr(), TySimd128I4, m_func);
     }
 
     // MOVUPS mask, [signBits]
@@ -1989,7 +2009,7 @@ IR::Instr* LowererMD::Simd128LowerLessThan(IR::Instr* instr)
         // for SIMD unsigned int, greaterThanOrEqual == lessThan + Not
         // dst = PANDN dst, X86_ALL_NEG_ONES
         // MOVUPS mask, [allNegOnes]
-        pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
     }
@@ -2038,7 +2058,7 @@ IR::Instr* LowererMD::Simd128LowerLessThanOrEqual(IR::Instr* instr)
         Legalize(pInstr);
 
         // dst = pandn dst, xmmword ptr[X86_ALL_NEG_ONES]
-        pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
     }
@@ -2062,15 +2082,15 @@ IR::Instr* LowererMD::Simd128LowerLessThanOrEqual(IR::Instr* instr)
     else if (instr->m_opcode == Js::OpCode::Simd128_LtEq_U4 || instr->m_opcode == Js::OpCode::Simd128_LtEq_U8 || instr->m_opcode == Js::OpCode::Simd128_LtEq_U16 ||
         instr->m_opcode == Js::OpCode::Simd128_Gt_U4 || instr->m_opcode == Js::OpCode::Simd128_Gt_U8 || instr->m_opcode == Js::OpCode::Simd128_Gt_U16)
     {
-        IR::MemRefOpnd* signBits = IR::MemRefOpnd::New((void*)&X86_DWORD_SIGNBITS, TySimd128I4, m_func);
+        IR::MemRefOpnd* signBits = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86DoubleWordSignBitsAddr(), TySimd128I4, m_func);
         IR::RegOpnd * mask = IR::RegOpnd::New(TySimd128I4, m_func);
         if (instr->m_opcode == Js::OpCode::Simd128_LtEq_U8 || instr->m_opcode == Js::OpCode::Simd128_Gt_U8)
         {
-            signBits = IR::MemRefOpnd::New((void*)&X86_WORD_SIGNBITS, TySimd128I4, m_func);
+            signBits = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86WordSignBitsAddr(), TySimd128I4, m_func);
         }
         else if (instr->m_opcode == Js::OpCode::Simd128_LtEq_U16 || instr->m_opcode == Js::OpCode::Simd128_Gt_U16)
         {
-            signBits = IR::MemRefOpnd::New((void*)&X86_BYTE_SIGNBITS, TySimd128I4, m_func);
+            signBits = IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86ByteSignBitsAddr(), TySimd128I4, m_func);
         }
         // MOVUPS mask, [signBits]
         pInstr = IR::Instr::New(Js::OpCode::MOVUPS, mask, signBits, m_func);
@@ -2104,7 +2124,7 @@ IR::Instr* LowererMD::Simd128LowerLessThanOrEqual(IR::Instr* instr)
         if (instr->m_opcode == Js::OpCode::Simd128_Gt_U4 || instr->m_opcode == Js::OpCode::Simd128_Gt_U8 || instr->m_opcode == Js::OpCode::Simd128_Gt_U16)
         {   // for SIMD unsigned int, greaterThan == lessThanOrEqual + Not
             // dst = PANDN dst, X86_ALL_NEG_ONES
-            pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst,  IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+            pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst,  IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
             instr->InsertBefore(pInstr);
 
             Legalize(pInstr);
@@ -2137,7 +2157,7 @@ IR::Instr* LowererMD::Simd128LowerGreaterThanOrEqual(IR::Instr* instr)
         Legalize(pInstr);
 
         // dst = pandn dst, xmmword ptr[X86_ALL_NEG_ONES]
-        pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES, TySimd128I4, m_func), m_func);
+        pInstr = IR::Instr::New(Js::OpCode::PANDN, dst, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesAddr(), TySimd128I4, m_func), m_func);
         instr->InsertBefore(pInstr);
         Legalize(pInstr);
     }
@@ -2346,7 +2366,7 @@ IR::Instr* LowererMD::Simd128LowerInt32x4FromFloat32x4(IR::Instr *instr)
     // JNE $doneLabel
     tmp = IR::RegOpnd::New(TySimd128I4, m_func);
     tmp2 = IR::RegOpnd::New(TySimd128I4, m_func);
-    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New((void*)&X86_NEG_MASK_F4, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegMaskF4Addr(), TySimd128I4, m_func), m_func);
     insertInstr->InsertBefore(newInstr);
     Legalize(newInstr);
     newInstr = IR::Instr::New(Js::OpCode::PCMPEQD, tmp, dst, tmp2, m_func);
@@ -2369,7 +2389,7 @@ IR::Instr* LowererMD::Simd128LowerInt32x4FromFloat32x4(IR::Instr *instr)
     // OR mask1, mask1, mask2
     // CMP mask1, 0
     // JNE $doneLabel
-    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New((void*)&X86_TWO_31_F4, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86TwoPower31F4Addr(), TySimd128I4, m_func), m_func);
     insertInstr->InsertBefore(newInstr);
     Legalize(newInstr);
     newInstr = IR::Instr::New(Js::OpCode::CMPLEPS, tmp, tmp2, src, m_func);
@@ -2377,7 +2397,7 @@ IR::Instr* LowererMD::Simd128LowerInt32x4FromFloat32x4(IR::Instr *instr)
     Legalize(newInstr);
     insertInstr->InsertBefore(IR::Instr::New(Js::OpCode::MOVMSKPS, mask1, tmp, m_func));
 
-    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New((void*)&X86_NEG_TWO_31_F4, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, tmp2, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegTwoPower31F4Addr(), TySimd128I4, m_func), m_func);
     insertInstr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -2425,7 +2445,7 @@ IR::Instr* LowererMD::Simd128LowerUint32x4FromFloat32x4(IR::Instr *instr)
     // MOVMSKPS mask, tmp
     // CMP mask, 0
     // JNE $throwLabel
-    newInstr = IR::Instr::New(Js::OpCode::CMPLEPS, tmp, src, IR::MemRefOpnd::New((void*)&X86_ALL_NEG_ONES_F4, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::CMPLEPS, tmp, src, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllNegOnesF4Addr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -2448,7 +2468,7 @@ IR::Instr* LowererMD::Simd128LowerUint32x4FromFloat32x4(IR::Instr *instr)
     // ANDPS        two_31_f4_mask, tmp2          // tmp has f32(2^31) for lanes >= 2^31, 0 otherwise
     // SUBPS        tmp2, two_31_f4_mask          // subtract 2^31 from lanes >= 2^31, unchanged otherwise.
     // CVTTPS2DQ    dst, tmp2
-    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, two_31_f4_mask, IR::MemRefOpnd::New((void*)&X86_TWO_31_F4, TySimd128F4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, two_31_f4_mask, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86TwoPower31F4Addr(), TySimd128F4, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -2473,7 +2493,7 @@ IR::Instr* LowererMD::Simd128LowerUint32x4FromFloat32x4(IR::Instr *instr)
     // MOVMSKPS     mask, tmp
     // CMP          mask, 0
     // JNE          $throwLabel
-    newInstr = IR::Instr::New(Js::OpCode::PCMPEQD, tmp, dst, IR::MemRefOpnd::New((void*)&X86_NEG_MASK_F4, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::PCMPEQD, tmp, dst, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86NegMaskF4Addr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -2498,7 +2518,7 @@ IR::Instr* LowererMD::Simd128LowerUint32x4FromFloat32x4(IR::Instr *instr)
     // ANDPS        two_31_i4_mask, two_31_f4_mask
     // PADDD        dst, dst, two_31_i4_mask
     // JMP          $doneLabel
-    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, two_31_i4_mask, IR::MemRefOpnd::New((void*)&X86_TWO_31_I4, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, two_31_i4_mask, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86TwoPower31I4Addr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -2542,7 +2562,7 @@ IR::Instr* LowererMD::Simd128LowerFloat32x4FromUint32x4(IR::Instr *instr)
 
     // find unsigned values above 2^31-1. Comparison is signed, so look for values < 0
     // MOVAPS zero, [X86_ALL_ZEROS]
-    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, zero, IR::MemRefOpnd::New((void*)&X86_ALL_ZEROS, TySimd128I4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::MOVAPS, zero, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86AllZerosAddr(), TySimd128I4, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 
@@ -2553,7 +2573,7 @@ IR::Instr* LowererMD::Simd128LowerFloat32x4FromUint32x4(IR::Instr *instr)
 
     // temp1 has f32(2^32) for unsigned values above 2^31, 0 otherwise
     // ANDPS tmp, tmp, [X86_TWO_32_F4]
-    newInstr = IR::Instr::New(Js::OpCode::ANDPS, tmp, tmp, IR::MemRefOpnd::New((void*)&X86_TWO_32_F4, TySimd128F4, m_func), m_func);
+    newInstr = IR::Instr::New(Js::OpCode::ANDPS, tmp, tmp, IR::MemRefOpnd::New(m_func->GetThreadContextInfo()->GetX86TwoPower32F4Addr(), TySimd128F4, m_func), m_func);
     instr->InsertBefore(newInstr);
     Legalize(newInstr);
 

+ 10 - 1
lib/Backend/NativeCodeData.h

@@ -201,7 +201,8 @@ char DataDesc_ArgOutOffsetInfo_StartCallOutParamCounts[]    = "";
 char DataDesc_ArgOutOffsetInfo_StartCallArgRestoreAdjustCounts[] = "";
 char DataDesc_LowererMD_LoadFloatValue_Float[]              = "";
 char DataDesc_LowererMD_LoadFloatValue_Double[]             = "";
-char DataDesc_LowererMD_EmitLoadFloatCommon_Double[]        = "";
+char DataDesc_LowererMD_EmitLoadFloatCommon_Double[] = "";
+char DataDesc_LowererMD_Simd128LoadConst[]        = "";
 
 template<char const *desc = DataDesc_None>
 struct IntType 
@@ -230,6 +231,14 @@ struct DoubleType
     double data;
 };
 
+template<char const *desc = DataDesc_None>
+struct SIMDType
+{
+    SIMDType() {}
+    SIMDType(AsmJsSIMDValue val) :data(val) {}
+    AsmJsSIMDValue data;
+};
+
 template<char const *desc = DataDesc_None>
 struct VarType
 {

+ 6 - 0
lib/Backend/ScriptContextInfo.cpp

@@ -176,6 +176,12 @@ ScriptContextInfo::GetRecyclerAllowNativeCodeBumpAllocation() const
     return m_contextData.recyclerAllowNativeCodeBumpAllocation != 0;
 }
 
+bool
+ScriptContextInfo::IsSIMDEnabled() const
+{
+    return m_contextData.isSIMDEnabled != 0;
+}
+
 intptr_t
 ScriptContextInfo::GetBuiltinFunctionsBaseAddr() const
 {

+ 1 - 0
lib/Backend/ScriptContextInfo.h

@@ -36,6 +36,7 @@ public:
     intptr_t GetNumberAllocatorAddr() const;
     intptr_t GetRecyclerAddr() const;
     bool GetRecyclerAllowNativeCodeBumpAllocation() const;
+    bool IsSIMDEnabled() const;
     intptr_t GetBuiltinFunctionsBaseAddr() const;
 
     intptr_t GetAddr() const;

+ 115 - 0
lib/Backend/ThreadContextInfo.cpp

@@ -179,6 +179,121 @@ ThreadContextInfo::GetMantissaMaskAddr() const
     return SHIFT_ADDR(this, &Js::Constants::MantissaMask);
 }
 
+intptr_t
+ThreadContextInfo::GetX86AbsMaskF4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_ABS_MASK_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86AbsMaskD2Addr() const
+{
+    return SHIFT_ADDR(this, &X86_ABS_MASK_D2);
+}
+
+intptr_t
+ThreadContextInfo::GetX86NegMaskF4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_NEG_MASK_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86NegMaskD2Addr() const
+{
+    return SHIFT_ADDR(this, &X86_NEG_MASK_D2);
+}
+
+intptr_t
+ThreadContextInfo::GetX86AllNegOnesAddr() const
+{
+    return SHIFT_ADDR(this, &X86_ALL_NEG_ONES);
+}
+
+intptr_t
+ThreadContextInfo::GetX86AllNegOnesF4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_ALL_NEG_ONES_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86AllZerosAddr() const
+{
+    return SHIFT_ADDR(this, &X86_ALL_ZEROS);
+}
+
+intptr_t
+ThreadContextInfo::GetX86AllOnesF4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_ALL_ONES_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86LowBytesMaskAddr() const
+{
+    return SHIFT_ADDR(this, &X86_LOWBYTES_MASK);
+}
+
+intptr_t
+ThreadContextInfo::GetX86HighBytesMaskAddr() const
+{
+    return SHIFT_ADDR(this, &X86_HIGHBYTES_MASK);
+}
+
+intptr_t
+ThreadContextInfo::GetX86DoubleWordSignBitsAddr() const
+{
+    return SHIFT_ADDR(this, &X86_DWORD_SIGNBITS);
+}
+
+intptr_t
+ThreadContextInfo::GetX86WordSignBitsAddr() const
+{
+    return SHIFT_ADDR(this, &X86_WORD_SIGNBITS);
+}
+
+intptr_t
+ThreadContextInfo::GetX86ByteSignBitsAddr() const
+{
+    return SHIFT_ADDR(this, &X86_BYTE_SIGNBITS);
+}
+
+intptr_t
+ThreadContextInfo::GetX86TwoPower32F4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_TWO_32_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86TwoPower31F4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_TWO_31_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86TwoPower31I4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_TWO_31_I4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86NegTwoPower31F4Addr() const
+{
+    return SHIFT_ADDR(this, &X86_NEG_TWO_31_F4);
+}
+
+intptr_t
+ThreadContextInfo::GetX86FourLanesMaskAddr(uint8 minorityLane) const
+{
+    return SHIFT_ADDR(this, &X86_4LANES_MASKS[minorityLane]);
+}
+
+intptr_t
+ThreadContextInfo::GetSimdTempAreaAddr(uint8 tempIndex) const
+{
+    Assert(tempIndex < SIMD_TEMP_SIZE);
+    return m_threadContextData.simdTempAreaBaseAddr + tempIndex * sizeof(_x86_SIMDValue);
+}
+
 intptr_t
 ThreadContextInfo::GetThreadStackLimitAddr() const
 {

+ 20 - 0
lib/Backend/ThreadContextInfo.h

@@ -51,6 +51,26 @@ public:
     intptr_t GetDebugFrameAddressAddr() const;
     intptr_t GetDebugScriptIdWhenSetAddr() const;
 
+    intptr_t GetX86AbsMaskF4Addr() const;
+    intptr_t GetX86AbsMaskD2Addr() const;
+    intptr_t GetX86NegMaskF4Addr() const;
+    intptr_t GetX86NegMaskD2Addr() const;
+    intptr_t GetX86AllNegOnesAddr() const;
+    intptr_t GetX86AllNegOnesF4Addr() const;
+    intptr_t GetX86AllZerosAddr() const;
+    intptr_t GetX86AllOnesF4Addr() const;
+    intptr_t GetX86LowBytesMaskAddr() const;
+    intptr_t GetX86HighBytesMaskAddr() const;
+    intptr_t GetX86DoubleWordSignBitsAddr() const;
+    intptr_t GetX86WordSignBitsAddr() const;
+    intptr_t GetX86ByteSignBitsAddr() const;
+    intptr_t GetX86TwoPower32F4Addr() const;
+    intptr_t GetX86TwoPower31F4Addr() const;
+    intptr_t GetX86TwoPower31I4Addr() const;
+    intptr_t GetX86NegTwoPower31F4Addr() const;
+    intptr_t GetX86FourLanesMaskAddr(uint8 minorityLane) const;
+    intptr_t GetSimdTempAreaAddr(uint8 tempIndex) const;
+
     size_t GetScriptStackLimit() const;
 
     bool IsThreadBound() const;

+ 1 - 3
lib/JITIDL/Chakra.JITIDL.vcxproj

@@ -18,11 +18,9 @@
   <PropertyGroup>
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
   </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Midl />
-  </ItemDefinitionGroup>
   <ItemGroup>
     <Midl Include="$(MsBuildThisFileDirectory)ChakraJIT.idl">
+      <OutputDirectory>$(IntDir)</OutputDirectory>
       <AdditionalOptions>%(AdditionalOptions) /target NT60 /prefix client "Client" server "Server"</AdditionalOptions>
     </Midl>
   </ItemGroup>

+ 3 - 1
lib/JITIDL/ChakraJIT.idl

@@ -202,11 +202,14 @@ typedef struct ThreadContextDataIDL
     __int3264 debugScriptIdWhenSetAddr;
     __int3264 stringReplaceNameAddr;
     __int3264 stringMatchNameAddr;
+    __int3264 simdTempAreaBaseAddr;
 } ThreadContextDataIDL;
 
 typedef struct ScriptContextDataIDL
 {
     boolean isRecyclerVerifyEnabled;
+    boolean recyclerAllowNativeCodeBumpAllocation;
+    boolean isSIMDEnabled;
     unsigned int recyclerVerifyPad;
     __int3264 vtableAddresses[VTABLE_COUNT];
 
@@ -235,7 +238,6 @@ typedef struct ScriptContextDataIDL
     __int3264 floatArraySetElementFastPathVtableAddr;
     __int3264 numberAllocatorAddr;
     __int3264 recyclerAddr;
-    boolean recyclerAllowNativeCodeBumpAllocation;
     __int3264 builtinFunctionsBaseAddr;
 } ScriptContextDataIDL;
 

+ 2 - 1
lib/Runtime/Base/ScriptContext.h

@@ -479,7 +479,8 @@ namespace Js
             contextData.recyclerVerifyPad = 0;
 #endif
             contextData.numberAllocatorAddr = (intptr_t)GetNumberAllocator();
-            CompileAssert(VTableValue::Count == VTABLE_COUNT); // need to update idl chen this changes
+            contextData.isSIMDEnabled = GetConfig()->IsSimdjsEnabled();
+            CompileAssert(VTableValue::Count == VTABLE_COUNT); // need to update idl when this changes
 
             auto vtblAddresses = GetLibrary()->GetVTableAddresses();
             for (unsigned int i = 0; i < VTableValue::Count; i++)

+ 5 - 0
lib/Runtime/Base/ThreadContext.cpp

@@ -1875,6 +1875,11 @@ ThreadContext::SetJITConnectionInfo(DWORD processId, UUID connectionId)
     contextData.debugScriptIdWhenSetAddr = (intptr_t)this->debugManager->stepController.GetAddressOfScriptIdWhenSet();
     contextData.scriptStackLimit = reinterpret_cast<size_t>(GetScriptStackLimit());
     contextData.isThreadBound = GetIsThreadBound();
+
+#if _M_IX86 || _M_AMD64
+    contextData.simdTempAreaBaseAddr = (intptr_t)GetSimdTempArea();
+#endif
+
     JITManager::GetJITManager()->InitializeThreadContext(&contextData, &m_remoteThreadContextInfo);
 
     // we may have populated propertyMap prior to initializing JIT connection