annotate python/ppci/target/arm/instructions.py @ 356:52492b304adf

Added newline to print
author Windel Bouwman
date Fri, 14 Mar 2014 13:02:16 +0100
parents 5477e499b039
children 42343d189e14
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
356
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
232 class And1(OpRegRegReg):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
233 mnemonic = 'AND'
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
234 opcode = 0b0000000
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
235
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
236
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
237 class ShiftBase(ArmInstruction):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
238 """ ? rd, rn, rm """
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
239 def __init__(self, rd, rn, rm):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
240 super().__init__()
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
241 self.rd = rd
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
242 self.rn = rn
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
243 self.rm = rm
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
244
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
245 def encode(self):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
246 self.token[0:4] = self.rn.num
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
247 self.token[4:8] = self.opcode
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
248 self.token[8:12] = self.rm.num
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
249 self.token[12:16] = self.rd.num
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
250 self.token.S = 0 # Set flags
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
251 self.token[21:28] = 0b1101
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
252 self.token.cond = 0xE # Always!
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
253 return self.token.encode()
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
254
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
255 def __repr__(self):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
256 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.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
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
259 class Lsr1(ShiftBase):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
260 mnemonic = 'LSR'
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
261 opcode = 0b0011
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
262
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
263
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
264 class Lsl1(ShiftBase):
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
265 mnemonic = 'LSL'
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
266 opcode = 0b0001
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
267
52492b304adf Added newline to print
Windel Bouwman
parents: 354
diff changeset
268
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
269 class OpRegRegImm(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
270 """ add rd, rn, imm12 """
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
271 def __init__(self, rd, rn, imm):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
272 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
273 self.rd = rd
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
274 self.rn = rn
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
275 self.imm2 = encode_imm32(imm)
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
276 self.imm = imm
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
277
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
278 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
279 self.token[0:12] = self.imm2
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
280 self.token.Rd = self.rd.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
281 self.token.Rn = self.rn.num
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
282 self.token.S = 0 # Set flags
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
283 self.token[21:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
284 self.token.cond = 0xE # Always!
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
285 return self.token.encode()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
286
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
287 def __repr__(self):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
288 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.imm)
345
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
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
291 class Add2(OpRegRegImm):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
292 mnemonic = 'ADD'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
293 opcode = 0b0010100
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
294
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 Sub2(OpRegRegImm):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
297 mnemonic = 'SUB'
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
298 opcode = 0b0010010
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
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 # Branches:
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 BranchBaseRoot(ArmInstruction):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
305 def __init__(self, target):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
306 super().__init__()
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
307 self.target = target
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 def encode(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
310 self.token.cond = self.cond
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
311 self.token[24:28] = self.opcode
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
312 return self.token.encode()
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 def relocations(self):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
315 return [(self.target, 'b_imm24')]
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
316
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
317 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
318 mnemonic = self.__class__.__name__
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
319 return '{} {}'.format(mnemonic, self.target)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
320
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
321
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
322 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
323
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
324 class BranchBase(BranchBaseRoot):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
325 opcode = 0b1010
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 class BranchLinkBase(BranchBaseRoot):
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
328 opcode = 0b1011
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
329
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
330 class Bl(BranchLinkBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
331 cond = AL
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
332
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
333 class B(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
334 cond = AL
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
335
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
336 class Beq(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
337 cond = EQ
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
338
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
339 class Bgt(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
340 cond = GT
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
341
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
342 class Ble(BranchBase):
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
343 cond = LE
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
344
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
345 class Blt(BranchBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
346 cond = LT
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
347
352
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
348 class Bne(BranchBase):
899ae3aea803 First kernel run for vexpressA9
Windel Bouwman
parents: 350
diff changeset
349 cond = NE
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
350
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
351 # Memory:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
352
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
353 def reg_list_to_mask(reg_list):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
354 mask = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
355 for reg in reg_list:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
356 mask |= (1 << reg.num)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
357 return mask
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
358
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
359
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
360 class Push(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
361 def __init__(self, register_set):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
362 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
363 self.reg_list = register_set
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
364
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
365 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
366 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
367 self.token[16:28] = 0b100100101101
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
368 reg_list = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
369 self.token[0:16] = reg_list_to_mask(self.reg_list)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
370 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
371
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
372 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
373 return 'PUSH {}'.format(self.reg_list)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
374
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
375
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
376 class Pop(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] = 0b100010111101
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
384 self.token[0:16] = reg_list_to_mask(self.reg_list)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
385 return self.token.encode()
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
386
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
387 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
388 return 'POP {}'.format(self.reg_list)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
389
345
b4882ff0ed06 Added more arm isa tests
Windel Bouwman
parents: 342
diff changeset
390
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
391 def Ldr(*args):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
392 """ Convenience function that creates the correct instruction """
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
393 if len(args) == 3:
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
394 if isinstance(args[1], ArmRegister):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
395 return Ldr1(*args)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
396 elif len(args) == 2:
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
397 if isinstance(args[1], ArmRegister):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
398 return Ldr1(args[0], args[1], 0)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
399 elif isinstance(args[1], str):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
400 return Ldr3(*args)
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
401 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
402
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
403
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
404 def Str(*args):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
405 if len(args) == 3 and isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
406 return Str1(*args)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
407 elif len(args) == 2 and isinstance(args[1], ArmRegister):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
408 return Str1(args[0], args[1], 0)
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
409 raise Exception()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
410
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
411
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
412 class LdrStrBase(ArmInstruction):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
413 def __init__(self, rt, rn, offset):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
414 super().__init__()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
415 self.rt = rt
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
416 self.rn = rn
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
417 self.offset = offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
418
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
419 def encode(self):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
420 self.token.cond = AL
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
421 self.token.Rn = self.rn.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
422 self.token[25:28] = self.opcode
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
423 self.token[20] = self.bit20
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
424 self.token[12:16] = self.rt.num
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
425 self.token[24] = 1 # Index
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
426 if self.offset >= 0:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
427 self.token[23] = 1 # U == 1 'add'
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
428 self.token[0:12] = self.offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
429 else:
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
430 self.token[23] = 0
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
431 self.token[0:12] = -self.offset
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
432 return self.token.encode()
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
433
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
434 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
435 return '{} {}, [{}, {}]'.format(self.mnemonic, self.rt, self.rn,
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
436 hex(self.offset))
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
437
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
438
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
439 class Str1(LdrStrBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
440 opcode = 0b010
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
441 bit20 = 0
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
442 mnemonic = 'STR'
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
443
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
444
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
445 class Ldr1(LdrStrBase):
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
446 opcode = 0b010
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
447 bit20 = 1
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
448 mnemonic = 'LDR'
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
449
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
450
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
451 class Adr(ArmInstruction):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
452 def __init__(self, rd, label):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
453 super().__init__()
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
454 self.rd = rd
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
455 self.label = label
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
456
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
457 def __repr__(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
458 return 'ADR {}, {}'.format(self.rd, self.label)
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
459
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
460 def relocations(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
461 return [(self.label, 'adr_imm12')]
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
462
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
463 def encode(self):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
464 self.token.cond = AL
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
465 self.token[0:12] = 0 # Filled by linker
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
466 self.token[12:16] = self.rd.num
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
467 self.token[16:20] = 0b1111
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
468 self.token[25] = 1
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
469 return self.token.encode()
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
470
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 353
diff changeset
471
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
472 class Ldr3(ArmInstruction):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
473 """ Load PC relative constant value
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
474 LDR rt, label
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
475 encoding A1
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
476 """
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
477 def __init__(self, rt, label):
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
478 super().__init__()
346
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
479 self.rt = rt
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
480 self.label = label
3bb7dcfe5529 expanded arm target
Windel Bouwman
parents: 345
diff changeset
481
350
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
482 def __repr__(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
483 return 'LDR {}, {}'.format(self.rt, self.label)
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
484
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
485 def relocations(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
486 return [(self.label, 'ldr_imm12')]
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
487
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
488 def encode(self):
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
489 self.token.cond = AL
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
490 self.token[0:12] = 0 # Filled by linker
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
491 self.token[12:16] = self.rt.num
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
492 self.token[16:23] = 0b0011111
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
493 self.token[24:28] = 0b0101
2b02bd286fe9 Fixed A9 hello worle
Windel Bouwman
parents: 346
diff changeset
494 return self.token.encode()