annotate test/testx86asm.py @ 398:c0d9837acde8

x86 target refactor
author Windel Bouwman
date Thu, 29 May 2014 12:13:37 +0200
parents 3b0c495e3008
children
rev   line source
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
1 #!/usr/bin/python
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
2
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
3 import unittest
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
4 from ppci.target.target_list import x86target
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
5 from testasm import AsmTestCaseBase
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
6 from ppci.outstream import BinaryOutputStream
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
7 from ppci.objectfile import ObjectFile
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
8
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
9
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
10 class AssemblerTestCase(AsmTestCaseBase):
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
11 """
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
12 test methods start with 'test*'
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
13 Checks several assembly constructs agains their bytecodes
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
14 """
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
15 def setUp(self):
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
16 self.target = x86target
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
17 self.obj = ObjectFile()
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
18 self.ostream = BinaryOutputStream(self.obj)
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
19 self.ostream.select_section('code')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
20 self.assembler = self.target.assembler
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
21 self.assembler.prepare()
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
22
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
23 def testX86(self):
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
24 self.feed('mov rax, rbx')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
25 self.feed('xor rcx, rbx')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
26 self.feed('inc rcx')
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
27 self.check('48 89 d8 48 31 d9 48 ff c1')
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
28
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
29 @unittest.skip('not implemented')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
30 def testJumpingAround(self):
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
31 """ Check all kind of assembler cases """
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
32 assert(assembler.shortjump(5) == [0xeb, 0x5])
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
33 assert(assembler.shortjump(-2) == [0xeb, 0xfc])
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
34 assert(assembler.shortjump(10,'GE') == [0x7d, 0xa])
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
35 assert(assembler.nearjump(5) == [0xe9, 0x5,0x0,0x0,0x0])
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
36 assert(assembler.nearjump(-2) == [0xe9, 0xf9, 0xff,0xff,0xff])
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
37 assert(assembler.nearjump(10,'LE') == [0x0f, 0x8e, 0xa,0x0,0x0,0x0])
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
38
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
39 @unittest.skip('not implemented')
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
40 def testCall(self):
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
41 self.feed('call r10')
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
42 self.check('')
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
43 self.feed('call rcx')
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
44 # assert(assembler.call('r10') == [0x41, 0xff, 0xd2])
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
45 # assert(assembler.call('rcx') == [0xff, 0xd1])
287
1c7c1e619be8 File movage
Windel Bouwman
parents: 284
diff changeset
46
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
47 def testXOR(self):
395
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
48 self.feed('xor rax, rax')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
49 self.feed('xor r9, r8')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
50 self.feed('xor rbx, r11')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
51 self.check('48 31 c0 4d 31 c1 4c 31 db')
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
52
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
53 def testINC(self):
395
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
54 self.feed('inc r11')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
55 self.feed('inc rcx')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
56 self.check('49 ff c3 48 ff c1')
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
57
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
58 def testPush(self):
395
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
59 self.feed('push rbp')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
60 self.feed('push rbx')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
61 self.feed('push r12')
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
62 self.check('55 53 41 54')
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
63
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
64 def testPop(self):
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
65 self.feed('pop rbx')
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
66 self.feed('pop rbp')
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
67 self.feed('pop r12')
395
3b0c495e3008 Speed improvements
Windel Bouwman
parents: 292
diff changeset
68 self.check('5b 5d 41 5c')
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
69
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
70 @unittest.skip('not implemented')
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
71 def testAsmLoads(self):
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
72 self.feed('mov rbx, r14')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
73 self.feed('mov r12, r8')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
74 self.feed('mov rdi, rsp')
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
75 self.check('4c 89 f3 4d 89 c4 48 89 e7')
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
76
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
77 @unittest.skip('not implemented')
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
78 def testAsmMemLoads(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
79 assert(assembler.mov('rax', ['r8','r15',0x11]) == [0x4b,0x8b,0x44,0x38,0x11])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
80 assert(assembler.mov('r13', ['rbp','rcx',0x23]) == [0x4c,0x8b,0x6c,0xd,0x23])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
81
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
82 assert(assembler.mov('r9', ['rbp',-0x33]) == [0x4c,0x8b,0x4d,0xcd])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
83 #assert(assembler.movreg64('rbx', ['rax']) == [0x48, 0x8b,0x18])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
84
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
85 assert(assembler.mov('rax', [0xb000]) == [0x48,0x8b,0x4,0x25,0x0,0xb0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
86 assert(assembler.mov('r11', [0xa0]) == [0x4c,0x8b,0x1c,0x25,0xa0,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
87
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
88 assert(assembler.mov('r11', ['RIP', 0xf]) == [0x4c,0x8b,0x1d,0x0f,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
89
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
90 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
91 def testAsmMemStores(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
92 assert(assembler.mov(['rbp', 0x13],'rbx') == [0x48,0x89,0x5d,0x13])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
93 assert(assembler.mov(['r12', 0x12],'r9') == [0x4d,0x89,0x4c,0x24,0x12])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
94 assert(assembler.mov(['rcx', 0x11],'r14') == [0x4c,0x89,0x71,0x11])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
95
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
96
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
97 assert(assembler.mov([0xab], 'rbx') == [0x48,0x89,0x1c,0x25,0xab,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
98 assert(assembler.mov([0xcd], 'r13') == [0x4c,0x89,0x2c,0x25,0xcd,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
99
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
100 assert(assembler.mov(['RIP', 0xf], 'r9') == [0x4c,0x89,0x0d,0x0f,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
101
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
102 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
103 def testAsmMOV8(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
104 assert(assembler.mov(['rbp', -8], 'al') == [0x88, 0x45, 0xf8])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
105 assert(assembler.mov(['r11', 9], 'cl') == [0x41, 0x88, 0x4b, 0x09])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
106
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
107 assert(assembler.mov(['rbx'], 'al') == [0x88, 0x03])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
108 assert(assembler.mov(['r11'], 'dl') == [0x41, 0x88, 0x13])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
109
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
110 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
111 def testAsmLea(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
112 assert(assembler.leareg64('r11', ['RIP', 0xf]) == [0x4c,0x8d,0x1d,0x0f,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
113 assert(assembler.leareg64('rsi', ['RIP', 0x7]) == [0x48,0x8d,0x35,0x07,0x0,0x0,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
114
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
115 assert(assembler.leareg64('rcx', ['rbp', -8]) == [0x48,0x8d,0x4d,0xf8])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
116
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
117 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
118 def testAssemblerCMP(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
119 assert(assembler.cmpreg64('rdi', 'r13') == [0x4c, 0x39, 0xef])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
120 assert(assembler.cmpreg64('rbx', 'r14') == [0x4c, 0x39, 0xf3])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
121 assert(assembler.cmpreg64('r12', 'r9') == [0x4d, 0x39, 0xcc])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
122
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
123 assert(assembler.cmpreg64('rdi', 1) == [0x48, 0x83, 0xff, 0x01])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
124 assert(assembler.cmpreg64('r11', 2) == [0x49, 0x83, 0xfb, 0x02])
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
125
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
126 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
127 def testAssemblerADD(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
128 assert(assembler.addreg64('rbx', 'r13') == [0x4c, 0x01, 0xeb])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
129 assert(assembler.addreg64('rax', 'rbx') == [0x48, 0x01, 0xd8])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
130 assert(assembler.addreg64('r12', 'r13') == [0x4d, 0x01, 0xec])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
131
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
132 assert(assembler.addreg64('rbx', 0x13) == [0x48, 0x83, 0xc3, 0x13])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
133 assert(assembler.addreg64('r11', 0x1234567) == [0x49, 0x81, 0xc3, 0x67, 0x45,0x23,0x1])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
134 assert(assembler.addreg64('rsp', 0x33) == [0x48, 0x83, 0xc4, 0x33])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
135
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
136 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
137 def testAssemblerSUB(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
138 assert(assembler.subreg64('rdx', 'r14') == [0x4c, 0x29, 0xf2])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
139 assert(assembler.subreg64('r15', 'rbx') == [0x49, 0x29, 0xdf])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
140 assert(assembler.subreg64('r8', 'r9') == [0x4d, 0x29, 0xc8])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
141
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
142 assert(assembler.subreg64('rsp', 0x123456) == [0x48, 0x81, 0xec, 0x56,0x34,0x12,0x0])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
143 assert(assembler.subreg64('rsp', 0x12) == [0x48, 0x83, 0xec, 0x12])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
144
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
145 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
146 def testAssemblerIDIV(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
147 assert(assembler.idivreg64('r11') == [0x49, 0xf7, 0xfb])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
148 assert(assembler.idivreg64('rcx') == [0x48, 0xf7, 0xf9])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
149 assert(assembler.idivreg64('rsp') == [0x48, 0xf7, 0xfc])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
150
398
c0d9837acde8 x86 target refactor
Windel Bouwman
parents: 395
diff changeset
151 @unittest.skip
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 287
diff changeset
152 def testAssemblerIMUL(self):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
153 assert(assembler.imulreg64_rax('rdi') == [0x48, 0xf7, 0xef])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
154 assert(assembler.imulreg64_rax('r10') == [0x49, 0xf7, 0xea])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
155 assert(assembler.imulreg64_rax('rdx') == [0x48, 0xf7, 0xea])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
156
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
157 assert(assembler.imulreg64('r11', 'rdi') == [0x4c, 0xf, 0xaf, 0xdf])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
158 assert(assembler.imulreg64('r12', 'rbx') == [0x4c, 0xf, 0xaf, 0xe3])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
159 # nasm generates this machine code: 0x4d, 0x6b, 0xff, 0xee
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
160 # This also works: 4D0FAFFE (another variant?? )
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
161 assert(assembler.imulreg64('r15', 'r14') == [0x4d, 0x0f, 0xaf, 0xfe])
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
162
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
163
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
164 if __name__ == '__main__':
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents:
diff changeset
165 unittest.main()