WebKit Bugzilla
Attachment 338970 Details for
Bug 185055
: [JSC][ARM64][Linux] Add collectCPUFeatures using auxiliary vector
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-185055-20180427061011.patch (text/plain), 5.71 KB, created by
Yusuke Suzuki
on 2018-04-26 22:10:14 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2018-04-26 22:10:14 PDT
Size:
5.71 KB
patch
obsolete
>Subversion Revision: 231073 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 41d8c24ed07ac8a673368a02756d85253c0fc300..e2d05f645323cb858290055c8635f3ebd854bb9a 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,28 @@ >+2018-04-26 Yusuke Suzuki <utatane.tea@gmail.com> >+ >+ [JSC][ARM64][Linux] Add collectCPUFeatures using auxiliary vector >+ https://bugs.webkit.org/show_bug.cgi?id=185055 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch is paving the way to emitting jscvt instruction if possible. >+ To do that, we need to determine jscvt instruction is supported in the >+ given CPU. >+ >+ We add a function collectCPUFeatures, which is responsible to collect >+ CPU features if necessary. In Linux, we can use auxiliary vector to get >+ the information without parsing /proc/cpuinfo. >+ >+ Currently, nobody calls this function. It is later called when we emit >+ jscvt instruction. To make it possible, we also need to add disassembler >+ support too. >+ >+ * assembler/AbstractMacroAssembler.h: >+ * assembler/MacroAssemblerARM64.cpp: >+ (JSC::MacroAssemblerARM64::collectCPUFeatures): >+ * assembler/MacroAssemblerARM64.h: >+ * assembler/MacroAssemblerX86Common.h: >+ > 2018-04-26 Jer Noble <jer.noble@apple.com> > > WK_COCOA_TOUCH all the things. >diff --git a/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h b/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h >index cf03f68b98670bc7336c8e70cca0e7cb07fdf3c5..9f4aaee6b560fe85810eb7494ad4b3c251fa20e5 100644 >--- a/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h >+++ b/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h >@@ -82,6 +82,12 @@ class AbstractMacroAssembler : public AbstractMacroAssemblerBase { > template<PtrTag tag> using CodePtr = MacroAssemblerCodePtr<tag>; > template<PtrTag tag> using CodeRef = MacroAssemblerCodeRef<tag>; > >+ enum class CPUIDCheckState { >+ NotChecked, >+ Clear, >+ Set >+ }; >+ > class Jump; > > typedef typename AssemblerType::RegisterID RegisterID; >diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp b/Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp >index ed343304a350fa6da3740f257a51d4b5768857d9..edfb4422577fee1d1fd906a898495152c30f6ddd 100644 >--- a/Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp >+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp >@@ -31,6 +31,11 @@ > #include "ProbeContext.h" > #include <wtf/InlineASM.h> > >+#if OS(LINUX) >+#include <asm/hwcap.h> >+#include <sys/auxv.h> >+#endif >+ > namespace JSC { > > #if ENABLE(MASM_PROBE) >@@ -526,6 +531,34 @@ void MacroAssembler::probe(Probe::Function function, void* arg) > > #endif // ENABLE(MASM_PROBE) > >+void MacroAssemblerARM64::collectCPUFeatures() >+{ >+ static std::once_flag onceKey; >+ std::call_once(onceKey, [] { >+#if OS(LINUX) >+ // A register for describing ARM64 CPU features are only accessible in kernel mode. >+ // Thus, some kernel support is necessary to collect CPU features. In Linux, the >+ // kernel passes CPU feature flags in AT_HWCAP auxiliary vector which is passed >+ // when the process starts. While this may pose a bit conservative information >+ // (for example, the Linux kernel may add a flag for a feature after the feature >+ // is shipped and implemented in some CPUs. In that case, even if the CPU has >+ // that feature, the kernel does not tell it to users.), it is a stable approach. >+ // https://www.kernel.org/doc/Documentation/arm64/elf_hwcaps.txt >+ unsigned long hwcaps = getauxval(AT_HWCAP); >+ >+#if !defined(HWCAP_JSCVT) >+#define HWCAP_JSCVT (1 << 13) >+#endif >+ >+ s_jscvtCheckState = (hwcaps & HWCAP_JSCVT) ? CPUIDCheckState::Set : CPUIDCheckState::Clear; >+#else >+ s_jscvtCheckState = CPUIDCheckState::Clear; >+#endif >+ }); >+} >+ >+MacroAssemblerARM64::CPUIDCheckState MacroAssemblerARM64::s_jscvtCheckState = CPUIDCheckState::NotChecked; >+ > } // namespace JSC > > #endif // ENABLE(ASSEMBLER) && CPU(ARM64) >diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h b/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h >index 52481bb1e4220d95d8651461b1866b9c08211259..80cdd1f908cd20ae9061a658b92de1df4f15aad1 100644 >--- a/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h >+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h >@@ -4460,6 +4460,10 @@ class MacroAssemblerARM64 : public AbstractMacroAssembler<Assembler> { > Assembler::linkCall(code, call.m_label, function.template retaggedExecutableAddress<NoPtrTag>()); > } > >+ JS_EXPORT_PRIVATE static void collectCPUFeatures(); >+ >+ JS_EXPORT_PRIVATE static CPUIDCheckState s_jscvtCheckState; >+ > CachedTempRegister m_dataMemoryTempRegister; > CachedTempRegister m_cachedMemoryTempRegister; > bool m_makeJumpPatchable; >diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h >index e8c859906fee12ed5e1a8906a95fa42738ba01e9..0f733256be0605a1f3faf3769499699977c23c8f 100644 >--- a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h >+++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h >@@ -4188,11 +4188,6 @@ class MacroAssemblerX86Common : public AbstractMacroAssembler<Assembler> { > static CPUID getCPUIDEx(unsigned level, unsigned count); > JS_EXPORT_PRIVATE static void collectCPUFeatures(); > >- enum class CPUIDCheckState { >- NotChecked, >- Clear, >- Set >- }; > JS_EXPORT_PRIVATE static CPUIDCheckState s_sse2CheckState; > JS_EXPORT_PRIVATE static CPUIDCheckState s_sse4_1CheckState; > JS_EXPORT_PRIVATE static CPUIDCheckState s_sse4_2CheckState;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185055
:
338920
| 338970