|  | 
| 34 | 34 | regs_expr = [ExprId(x, 32) for x in regs_str] | 
| 35 | 35 | 
 | 
| 36 | 36 | # Single-Precision | 
| 37 |  | -spregs_str = ['S%d' % r for r in range(0x10)] | 
|  | 37 | +spregs_str = ['S%d' % r for r in range(0x20)] | 
| 38 | 38 | spregs_expr = [ExprId(x, 32) for x in spregs_str] | 
| 39 | 39 | spregs = reg_info(spregs_str, spregs_expr) | 
| 40 | 40 | 
 | 
| @@ -1830,24 +1830,34 @@ class arm_dpregs(reg_noarg): | 
| 1830 | 1830 | 
 | 
| 1831 | 1831 | 
 | 
| 1832 | 1832 |     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) | 
| 1837 | 1841 |             return False | 
|  | 1842 | +        self.value = self.reg_info.expr.index(self.expr) | 
|  | 1843 | +        self.parent.vm1.value = self.value >> 4 & self.parent.vm1.lmask | 
| 1838 | 1844 |         return True | 
| 1839 | 1845 | 
 | 
|  | 1846 | + | 
| 1840 | 1847 | class arm_spregs(reg_noarg): | 
| 1841 | 1848 |     reg_info = spregs | 
| 1842 | 1849 |     parser = reg_info.parser | 
| 1843 | 1850 | 
 | 
| 1844 | 1851 | 
 | 
| 1845 | 1852 |     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 | 
| 1851 | 1861 |         return True | 
| 1852 | 1862 | 
 | 
| 1853 | 1863 | 
 | 
| @@ -3393,20 +3403,20 @@ def check_fbits(self, v): | 
| 3393 | 3403 | 
 | 
| 3394 | 3404 | toarm = bs(l=1, fname="toarm") | 
| 3395 | 3405 | 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") | 
| 3398 | 3408 | vd = bs(l=4, cls=(arm_dpregs, arm_arg)) | 
| 3399 | 3409 | vcvt_d = bs(l=1) | 
| 3400 |  | -vcvt_m = bs(l=1) | 
|  | 3410 | +vm1 = bs(l=1, fname="vm1", order=-1) | 
| 3401 | 3411 | vcvt_op = bs(l=1) | 
| 3402 | 3412 | vcvt_sz = bs(l=1) | 
| 3403 | 3413 | 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]) | 
| 3408 | 3418 | 
 | 
| 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]) | 
| 3410 | 3420 | # 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]) | 
| 3411 | 3421 | 
 | 
| 3412 | 3422 | armtop("ldr",  [bs('111110001101'), rn_deref, rt, off12], [rt, rn_deref]) | 
|  | 
0 commit comments