[pypy-svn] pypy default: (David Edelsohn) make the x86 backend no longer emit the XCHG, which implies
cfbolz
commits-noreply at bitbucket.org
Mon Mar 7 21:52:55 CET 2011
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch:
Changeset: r42466:6599d8ca8be1
Date: 2011-03-07 21:51 +0100
http://bitbucket.org/pypy/pypy/changeset/6599d8ca8be1/
Log: (David Edelsohn) make the x86 backend no longer emit the XCHG, which
implies atomic semantics (which is not really needed in our case).
diff --git a/pypy/jit/backend/x86/rx86.py b/pypy/jit/backend/x86/rx86.py
--- a/pypy/jit/backend/x86/rx86.py
+++ b/pypy/jit/backend/x86/rx86.py
@@ -516,8 +516,8 @@
# XXX: Only here for testing purposes..."as" happens the encode the
# registers in the opposite order that we would otherwise do in a
- # register-register exchange
- XCHG_rr = insn(rex_w, '\x87', register(1), register(2,8), '\xC0')
+ # register-register exchange.
+ #XCHG_rr = insn(rex_w, '\x87', register(1), register(2,8), '\xC0')
JMP_l = insn('\xE9', relative(1))
JMP_r = insn(rex_nw, '\xFF', orbyte(4<<3), register(1), '\xC0')
@@ -658,7 +658,7 @@
define_modrm_modes('MOVSD_x*', ['\xF2', rex_nw, '\x0F\x10', register(1,8)], regtype='XMM')
define_modrm_modes('MOVSD_*x', ['\xF2', rex_nw, '\x0F\x11', register(2,8)], regtype='XMM')
-define_modrm_modes('XCHG_r*', [rex_w, '\x87', register(1, 8)])
+#define_modrm_modes('XCHG_r*', [rex_w, '\x87', register(1, 8)])
define_modrm_modes('ADDSD_x*', ['\xF2', rex_nw, '\x0F\x58', register(1, 8)], regtype='XMM')
define_modrm_modes('SUBSD_x*', ['\xF2', rex_nw, '\x0F\x5C', register(1, 8)], regtype='XMM')
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -698,11 +698,9 @@
else:
target = tmp
if inputargs[i].type == REF:
- # This uses XCHG to put zeroes in fail_boxes_ptr after
- # reading them
- self.mc.XOR(target, target)
adr = self.fail_boxes_ptr.get_addr_for_num(i)
- self.mc.XCHG(target, heap(adr))
+ self.mc.MOV(target, heap(adr))
+ self.mc.MOV(heap(adr), imm0)
else:
adr = self.fail_boxes_int.get_addr_for_num(i)
self.mc.MOV(target, heap(adr))
@@ -1908,8 +1906,8 @@
self.mc.MOV(eax, heap(adr))
elif kind == REF:
adr = self.fail_boxes_ptr.get_addr_for_num(0)
- self.mc.XOR_rr(eax.value, eax.value)
- self.mc.XCHG(eax, heap(adr))
+ self.mc.MOV(eax, heap(adr))
+ self.mc.MOV(heap(adr), imm0)
else:
raise AssertionError(kind)
#
diff --git a/pypy/jit/backend/x86/test/test_rx86.py b/pypy/jit/backend/x86/test/test_rx86.py
--- a/pypy/jit/backend/x86/test/test_rx86.py
+++ b/pypy/jit/backend/x86/test/test_rx86.py
@@ -118,11 +118,6 @@
s.SET_ir(5, dl)
assert s.getvalue() == '\x0F\x95\xC2'
-def test_xchg_rj():
- s = CodeBuilder32()
- s.XCHG_rj(edx, 0x01234567)
- assert s.getvalue() == '\x87\x15\x67\x45\x23\x01'
-
def test_movsd_rj():
s = CodeBuilder32()
s.MOVSD_xj(xmm2, 0x01234567)
diff --git a/pypy/jit/backend/x86/regloc.py b/pypy/jit/backend/x86/regloc.py
--- a/pypy/jit/backend/x86/regloc.py
+++ b/pypy/jit/backend/x86/regloc.py
@@ -491,7 +491,9 @@
MOVSX16 = _binaryop('MOVSX16')
MOV32 = _binaryop('MOV32')
MOVSX32 = _binaryop('MOVSX32')
- XCHG = _binaryop('XCHG')
+ # Avoid XCHG because it always implies atomic semantics, which is
+ # slower and does not pair well for dispatch.
+ #XCHG = _binaryop('XCHG')
PUSH = _unaryop('PUSH')
POP = _unaryop('POP')
More information about the Pypy-commit
mailing list