OLD | NEW |
---|---|
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
183 *m = code_ & 0x1; | 183 *m = code_ & 0x1; |
184 *vm = code_ >> 1; | 184 *vm = code_ >> 1; |
185 } | 185 } |
186 | 186 |
187 int code_; | 187 int code_; |
188 }; | 188 }; |
189 | 189 |
190 | 190 |
191 // Double word VFP register. | 191 // Double word VFP register. |
192 struct DwVfpRegister { | 192 struct DwVfpRegister { |
193 static const int kNumRegisters = 16; | 193 static const int kNumRegisters = 32; // XXX |
194 // A few double registers are reserved: one as a scratch register and one to | 194 // A few double registers are reserved: one as a scratch register and one to |
195 // hold 0.0, that does not fit in the immediate field of vmov instructions. | 195 // hold 0.0, that does not fit in the immediate field of vmov instructions. |
196 // d14: 0.0 | 196 // d14: 0.0 |
197 // d15: scratch register. | 197 // d15: scratch register. |
198 static const int kNumReservedRegisters = 2; | 198 static const int kNumReservedRegisters = 2; |
199 static const int kNumAllocatableRegisters = kNumRegisters - | 199 static int NumAvailableRegisters() { |
200 kNumReservedRegisters; | 200 return 32; // XXX: 16 or 32, detected at runtime. |
201 } | |
202 static int NumAllocatableRegisters() { | |
203 return NumAvailableRegisters() - kNumReservedRegisters; | |
204 } | |
205 static DwVfpRegister FirstCalleeSavedReg() { return from_code(8); } | |
206 static DwVfpRegister LastCalleeSavedReg() { | |
207 return from_code(NumAvailableRegisters() - 1); | |
Rodolph Perfetta
2012/12/04 14:08:40
last callee saved register is d15 even if you have
hans
2012/12/04 14:30:54
Done.
| |
208 } | |
209 static DwVfpRegister ZeroReg() { | |
210 return from_code(14); | |
211 } | |
212 static DwVfpRegister ScratchReg() { | |
213 return from_code(15); | |
214 } | |
215 static int NumCalleeSaved() { | |
216 return LastCalleeSavedReg().code() - FirstCalleeSavedReg().code() + 1; | |
217 } | |
201 | 218 |
202 inline static int ToAllocationIndex(DwVfpRegister reg); | 219 inline static int ToAllocationIndex(DwVfpRegister reg); |
203 | 220 |
204 static DwVfpRegister FromAllocationIndex(int index) { | 221 static DwVfpRegister FromAllocationIndex(int index) { |
205 ASSERT(index >= 0 && index < kNumAllocatableRegisters); | 222 ASSERT(index >= 0 && index < NumAllocatableRegisters()); |
206 return from_code(index); | 223 if (index < ZeroReg().code()) |
224 return from_code(index); | |
225 return from_code(index + kNumReservedRegisters); | |
207 } | 226 } |
208 | 227 |
209 static const char* AllocationIndexToString(int index) { | 228 static const char* AllocationIndexToString(int index) { |
210 ASSERT(index >= 0 && index < kNumAllocatableRegisters); | 229 ASSERT(index >= 0 && index < NumAllocatableRegisters()); |
230 if (index > ZeroReg().code()) | |
Rodolph Perfetta
2012/12/04 14:08:40
>= otherwise index 14 maps to d14 which is zero.
hans
2012/12/04 14:30:54
oops. done.
| |
231 index += kNumReservedRegisters; | |
211 const char* const names[] = { | 232 const char* const names[] = { |
212 "d0", | 233 "d0", |
213 "d1", | 234 "d1", |
214 "d2", | 235 "d2", |
215 "d3", | 236 "d3", |
216 "d4", | 237 "d4", |
217 "d5", | 238 "d5", |
218 "d6", | 239 "d6", |
219 "d7", | 240 "d7", |
220 "d8", | 241 "d8", |
221 "d9", | 242 "d9", |
222 "d10", | 243 "d10", |
223 "d11", | 244 "d11", |
224 "d12", | 245 "d12", |
225 "d13" | 246 "d13", |
247 "d14", | |
248 "d15", | |
249 "d16", | |
250 "d17", | |
251 "d18", | |
252 "d19", | |
253 "d20", | |
254 "d21", | |
255 "d22", | |
256 "d23", | |
257 "d24", | |
258 "d25", | |
259 "d26", | |
260 "d27", | |
261 "d28", | |
262 "d29", | |
263 "d30", | |
264 "d31" | |
226 }; | 265 }; |
227 return names[index]; | 266 return names[index]; |
228 } | 267 } |
229 | 268 |
230 static DwVfpRegister from_code(int code) { | 269 static DwVfpRegister from_code(int code) { |
231 DwVfpRegister r = { code }; | 270 DwVfpRegister r = { code }; |
232 return r; | 271 return r; |
233 } | 272 } |
234 | 273 |
235 // Supporting d0 to d15, can be later extended to d31. | 274 bool is_valid() const { |
236 bool is_valid() const { return 0 <= code_ && code_ < 16; } | 275 return 0 <= code_ && code_ < NumAvailableRegisters(); |
276 } | |
237 bool is(DwVfpRegister reg) const { return code_ == reg.code_; } | 277 bool is(DwVfpRegister reg) const { return code_ == reg.code_; } |
238 SwVfpRegister low() const { | 278 SwVfpRegister low() const { |
279 ASSERT(code_ < 16); | |
239 SwVfpRegister reg; | 280 SwVfpRegister reg; |
240 reg.code_ = code_ * 2; | 281 reg.code_ = code_ * 2; |
241 | 282 |
242 ASSERT(reg.is_valid()); | 283 ASSERT(reg.is_valid()); |
243 return reg; | 284 return reg; |
244 } | 285 } |
245 SwVfpRegister high() const { | 286 SwVfpRegister high() const { |
287 ASSERT(code_ < 16); | |
246 SwVfpRegister reg; | 288 SwVfpRegister reg; |
247 reg.code_ = (code_ * 2) + 1; | 289 reg.code_ = (code_ * 2) + 1; |
248 | 290 |
249 ASSERT(reg.is_valid()); | 291 ASSERT(reg.is_valid()); |
250 return reg; | 292 return reg; |
251 } | 293 } |
252 int code() const { | 294 int code() const { |
253 ASSERT(is_valid()); | 295 ASSERT(is_valid()); |
254 return code_; | 296 return code_; |
255 } | 297 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
315 const DwVfpRegister d6 = { 6 }; | 357 const DwVfpRegister d6 = { 6 }; |
316 const DwVfpRegister d7 = { 7 }; | 358 const DwVfpRegister d7 = { 7 }; |
317 const DwVfpRegister d8 = { 8 }; | 359 const DwVfpRegister d8 = { 8 }; |
318 const DwVfpRegister d9 = { 9 }; | 360 const DwVfpRegister d9 = { 9 }; |
319 const DwVfpRegister d10 = { 10 }; | 361 const DwVfpRegister d10 = { 10 }; |
320 const DwVfpRegister d11 = { 11 }; | 362 const DwVfpRegister d11 = { 11 }; |
321 const DwVfpRegister d12 = { 12 }; | 363 const DwVfpRegister d12 = { 12 }; |
322 const DwVfpRegister d13 = { 13 }; | 364 const DwVfpRegister d13 = { 13 }; |
323 const DwVfpRegister d14 = { 14 }; | 365 const DwVfpRegister d14 = { 14 }; |
324 const DwVfpRegister d15 = { 15 }; | 366 const DwVfpRegister d15 = { 15 }; |
325 | 367 const DwVfpRegister d16 = { 16 }; |
326 // Aliases for double registers. Defined using #define instead of | 368 const DwVfpRegister d17 = { 17 }; |
327 // "static const DwVfpRegister&" because Clang complains otherwise when a | 369 const DwVfpRegister d18 = { 18 }; |
328 // compilation unit that includes this header doesn't use the variables. | 370 const DwVfpRegister d19 = { 19 }; |
329 #define kFirstCalleeSavedDoubleReg d8 | 371 const DwVfpRegister d20 = { 20 }; |
330 #define kLastCalleeSavedDoubleReg d15 | 372 const DwVfpRegister d21 = { 21 }; |
331 #define kDoubleRegZero d14 | 373 const DwVfpRegister d22 = { 22 }; |
332 #define kScratchDoubleReg d15 | 374 const DwVfpRegister d23 = { 23 }; |
375 const DwVfpRegister d24 = { 24 }; | |
376 const DwVfpRegister d25 = { 25 }; | |
377 const DwVfpRegister d26 = { 26 }; | |
378 const DwVfpRegister d27 = { 27 }; | |
379 const DwVfpRegister d28 = { 28 }; | |
380 const DwVfpRegister d29 = { 29 }; | |
381 const DwVfpRegister d30 = { 30 }; | |
382 const DwVfpRegister d31 = { 31 }; | |
333 | 383 |
334 | 384 |
335 // Coprocessor register | 385 // Coprocessor register |
336 struct CRegister { | 386 struct CRegister { |
337 bool is_valid() const { return 0 <= code_ && code_ < 16; } | 387 bool is_valid() const { return 0 <= code_ && code_ < 16; } |
338 bool is(CRegister creg) const { return code_ == creg.code_; } | 388 bool is(CRegister creg) const { return code_ == creg.code_; } |
339 int code() const { | 389 int code() const { |
340 ASSERT(is_valid()); | 390 ASSERT(is_valid()); |
341 return code_; | 391 return code_; |
342 } | 392 } |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
987 LFlag l = Short, Condition cond = al); | 1037 LFlag l = Short, Condition cond = al); |
988 void ldc(Coprocessor coproc, CRegister crd, Register base, int option, | 1038 void ldc(Coprocessor coproc, CRegister crd, Register base, int option, |
989 LFlag l = Short, Condition cond = al); | 1039 LFlag l = Short, Condition cond = al); |
990 | 1040 |
991 void ldc2(Coprocessor coproc, CRegister crd, const MemOperand& src, | 1041 void ldc2(Coprocessor coproc, CRegister crd, const MemOperand& src, |
992 LFlag l = Short); // v5 and above | 1042 LFlag l = Short); // v5 and above |
993 void ldc2(Coprocessor coproc, CRegister crd, Register base, int option, | 1043 void ldc2(Coprocessor coproc, CRegister crd, Register base, int option, |
994 LFlag l = Short); // v5 and above | 1044 LFlag l = Short); // v5 and above |
995 | 1045 |
996 // Support for VFP. | 1046 // Support for VFP. |
997 // All these APIs support S0 to S31 and D0 to D15. | 1047 // All these APIs support S0 to S31 and D0 to D31. |
998 // Currently these APIs do not support extended D registers, i.e, D16 to D31. | |
999 // However, some simple modifications can allow | |
1000 // these APIs to support D16 to D31. | |
1001 | 1048 |
1002 void vldr(const DwVfpRegister dst, | 1049 void vldr(const DwVfpRegister dst, |
1003 const Register base, | 1050 const Register base, |
1004 int offset, | 1051 int offset, |
1005 const Condition cond = al); | 1052 const Condition cond = al); |
1006 void vldr(const DwVfpRegister dst, | 1053 void vldr(const DwVfpRegister dst, |
1007 const MemOperand& src, | 1054 const MemOperand& src, |
1008 const Condition cond = al); | 1055 const Condition cond = al); |
1009 | 1056 |
1010 void vldr(const SwVfpRegister dst, | 1057 void vldr(const SwVfpRegister dst, |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1488 public: | 1535 public: |
1489 explicit EnsureSpace(Assembler* assembler) { | 1536 explicit EnsureSpace(Assembler* assembler) { |
1490 assembler->CheckBuffer(); | 1537 assembler->CheckBuffer(); |
1491 } | 1538 } |
1492 }; | 1539 }; |
1493 | 1540 |
1494 | 1541 |
1495 } } // namespace v8::internal | 1542 } } // namespace v8::internal |
1496 | 1543 |
1497 #endif // V8_ARM_ASSEMBLER_ARM_H_ | 1544 #endif // V8_ARM_ASSEMBLER_ARM_H_ |
OLD | NEW |