Files
2026-03-15 22:20:01 +01:00

96 lines
3.6 KiB
Python

# SPDX-FileCopyrightText: 2021 Rot127 <[email protected]>
#
# SPDX-License-Identifier: LGPL-3.0-only
from bitarray import bitarray
import unittest
from rzhexagon.LLVMImporter import LLVMImporter
from rzhexagon.InstructionEncoding import InstructionEncoding
from rzhexagon.Operand import SparseMask
class TestInstructionEncoding(unittest.TestCase):
def setUp(self) -> None:
self.interface = LLVMImporter(False, test_mode=True, gen_rzil=False, skip_pcpp=True, rzil_compile=False)
self.json = self.interface.hexArch
def test_manual_mask(self) -> None:
self.assertEqual(
"011111000IIIIIIIPPIiiiiiiiiddddd",
InstructionEncoding(self.json["A2_combineii"]["Inst"]).docs_mask,
)
self.assertEqual(
"11110101000sssssPP0ttttt000ddddd",
InstructionEncoding(self.json["A2_combinew"]["Inst"]).docs_mask,
)
self.assertEqual(
"1011iiiiiiisssssPPiiiiiiiiiddddd",
InstructionEncoding(self.json["A2_addi"]["Inst"]).docs_mask,
)
self.assertEqual(
"0000iiiiiiiiiiiiPPiiiiiiiiiiiiii",
InstructionEncoding(self.json["A4_ext"]["Inst"]).docs_mask,
)
def test_bit_masks(self) -> None:
# Initializing a bitarray with a string, it interprets the bit most to the right as the MSB.
# In the manual the MSB is the left most.
# Therefore we reverse the string here.
self.assertEqual(
bitarray("00000000000000000000000000011111"[::-1], endian="little"),
InstructionEncoding(self.json["A2_combineii"]["Inst"]).operand_masks["Rdd32"],
)
self.assertEqual(
bitarray("00000000000000000001111111100000"[::-1], endian="little"),
InstructionEncoding(self.json["A2_combineii"]["Inst"]).operand_masks["Ii"],
)
self.assertEqual(
bitarray("00000000011111110010000000000000"[::-1], endian="little"),
InstructionEncoding(self.json["A2_combineii"]["Inst"]).operand_masks["II"],
)
self.assertEqual(
bitarray("00000000000000000001111100000000"[::-1], endian="little"),
InstructionEncoding(self.json["A2_combinew"]["Inst"]).operand_masks["Rt32"],
)
self.assertEqual(
bitarray("00000000000111110000000000000000"[::-1], endian="little"),
InstructionEncoding(self.json["A2_combinew"]["Inst"]).operand_masks["Rs32"],
)
self.assertEqual(
bitarray("00001111111111110011111111111111"[::-1], endian="little"),
InstructionEncoding(self.json["A4_ext"]["Inst"]).operand_masks["Ii"],
)
def test_get_i_class(self) -> None:
self.assertEqual(
0xD,
InstructionEncoding(self.json["A2_addh_h16_hh"]["Inst"]).get_i_class(),
)
def test_num_representation(self) -> None:
self.assertEqual(
0b1111101000110,
InstructionEncoding(self.json["SL2_return_tnew"]["Inst"]).num_representation,
)
def test_correct_operand_names(self) -> None:
# TODO
pass
def test_shifting_c_code(self) -> None:
self.assertEqual(
"{ 0x8, 5 }",
SparseMask(InstructionEncoding(self.json["A2_combineii"]["Inst"]).operand_masks["Ii"]).c_template,
)
self.assertEqual(
"{ 0x1, 13 }, { 0x7, 16 }",
SparseMask(InstructionEncoding(self.json["A2_combineii"]["Inst"]).operand_masks["II"]).c_template,
)
self.assertEqual(
"{ 0xe, 0 }, { 0xc, 16 }",
SparseMask(InstructionEncoding(self.json["A4_ext"]["Inst"]).operand_masks["Ii"]).c_template,
)