Skip to content

Commit f4b6faa

Browse files
committed
Bugfix: return all regs for unknown code block
User ASM inline blocks are considered unknown (not optimized) and requires and destroys all registers. Also adds some extra text for other instructions.
1 parent 18c8086 commit f4b6faa

2 files changed

Lines changed: 57 additions & 2 deletions

File tree

arch/zx48k/optimizer/memcell.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def destroys(self):
114114
115115
ret => Destroys SP
116116
"""
117-
if self.asm in backend.ASMS:
117+
if self.code in backend.ASMS:
118118
return helpers.ALL_REGS
119119

120120
res = set([])
@@ -171,7 +171,7 @@ def destroys(self):
171171
def requires(self):
172172
""" Returns the registers, operands, etc. required by an instruction.
173173
"""
174-
if self.asm in backend.ASMS:
174+
if self.code in backend.ASMS:
175175
return helpers.ALL_REGS
176176

177177
if self.inst == '#pragma':

tests/arch/zx48k/backend/test_memcell.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import unittest
44

5+
import arch
56
from arch.zx48k.optimizer import memcell
67

78

@@ -67,3 +68,57 @@ def test_require_ldir(self):
6768
c = memcell.MemCell('ldir', 1)
6869
self.assertSetEqual(c.requires, {'h', 'l', 'd', 'e', 'b', 'c'})
6970
self.assertSetEqual(c.destroys, {'h', 'l', 'd', 'e', 'b', 'c', 'f'})
71+
72+
def test_require_ex_de_hl(self):
73+
""" Test requires of ex de, hl instruction
74+
"""
75+
c = memcell.MemCell('ex de, hl', 1)
76+
self.assertSetEqual(c.requires, {'h', 'l', 'd', 'e'})
77+
self.assertSetEqual(c.destroys, {'h', 'l', 'd', 'e'})
78+
79+
def test_require_add_hl(self):
80+
""" Test requires of add hl, NN instruction
81+
"""
82+
c = memcell.MemCell('add hl, de', 1)
83+
self.assertSetEqual(c.requires, {'h', 'l', 'd', 'e'})
84+
self.assertSetEqual(c.destroys, {'h', 'l', 'f'})
85+
c = memcell.MemCell('add hl, bc', 1)
86+
self.assertSetEqual(c.requires, {'h', 'l', 'b', 'c'})
87+
self.assertSetEqual(c.destroys, {'h', 'l', 'f'})
88+
89+
def test_require_sbc_hl(self):
90+
""" Test requires of add hl, NN instruction
91+
"""
92+
c = memcell.MemCell('sbc hl, de', 1)
93+
self.assertSetEqual(c.requires, {'h', 'l', 'd', 'e', 'f'})
94+
self.assertSetEqual(c.destroys, {'h', 'l', 'f'})
95+
c = memcell.MemCell('sbc hl, bc', 1)
96+
self.assertSetEqual(c.requires, {'h', 'l', 'b', 'c', 'f'})
97+
self.assertSetEqual(c.destroys, {'h', 'l', 'f'})
98+
99+
def test_require_sbc_a_a(self):
100+
""" Test requires of sbc a, a instruction
101+
"""
102+
c = memcell.MemCell('sbc a, a', 1)
103+
self.assertSetEqual(c.requires, {'f'})
104+
self.assertSetEqual(c.destroys, {'a', 'f'})
105+
106+
def test_require_sub_1(self):
107+
""" Test requires of sub 1 instruction
108+
"""
109+
c = memcell.MemCell('sub 1', 1)
110+
self.assertSetEqual(c.requires, {'a'})
111+
self.assertSetEqual(c.destroys, {'a', 'f'})
112+
113+
def test_require_destroys_asm(self):
114+
""" For a user memory block, returns the list of required (ALL)
115+
and destroyed (ALL) registers
116+
"""
117+
arch.zx48k.backend.ASMS['##ASM0'] = ['nop']
118+
c = memcell.MemCell('##ASM0', 1)
119+
self.assertEqual(c.destroys, {'a', 'b', 'c', 'd', 'e', 'f', 'h', 'l', 'ixh', 'ixl', 'iyh', 'iyl',
120+
'r', 'i', 'sp'})
121+
self.assertEqual(c.requires, {'a', 'b', 'c', 'd', 'e', 'f', 'h', 'l', 'ixh', 'ixl', 'iyh', 'iyl',
122+
'r', 'i', 'sp'})
123+
124+
del arch.zx48k.backend.ASMS['##ASM0']

0 commit comments

Comments
 (0)