[pypy-commit] pypy vecopt: simplifications, added a x86_64 sse4 cpu
plan_rich
noreply at buildbot.pypy.org
Mon May 11 15:46:10 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r77291:9363d09e85dc
Date: 2015-05-11 11:08 +0200
http://bitbucket.org/pypy/pypy/changeset/9363d09e85dc/
Log: simplifications, added a x86_64 sse4 cpu
diff --git a/rpython/jit/backend/detect_cpu.py b/rpython/jit/backend/detect_cpu.py
--- a/rpython/jit/backend/detect_cpu.py
+++ b/rpython/jit/backend/detect_cpu.py
@@ -13,6 +13,7 @@
MODEL_X86 = 'x86'
MODEL_X86_NO_SSE2 = 'x86-without-sse2'
MODEL_X86_64 = 'x86-64'
+MODEL_X86_64_SSE4 = 'x86-64-sse4'
MODEL_ARM = 'arm'
MODEL_PPC_64 = 'ppc-64'
# don't use '_' in the model strings; they are replaced by '-'
@@ -69,18 +70,22 @@
raise ProcessorAutodetectError, "unknown machine name %s" % mach
#
if result.startswith('x86'):
+ from rpython.jit.backend.x86 import detect_feature as feature
if sys.maxint == 2**63-1:
result = MODEL_X86_64
+ # has sse 2 at least
+ if feature.detect_sse4_1():
+ result = MODEL_X86_64_SSE4
else:
assert sys.maxint == 2**31-1
- from rpython.jit.backend.x86 import detect_feature
- if detect_feature.detect_sse2():
+ if feature.detect_sse2():
result = MODEL_X86
else:
result = MODEL_X86_NO_SSE2
if detect_feature.detect_x32_mode():
raise ProcessorAutodetectError(
'JITting in x32 mode is not implemented')
+
#
if result.startswith('arm'):
from rpython.jit.backend.arm.detect import detect_float
@@ -108,6 +113,8 @@
return "rpython.jit.backend.x86.runner", "CPU386_NO_SSE2"
elif backend_name == MODEL_X86_64:
return "rpython.jit.backend.x86.runner", "CPU_X86_64"
+ elif backend_name == MODEL_X86_64_SSE4:
+ return "rpython.jit.backend.x86.runner", "CPU_X86_64_SSE4"
elif backend_name == MODEL_ARM:
return "rpython.jit.backend.arm.runner", "CPU_ARM"
else:
diff --git a/rpython/jit/backend/x86/detect_feature.py b/rpython/jit/backend/x86/detect_feature.py
--- a/rpython/jit/backend/x86/detect_feature.py
+++ b/rpython/jit/backend/x86/detect_feature.py
@@ -18,41 +18,32 @@
code = cpu_id(eax=1)
return bool(code & (1<<25)) and bool(code & (1<<26))
-def cpu_id(eax = 1, ret_edx=True, ret_ecx = False):
+def cpu_id(eax = 1, ret_edx = True, ret_ecx = False):
asm = "\xB8" + struct.pack('I', eax) # MOV EAX, $eax
- asm += "\x53" # PUSH EBX
- "\x0F\xA2" # CPUID
- "\x5B" # POP EBX
+ asm += ("\x53" # PUSH EBX
+ "\x0F\xA2" # CPUID
+ "\x5B" # POP EBX
+ )
if ret_edx:
asm += "\x92" # XCHG EAX, EDX
elif ret_ecx:
asm += "\x91" # XCHG EAX, ECX
asm += "\xC3" # RET
- #code = cpu_info("\xB8\x01\x00\x00\x00" # MOV EAX, 1
- # "\x53" # PUSH EBX
- # "\x0F\xA2" # CPUID
- # "\x5B" # POP EBX
- # "\x92" # XCHG EAX, EDX
- # "\xC3" # RET
- # )
return cpu_info(asm)
def detect_sse4_1(code=-1):
- """ use cpu_id_eax_1_ecx() to get code parameter """
if code == -1:
- code = cpu_id(eax=1, ret_edx=False, ret_ecx=False)
+ code = cpu_id(eax=1, ret_edx=False, ret_ecx=True)
return bool(code & (1<<19))
def detect_sse4_2(code=-1):
- """ use cpu_id_eax_1_ecx() to get code parameter """
if code == -1:
- code = cpu_id(eax=1, ret_edx=False, ret_ecx=False)
+ code = cpu_id(eax=1, ret_edx=False, ret_ecx=True)
return bool(code & (1<<20))
def detect_sse4a(code=-1):
- """ use cpu_id_eax_1_ecx() to get code parameter """
if code == -1:
- code = feature.cpu_id(eax=0x80000001, ret_edx=False, ret_ecx=True)
+ code = cpu_id(eax=0x80000001, ret_edx=False, ret_ecx=True)
return bool(code & (1<<20))
def detect_x32_mode():
@@ -67,8 +58,13 @@
if __name__ == '__main__':
if detect_sse2():
- print 'Processor supports sse2.'
- else:
- print 'Missing processor support for sse2.'
+ print 'Processor supports sse2'
+ if detect_sse4_1():
+ print 'Processor supports sse4.1'
+ if detect_sse4_2():
+ print 'Processor supports sse4.2'
+ if detect_sse4a():
+ print 'Processor supports sse4a'
+
if detect_x32_mode():
print 'Process is running in "x32" mode.'
diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -51,16 +51,6 @@
self.profile_agent = profile_agent
- if self.supports_floats and self.supports_longlong:
- # has sse 2 at least
- from rpython.jit.backend.x86 import detect_feature as feature
- if feature.detect_sse4_1():
- self.vector_extension = True
- self.vector_register_size = 16
- self.vector_horizontal_operations = True
- if feature.detect_sse4a():
- self.vector_pack_slots = True
-
def set_debug(self, flag):
return self.assembler.set_debug(flag)
@@ -176,4 +166,9 @@
IS_64_BIT = True
HAS_CODEMAP = True
+class CPU_X86_64_SSE4(CPU_X86_64):
+ vector_extension = True
+ vector_register_size = 16
+ vector_horizontal_operations = True
+
CPU = CPU386
More information about the pypy-commit
mailing list