Mercurial > lcfOS
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 |