Add intrinsics and missing LLVM AsmParser files for Windows ARM64
llvm::parseIR in llvm-7.0\llvm\lib\IRReader\IRReader.cpp calls parseAssembly
which is defined in lib/AsmParser/Parser.cpp, but the latter file is not
included in swiftshader_llvm which causes unresovled symbol for linking.
This CL added the necessary source files under llvm\AsmParser to
swiftshader_llvm.
This CL also changed __rdtsc() to use Windows ARM64 intrinsic _ReadStatusReg
to get cycle counter as alternative of __rdtsc().
Bug: chromium:893460
Change-Id: I269662f2e4249a3ec5495ecad02bc759139e1d4f
Reviewed-on: https://swiftshader-review.googlesource.com/c/23508
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Tom Tan <Tom.Tan@microsoft.com>
diff --git a/src/Common/Timer.cpp b/src/Common/Timer.cpp
index 8ff2cf3..db0ba4a 100644
--- a/src/Common/Timer.cpp
+++ b/src/Common/Timer.cpp
@@ -59,7 +59,11 @@
int64_t Timer::ticks()
{
#if defined(_WIN32)
- return __rdtsc();
+ #if defined(_M_ARM64)
+ return _ReadStatusReg(ARM64_PMCCNTR_EL0);
+ #else
+ return __rdtsc();
+ #endif
#elif defined(__i386__) || defined(__x86_64__)
int64_t tsc;
__asm volatile("rdtsc": "=A" (tsc));
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 8e8b9d3..1b9bacf 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -105,6 +105,7 @@
#define __x86_64__ 1
#endif
+#if defined(__i386__) || defined(__x86_64__)
static void cpuid(int registers[4], int info)
{
#if defined(__i386__) || defined(__x86_64__)
@@ -127,6 +128,7 @@
cpuid(registers, 1);
return (registers[3] & 0x02000000) != 0;
}
+#endif
bool Display::initialize()
{
diff --git a/third_party/llvm-7.0/BUILD.gn b/third_party/llvm-7.0/BUILD.gn
index 744b0eb..4ccc6d1 100644
--- a/third_party/llvm-7.0/BUILD.gn
+++ b/third_party/llvm-7.0/BUILD.gn
@@ -196,6 +196,9 @@
"llvm/lib/Analysis/ValueLatticeUtils.cpp",
"llvm/lib/Analysis/ValueTracking.cpp",
"llvm/lib/Analysis/VectorUtils.cpp",
+ "llvm/lib/AsmParser/LLLexer.cpp",
+ "llvm/lib/AsmParser/LLParser.cpp",
+ "llvm/lib/AsmParser/Parser.cpp",
"llvm/lib/BinaryFormat/Dwarf.cpp",
"llvm/lib/BinaryFormat/Magic.cpp",
"llvm/lib/BinaryFormat/Wasm.cpp",
@@ -407,7 +410,10 @@
}
if (target_cpu != current_cpu &&
- (current_cpu == "x86" || current_cpu == "x64")) {
+ (current_cpu == "x86" || current_cpu == "x64") ||
+ # Windows ARM64 does cross compilation on Windows x64 host, and requires native
+ # x86 target.
+ (is_win && target_cpu == "arm64")) {
deps += [ ":swiftshader_llvm_x86" ]
}
}