annotate python/ppci/target/arm/instructions.py @ 352:899ae3aea803

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