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

Added some sort of string functionality
author Windel Bouwman
date Thu, 13 Mar 2014 18:59:06 +0100
parents b8ad45b3a573
children 52492b304adf
comparison
equal deleted inserted replaced
353:b8ad45b3a573 354:5477e499b039
171 171
172 def Mul(*args): 172 def Mul(*args):
173 return Mul1(args[0], args[1], args[2]) 173 return Mul1(args[0], args[1], args[2])
174 174
175 175
176 class Mul(ArmInstruction): 176 class Mul1(ArmInstruction):
177 def __init__(self, rd, rn, rm): 177 def __init__(self, rd, rn, rm):
178 super().__init__() 178 super().__init__()
179 self.rd = rd 179 self.rd = rd
180 self.rn = rn 180 self.rn = rn
181 self.rm = rm 181 self.rm = rm
209 self.token[21:28] = self.opcode 209 self.token[21:28] = self.opcode
210 self.token.cond = 0xE # Always! 210 self.token.cond = 0xE # Always!
211 return self.token.encode() 211 return self.token.encode()
212 212
213 def __repr__(self): 213 def __repr__(self):
214 return 'add {}, {}, {}'.format(self.rd, self.rn, self.rm) 214 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.rm)
215 215
216 216
217 class Add1(OpRegRegReg): 217 class Add1(OpRegRegReg):
218 mnemonic = 'ADD'
218 opcode = 0b0000100 219 opcode = 0b0000100
219 220
220 221
221 class Sub1(OpRegRegReg): 222 class Sub1(OpRegRegReg):
223 mnemonic = 'SUB'
222 opcode = 0b0000010 224 opcode = 0b0000010
223 225
224 226
225 class Orr1(OpRegRegReg): 227 class Orr1(OpRegRegReg):
228 mnemonic = 'ORR'
226 opcode = 0b0001100 229 opcode = 0b0001100
227 230
228 231
229 class OpRegRegImm(ArmInstruction): 232 class OpRegRegImm(ArmInstruction):
230 """ add rd, rn, imm12 """ 233 """ add rd, rn, imm12 """
243 self.token[21:28] = self.opcode 246 self.token[21:28] = self.opcode
244 self.token.cond = 0xE # Always! 247 self.token.cond = 0xE # Always!
245 return self.token.encode() 248 return self.token.encode()
246 249
247 def __repr__(self): 250 def __repr__(self):
248 return 'add {}, {}, {}'.format(self.rd, self.rn, self.imm) 251 return '{} {}, {}, {}'.format(self.mnemonic, self.rd, self.rn, self.imm)
249 252
250 253
251 class Add2(OpRegRegImm): 254 class Add2(OpRegRegImm):
255 mnemonic = 'ADD'
252 opcode = 0b0010100 256 opcode = 0b0010100
253 257
254 258
255 class Sub2(OpRegRegImm): 259 class Sub2(OpRegRegImm):
260 mnemonic = 'SUB'
256 opcode = 0b0010010 261 opcode = 0b0010010
257 262
258 263
259 264
260 # Branches: 265 # Branches:
391 396
392 def __repr__(self): 397 def __repr__(self):
393 return '{} {}, [{}, {}]'.format(self.mnemonic, self.rt, self.rn, 398 return '{} {}, [{}, {}]'.format(self.mnemonic, self.rt, self.rn,
394 hex(self.offset)) 399 hex(self.offset))
395 400
401
396 class Str1(LdrStrBase): 402 class Str1(LdrStrBase):
397 opcode = 0b010 403 opcode = 0b010
398 bit20 = 0 404 bit20 = 0
399 mnemonic = 'STR' 405 mnemonic = 'STR'
400 406
401 407
402 class Ldr1(LdrStrBase): 408 class Ldr1(LdrStrBase):
403 opcode = 0b010 409 opcode = 0b010
404 bit20 = 1 410 bit20 = 1
405 mnemonic = 'LDR' 411 mnemonic = 'LDR'
412
413
414 class Adr(ArmInstruction):
415 def __init__(self, rd, label):
416 super().__init__()
417 self.rd = rd
418 self.label = label
419
420 def __repr__(self):
421 return 'ADR {}, {}'.format(self.rd, self.label)
422
423 def relocations(self):
424 return [(self.label, 'adr_imm12')]
425
426 def encode(self):
427 self.token.cond = AL
428 self.token[0:12] = 0 # Filled by linker
429 self.token[12:16] = self.rd.num
430 self.token[16:20] = 0b1111
431 self.token[25] = 1
432 return self.token.encode()
406 433
407 434
408 class Ldr3(ArmInstruction): 435 class Ldr3(ArmInstruction):
409 """ Load PC relative constant value 436 """ Load PC relative constant value
410 LDR rt, label 437 LDR rt, label