diff options
-rw-r--r-- | .gitattributes | 4 | ||||
-rw-r--r-- | msvc_build/aarch64/Ffi_staticLib.sln | 66 | ||||
-rw-r--r-- | msvc_build/aarch64/Ffi_staticLib.vcxproj | 258 | ||||
-rw-r--r-- | msvc_build/aarch64/Ffi_staticLib.vcxproj.filters | 112 | ||||
-rw-r--r-- | msvc_build/aarch64/Ffi_staticLib.vcxproj.user | 6 | ||||
-rw-r--r-- | src/aarch64/win64_armasm.S | 1010 |
6 files changed, 730 insertions, 726 deletions
diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f7d3833 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +* text=auto + +*.sln text eol=crlf +*.vcxproj* text eol=crlf diff --git a/msvc_build/aarch64/Ffi_staticLib.sln b/msvc_build/aarch64/Ffi_staticLib.sln index 79f1ff5..d9119df 100644 --- a/msvc_build/aarch64/Ffi_staticLib.sln +++ b/msvc_build/aarch64/Ffi_staticLib.sln @@ -1,33 +1,33 @@ -
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28302.56
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ffi_staticLib_arm64", "Ffi_staticLib.vcxproj", "{115502C0-BE05-4767-BF19-5C87D805FAD6}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|ARM64 = Debug|ARM64
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|ARM64 = Release|ARM64
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.Build.0 = Debug|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x64.ActiveCfg = Debug|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x86.ActiveCfg = Debug|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.ActiveCfg = Release|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.Build.0 = Release|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x64.ActiveCfg = Release|ARM64
- {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x86.ActiveCfg = Release|ARM64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {241C54C7-20DD-4897-9376-E6B6D1B43BD5}
- EndGlobalSection
-EndGlobal
+ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28302.56 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Ffi_staticLib_arm64", "Ffi_staticLib.vcxproj", "{115502C0-BE05-4767-BF19-5C87D805FAD6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|ARM64.Build.0 = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x64.ActiveCfg = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Debug|x86.ActiveCfg = Debug|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.ActiveCfg = Release|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|ARM64.Build.0 = Release|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x64.ActiveCfg = Release|ARM64 + {115502C0-BE05-4767-BF19-5C87D805FAD6}.Release|x86.ActiveCfg = Release|ARM64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {241C54C7-20DD-4897-9376-E6B6D1B43BD5} + EndGlobalSection +EndGlobal diff --git a/msvc_build/aarch64/Ffi_staticLib.vcxproj b/msvc_build/aarch64/Ffi_staticLib.vcxproj index b9e90d6..3187699 100644 --- a/msvc_build/aarch64/Ffi_staticLib.vcxproj +++ b/msvc_build/aarch64/Ffi_staticLib.vcxproj @@ -1,130 +1,130 @@ -<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|ARM64">
- <Configuration>Debug</Configuration>
- <Platform>ARM64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ARM64">
- <Configuration>Release</Configuration>
- <Platform>ARM64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <VCProjectVersion>15.0</VCProjectVersion>
- <ProjectGuid>{115502C0-BE05-4767-BF19-5C87D805FAD6}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- <RootNamespace>FfistaticLib</RootNamespace>
- <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
- <ProjectName>Ffi_staticLib_arm64</ProjectName>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <PlatformToolset>v141</PlatformToolset>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <PlatformToolset>v141</PlatformToolset>
- <WholeProgramOptimization>true</WholeProgramOptimization>
- <CharacterSet>Unicode</CharacterSet>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="Shared">
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" 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|ARM64'">
- <LinkIncremental>true</LinkIncremental>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
- <LinkIncremental>false</LinkIncremental>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>Disabled</Optimization>
- <SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>FFI_BUILDING_DLL;_DEBUG;_LIB;USE_DL_PREFIX;ARM64;_M_ARM64;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <ConformanceMode>true</ConformanceMode>
- <AdditionalIncludeDirectories>..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <IgnoreStandardIncludePath>false</IgnoreStandardIncludePath>
- <BrowseInformation>true</BrowseInformation>
- <OmitFramePointers>
- </OmitFramePointers>
- <WholeProgramOptimization>false</WholeProgramOptimization>
- </ClCompile>
- <Link>
- <SubSystem>Windows</SubSystem>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
- <ClCompile>
- <PrecompiledHeader>NotUsing</PrecompiledHeader>
- <WarningLevel>Level3</WarningLevel>
- <Optimization>MaxSpeed</Optimization>
- <FunctionLevelLinking>true</FunctionLevelLinking>
- <IntrinsicFunctions>true</IntrinsicFunctions>
- <SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>FFI_BUILDING_DLL;USE_DL_PREFIX;ARM64;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- <ConformanceMode>true</ConformanceMode>
- <AdditionalIncludeDirectories>..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <OmitFramePointers>true</OmitFramePointers>
- <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
- <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
- <AdditionalUsingDirectories>..\..\src;..\..\src\aarch64;%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
- </ClCompile>
- <Link>
- <SubSystem>Windows</SubSystem>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- </Link>
- <ProjectReference>
- <LinkLibraryDependencies>true</LinkLibraryDependencies>
- </ProjectReference>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClInclude Include=".\aarch64_include\ffi.h" />
- <ClInclude Include=".\aarch64_include\fficonfig.h" />
- <ClInclude Include="..\..\src\aarch64\ffitarget.h" />
- <ClInclude Include="..\include\ffi_cfi.h" />
- <ClInclude Include="..\include\ffi_common.h" />
- <ClInclude Include="..\..\src\aarch64\internal.h" />
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="..\..\src\closures.c" />
- <ClCompile Include="..\..\src\dlmalloc.c" />
- <ClCompile Include="..\..\src\aarch64\ffi.c" />
- <ClCompile Include="..\..\src\prep_cif.c" />
- <ClCompile Include="..\..\src\types.c" />
- </ItemGroup>
- <!--ItemGroup>
- <Object Include="..\..\..\..\Downloads\libffi-master-win64\src\aarch64\win64_armasm.obj" />
- </ItemGroup-->
- <ItemGroup>
- <CustomBuild Include="..\..\src\aarch64\win64_armasm.S">
- <!--ExcludedFromBuild Condition="'$(Platform)'!='ARM64'">true</ExcludedFromBuild -->
- <Command>
- cl /FA /EP /nologo /I"..\..\include" /I".\aarch64_include" /I"..\..\src\aarch64" "%(FullPath)" > $(IntDir)win64_armasm.i
- armasm64 $(IntDir)win64_armasm.i /I"src\" /I"..\..\include" /I"..\..\src\aarch64" -o "$(IntDir)win64_armasm.obj"
- </Command>
- <Outputs>win64_armasm.obj;%(Outputs)</Outputs>
- </CustomBuild>
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
+<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|ARM64"> + <Configuration>Debug</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|ARM64"> + <Configuration>Release</Configuration> + <Platform>ARM64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{115502C0-BE05-4767-BF19-5C87D805FAD6}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>FfistaticLib</RootNamespace> + <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion> + <ProjectName>Ffi_staticLib_arm64</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" 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|ARM64'"> + <LinkIncremental>true</LinkIncremental> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>FFI_BUILDING_DLL;_DEBUG;_LIB;USE_DL_PREFIX;ARM64;_M_ARM64;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <IgnoreStandardIncludePath>false</IgnoreStandardIncludePath> + <BrowseInformation>true</BrowseInformation> + <OmitFramePointers> + </OmitFramePointers> + <WholeProgramOptimization>false</WholeProgramOptimization> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>FFI_BUILDING_DLL;USE_DL_PREFIX;ARM64;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>..\..\include;.\aarch64_include;..\..\src\aarch64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <OmitFramePointers>true</OmitFramePointers> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations> + <AdditionalUsingDirectories>..\..\src;..\..\src\aarch64;%(AdditionalUsingDirectories)</AdditionalUsingDirectories> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <ProjectReference> + <LinkLibraryDependencies>true</LinkLibraryDependencies> + </ProjectReference> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include=".\aarch64_include\ffi.h" /> + <ClInclude Include=".\aarch64_include\fficonfig.h" /> + <ClInclude Include="..\..\src\aarch64\ffitarget.h" /> + <ClInclude Include="..\include\ffi_cfi.h" /> + <ClInclude Include="..\include\ffi_common.h" /> + <ClInclude Include="..\..\src\aarch64\internal.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\src\closures.c" /> + <ClCompile Include="..\..\src\dlmalloc.c" /> + <ClCompile Include="..\..\src\aarch64\ffi.c" /> + <ClCompile Include="..\..\src\prep_cif.c" /> + <ClCompile Include="..\..\src\types.c" /> + </ItemGroup> + <!--ItemGroup> + <Object Include="..\..\..\..\Downloads\libffi-master-win64\src\aarch64\win64_armasm.obj" /> + </ItemGroup--> + <ItemGroup> + <CustomBuild Include="..\..\src\aarch64\win64_armasm.S"> + <!--ExcludedFromBuild Condition="'$(Platform)'!='ARM64'">true</ExcludedFromBuild --> + <Command> + cl /FA /EP /nologo /I"..\..\include" /I".\aarch64_include" /I"..\..\src\aarch64" "%(FullPath)" > $(IntDir)win64_armasm.i + armasm64 $(IntDir)win64_armasm.i /I"src\" /I"..\..\include" /I"..\..\src\aarch64" -o "$(IntDir)win64_armasm.obj" + </Command> + <Outputs>win64_armasm.obj;%(Outputs)</Outputs> + </CustomBuild> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> </Project>
\ No newline at end of file diff --git a/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters b/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters index d005b0b..1f8c6e1 100644 --- a/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters +++ b/msvc_build/aarch64/Ffi_staticLib.vcxproj.filters @@ -1,57 +1,57 @@ -<?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;ipp;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>
- <ClInclude Include="..\include\ffi.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\include\ffi_cfi.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\include\ffi_common.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\include\fficonfig.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\include\ffitarget.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="..\include\internal.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="src\closures.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\dlmalloc.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\ffi.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\prep_cif.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\types.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="src\win64_armasm.S" />
- </ItemGroup>
+<?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;ipp;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> + <ClInclude Include="..\include\ffi.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\ffi_cfi.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\ffi_common.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\fficonfig.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\ffitarget.h"> + <Filter>Header Files</Filter> + </ClInclude> + <ClInclude Include="..\include\internal.h"> + <Filter>Header Files</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <ClCompile Include="src\closures.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\dlmalloc.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\ffi.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\prep_cif.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="src\types.c"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <CustomBuild Include="src\win64_armasm.S" /> + </ItemGroup> </Project>
\ No newline at end of file diff --git a/msvc_build/aarch64/Ffi_staticLib.vcxproj.user b/msvc_build/aarch64/Ffi_staticLib.vcxproj.user index 6e2aec7..be25078 100644 --- a/msvc_build/aarch64/Ffi_staticLib.vcxproj.user +++ b/msvc_build/aarch64/Ffi_staticLib.vcxproj.user @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
+<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup /> </Project>
\ No newline at end of file diff --git a/src/aarch64/win64_armasm.S b/src/aarch64/win64_armasm.S index 8ebc444..a79f8a8 100644 --- a/src/aarch64/win64_armasm.S +++ b/src/aarch64/win64_armasm.S @@ -1,506 +1,506 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-``Software''), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#define LIBFFI_ASM
-#include <fficonfig.h>
-#include <ffi.h>
-#include <ffi_cfi.h>
-#include "internal.h"
-
- OPT 2 /*disable listing */
-/* For some macros to add unwind information */
-#include "ksarm64.h"
- OPT 1 /*re-enable listing */
-
-#define BE(X) 0
-#define PTR_REG(n) x##n
-#define PTR_SIZE 8
-
- IMPORT ffi_closure_SYSV_inner
- EXPORT ffi_call_SYSV
- EXPORT ffi_closure_SYSV_V
- EXPORT ffi_closure_SYSV
- EXPORT extend_hfa_type
- EXPORT compress_hfa_type
-#ifdef FFI_GO_CLOSURES
- EXPORT ffi_go_closure_SYSV_V
- EXPORT ffi_go_closure_SYSV
-#endif
-
- TEXTAREA, ALLIGN=8
-
-/* ffi_call_SYSV
- extern void ffi_call_SYSV (void *stack, void *frame,
- void (*fn)(void), void *rvalue,
- int flags, void *closure);
- Therefore on entry we have:
- x0 stack
- x1 frame
- x2 fn
- x3 rvalue
- x4 flags
- x5 closure
-*/
-
- NESTED_ENTRY ffi_call_SYSV_fake
-
- /* For unwind information, Windows has to store fp and lr */
- PROLOG_SAVE_REG_PAIR x29, x30, #-32!
-
- ALTERNATE_ENTRY ffi_call_SYSV
- /* Use a stack frame allocated by our caller. */
- stp x29, x30, [x1]
- mov x29, x1
- mov sp, x0
-
- mov x9, x2 /* save fn */
- mov x8, x3 /* install structure return */
-#ifdef FFI_GO_CLOSURES
- /*mov x18, x5 install static chain */
-#endif
- stp x3, x4, [x29, #16] /* save rvalue and flags */
-
- /* Load the vector argument passing registers, if necessary. */
- tbz x4, #AARCH64_FLAG_ARG_V_BIT, ffi_call_SYSV_L1
- ldp q0, q1, [sp, #0]
- ldp q2, q3, [sp, #32]
- ldp q4, q5, [sp, #64]
- ldp q6, q7, [sp, #96]
-
-ffi_call_SYSV_L1
- /* Load the core argument passing registers, including
- the structure return pointer. */
- ldp x0, x1, [sp, #16*N_V_ARG_REG + 0]
- ldp x2, x3, [sp, #16*N_V_ARG_REG + 16]
- ldp x4, x5, [sp, #16*N_V_ARG_REG + 32]
- ldp x6, x7, [sp, #16*N_V_ARG_REG + 48]
-
- /* Deallocate the context, leaving the stacked arguments. */
- add sp, sp, #CALL_CONTEXT_SIZE
-
- blr x9 /* call fn */
-
- ldp x3, x4, [x29, #16] /* reload rvalue and flags */
-
- /* Partially deconstruct the stack frame. */
- mov sp, x29
- ldp x29, x30, [x29]
-
- /* Save the return value as directed. */
- adr x5, ffi_call_SYSV_return
- and w4, w4, #AARCH64_RET_MASK
- add x5, x5, x4, lsl #3
- br x5
-
- /* Note that each table entry is 2 insns, and thus 8 bytes.
- For integer data, note that we're storing into ffi_arg
- and therefore we want to extend to 64 bits; these types
- have two consecutive entries allocated for them. */
- ALIGN 4
-ffi_call_SYSV_return
- ret /* VOID */
- nop
- str x0, [x3] /* INT64 */
- ret
- stp x0, x1, [x3] /* INT128 */
- ret
- brk #1000 /* UNUSED */
- ret
- brk #1000 /* UNUSED */
- ret
- brk #1000 /* UNUSED */
- ret
- brk #1000 /* UNUSED */
- ret
- brk #1000 /* UNUSED */
- ret
- st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */
- ret
- st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */
- ret
- stp s0, s1, [x3] /* S2 */
- ret
- str s0, [x3] /* S1 */
- ret
- st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */
- ret
- st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */
- ret
- stp d0, d1, [x3] /* D2 */
- ret
- str d0, [x3] /* D1 */
- ret
- str q3, [x3, #48] /* Q4 */
- nop
- str q2, [x3, #32] /* Q3 */
- nop
- stp q0, q1, [x3] /* Q2 */
- ret
- str q0, [x3] /* Q1 */
- ret
- uxtb w0, w0 /* UINT8 */
- str x0, [x3]
- ret /* reserved */
- nop
- uxth w0, w0 /* UINT16 */
- str x0, [x3]
- ret /* reserved */
- nop
- mov w0, w0 /* UINT32 */
- str x0, [x3]
- ret /* reserved */
- nop
- sxtb x0, w0 /* SINT8 */
- str x0, [x3]
- ret /* reserved */
- nop
- sxth x0, w0 /* SINT16 */
- str x0, [x3]
- ret /* reserved */
- nop
- sxtw x0, w0 /* SINT32 */
- str x0, [x3]
- ret /* reserved */
- nop
-
-
- NESTED_END ffi_call_SYSV_fake
-
-
-/* ffi_closure_SYSV
- Closure invocation glue. This is the low level code invoked directly by
- the closure trampoline to setup and call a closure.
- On entry x17 points to a struct ffi_closure, x16 has been clobbered
- all other registers are preserved.
- We allocate a call context and save the argument passing registers,
- then invoked the generic C ffi_closure_SYSV_inner() function to do all
- the real work, on return we load the result passing registers back from
- the call context.
-*/
-
-#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64)
-
- NESTED_ENTRY ffi_closure_SYSV_V
- PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
-
- /* Save the argument passing vector registers. */
- stp q0, q1, [sp, #16 + 0]
- stp q2, q3, [sp, #16 + 32]
- stp q4, q5, [sp, #16 + 64]
- stp q6, q7, [sp, #16 + 96]
-
- b ffi_closure_SYSV_save_argument
- NESTED_END ffi_closure_SYSV_V
-
- NESTED_ENTRY ffi_closure_SYSV
- PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
-
-ffi_closure_SYSV_save_argument
- /* Save the argument passing core registers. */
- stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0]
- stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16]
- stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32]
- stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48]
-
- /* Load ffi_closure_inner arguments. */
- ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */
- ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */
-
-do_closure
- add x3, sp, #16 /* load context */
- add x4, sp, #ffi_closure_SYSV_FS /* load stack */
- add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */
- mov x6, x8 /* load struct_rval */
-
- bl ffi_closure_SYSV_inner
-
- /* Load the return value as directed. */
- adr x1, ffi_closure_SYSV_return_base
- and w0, w0, #AARCH64_RET_MASK
- add x1, x1, x0, lsl #3
- add x3, sp, #16+CALL_CONTEXT_SIZE
- br x1
-
- /* Note that each table entry is 2 insns, and thus 8 bytes. */
- ALIGN 8
-ffi_closure_SYSV_return_base
- b ffi_closure_SYSV_epilog /* VOID */
- nop
- ldr x0, [x3] /* INT64 */
- b ffi_closure_SYSV_epilog
- ldp x0, x1, [x3] /* INT128 */
- b ffi_closure_SYSV_epilog
- brk #1000 /* UNUSED */
- nop
- brk #1000 /* UNUSED */
- nop
- brk #1000 /* UNUSED */
- nop
- brk #1000 /* UNUSED */
- nop
- brk #1000 /* UNUSED */
- nop
- ldr s3, [x3, #12] /* S4 */
- nop
- ldr s2, [x3, #8] /* S3 */
- nop
- ldp s0, s1, [x3] /* S2 */
- b ffi_closure_SYSV_epilog
- ldr s0, [x3] /* S1 */
- b ffi_closure_SYSV_epilog
- ldr d3, [x3, #24] /* D4 */
- nop
- ldr d2, [x3, #16] /* D3 */
- nop
- ldp d0, d1, [x3] /* D2 */
- b ffi_closure_SYSV_epilog
- ldr d0, [x3] /* D1 */
- b ffi_closure_SYSV_epilog
- ldr q3, [x3, #48] /* Q4 */
- nop
- ldr q2, [x3, #32] /* Q3 */
- nop
- ldp q0, q1, [x3] /* Q2 */
- b ffi_closure_SYSV_epilog
- ldr q0, [x3] /* Q1 */
- b ffi_closure_SYSV_epilog
- ldrb w0, [x3, #BE(7)] /* UINT8 */
- b ffi_closure_SYSV_epilog
- brk #1000 /* reserved */
- nop
- ldrh w0, [x3, #BE(6)] /* UINT16 */
- b ffi_closure_SYSV_epilog
- brk #1000 /* reserved */
- nop
- ldr w0, [x3, #BE(4)] /* UINT32 */
- b ffi_closure_SYSV_epilog
- brk #1000 /* reserved */
- nop
- ldrsb x0, [x3, #BE(7)] /* SINT8 */
- b ffi_closure_SYSV_epilog
- brk #1000 /* reserved */
- nop
- ldrsh x0, [x3, #BE(6)] /* SINT16 */
- b ffi_closure_SYSV_epilog
- brk #1000 /* reserved */
- nop
- ldrsw x0, [x3, #BE(4)] /* SINT32 */
- nop
- /* reserved */
-
-ffi_closure_SYSV_epilog
- EPILOG_RESTORE_REG_PAIR x29, x30, #ffi_closure_SYSV_FS!
- EPILOG_RETURN
- NESTED_END ffi_closure_SYSV
-
-
-#ifdef FFI_GO_CLOSURES
- NESTED_ENTRY ffi_go_closure_SYSV_V
- PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
-
- /* Save the argument passing vector registers. */
- stp q0, q1, [sp, #16 + 0]
- stp q2, q3, [sp, #16 + 32]
- stp q4, q5, [sp, #16 + 64]
- stp q6, q7, [sp, #16 + 96]
- b ffi_go_closure_SYSV_save_argument
- NESTED_END ffi_go_closure_SYSV_V
-
- NESTED_ENTRY ffi_go_closure_SYSV
- PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS!
-
-ffi_go_closure_SYSV_save_argument
- /* Save the argument passing core registers. */
- stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0]
- stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16]
- stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32]
- stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48]
-
- /* Load ffi_closure_inner arguments. */
- ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */
- mov x2, x18 /* load user_data */
- b do_closure
- NESTED_END ffi_go_closure_SYSV
-
-#endif /* FFI_GO_CLOSURES */
-
-
-/* void extend_hfa_type (void *dest, void *src, int h) */
-
- LEAF_ENTRY extend_hfa_type
-
- adr x3, extend_hfa_type_jump_base
- and w2, w2, #AARCH64_RET_MASK
- sub x2, x2, #AARCH64_RET_S4
- add x3, x3, x2, lsl #4
- br x3
-
- ALIGN 4
-extend_hfa_type_jump_base
- ldp s16, s17, [x1] /* S4 */
- ldp s18, s19, [x1, #8]
- b extend_hfa_type_store_4
- nop
-
- ldp s16, s17, [x1] /* S3 */
- ldr s18, [x1, #8]
- b extend_hfa_type_store_3
- nop
-
- ldp s16, s17, [x1] /* S2 */
- b extend_hfa_type_store_2
- nop
- nop
-
- ldr s16, [x1] /* S1 */
- b extend_hfa_type_store_1
- nop
- nop
-
- ldp d16, d17, [x1] /* D4 */
- ldp d18, d19, [x1, #16]
- b extend_hfa_type_store_4
- nop
-
- ldp d16, d17, [x1] /* D3 */
- ldr d18, [x1, #16]
- b extend_hfa_type_store_3
- nop
-
- ldp d16, d17, [x1] /* D2 */
- b extend_hfa_type_store_2
- nop
- nop
-
- ldr d16, [x1] /* D1 */
- b extend_hfa_type_store_1
- nop
- nop
-
- ldp q16, q17, [x1] /* Q4 */
- ldp q18, q19, [x1, #16]
- b extend_hfa_type_store_4
- nop
-
- ldp q16, q17, [x1] /* Q3 */
- ldr q18, [x1, #16]
- b extend_hfa_type_store_3
- nop
-
- ldp q16, q17, [x1] /* Q2 */
- b extend_hfa_type_store_2
- nop
- nop
-
- ldr q16, [x1] /* Q1 */
- b extend_hfa_type_store_1
-
-extend_hfa_type_store_4
- str q19, [x0, #48]
-extend_hfa_type_store_3
- str q18, [x0, #32]
-extend_hfa_type_store_2
- str q17, [x0, #16]
-extend_hfa_type_store_1
- str q16, [x0]
- ret
-
- LEAF_END extend_hfa_type
-
-
-/* void compress_hfa_type (void *dest, void *reg, int h) */
-
- LEAF_ENTRY compress_hfa_type
-
- adr x3, compress_hfa_type_jump_base
- and w2, w2, #AARCH64_RET_MASK
- sub x2, x2, #AARCH64_RET_S4
- add x3, x3, x2, lsl #4
- br x3
-
- ALIGN 4
-compress_hfa_type_jump_base
- ldp q16, q17, [x1] /* S4 */
- ldp q18, q19, [x1, #32]
- st4 { v16.s, v17.s, v18.s, v19.s }[0], [x0]
- ret
-
- ldp q16, q17, [x1] /* S3 */
- ldr q18, [x1, #32]
- st3 { v16.s, v17.s, v18.s }[0], [x0]
- ret
-
- ldp q16, q17, [x1] /* S2 */
- st2 { v16.s, v17.s }[0], [x0]
- ret
- nop
-
- ldr q16, [x1] /* S1 */
- st1 { v16.s }[0], [x0]
- ret
- nop
-
- ldp q16, q17, [x1] /* D4 */
- ldp q18, q19, [x1, #32]
- st4 { v16.d, v17.d, v18.d, v19.d }[0], [x0]
- ret
-
- ldp q16, q17, [x1] /* D3 */
- ldr q18, [x1, #32]
- st3 { v16.d, v17.d, v18.d }[0], [x0]
- ret
-
- ldp q16, q17, [x1] /* D2 */
- st2 { v16.d, v17.d }[0], [x0]
- ret
- nop
-
- ldr q16, [x1] /* D1 */
- st1 { v16.d }[0], [x0]
- ret
- nop
-
- ldp q16, q17, [x1] /* Q4 */
- ldp q18, q19, [x1, #32]
- b compress_hfa_type_store_q4
- nop
-
- ldp q16, q17, [x1] /* Q3 */
- ldr q18, [x1, #32]
- b compress_hfa_type_store_q3
- nop
-
- ldp q16, q17, [x1] /* Q2 */
- stp q16, q17, [x0]
- ret
- nop
-
- ldr q16, [x1] /* Q1 */
- str q16, [x0]
- ret
-
-compress_hfa_type_store_q4
- str q19, [x0, #48]
-compress_hfa_type_store_q3
- str q18, [x0, #32]
- stp q16, q17, [x0]
- ret
-
- LEAF_END compress_hfa_type
-
+/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal.h" + + OPT 2 /*disable listing */ +/* For some macros to add unwind information */ +#include "ksarm64.h" + OPT 1 /*re-enable listing */ + +#define BE(X) 0 +#define PTR_REG(n) x##n +#define PTR_SIZE 8 + + IMPORT ffi_closure_SYSV_inner + EXPORT ffi_call_SYSV + EXPORT ffi_closure_SYSV_V + EXPORT ffi_closure_SYSV + EXPORT extend_hfa_type + EXPORT compress_hfa_type +#ifdef FFI_GO_CLOSURES + EXPORT ffi_go_closure_SYSV_V + EXPORT ffi_go_closure_SYSV +#endif + + TEXTAREA, ALLIGN=8 + +/* ffi_call_SYSV + extern void ffi_call_SYSV (void *stack, void *frame, + void (*fn)(void), void *rvalue, + int flags, void *closure); + Therefore on entry we have: + x0 stack + x1 frame + x2 fn + x3 rvalue + x4 flags + x5 closure +*/ + + NESTED_ENTRY ffi_call_SYSV_fake + + /* For unwind information, Windows has to store fp and lr */ + PROLOG_SAVE_REG_PAIR x29, x30, #-32! + + ALTERNATE_ENTRY ffi_call_SYSV + /* Use a stack frame allocated by our caller. */ + stp x29, x30, [x1] + mov x29, x1 + mov sp, x0 + + mov x9, x2 /* save fn */ + mov x8, x3 /* install structure return */ +#ifdef FFI_GO_CLOSURES + /*mov x18, x5 install static chain */ +#endif + stp x3, x4, [x29, #16] /* save rvalue and flags */ + + /* Load the vector argument passing registers, if necessary. */ + tbz x4, #AARCH64_FLAG_ARG_V_BIT, ffi_call_SYSV_L1 + ldp q0, q1, [sp, #0] + ldp q2, q3, [sp, #32] + ldp q4, q5, [sp, #64] + ldp q6, q7, [sp, #96] + +ffi_call_SYSV_L1 + /* Load the core argument passing registers, including + the structure return pointer. */ + ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] + ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] + ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] + ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] + + /* Deallocate the context, leaving the stacked arguments. */ + add sp, sp, #CALL_CONTEXT_SIZE + + blr x9 /* call fn */ + + ldp x3, x4, [x29, #16] /* reload rvalue and flags */ + + /* Partially deconstruct the stack frame. */ + mov sp, x29 + ldp x29, x30, [x29] + + /* Save the return value as directed. */ + adr x5, ffi_call_SYSV_return + and w4, w4, #AARCH64_RET_MASK + add x5, x5, x4, lsl #3 + br x5 + + /* Note that each table entry is 2 insns, and thus 8 bytes. + For integer data, note that we're storing into ffi_arg + and therefore we want to extend to 64 bits; these types + have two consecutive entries allocated for them. */ + ALIGN 4 +ffi_call_SYSV_return + ret /* VOID */ + nop + str x0, [x3] /* INT64 */ + ret + stp x0, x1, [x3] /* INT128 */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + brk #1000 /* UNUSED */ + ret + st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ + ret + st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ + ret + stp s0, s1, [x3] /* S2 */ + ret + str s0, [x3] /* S1 */ + ret + st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ + ret + st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ + ret + stp d0, d1, [x3] /* D2 */ + ret + str d0, [x3] /* D1 */ + ret + str q3, [x3, #48] /* Q4 */ + nop + str q2, [x3, #32] /* Q3 */ + nop + stp q0, q1, [x3] /* Q2 */ + ret + str q0, [x3] /* Q1 */ + ret + uxtb w0, w0 /* UINT8 */ + str x0, [x3] + ret /* reserved */ + nop + uxth w0, w0 /* UINT16 */ + str x0, [x3] + ret /* reserved */ + nop + mov w0, w0 /* UINT32 */ + str x0, [x3] + ret /* reserved */ + nop + sxtb x0, w0 /* SINT8 */ + str x0, [x3] + ret /* reserved */ + nop + sxth x0, w0 /* SINT16 */ + str x0, [x3] + ret /* reserved */ + nop + sxtw x0, w0 /* SINT32 */ + str x0, [x3] + ret /* reserved */ + nop + + + NESTED_END ffi_call_SYSV_fake + + +/* ffi_closure_SYSV + Closure invocation glue. This is the low level code invoked directly by + the closure trampoline to setup and call a closure. + On entry x17 points to a struct ffi_closure, x16 has been clobbered + all other registers are preserved. + We allocate a call context and save the argument passing registers, + then invoked the generic C ffi_closure_SYSV_inner() function to do all + the real work, on return we load the result passing registers back from + the call context. +*/ + +#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) + + NESTED_ENTRY ffi_closure_SYSV_V + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + + b ffi_closure_SYSV_save_argument + NESTED_END ffi_closure_SYSV_V + + NESTED_ENTRY ffi_closure_SYSV + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + +ffi_closure_SYSV_save_argument + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ + ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ + +do_closure + add x3, sp, #16 /* load context */ + add x4, sp, #ffi_closure_SYSV_FS /* load stack */ + add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ + mov x6, x8 /* load struct_rval */ + + bl ffi_closure_SYSV_inner + + /* Load the return value as directed. */ + adr x1, ffi_closure_SYSV_return_base + and w0, w0, #AARCH64_RET_MASK + add x1, x1, x0, lsl #3 + add x3, sp, #16+CALL_CONTEXT_SIZE + br x1 + + /* Note that each table entry is 2 insns, and thus 8 bytes. */ + ALIGN 8 +ffi_closure_SYSV_return_base + b ffi_closure_SYSV_epilog /* VOID */ + nop + ldr x0, [x3] /* INT64 */ + b ffi_closure_SYSV_epilog + ldp x0, x1, [x3] /* INT128 */ + b ffi_closure_SYSV_epilog + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + brk #1000 /* UNUSED */ + nop + ldr s3, [x3, #12] /* S4 */ + nop + ldr s2, [x3, #8] /* S3 */ + nop + ldp s0, s1, [x3] /* S2 */ + b ffi_closure_SYSV_epilog + ldr s0, [x3] /* S1 */ + b ffi_closure_SYSV_epilog + ldr d3, [x3, #24] /* D4 */ + nop + ldr d2, [x3, #16] /* D3 */ + nop + ldp d0, d1, [x3] /* D2 */ + b ffi_closure_SYSV_epilog + ldr d0, [x3] /* D1 */ + b ffi_closure_SYSV_epilog + ldr q3, [x3, #48] /* Q4 */ + nop + ldr q2, [x3, #32] /* Q3 */ + nop + ldp q0, q1, [x3] /* Q2 */ + b ffi_closure_SYSV_epilog + ldr q0, [x3] /* Q1 */ + b ffi_closure_SYSV_epilog + ldrb w0, [x3, #BE(7)] /* UINT8 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrh w0, [x3, #BE(6)] /* UINT16 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldr w0, [x3, #BE(4)] /* UINT32 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrsb x0, [x3, #BE(7)] /* SINT8 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrsh x0, [x3, #BE(6)] /* SINT16 */ + b ffi_closure_SYSV_epilog + brk #1000 /* reserved */ + nop + ldrsw x0, [x3, #BE(4)] /* SINT32 */ + nop + /* reserved */ + +ffi_closure_SYSV_epilog + EPILOG_RESTORE_REG_PAIR x29, x30, #ffi_closure_SYSV_FS! + EPILOG_RETURN + NESTED_END ffi_closure_SYSV + + +#ifdef FFI_GO_CLOSURES + NESTED_ENTRY ffi_go_closure_SYSV_V + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + b ffi_go_closure_SYSV_save_argument + NESTED_END ffi_go_closure_SYSV_V + + NESTED_ENTRY ffi_go_closure_SYSV + PROLOG_SAVE_REG_PAIR x29, x30, #-ffi_closure_SYSV_FS! + +ffi_go_closure_SYSV_save_argument + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ + mov x2, x18 /* load user_data */ + b do_closure + NESTED_END ffi_go_closure_SYSV + +#endif /* FFI_GO_CLOSURES */ + + +/* void extend_hfa_type (void *dest, void *src, int h) */ + + LEAF_ENTRY extend_hfa_type + + adr x3, extend_hfa_type_jump_base + and w2, w2, #AARCH64_RET_MASK + sub x2, x2, #AARCH64_RET_S4 + add x3, x3, x2, lsl #4 + br x3 + + ALIGN 4 +extend_hfa_type_jump_base + ldp s16, s17, [x1] /* S4 */ + ldp s18, s19, [x1, #8] + b extend_hfa_type_store_4 + nop + + ldp s16, s17, [x1] /* S3 */ + ldr s18, [x1, #8] + b extend_hfa_type_store_3 + nop + + ldp s16, s17, [x1] /* S2 */ + b extend_hfa_type_store_2 + nop + nop + + ldr s16, [x1] /* S1 */ + b extend_hfa_type_store_1 + nop + nop + + ldp d16, d17, [x1] /* D4 */ + ldp d18, d19, [x1, #16] + b extend_hfa_type_store_4 + nop + + ldp d16, d17, [x1] /* D3 */ + ldr d18, [x1, #16] + b extend_hfa_type_store_3 + nop + + ldp d16, d17, [x1] /* D2 */ + b extend_hfa_type_store_2 + nop + nop + + ldr d16, [x1] /* D1 */ + b extend_hfa_type_store_1 + nop + nop + + ldp q16, q17, [x1] /* Q4 */ + ldp q18, q19, [x1, #16] + b extend_hfa_type_store_4 + nop + + ldp q16, q17, [x1] /* Q3 */ + ldr q18, [x1, #16] + b extend_hfa_type_store_3 + nop + + ldp q16, q17, [x1] /* Q2 */ + b extend_hfa_type_store_2 + nop + nop + + ldr q16, [x1] /* Q1 */ + b extend_hfa_type_store_1 + +extend_hfa_type_store_4 + str q19, [x0, #48] +extend_hfa_type_store_3 + str q18, [x0, #32] +extend_hfa_type_store_2 + str q17, [x0, #16] +extend_hfa_type_store_1 + str q16, [x0] + ret + + LEAF_END extend_hfa_type + + +/* void compress_hfa_type (void *dest, void *reg, int h) */ + + LEAF_ENTRY compress_hfa_type + + adr x3, compress_hfa_type_jump_base + and w2, w2, #AARCH64_RET_MASK + sub x2, x2, #AARCH64_RET_S4 + add x3, x3, x2, lsl #4 + br x3 + + ALIGN 4 +compress_hfa_type_jump_base + ldp q16, q17, [x1] /* S4 */ + ldp q18, q19, [x1, #32] + st4 { v16.s, v17.s, v18.s, v19.s }[0], [x0] + ret + + ldp q16, q17, [x1] /* S3 */ + ldr q18, [x1, #32] + st3 { v16.s, v17.s, v18.s }[0], [x0] + ret + + ldp q16, q17, [x1] /* S2 */ + st2 { v16.s, v17.s }[0], [x0] + ret + nop + + ldr q16, [x1] /* S1 */ + st1 { v16.s }[0], [x0] + ret + nop + + ldp q16, q17, [x1] /* D4 */ + ldp q18, q19, [x1, #32] + st4 { v16.d, v17.d, v18.d, v19.d }[0], [x0] + ret + + ldp q16, q17, [x1] /* D3 */ + ldr q18, [x1, #32] + st3 { v16.d, v17.d, v18.d }[0], [x0] + ret + + ldp q16, q17, [x1] /* D2 */ + st2 { v16.d, v17.d }[0], [x0] + ret + nop + + ldr q16, [x1] /* D1 */ + st1 { v16.d }[0], [x0] + ret + nop + + ldp q16, q17, [x1] /* Q4 */ + ldp q18, q19, [x1, #32] + b compress_hfa_type_store_q4 + nop + + ldp q16, q17, [x1] /* Q3 */ + ldr q18, [x1, #32] + b compress_hfa_type_store_q3 + nop + + ldp q16, q17, [x1] /* Q2 */ + stp q16, q17, [x0] + ret + nop + + ldr q16, [x1] /* Q1 */ + str q16, [x0] + ret + +compress_hfa_type_store_q4 + str q19, [x0, #48] +compress_hfa_type_store_q3 + str q18, [x0, #32] + stp q16, q17, [x0] + ret + + LEAF_END compress_hfa_type + END
\ No newline at end of file |