def test_constaddr_constaddr_int(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_INT)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 13, 42)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 13 + 42, 42)) self.assertEqual(vm.offset, size)
def test_regoff_float_regoff_int(self): self.add_opcode() self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 13)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 13.0, 13)) self.assertEqual(vm.offset, size)
def test_regoff_regoff_int(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -12, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iiii', 1, 2, 3, 4)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iiii', 1, 2, 5, 4)) self.assertEqual(vm.offset, size)
def test_regoff_constaddr_float(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<iffi', 1, 2.5, 3.5, 4)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iffi', 1, 2.5, 6.0, 4)) self.assertEqual(vm.offset, size)
def test_positive_int(self): value, = struct.unpack( '>H', Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, 42, Opcodes.ADDR_VALTYPE_INT)) self.assertEqual(value, (Opcodes.ADDR_TYPE_REGOFF << 14) | (Opcodes.REGINDEX_TH << 12) | (Opcodes.ADDR_VALTYPE_INT << 11) | 42)
def test_negative_float(self): value, = struct.unpack( '>H', Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, -42, Opcodes.ADDR_VALTYPE_FLOAT)) self.assertEqual(value, (Opcodes.ADDR_TYPE_REGOFF << 14) | (Opcodes.REGINDEX_TH << 12) | (Opcodes.ADDR_VALTYPE_FLOAT << 11) | (1 << 10) | 42)
def test_not_constaddr_float_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 0.0, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 1.0, 3)) self.assertEqual(vm.offset, size)
def test_push_report_constaddr_int(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iiii', 1, 42, 3, 42)) self.assertEqual(vm.offset, size)
def test_neg_regoff_float(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NEG) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, -2.5, 3)) self.assertEqual(vm.offset, size)
def test_not_regoff_int_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 0, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 1, 3)) self.assertEqual(vm.offset, size)
def test_push_report_regoff_float(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 3)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<ifif', 1, 42.5, 3, 42.5)) self.assertEqual(vm.offset, size)
def test_reg_regoff(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3)) vm.step(Report()) self.assertEqual(vm.SP, 12 + 42) self.assertEqual(vm.offset, size)
def test_reg_int_regoff_float(self): self.add_opcode() self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) vm, size = self.create(stack=struct.pack('<if', 1, 42.5)) vm.step(Report()) self.assertEqual(vm.TH, 42) self.assertEqual(vm.offset, size)
def test_regoff_report_float(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY)) vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3)) vm.step(Report(IMUY=42.5)) self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 2.5 + 42.5, 3)) self.assertEqual(vm.offset, size)
def test_report_regoff(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_INT)) vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3)) report = Report(L2Value=9) vm.step(report) self.assertEqual(report.L2Value, 9 + 42) self.assertEqual(vm.offset, size)
def test_constaddr_report_float(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX)) vm, size = self.create(stack=struct.pack('<if', 1, 2.0)) report = Report(IMUX=42.5) vm.step(report) self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 2.0 + 42.5)) self.assertEqual(vm.offset, size)
def test_constaddr_report_int(self): self.add_opcode(Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_INT)) self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE)) vm, size = self.create(stack=struct.pack('<ii', 1, 2)) report = Report(L2Value=42) vm.step(report) self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 2 + 42)) self.assertEqual(vm.offset, size)
def test_jz_regoff_float_false(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ, variant=Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(struct.pack('<H', 42)) vm, size = self.create(stack=struct.pack('<ifi', 1, 1.0, 1)) ret = vm.step(Report()) self.assertEqual(vm.offset, size) self.assertFalse(ret)
def test_constaddr_C_float(self): self.add_opcode(Opcodes.OPCODE_VARIANT_C) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 9, Opcodes.ADDR_VALTYPE_FLOAT)) self.add(struct.pack('<f', 42.5)) vm, size = self.create(stack=struct.pack('<iibfi', 1, 2, 3, 4.0, 5)) vm.step(Report()) self.assertEqual(vm.get_stack(), struct.pack('<iibfi', 1, 2, 3, 4.0 + 42.5, 5)) self.assertEqual(vm.offset, size)
def test_jz_constaddr_int_true(self): self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ, variant=Opcodes.OPCODE_VARIANT_A) self.add( Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4, Opcodes.ADDR_VALTYPE_INT)) self.add(struct.pack('<H', 42)) vm, size = self.create(stack=struct.pack('<iii', 1, 0, 1)) ret = vm.step(Report()) self.assertEqual(vm.offset, 42) self.assertFalse(ret)
def test_negative_float_str(self): value = Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, -42, Opcodes.ADDR_VALTYPE_FLOAT) self.assertEqual(Opcodes.make_addr_str(value).str, '[%TH-42]f')
def test_positive_int_str(self): value = Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, 42, Opcodes.ADDR_VALTYPE_INT) self.assertEqual(Opcodes.make_addr_str(value).str, '[%TH+42]i')