annotate python/ppci/target/arm/instructions.py @ 364:c49459768aaa

Work on globals
author Windel Bouwman
date Wed, 19 Mar 2014 20:24:03 +0100
parents c05ab629976a
children 98ff43cfdd36
rev   line source
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
1
364
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
2 from ..basetarget import Instruction, LabelAddress
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
3 from ...bitfun import rotate_left
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
4
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
5 from .token import ArmToken
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
6 from .registers import R0, SP, ArmRegister
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
7
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
8
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
9 def encode_imm32(v):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
10 """ Bundle 32 bit value into 4 bits rotation and 8 bits value
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
11 """
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
12 for i in range(0, 16):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
13 v2 = rotate_left(v, i*2)
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
14 if (v2 & 0xFFFFFF00) == 0:
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
15 rotation = i
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
16 val = v2 & 0xFF
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
17 x = (rotation << 8) | val
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
18 return x
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
19 raise Exception("Invalid value {}".format(v))
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
20
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
21 # Instructions:
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
22
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
23 class ArmInstruction(Instruction):
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
24 def __init__(self):
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
25 self.token = ArmToken()
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
26
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
27
353
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
28 class ConstantData(ArmInstruction):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
29 def __init__(self, v):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
30 super().__init__()
353
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
31 assert isinstance(v, int)
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
32 self.v = v
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
33
353
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
34
364
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
35 class Dcd(ArmInstruction):
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
36 def __init__(self, v):
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
37 super().__init__()
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
38 assert isinstance(v, int) or isinstance(v, LabelAddress)
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
39 self.v = v
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
40
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
41 def encode(self):
364
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
42 if type(self.v) is int:
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
43 self.token[0:32] = self.v
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
44 else:
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
45 self.token[0:32] = 0
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
46 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
47
364
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
48 def relocations(self):
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
49 if type(self.v) is LabelAddress:
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
50 return [(self.v.name, 'absaddr32')]
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
51 return []
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
52
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
53 def __repr__(self):
364
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
54 if type(self.v) is int:
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
55 return 'DCD {}'.format(hex(self.v))
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
56 else:
c49459768aaa Work on globals
Windel Bouwman
parents: 362
diff changeset
57 return 'DCD ={}'.format(self.v.name)
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
58
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
59
353
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
60 class Db(ConstantData):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
61 def encode(self):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
62 assert self.v < 256
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
63 return bytes([self.v])
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
64
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
65 def __repr__(self):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
66 return 'DB {}'.format(hex(self.v))
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
67
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
68
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
69 def Mov(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
70 if len(args) == 2:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
71 if isinstance(args[1], int):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
72 return Mov1(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
73 elif isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
74 return Mov2(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
75 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
76
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
77
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
78 class Mov1(ArmInstruction):
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
79 """ Mov Rd, imm16 """
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
80 def __init__(self, reg, imm):
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
81 super().__init__()
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
82 assert type(imm) is int
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
83 self.reg = reg
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
84 self.imm = imm
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
85
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
86 def encode(self):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
87 self.token[0:12] = encode_imm32(self.imm)
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
88 self.token.Rd = self.reg.num
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
89 self.token[16:20] = 0
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
90 self.token[20] = 0 # Set flags
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
91 self.token[21:28] = 0b0011101
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
92 self.token.cond = AL
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
93 return self.token.encode()
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
94
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
95 def __repr__(self):
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
96 return 'Mov {}, {}'.format(self.reg, self.imm)
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
97
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
98
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
99 class Mov2(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
100 def __init__(self, rd, rm):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
101 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
102 self.rd = rd
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
103 self.rm = rm
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
104
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
105 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
106 self.token[0:4] = self.rm.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
107 self.token[4:12] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
108 self.token[12:16] = self.rd.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
109 self.token[16:20] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
110 self.token.S = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
111 self.token[21:28] = 0xD
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
112 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
113 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
114
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
115 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
116 return 'MOV {}, {}'.format(self.rd, self.rm)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
117
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
118
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
119 def Cmp(*args):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
120 if len(args) == 2:
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
121 if isinstance(args[1], int):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
122 return Cmp1(*args)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
123 elif isinstance(args[1], ArmRegister):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
124 return Cmp2(*args)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
125 raise Exception()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
126
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
127
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
128 class Cmp1(ArmInstruction):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
129 """ CMP Rn, imm """
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
130 def __init__(self, reg, imm):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
131 super().__init__()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
132 assert type(imm) is int
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
133 self.reg = reg
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
134 self.imm = imm
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
135
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
136 def encode(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
137 self.token[0:12] = encode_imm32(self.imm)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
138 self.token.Rn = self.reg.num
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
139 self.token[20:28] = 0b00110101
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
140 self.token.cond = AL
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
141 return self.token.encode()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
142
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
143 def __repr__(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
144 return 'CMP {}, {}'.format(self.reg, self.imm)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
145
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
146
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
147 class Cmp2(ArmInstruction):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
148 """ CMP Rn, Rm """
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
149 def __init__(self, rn, rm):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
150 super().__init__()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
151 self.rn = rn
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
152 self.rm = rm
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
153
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
154 def encode(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
155 self.token.Rn = self.rn.num
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
156 self.token.Rm = self.rm.num
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
157 self.token[7:16] = 0
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
158 self.token[20:28] = 0b10101
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
159 self.token.cond = AL
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
160 return self.token.encode()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
161
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
162 def __repr__(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
163 return 'CMP {}, {}'.format(self.rn, self.rm)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
164
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
165
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
166 def Add(*args):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
167 if len(args) == 3 and isinstance(args[0], ArmRegister) and \
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
168 isinstance(args[1], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
169 if isinstance(args[2], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
170 return Add1(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
171 elif isinstance(args[2], int):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
172 return Add2(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
173 raise Exception()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
174
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
175 def Sub(*args):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
176 if len(args) == 3 and isinstance(args[0], ArmRegister) and \
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
177 isinstance(args[1], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
178 if isinstance(args[2], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
179 return Sub1(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
180 elif isinstance(args[2], int):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
181 return Sub2(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
182 raise Exception()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
183
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
184
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
185 def Mul(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
186 return Mul1(args[0], args[1], args[2])
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
187
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
188
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
189 class Mul1(ArmInstruction):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
190 def __init__(self, rd, rn, rm):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
191 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
192 self.rd = rd
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
193 self.rn = rn
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
194 self.rm = rm
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
195
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
196 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
197 self.token[0:4] = self.rn.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
198 self.token[4:8] = 0b1001
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
199 self.token[8:12] = self.rm.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
200 self.token[16:20] = self.rd.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
201 self.token.S = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
202 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
203 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
204
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
205
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
206 class OpRegRegReg(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
207 """ add rd, rn, rm """
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
208 def __init__(self, rd, rn, rm, shift=0):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
209 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
210 self.rd = rd
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
211 self.rn = rn
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
212 self.rm = rm
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
213
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
214 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
215 self.token[0:4] = self.rm.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
216 self.token[4] = 0
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
217 self.token[5:7] = 0
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
218 self.token[7:12] = 0 # Shift
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
219 self.token.Rd = self.rd.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
220 self.token.Rn = self.rn.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
221 self.token.S = 0 # Set flags
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
222 self.token[21:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
223 self.token.cond = 0xE # Always!
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
224 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
225
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
226 def __repr__(self):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
227 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.rm)
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
228
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
229
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
230 class Add1(OpRegRegReg):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
231 mnemonic = 'ADD'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
232 opcode = 0b0000100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
233
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
234
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
235 class Sub1(OpRegRegReg):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
236 mnemonic = 'SUB'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
237 opcode = 0b0000010
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
238
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
239
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
240 class Orr1(OpRegRegReg):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
241 mnemonic = 'ORR'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
242 opcode = 0b0001100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
243
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
244
356
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
245 class And1(OpRegRegReg):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
246 mnemonic = 'AND'
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
247 opcode = 0b0000000
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
248
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
249
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
250 class ShiftBase(ArmInstruction):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
251 """ ? rd, rn, rm """
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
252 def __init__(self, rd, rn, rm):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
253 super().__init__()
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
254 self.rd = rd
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
255 self.rn = rn
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
256 self.rm = rm
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
257
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
258 def encode(self):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
259 self.token[0:4] = self.rn.num
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
260 self.token[4:8] = self.opcode
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
261 self.token[8:12] = self.rm.num
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
262 self.token[12:16] = self.rd.num
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
263 self.token.S = 0 # Set flags
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
264 self.token[21:28] = 0b1101
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
265 self.token.cond = 0xE # Always!
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
266 return self.token.encode()
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
267
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
268 def __repr__(self):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
269 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.rm)
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
270
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
271
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
272 class Lsr1(ShiftBase):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
273 mnemonic = 'LSR'
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
274 opcode = 0b0011
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
275
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
276
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
277 class Lsl1(ShiftBase):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
278 mnemonic = 'LSL'
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
279 opcode = 0b0001
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
280
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
281
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
282 class OpRegRegImm(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
283 """ add rd, rn, imm12 """
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
284 def __init__(self, rd, rn, imm):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
285 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
286 self.rd = rd
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
287 self.rn = rn
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
288 self.imm2 = encode_imm32(imm)
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
289 self.imm = imm
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
290
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
291 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
292 self.token[0:12] = self.imm2
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
293 self.token.Rd = self.rd.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
294 self.token.Rn = self.rn.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
295 self.token.S = 0 # Set flags
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
296 self.token[21:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
297 self.token.cond = 0xE # Always!
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
298 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
299
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
300 def __repr__(self):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
301 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.imm)
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
302
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
303
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
304 class Add2(OpRegRegImm):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
305 mnemonic = 'ADD'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
306 opcode = 0b0010100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
307
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
308
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
309 class Sub2(OpRegRegImm):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
310 mnemonic = 'SUB'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
311 opcode = 0b0010010
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
312
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
313
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
314
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
315 # Branches:
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
316
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
317 class BranchBaseRoot(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
318 def __init__(self, target):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
319 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
320 self.target = target
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
321
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
322 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
323 self.token.cond = self.cond
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
324 self.token[24:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
325 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
326
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
327 def relocations(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
328 return [(self.target, 'b_imm24')]
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
329
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
330 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
331 mnemonic = self.__class__.__name__
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
332 return '{} {}'.format(mnemonic, self.target)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
333
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
334
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
335 EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL = range(15)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
336
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
337 class BranchBase(BranchBaseRoot):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
338 opcode = 0b1010
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
339
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
340 class BranchLinkBase(BranchBaseRoot):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
341 opcode = 0b1011
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
342
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
343 class Bl(BranchLinkBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
344 cond = AL
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
346 class B(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
347 cond = AL
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
348
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
349 class Beq(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
350 cond = EQ
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
351
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
352 class Bgt(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
353 cond = GT
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
354
360
42343d189e14 Bugfix in for loop
Windel Bouwman
parents: 356
diff changeset
355 class Bge(BranchBase):
42343d189e14 Bugfix in for loop
Windel Bouwman
parents: 356
diff changeset
356 cond = GE
42343d189e14 Bugfix in for loop
Windel Bouwman
parents: 356
diff changeset
357
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
358 class Ble(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
359 cond = LE
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
360
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
361 class Blt(BranchBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
362 cond = LT
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
363
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
364 class Bne(BranchBase):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
365 cond = NE
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
366
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
367 # Memory:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
368
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
369 def reg_list_to_mask(reg_list):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
370 mask = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
371 for reg in reg_list:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
372 mask |= (1 << reg.num)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
373 return mask
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
374
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
375
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
376 class Push(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
377 def __init__(self, register_set):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
378 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
379 self.reg_list = register_set
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
380
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
381 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
382 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
383 self.token[16:28] = 0b100100101101
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
384 reg_list = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
385 self.token[0:16] = reg_list_to_mask(self.reg_list)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
386 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
387
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
388 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
389 return 'PUSH {}'.format(self.reg_list)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
390
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
391
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
392 class Pop(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
393 def __init__(self, register_set):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
394 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
395 self.reg_list = register_set
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
396
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
397 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
398 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
399 self.token[16:28] = 0b100010111101
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
400 self.token[0:16] = reg_list_to_mask(self.reg_list)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
401 return self.token.encode()
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
402
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
403 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
404 return 'POP {}'.format(self.reg_list)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
405
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
406
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
407 def Ldr(*args):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
408 """ Convenience function that creates the correct instruction """
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
409 if len(args) == 3:
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
410 if isinstance(args[1], ArmRegister):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
411 return Ldr1(*args)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
412 elif len(args) == 2:
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
413 if isinstance(args[1], ArmRegister):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
414 return Ldr1(args[0], args[1], 0)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
415 elif isinstance(args[1], str):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
416 return Ldr3(*args)
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
417 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
418
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
419
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
420 def Str(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
421 if len(args) == 3 and isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
422 return Str1(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
423 elif len(args) == 2 and isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
424 return Str1(args[0], args[1], 0)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
425 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
426
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
427
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
428 class LdrStrBase(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
429 def __init__(self, rt, rn, offset):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
430 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
431 self.rt = rt
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
432 self.rn = rn
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
433 self.offset = offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
434
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
435 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
436 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
437 self.token.Rn = self.rn.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
438 self.token[25:28] = self.opcode
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
439 self.token[20] = self.bit20
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
440 self.token[12:16] = self.rt.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
441 self.token[24] = 1 # Index
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
442 if self.offset >= 0:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
443 self.token[23] = 1 # U == 1 'add'
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
444 self.token[0:12] = self.offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
445 else:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
446 self.token[23] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
447 self.token[0:12] = -self.offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
448 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
449
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
450 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
451 return '{} {}, [{}, {}]'.format(self.mnemonic, self.rt, self.rn,
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
452 hex(self.offset))
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
453
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
454
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
455 class Str1(LdrStrBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
456 opcode = 0b010
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
457 bit20 = 0
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
458 mnemonic = 'STR'
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
459
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
460
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
461 class Ldr1(LdrStrBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
462 opcode = 0b010
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
463 bit20 = 1
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
464 mnemonic = 'LDR'
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
465
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
466
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
467 class Adr(ArmInstruction):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
468 def __init__(self, rd, label):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
469 super().__init__()
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
470 self.rd = rd
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
471 self.label = label
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
472
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
473 def __repr__(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
474 return 'ADR {}, {}'.format(self.rd, self.label)
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
475
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
476 def relocations(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
477 return [(self.label, 'adr_imm12')]
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
478
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
479 def encode(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
480 self.token.cond = AL
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
481 self.token[0:12] = 0 # Filled by linker
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
482 self.token[12:16] = self.rd.num
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
483 self.token[16:20] = 0b1111
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
484 self.token[25] = 1
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
485 return self.token.encode()
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
486
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
487
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
488 class Ldr3(ArmInstruction):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
489 """ Load PC relative constant value
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
490 LDR rt, label
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
491 encoding A1
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
492 """
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
493 def __init__(self, rt, label):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
494 super().__init__()
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
495 self.rt = rt
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
496 self.label = label
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
497
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
498 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
499 return 'LDR {}, {}'.format(self.rt, self.label)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
500
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
501 def relocations(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
502 return [(self.label, 'ldr_imm12')]
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
503
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
504 def encode(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
505 self.token.cond = AL
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
506 self.token[0:12] = 0 # Filled by linker
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
507 self.token[12:16] = self.rt.num
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
508 self.token[16:23] = 0b0011111
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
509 self.token[24:28] = 0b0101
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
510 return self.token.encode()
362
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
511
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
512
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
513 class McrBase(ArmInstruction):
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
514 """ Mov arm register to coprocessor register """
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
515 def __init__(self, coproc, opc1, rt, crn, crm, opc2):
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
516 super().__init__()
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
517 self.coproc = coproc
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
518 self.opc1 = opc1
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
519 self.rt = rt
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
520 self.crn = crn
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
521 self.crm = crm
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
522 self.opc2 = opc2
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
523
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
524 def encode(self):
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
525 self.token[0:4] = self.crm
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
526 self.token[4] = 1
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
527 self.token[5:8] = self.opc2
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
528 self.token[8:12] = self.coproc
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
529 self.token[12:16] = self.rt.num
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
530 self.token[16:20] = self.crn
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
531 self.token[20] = self.b20
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
532 self.token[21:24] = self.opc1
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
533 self.token[24:28] = 0b1110
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
534 self.token.cond = AL
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
535 return self.token.encode()
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
536
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
537
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
538 class Mcr(McrBase):
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
539 b20 = 0
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
540
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
541
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
542 class Mrc(McrBase):
c05ab629976a Added CPUID for arm
Windel Bouwman
parents: 360
diff changeset
543 b20 = 1