|
12725 | 12725 | (b'\x1F\x20\x03\xD5', 'LLIL_NOP()'), # nop, gets optimized from function |
12726 | 12726 | ] |
12727 | 12727 |
|
| 12728 | +# FEAT_CSSC integer min/max and absolute value (lifted to dedicated LLIL ops) |
| 12729 | +tests_cssc = [ |
| 12730 | + # smax w0, w1, w2 |
| 12731 | + (b'\x20\x60\xc2\x1a', 'LLIL_SET_REG.d(w0,LLIL_MAXS.d(LLIL_REG.d(w1),LLIL_REG.d(w2)))'), |
| 12732 | + # smax x0, x1, x2 |
| 12733 | + (b'\x20\x60\xc2\x9a', 'LLIL_SET_REG.q(x0,LLIL_MAXS.q(LLIL_REG.q(x1),LLIL_REG.q(x2)))'), |
| 12734 | + # umax w0, w1, w2 |
| 12735 | + (b'\x20\x64\xc2\x1a', 'LLIL_SET_REG.d(w0,LLIL_MAXU.d(LLIL_REG.d(w1),LLIL_REG.d(w2)))'), |
| 12736 | + # umax x0, x1, x2 |
| 12737 | + (b'\x20\x64\xc2\x9a', 'LLIL_SET_REG.q(x0,LLIL_MAXU.q(LLIL_REG.q(x1),LLIL_REG.q(x2)))'), |
| 12738 | + # smin w0, w1, w2 |
| 12739 | + (b'\x20\x68\xc2\x1a', 'LLIL_SET_REG.d(w0,LLIL_MINS.d(LLIL_REG.d(w1),LLIL_REG.d(w2)))'), |
| 12740 | + # smin x0, x1, x2 |
| 12741 | + (b'\x20\x68\xc2\x9a', 'LLIL_SET_REG.q(x0,LLIL_MINS.q(LLIL_REG.q(x1),LLIL_REG.q(x2)))'), |
| 12742 | + # umin w0, w1, w2 |
| 12743 | + (b'\x20\x6c\xc2\x1a', 'LLIL_SET_REG.d(w0,LLIL_MINU.d(LLIL_REG.d(w1),LLIL_REG.d(w2)))'), |
| 12744 | + # umin x0, x1, x2 |
| 12745 | + (b'\x20\x6c\xc2\x9a', 'LLIL_SET_REG.q(x0,LLIL_MINU.q(LLIL_REG.q(x1),LLIL_REG.q(x2)))'), |
| 12746 | + # abs w0, w1 |
| 12747 | + (b'\x20\x20\xc0\x5a', 'LLIL_SET_REG.d(w0,LLIL_ABS.d(LLIL_REG.d(w1)))'), |
| 12748 | + # abs x0, x1 |
| 12749 | + (b'\x20\x20\xc0\xda', 'LLIL_SET_REG.q(x0,LLIL_ABS.q(LLIL_REG.q(x1)))'), |
| 12750 | + # smax w0, w1, #0x5 |
| 12751 | + (b'\x20\x14\xc0\x11', 'LLIL_SET_REG.d(w0,LLIL_MAXS.d(LLIL_REG.d(w1),LLIL_CONST.d(0x5)))'), |
| 12752 | + # umin w0, w1, #0x7 |
| 12753 | + (b'\x20\x1c\xcc\x11', 'LLIL_SET_REG.d(w0,LLIL_MINU.d(LLIL_REG.d(w1),LLIL_CONST.d(0x7)))'), |
| 12754 | + # ctz w0, w1 |
| 12755 | + (b'\x20\x18\xc0\x5a', 'LLIL_SET_REG.d(w0,LLIL_CTZ.d(LLIL_REG.d(w1)))'), |
| 12756 | + # ctz x0, x1 |
| 12757 | + (b'\x20\x18\xc0\xda', 'LLIL_SET_REG.q(x0,LLIL_CTZ.q(LLIL_REG.q(x1)))'), |
| 12758 | + # cnt w0, w1 (FEAT_CSSC scalar population count) |
| 12759 | + (b'\x20\x1c\xc0\x5a', 'LLIL_SET_REG.d(w0,LLIL_POPCNT.d(LLIL_REG.d(w1)))'), |
| 12760 | + # cnt x0, x1 (FEAT_CSSC scalar population count) |
| 12761 | + (b'\x20\x1c\xc0\xda', 'LLIL_SET_REG.q(x0,LLIL_POPCNT.q(LLIL_REG.q(x1)))'), |
| 12762 | + |
| 12763 | + # Vector/SVE forms of these mnemonics are not FEAT_CSSC scalar ops and must not be lifted |
| 12764 | + # as whole-register scalar operations. The NEON cnt has a per-element intrinsic; the others |
| 12765 | + # have no native scalar representation and are left unimplemented. |
| 12766 | + # cnt v0.8b, v1.8b |
| 12767 | + (b'\x20\x58\x20\x0e', 'LLIL_INTRINSIC([v0],_PopulationCount,[LLIL_REG.o(v1)])'), |
| 12768 | + # cnt v0.16b, v1.16b |
| 12769 | + (b'\x20\x58\x20\x4e', 'LLIL_INTRINSIC([v0],_PopulationCount,[LLIL_REG.o(v1)])'), |
| 12770 | + # abs v0.8b, v1.8b |
| 12771 | + (b'\x20\xb8\x20\x0e', 'LLIL_UNIMPL()'), |
| 12772 | + # abs v0.2d, v1.2d |
| 12773 | + (b'\x20\xb8\xe0\x4e', 'LLIL_UNIMPL()'), |
| 12774 | +] |
| 12775 | + |
12728 | 12776 | test_cases = \ |
| 12777 | + tests_cssc + \ |
12729 | 12778 | tests_shll + \ |
12730 | 12779 | tests_udf + \ |
12731 | 12780 | tests_pac + \ |
|
0 commit comments