Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: src/arm/assembler-arm.h

Issue 11428137: ARM: Make use of d16-d31 when available. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/arm/assembler-arm.cc » ('j') | src/arm/lithium-arm.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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_
OLDNEW
« no previous file with comments | « no previous file | src/arm/assembler-arm.cc » ('j') | src/arm/lithium-arm.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698