comparison 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
comparison
equal deleted inserted replaced
351:62803b073d11 352:899ae3aea803
62 self.token[20] = 0 # Set flags 62 self.token[20] = 0 # Set flags
63 self.token[21:28] = 0b0011101 63 self.token[21:28] = 0b0011101
64 self.token.cond = AL 64 self.token.cond = AL
65 return self.token.encode() 65 return self.token.encode()
66 66
67 def relocations(self):
68 return []
69
70 def __repr__(self): 67 def __repr__(self):
71 return 'Mov {}, {}'.format(self.reg, self.imm) 68 return 'Mov {}, {}'.format(self.reg, self.imm)
72 69
73 70
74 class Mov2(ArmInstruction): 71 class Mov2(ArmInstruction):
87 self.token.cond = AL 84 self.token.cond = AL
88 return self.token.encode() 85 return self.token.encode()
89 86
90 def __repr__(self): 87 def __repr__(self):
91 return 'MOV {}, {}'.format(self.rd, self.rm) 88 return 'MOV {}, {}'.format(self.rd, self.rm)
89
90
91 def Cmp(*args):
92 if len(args) == 2:
93 if isinstance(args[1], int):
94 return Cmp1(*args)
95 elif isinstance(args[1], ArmRegister):
96 return Cmp2(*args)
97 raise Exception()
98
99
100 class Cmp1(ArmInstruction):
101 """ CMP Rn, imm """
102 def __init__(self, reg, imm):
103 super().__init__()
104 assert type(imm) is int
105 self.reg = reg
106 self.imm = imm
107
108 def encode(self):
109 self.token[0:12] = encode_imm32(self.imm)
110 self.token.Rn = self.reg.num
111 self.token[20:28] = 0b00110101
112 self.token.cond = AL
113 return self.token.encode()
114
115 def __repr__(self):
116 return 'CMP {}, {}'.format(self.reg, self.imm)
117
118
119 class Cmp2(ArmInstruction):
120 """ CMP Rn, Rm """
121 def __init__(self, rn, rm):
122 super().__init__()
123 self.rn = rn
124 self.rm = rm
125
126 def encode(self):
127 self.token.Rn = self.rn.num
128 self.token.Rm = self.rm.num
129 self.token[7:16] = 0
130 self.token[20:28] = 0b10101
131 self.token.cond = AL
132 return self.token.encode()
133
134 def __repr__(self):
135 return 'CMP {}, {}'.format(self.rn, self.rm)
92 136
93 137
94 def Add(*args): 138 def Add(*args):
95 if len(args) == 3 and isinstance(args[0], ArmRegister) and \ 139 if len(args) == 3 and isinstance(args[0], ArmRegister) and \
96 isinstance(args[1], ArmRegister): 140 isinstance(args[1], ArmRegister):
106 if isinstance(args[2], ArmRegister): 150 if isinstance(args[2], ArmRegister):
107 return Sub1(args[0], args[1], args[2]) 151 return Sub1(args[0], args[1], args[2])
108 elif isinstance(args[2], int): 152 elif isinstance(args[2], int):
109 return Sub2(args[0], args[1], args[2]) 153 return Sub2(args[0], args[1], args[2])
110 raise Exception() 154 raise Exception()
155
111 156
112 def Mul(*args): 157 def Mul(*args):
113 return Mul1(args[0], args[1], args[2]) 158 return Mul1(args[0], args[1], args[2])
114 159
115 160
241 cond = LE 286 cond = LE
242 287
243 class Blt(BranchBase): 288 class Blt(BranchBase):
244 cond = LT 289 cond = LT
245 290
291 class Bne(BranchBase):
292 cond = NE
246 293
247 # Memory: 294 # Memory:
248 295
249 def reg_list_to_mask(reg_list): 296 def reg_list_to_mask(reg_list):
250 mask = 0 297 mask = 0