Skip to content

Commit 764a219

Browse files
committed
Detect in/out reg dependencies
For in/out the b register is also involved in Z80, as it's used to address a 16 bit port.
1 parent 206f13d commit 764a219

2 files changed

Lines changed: 26 additions & 4 deletions

File tree

arch/zx48k/optimizer/memcell.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,12 @@ def requires(self):
295295

296296
elif i == 'out':
297297
result.add(o[1])
298-
if o[0] == '(c)':
299-
result.add('c')
298+
if o[0] == 'c':
299+
result.update('b', 'c')
300300

301301
elif i == 'in':
302-
if o[1] == '(c)':
303-
result.add('c')
302+
if o[1] == 'c':
303+
result.update('b', 'c')
304304

305305
elif i == 'im':
306306
result.add('i')

tests/arch/zx48k/backend/test_memcell.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,25 @@ def test_requires_xor_a(self):
129129
c = memcell.MemCell('xor a', 1)
130130
self.assertSetEqual(c.requires, set())
131131
self.assertSetEqual(c.destroys, {'a', 'f'})
132+
133+
def test_require_out(self):
134+
""" Test requires for out(c), a instruction
135+
"""
136+
c = memcell.MemCell('out (c), a', 1)
137+
self.assertSetEqual(c.requires, {'a', 'b', 'c'})
138+
self.assertSetEqual(c.destroys, set())
139+
140+
c = memcell.MemCell('out (c), d', 1)
141+
self.assertSetEqual(c.requires, {'d', 'b', 'c'})
142+
self.assertSetEqual(c.destroys, set())
143+
144+
def test_require_in(self):
145+
""" Test requires for out(c), a instruction
146+
"""
147+
c = memcell.MemCell('in a, (c)', 1)
148+
self.assertSetEqual(c.requires, {'b', 'c'})
149+
self.assertSetEqual(c.destroys, {'a'})
150+
151+
c = memcell.MemCell('in d, (c)', 1)
152+
self.assertSetEqual(c.requires, {'b', 'c'})
153+
self.assertSetEqual(c.destroys, {'d'})

0 commit comments

Comments
 (0)