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" ]
   }
 }