Skip to content

Commit 4832be2

Browse files
committed
fix vmov
1 parent c2a99f9 commit 4832be2

File tree

3 files changed

+35
-18
lines changed

3 files changed

+35
-18
lines changed

miasm/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0.1.3.dev25

miasm/arch/arm/arch.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
regs_expr = [ExprId(x, 32) for x in regs_str]
3535

3636
# Single-Precision
37-
spregs_str = ['S%d' % r for r in range(0x10)]
37+
spregs_str = ['S%d' % r for r in range(0x20)]
3838
spregs_expr = [ExprId(x, 32) for x in spregs_str]
3939
spregs = reg_info(spregs_str, spregs_expr)
4040

@@ -1830,24 +1830,34 @@ class arm_dpregs(reg_noarg):
18301830

18311831

18321832
def decode(self, v):
1833-
ret = super(arm_dpregs, self).decode(v)
1834-
if ret is False:
1835-
return False
1836-
if self.expr == reg_dum:
1833+
v = v & self.lmask
1834+
v = self.parent.vm1.value << 4 | v
1835+
self.expr = self.reg_info.expr[v]
1836+
return True
1837+
1838+
def encode(self):
1839+
if not self.expr in self.reg_info.expr:
1840+
log.debug("cannot encode reg %r", self.expr)
18371841
return False
1842+
self.value = self.reg_info.expr.index(self.expr)
1843+
self.parent.vm1.value = self.value >> 4 & self.parent.vm1.lmask
18381844
return True
18391845

1846+
18401847
class arm_spregs(reg_noarg):
18411848
reg_info = spregs
18421849
parser = reg_info.parser
18431850

18441851

18451852
def decode(self, v):
1846-
ret = super(arm_spregs, self).decode(v)
1847-
if ret is False:
1848-
return False
1849-
if self.expr == reg_dum:
1850-
return False
1853+
v = v & self.lmask
1854+
v = self.parent.vn1.value | (v << 1)
1855+
self.expr = self.reg_info.expr[v]
1856+
return True
1857+
1858+
def encode(self):
1859+
self.value = self.reg_info.expr.index(self.expr)
1860+
self.parent.vn1.value = self.value & self.parent.vn1.lmask
18511861
return True
18521862

18531863

@@ -3393,20 +3403,20 @@ def check_fbits(self, v):
33933403

33943404
toarm = bs(l=1, fname="toarm")
33953405
vn = bs(l=4, cls=(arm_spregs, arm_arg))
3396-
vmov_n = bs(l=1)
3397-
vmov_op = bs(l=1)
3406+
vn1 = bs(l=1, fname="vn1", order=-1)
3407+
vmov_op = bs(l=1, fname="vmovop")
33983408
vd = bs(l=4, cls=(arm_dpregs, arm_arg))
33993409
vcvt_d = bs(l=1)
3400-
vcvt_m = bs(l=1)
3410+
vm1 = bs(l=1, fname="vm1", order=-1)
34013411
vcvt_op = bs(l=1)
34023412
vcvt_sz = bs(l=1)
34033413
vcvt_opc2 = bs(l=3)
3404-
armtop("vmov", [bs('11101110000'), bs('1'), vn, rt_nopc, bs('1010'), vmov_n, bs('0010000')], [rt_nopc, vn])
3405-
armtop("vmov", [bs('11101110000'), bs('0'), vn, rt_nopc, bs('1010'), vmov_n, bs('0010000')], [vn, rt_nopc])
3406-
armtop("vmov", [bs('11101100010'), bs('1'), rt2_nopc, rt_nopc, bs('101100'), vcvt_m, bs('1'), vd], [rt_nopc, rt2_nopc, vd])
3407-
armtop("vmov", [bs('11101100010'), bs('0'), rt2_nopc, rt_nopc, bs('101100'), vcvt_m, bs('1'), vd], [vd, rt_nopc, rt2_nopc])
3414+
armtop("vmov", [bs('11101110000'), bs('1'), vn, rt_nopc, bs('1010'), vn1, bs('0010000')], [rt_nopc, vn])
3415+
armtop("vmov", [bs('11101110000'), bs('0'), vn, rt_nopc, bs('1010'), vn1, bs('0010000')], [vn, rt_nopc])
3416+
armtop("vmov", [bs('11101100010'), bs('1'), rt2_nopc, rt_nopc, bs('101100'), vm1, bs('1'), vd], [rt_nopc, rt2_nopc, vd])
3417+
armtop("vmov", [bs('11101100010'), bs('0'), rt2_nopc, rt_nopc, bs('101100'), vm1, bs('1'), vd], [vd, rt_nopc, rt2_nopc])
34083418

3409-
armtop("vcvt", [bs('111011101'), vcvt_d, bs('111'), vcvt_opc2, vd, bs('101'), vcvt_sz, vcvt_op, bs('1'), vcvt_m, bs('0'), vn], [vd, vn])
3419+
# armtop("vcvt", [bs('111011101'), vcvt_d, bs('111'), vcvt_opc2, vd, bs('101'), vcvt_sz, vcvt_op, bs('1'), vcvt_m, bs('0'), vn], [vd, vn])
34103420
# armtop("vcvt", [bs('111011101'), vcvt_d, bs('111'), vcvt_opc2, vd, bs('101'), vcvt_sz, vcvt_op, bs('1'), vcvt_m, bs('0'), vn], [vd, vn])
34113421

34123422
armtop("ldr", [bs('111110001101'), rn_deref, rt, off12], [rt, rn_deref])

test/arch/arm/arch.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,12 @@ def u16swap(i):
732732

733733
("xxxxxxxx ADD R0, SP, 0x714",
734734
"0DF21470"),
735+
736+
("xxxxxxxx VMOV S0, R0",
737+
"00EE100A"),
738+
739+
("xxxxxxxx VMOV R2, R3, D0",
740+
"53EC102B")
735741
]
736742
print("#" * 40, 'armthumb', '#' * 40)
737743

0 commit comments

Comments
 (0)