annotate python/ppci/target/arm/instructions.py @ 354:5477e499b039

Added some sort of string functionality
author Windel Bouwman
date Thu, 13 Mar 2014 18:59:06 +0100
parents b8ad45b3a573
children 52492b304adf
rev   line source
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
1
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
2 from ..basetarget import Instruction
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 def __repr__(self):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
35 return 'DCD {}'.format(hex(self.v))
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
36
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
37
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
38 class Dcd(ConstantData):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
39 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
40 self.token[0:32] = self.v
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
41 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
42
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
43 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
44 return 'DCD {}'.format(hex(self.v))
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
45
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
46
353
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
47 class Db(ConstantData):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
48 def encode(self):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
49 assert self.v < 256
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
50 return bytes([self.v])
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
51
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
52 def __repr__(self):
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
53 return 'DB {}'.format(hex(self.v))
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
54
b8ad45b3a573 Started with strings
Windel Bouwman
parents: 352
diff changeset
55
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
56 def Mov(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
57 if len(args) == 2:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
58 if isinstance(args[1], int):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
59 return Mov1(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
60 elif isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
61 return Mov2(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
62 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
63
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
64
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
65 class Mov1(ArmInstruction):
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
66 """ Mov Rd, imm16 """
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
67 def __init__(self, reg, imm):
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
68 super().__init__()
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
69 assert type(imm) is int
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
70 self.reg = reg
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
71 self.imm = imm
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
72
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
73 def encode(self):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
74 self.token[0:12] = encode_imm32(self.imm)
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
75 self.token.Rd = self.reg.num
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
76 self.token[16:20] = 0
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
77 self.token[20] = 0 # Set flags
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
78 self.token[21:28] = 0b0011101
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
79 self.token.cond = AL
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
80 return self.token.encode()
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
81
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
82 def __repr__(self):
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
83 return 'Mov {}, {}'.format(self.reg, self.imm)
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
84
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
85
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
86 class Mov2(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
87 def __init__(self, rd, rm):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
88 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
89 self.rd = rd
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
90 self.rm = rm
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
91
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
92 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
93 self.token[0:4] = self.rm.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
94 self.token[4:12] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
95 self.token[12:16] = self.rd.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
96 self.token[16:20] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
97 self.token.S = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
98 self.token[21:28] = 0xD
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
99 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
100 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
101
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
102 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
103 return 'MOV {}, {}'.format(self.rd, self.rm)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
104
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
105
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
106 def Cmp(*args):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
107 if len(args) == 2:
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
108 if isinstance(args[1], int):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
109 return Cmp1(*args)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
110 elif isinstance(args[1], ArmRegister):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
111 return Cmp2(*args)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
112 raise Exception()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
113
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
114
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
115 class Cmp1(ArmInstruction):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
116 """ CMP Rn, imm """
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
117 def __init__(self, reg, imm):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
118 super().__init__()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
119 assert type(imm) is int
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
120 self.reg = reg
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
121 self.imm = imm
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
122
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
123 def encode(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
124 self.token[0:12] = encode_imm32(self.imm)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
125 self.token.Rn = self.reg.num
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
126 self.token[20:28] = 0b00110101
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
127 self.token.cond = AL
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
128 return self.token.encode()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
129
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
130 def __repr__(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
131 return 'CMP {}, {}'.format(self.reg, self.imm)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
132
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
133
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
134 class Cmp2(ArmInstruction):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
135 """ CMP Rn, Rm """
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
136 def __init__(self, rn, rm):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
137 super().__init__()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
138 self.rn = rn
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
139 self.rm = rm
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
140
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
141 def encode(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
142 self.token.Rn = self.rn.num
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
143 self.token.Rm = self.rm.num
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
144 self.token[7:16] = 0
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
145 self.token[20:28] = 0b10101
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
146 self.token.cond = AL
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
147 return self.token.encode()
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
148
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
149 def __repr__(self):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
150 return 'CMP {}, {}'.format(self.rn, self.rm)
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
151
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
152
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
153 def Add(*args):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
154 if len(args) == 3 and isinstance(args[0], ArmRegister) and \
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
155 isinstance(args[1], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
156 if isinstance(args[2], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
157 return Add1(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
158 elif isinstance(args[2], int):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
159 return Add2(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
160 raise Exception()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
161
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
162 def Sub(*args):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
163 if len(args) == 3 and isinstance(args[0], ArmRegister) and \
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
164 isinstance(args[1], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
165 if isinstance(args[2], ArmRegister):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
166 return Sub1(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
167 elif isinstance(args[2], int):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
168 return Sub2(args[0], args[1], args[2])
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
169 raise Exception()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
170
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
171
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
172 def Mul(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
173 return Mul1(args[0], args[1], args[2])
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
174
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
175
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
176 class Mul1(ArmInstruction):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
177 def __init__(self, rd, rn, rm):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
178 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
179 self.rd = rd
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
180 self.rn = rn
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
181 self.rm = rm
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
182
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
183 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
184 self.token[0:4] = self.rn.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
185 self.token[4:8] = 0b1001
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
186 self.token[8:12] = self.rm.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
187 self.token[16:20] = self.rd.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
188 self.token.S = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
189 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
190 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
191
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
192
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
193 class OpRegRegReg(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
194 """ add rd, rn, rm """
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
195 def __init__(self, rd, rn, rm, shift=0):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
196 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
197 self.rd = rd
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
198 self.rn = rn
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
199 self.rm = rm
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
200
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
201 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
202 self.token[0:4] = self.rm.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
203 self.token[4] = 0
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
204 self.token[5:7] = 0
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
205 self.token[7:12] = 0 # Shift
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
206 self.token.Rd = self.rd.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
207 self.token.Rn = self.rn.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
208 self.token.S = 0 # Set flags
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
209 self.token[21:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
210 self.token.cond = 0xE # Always!
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
211 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
212
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
213 def __repr__(self):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
214 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.rm)
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
215
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
216
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
217 class Add1(OpRegRegReg):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
218 mnemonic = 'ADD'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
219 opcode = 0b0000100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
220
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
221
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
222 class Sub1(OpRegRegReg):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
223 mnemonic = 'SUB'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
224 opcode = 0b0000010
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
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
227 class Orr1(OpRegRegReg):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
228 mnemonic = 'ORR'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
229 opcode = 0b0001100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
230
342
86b02c98a717 Moved target directory
Windel Bouwman
parents:
diff changeset
231
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
232 class OpRegRegImm(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
233 """ add rd, rn, imm12 """
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
234 def __init__(self, rd, rn, imm):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
235 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
236 self.rd = rd
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
237 self.rn = rn
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
238 self.imm2 = encode_imm32(imm)
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
239 self.imm = imm
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
240
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
241 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
242 self.token[0:12] = self.imm2
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
243 self.token.Rd = self.rd.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
244 self.token.Rn = self.rn.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
245 self.token.S = 0 # Set flags
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
246 self.token[21:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
247 self.token.cond = 0xE # Always!
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
248 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
249
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
250 def __repr__(self):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
251 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.imm)
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
252
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
253
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
254 class Add2(OpRegRegImm):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
255 mnemonic = 'ADD'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
256 opcode = 0b0010100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
257
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
258
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
259 class Sub2(OpRegRegImm):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
260 mnemonic = 'SUB'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
261 opcode = 0b0010010
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
262
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
263
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
264
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
265 # Branches:
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
266
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
267 class BranchBaseRoot(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
268 def __init__(self, target):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
269 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
270 self.target = target
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
271
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
272 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
273 self.token.cond = self.cond
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
274 self.token[24:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
275 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
276
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
277 def relocations(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
278 return [(self.target, 'b_imm24')]
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
279
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
280 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
281 mnemonic = self.__class__.__name__
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
282 return '{} {}'.format(mnemonic, self.target)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
283
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
284
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
285 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
286
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
287 class BranchBase(BranchBaseRoot):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
288 opcode = 0b1010
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
289
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
290 class BranchLinkBase(BranchBaseRoot):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
291 opcode = 0b1011
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
292
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
293 class Bl(BranchLinkBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
294 cond = AL
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
295
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
296 class B(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
297 cond = AL
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
298
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
299 class Beq(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
300 cond = EQ
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
301
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
302 class Bgt(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
303 cond = GT
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
304
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
305 class Ble(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
306 cond = LE
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
307
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
308 class Blt(BranchBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
309 cond = LT
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
310
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
311 class Bne(BranchBase):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
312 cond = NE
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
313
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
314 # Memory:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
315
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
316 def reg_list_to_mask(reg_list):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
317 mask = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
318 for reg in reg_list:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
319 mask |= (1 << reg.num)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
320 return mask
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
321
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
322
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
323 class Push(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
324 def __init__(self, register_set):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
325 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
326 self.reg_list = register_set
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
327
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
328 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
329 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
330 self.token[16:28] = 0b100100101101
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
331 reg_list = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
332 self.token[0:16] = reg_list_to_mask(self.reg_list)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
333 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
334
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
335 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
336 return 'PUSH {}'.format(self.reg_list)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
337
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
338
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
339 class Pop(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
340 def __init__(self, register_set):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
341 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
342 self.reg_list = register_set
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
343
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
344 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
345 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
346 self.token[16:28] = 0b100010111101
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
347 self.token[0:16] = reg_list_to_mask(self.reg_list)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
348 return self.token.encode()
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
349
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
350 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
351 return 'POP {}'.format(self.reg_list)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
352
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
353
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
354 def Ldr(*args):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
355 """ Convenience function that creates the correct instruction """
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
356 if len(args) == 3:
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
357 if isinstance(args[1], ArmRegister):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
358 return Ldr1(*args)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
359 elif len(args) == 2:
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
360 if isinstance(args[1], ArmRegister):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
361 return Ldr1(args[0], args[1], 0)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
362 elif isinstance(args[1], str):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
363 return Ldr3(*args)
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
364 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
365
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
366
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
367 def Str(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
368 if len(args) == 3 and isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
369 return Str1(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
370 elif len(args) == 2 and isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
371 return Str1(args[0], args[1], 0)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
372 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
373
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
374
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
375 class LdrStrBase(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
376 def __init__(self, rt, rn, offset):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
377 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
378 self.rt = rt
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
379 self.rn = rn
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
380 self.offset = offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
381
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
382 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
383 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
384 self.token.Rn = self.rn.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
385 self.token[25:28] = self.opcode
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
386 self.token[20] = self.bit20
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
387 self.token[12:16] = self.rt.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
388 self.token[24] = 1 # Index
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
389 if self.offset >= 0:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
390 self.token[23] = 1 # U == 1 'add'
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
391 self.token[0:12] = self.offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
392 else:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
393 self.token[23] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
394 self.token[0:12] = -self.offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
395 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
396
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
397 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
398 return '{} {}, [{}, {}]'.format(self.mnemonic, self.rt, self.rn,
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
399 hex(self.offset))
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
400
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
401
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
402 class Str1(LdrStrBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
403 opcode = 0b010
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
404 bit20 = 0
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
405 mnemonic = 'STR'
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
406
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
407
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
408 class Ldr1(LdrStrBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
409 opcode = 0b010
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
410 bit20 = 1
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
411 mnemonic = 'LDR'
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
412
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
413
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
414 class Adr(ArmInstruction):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
415 def __init__(self, rd, label):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
416 super().__init__()
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
417 self.rd = rd
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
418 self.label = label
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
419
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
420 def __repr__(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
421 return 'ADR {}, {}'.format(self.rd, self.label)
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
422
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
423 def relocations(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
424 return [(self.label, 'adr_imm12')]
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
425
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
426 def encode(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
427 self.token.cond = AL
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
428 self.token[0:12] = 0 # Filled by linker
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
429 self.token[12:16] = self.rd.num
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
430 self.token[16:20] = 0b1111
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
431 self.token[25] = 1
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
432 return self.token.encode()
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
433
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
434
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
435 class Ldr3(ArmInstruction):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
436 """ Load PC relative constant value
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
437 LDR rt, label
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
438 encoding A1
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
439 """
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
440 def __init__(self, rt, label):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
441 super().__init__()
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
442 self.rt = rt
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
443 self.label = label
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
444
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
445 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
446 return 'LDR {}, {}'.format(self.rt, self.label)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
447
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
448 def relocations(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
449 return [(self.label, 'ldr_imm12')]
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
450
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
451 def encode(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
452 self.token.cond = AL
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
453 self.token[0:12] = 0 # Filled by linker
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
454 self.token[12:16] = self.rt.num
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
455 self.token[16:23] = 0b0011111
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
456 self.token[24:28] = 0b0101
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
457 return self.token.encode()