about summary refs log tree commit diff stats
path: root/test/arch/mep/ir/test_arithmetic.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/arch/mep/ir/test_arithmetic.py')
-rw-r--r--test/arch/mep/ir/test_arithmetic.py185
1 files changed, 185 insertions, 0 deletions
diff --git a/test/arch/mep/ir/test_arithmetic.py b/test/arch/mep/ir/test_arithmetic.py
new file mode 100644
index 00000000..6da938e9
--- /dev/null
+++ b/test/arch/mep/ir/test_arithmetic.py
@@ -0,0 +1,185 @@
+# Toshiba MeP-c4 - Arithmetic instructions unit tests
+# Guillaume Valadon <guillaume@valadon.net>
+
+from ut_helpers_ir import exec_instruction
+
+from miasm2.expression.expression import ExprId, ExprInt, ExprCond, ExprOp
+
+
+class TestArithmetic:
+
+    def test_add3(self):
+        """Test ADD3 execution"""
+
+        # ADD3 Rl,Rn,Rm
+        exec_instruction("ADD3 R1, R2, R3",
+                         [(ExprId("R2", 32), ExprInt(0x40, 32)), (ExprId("R3", 32), ExprInt(0x2, 32))],
+                         [(ExprId("R1", 32), ExprInt(0x42, 32))])
+
+        # ADD3 Rn,SP,imm7.align4
+        exec_instruction("ADD3 R1, SP, 0x8",
+                         [(ExprId("SP", 32), ExprInt(0x20, 32))],
+                         [(ExprId("R1", 32), ExprInt(0x28, 32))])
+
+        # ADD3 Rn,Rm,imm16
+        exec_instruction("ADD3 R7, R5, -31912",
+                         [(ExprId("R5", 32), ExprInt(0x20, 32))],
+                         [(ExprId("R7", 32), ExprInt(-31880, 32))])
+
+    def test_add(self):
+        """Test ADD execution"""
+
+        # ADD Rn,imm6
+        exec_instruction("ADD R1, 0x10",
+                         [(ExprId("R1", 32), ExprInt(0x32, 32))],
+                         [(ExprId("R1", 32), ExprInt(0x42, 32))])
+
+        exec_instruction("ADD R1, -5",
+                         [(ExprId("R1", 32), ExprInt(0x32, 32))],
+                         [(ExprId("R1", 32), ExprInt(45, 32))])
+
+        exec_instruction("ADD R1, -16",
+                         [(ExprId("R1", 32), ExprInt(0xFFFF, 32))],
+                         [(ExprId("R1", 32), ExprInt(0xFFEF, 32))])
+
+        exec_instruction("ADD R1, -28",
+                         [(ExprId("R1", 32), ExprInt(0, 32))],
+                         [(ExprId("R1", 32), ExprInt(0xFFFFFFE4, 32))])
+
+    def test_advck3(self):
+        """Test ADVCK3 execution"""
+
+        # ADVCK3 R0,Rn,Rm
+        exec_instruction("ADVCK3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(1, 32)),
+                          (ExprId("R2", 32), ExprInt(2, 32))],
+                         [(ExprId("R0", 32), ExprInt(0, 32))])
+
+        exec_instruction("ADVCK3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(1, 32)),
+                          (ExprId("R2", 32), ExprInt(0xFFFFFFFF, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+    def test_sub(self):
+        """Test SUB execution"""
+
+        # SUB Rn,Rm
+        exec_instruction("SUB R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0x28, 32)),
+                          (ExprId("R2", 32), ExprInt(0x7, 32))],
+                         [(ExprId("R1", 32), ExprInt(0x21, 32))])
+
+    def test_sbvck3(self):
+        """Test SBVCK3 execution"""
+
+        # SBVCK3 R0,Rn,Rm
+        exec_instruction("SBVCK3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(2, 32)),
+                          (ExprId("R2", 32), ExprInt(1, 32))],
+                         [(ExprId("R0", 32), ExprCond(ExprOp(">",
+                                                             ExprInt(3, 32),
+                                                             ExprCond(ExprOp(">", ExprInt(0x2, 32), ExprInt(0x1, 32)),
+                                                                      ExprInt(0x2, 32),
+                                                                      ExprInt(0x1, 32))),
+                                                      ExprInt(1, 32),
+                                                      ExprInt(0, 32)))])
+
+        exec_instruction("SBVCK3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0, 32)),
+                          (ExprId("R2", 32), ExprInt(1, 32))],
+                         [(ExprId("R0", 32), ExprCond(ExprOp(">",
+                                                             ExprInt(1, 32),
+                                                             ExprCond(ExprOp(">", ExprInt(0, 32), ExprInt(1, 32)),
+                                                                      ExprInt(0, 32),
+                                                                      ExprInt(1, 32))),
+                                                      ExprInt(1, 32),
+                                                      ExprInt(0, 32)))])
+
+    def test_neg(self):
+        """Test NEG execution"""
+
+        # NEG Rn,Rm
+        exec_instruction("NEG R1, R2",
+                         [(ExprId("R2", 32), ExprInt(1, 32))],
+                         [(ExprId("R1", 32), ExprInt(0xFFFFFFFF, 32))])
+
+        exec_instruction("NEG R1, R2",
+                         [(ExprId("R2", 32), ExprInt(0x42, 32))],
+                         [(ExprId("R1", 32), ExprInt(0xFFFFFFBE, 32))])
+
+    def test_slt3(self):
+        """Test SLT3 execution"""
+
+        # SLT3 R0,Rn,Rm
+        exec_instruction("SLT3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0x2, 32)),
+                          (ExprId("R2", 32), ExprInt(0x1, 32))],
+                         [(ExprId("R0", 32), ExprInt(0, 32))])
+
+        r1 = 0x80000000
+        r2 = 0x80000001
+        exec_instruction("SLT3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(r1, 32)),
+                          (ExprId("R2", 32), ExprInt(r2, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+        r1 = 0x80000000
+        r2 = 0x00000001
+        exec_instruction("SLT3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(r1, 32)),
+                          (ExprId("R2", 32), ExprInt(r2, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+        r1 = 0x00000001
+        r2 = 0x80000000
+        exec_instruction("SLT3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(r1, 32)),
+                          (ExprId("R2", 32), ExprInt(r2, 32))],
+                         [(ExprId("R0", 32), ExprInt(0, 32))])
+
+        # SLT3 R0,Rn,imm5
+        exec_instruction("SLT3 R0, R1, 12",
+                         [(ExprId("R1", 32), ExprInt(0x1, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+        r1 = 0x80000000
+        exec_instruction("SLT3 R0, R1, 12",
+                         [(ExprId("R1", 32), ExprInt(0x80000000, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+    def test_sltu3(self):
+        """Test SLTU3 execution"""
+
+        # SLTU3 R0,Rn,Rm
+        exec_instruction("SLTU3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0x1, 32)),
+                          (ExprId("R2", 32), ExprInt(0x2, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+        exec_instruction("SLTU3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0x2, 32)),
+                          (ExprId("R2", 32), ExprInt(0x1, 32))],
+                         [(ExprId("R0", 32), ExprInt(0, 32))])
+
+        # SLTU3 R0,Rn,imm5
+        exec_instruction("SLTU3 R0, R1, 12",
+                         [(ExprId("R1", 32), ExprInt(0x1, 32))],
+                         [(ExprId("R0", 32), ExprInt(1, 32))])
+
+    def test_sl1ad3(self):
+        """Test SL2AD3 execution"""
+
+        # SL1AD3 R0,Rn,Rm
+        exec_instruction("SL1AD3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0x2, 32)),
+                          (ExprId("R2", 32), ExprInt(0x20, 32))],
+                         [(ExprId("R0", 32), ExprInt(0x24, 32))])
+
+    def test_sl2ad3(self):
+        """Test SL2AD3 execution"""
+
+        # SL2AD3 R0,Rn,Rm
+        exec_instruction("SL2AD3 R0, R1, R2",
+                         [(ExprId("R1", 32), ExprInt(0x2, 32)),
+                          (ExprId("R2", 32), ExprInt(0x20, 32))],
+                         [(ExprId("R0", 32), ExprInt(0x28, 32))])