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

Side by Side Diff: src/IceTargetLoweringX8632Traits.h

Issue 1419903002: Subzero: Refactor x86 register definitions to use the alias mechanism. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Add some comments Created 5 years, 1 month 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
OLDNEW
1 //===- subzero/src/IceTargetLoweringX8632Traits.h - x86-32 traits -*- C++ -*-=// 1 //===- subzero/src/IceTargetLoweringX8632Traits.h - x86-32 traits -*- C++ -*-=//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 static constexpr bool HasPopa = true; 54 static constexpr bool HasPopa = true;
55 static constexpr bool HasPusha = true; 55 static constexpr bool HasPusha = true;
56 static constexpr bool UsesX87 = true; 56 static constexpr bool UsesX87 = true;
57 static constexpr ::Ice::RegX8632::GPRRegister Last8BitGPR = 57 static constexpr ::Ice::RegX8632::GPRRegister Last8BitGPR =
58 ::Ice::RegX8632::GPRRegister::Encoded_Reg_ebx; 58 ::Ice::RegX8632::GPRRegister::Encoded_Reg_ebx;
59 59
60 enum ScaleFactor { TIMES_1 = 0, TIMES_2 = 1, TIMES_4 = 2, TIMES_8 = 3 }; 60 enum ScaleFactor { TIMES_1 = 0, TIMES_2 = 1, TIMES_4 = 2, TIMES_8 = 3 };
61 61
62 using GPRRegister = ::Ice::RegX8632::GPRRegister; 62 using GPRRegister = ::Ice::RegX8632::GPRRegister;
63 using XmmRegister = ::Ice::RegX8632::XmmRegister; 63 using XmmRegister = ::Ice::RegX8632::XmmRegister;
64 using ByteRegister = ::Ice::RegX8632::ByteRegister;
65 using X87STRegister = ::Ice::RegX8632::X87STRegister; 64 using X87STRegister = ::Ice::RegX8632::X87STRegister;
66 65
67 using Cond = ::Ice::CondX86; 66 using Cond = ::Ice::CondX86;
68 67
69 using RegisterSet = ::Ice::RegX8632; 68 using RegisterSet = ::Ice::RegX8632;
70 static const GPRRegister Encoded_Reg_Accumulator = RegX8632::Encoded_Reg_eax; 69 static const GPRRegister Encoded_Reg_Accumulator = RegX8632::Encoded_Reg_eax;
71 static const GPRRegister Encoded_Reg_Counter = RegX8632::Encoded_Reg_ecx; 70 static const GPRRegister Encoded_Reg_Counter = RegX8632::Encoded_Reg_ecx;
72 static const FixupKind PcRelFixup = llvm::ELF::R_386_PC32; 71 static const FixupKind PcRelFixup = llvm::ELF::R_386_PC32;
73 static const FixupKind RelFixup = llvm::ELF::R_386_32; 72 static const FixupKind RelFixup = llvm::ELF::R_386_32;
74 73
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 Begin, 269 Begin,
271 // SSE2 is the PNaCl baseline instruction set. 270 // SSE2 is the PNaCl baseline instruction set.
272 SSE2 = Begin, 271 SSE2 = Begin,
273 SSE4_1, 272 SSE4_1,
274 End 273 End
275 }; 274 };
276 275
277 static const char *TargetName; 276 static const char *TargetName;
278 static constexpr Type WordType = IceType_i32; 277 static constexpr Type WordType = IceType_i32;
279 278
280 static IceString getRegName(SizeT RegNum, Type Ty) { 279 static IceString getRegName(int32_t RegNum) {
281 assert(RegNum < RegisterSet::Reg_NUM); 280 static const char *const RegNames[] = {
282 static const char *RegNames8[] = { 281 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
283 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \ 282 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
284 frameptr, isI8, isInt, isFP) \ 283 isTrunc8Rcvr, isAhRcvr, aliases) \
285 name8,
286 REGX8632_TABLE
287 #undef X
288 };
289
290 static const char *RegNames16[] = {
291 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
292 frameptr, isI8, isInt, isFP) \
293 name16,
294 REGX8632_TABLE
295 #undef X
296 };
297
298 static const char *RegNames[] = {
299 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
300 frameptr, isI8, isInt, isFP) \
301 name, 284 name,
302 REGX8632_TABLE 285 REGX8632_TABLE
303 #undef X 286 #undef X
304 }; 287 };
288 assert(RegNum >= 0);
289 assert(RegNum < RegisterSet::Reg_NUM);
290 return RegNames[RegNum];
291 }
305 292
306 switch (Ty) { 293 static GPRRegister getEncodedGPR(int32_t RegNum) {
307 case IceType_i1: 294 static const GPRRegister GPRRegs[] = {
308 case IceType_i8: 295 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
309 return RegNames8[RegNum]; 296 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
310 case IceType_i16: 297 isTrunc8Rcvr, isAhRcvr, aliases) \
311 return RegNames16[RegNum]; 298 GPRRegister(isGPR ? encode : GPRRegister::Encoded_Not_GPR),
312 default: 299 REGX8632_TABLE
313 return RegNames[RegNum]; 300 #undef X
301 };
302 assert(RegNum >= 0);
303 assert(RegNum < RegisterSet::Reg_NUM);
304 assert(GPRRegs[RegNum] != GPRRegister::Encoded_Not_GPR);
305 return GPRRegs[RegNum];
306 }
307
308 static XmmRegister getEncodedXmm(int32_t RegNum) {
309 static const XmmRegister XmmRegs[] = {
310 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
311 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
312 isTrunc8Rcvr, isAhRcvr, aliases) \
313 XmmRegister(isXmm ? encode : XmmRegister::Encoded_Not_Xmm),
314 REGX8632_TABLE
315 #undef X
316 };
317 assert(RegNum >= 0);
318 assert(RegNum < RegisterSet::Reg_NUM);
319 assert(XmmRegs[RegNum] != XmmRegister::Encoded_Not_Xmm);
320 return XmmRegs[RegNum];
321 }
322
323 static uint32_t getEncoding(int32_t RegNum) {
324 static const uint32_t Encoding[] = {
325 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
326 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
327 isTrunc8Rcvr, isAhRcvr, aliases) \
328 encode,
329 REGX8632_TABLE
330 #undef X
331 };
332 assert(RegNum >= 0);
333 assert(RegNum < RegisterSet::Reg_NUM);
334 return Encoding[RegNum];
335 }
336
337 static int32_t getBaseReg(int32_t RegNum) {
338 static const int32_t BaseRegs[] = {
339 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
340 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
341 isTrunc8Rcvr, isAhRcvr, aliases) \
342 RegisterSet::base,
343 REGX8632_TABLE
344 #undef X
345 };
346 assert(RegNum >= 0);
347 assert(RegNum < RegisterSet::Reg_NUM);
348 return BaseRegs[RegNum];
349 }
350
351 // Return a register in RegNum's alias set that is suitable for Ty.
352 static int32_t getGprForType(Type Ty, int32_t RegNum) {
353 assert(RegNum != Variable::NoRegister);
354 // TODO(stichnot): Rewrite this as a table lookup from a table computed in a
355 // TargetLowering static initializer.
356 RegNum = getBaseReg(RegNum);
357 if (Ty == IceType_i8 || Ty == IceType_i1) {
358 switch (RegNum) {
359 default:
360 assert(0);
361 case RegisterSet::Reg_eax:
362 return RegisterSet::Reg_al;
363 case RegisterSet::Reg_ecx:
364 return RegisterSet::Reg_cl;
365 case RegisterSet::Reg_edx:
366 return RegisterSet::Reg_dl;
367 case RegisterSet::Reg_ebx:
368 return RegisterSet::Reg_bl;
369 }
314 } 370 }
371 if (Ty == IceType_i16) {
372 switch (RegNum) {
373 default:
374 assert(0);
375 case RegisterSet::Reg_eax:
376 return RegisterSet::Reg_ax;
377 case RegisterSet::Reg_ecx:
378 return RegisterSet::Reg_cx;
379 case RegisterSet::Reg_edx:
380 return RegisterSet::Reg_dx;
381 case RegisterSet::Reg_ebx:
382 return RegisterSet::Reg_bx;
383 case RegisterSet::Reg_ebp:
384 return RegisterSet::Reg_bp;
385 case RegisterSet::Reg_esi:
386 return RegisterSet::Reg_si;
387 case RegisterSet::Reg_edi:
388 return RegisterSet::Reg_di;
389 }
390 }
391 return RegNum;
315 } 392 }
316 393
317 static void initRegisterSet( 394 static void initRegisterSet(
318 std::array<llvm::SmallBitVector, IceType_NUM> *TypeToRegisterSet, 395 std::array<llvm::SmallBitVector, IceType_NUM> *TypeToRegisterSet,
319 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases, 396 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases,
320 llvm::SmallBitVector *ScratchRegs) { 397 llvm::SmallBitVector *ScratchRegs) {
321 llvm::SmallBitVector IntegerRegisters(RegisterSet::Reg_NUM); 398 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM);
399 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM);
322 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM); 400 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM);
323 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM); 401 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM);
324 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM); 402 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM);
325 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM); 403 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM);
326 ScratchRegs->resize(RegisterSet::Reg_NUM); 404 ScratchRegs->resize(RegisterSet::Reg_NUM);
327 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \ 405 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
328 frameptr, isI8, isInt, isFP) \ 406 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
329 (IntegerRegisters)[RegisterSet::val] = isInt; \ 407 isTrunc8Rcvr, isAhRcvr, aliases) \
330 (IntegerRegistersI8)[RegisterSet::val] = isI8; \ 408 (IntegerRegistersI32)[RegisterSet::val] = is32; \
331 (FloatRegisters)[RegisterSet::val] = isFP; \ 409 (IntegerRegistersI16)[RegisterSet::val] = is16; \
332 (VectorRegisters)[RegisterSet::val] = isFP; \ 410 (IntegerRegistersI8)[RegisterSet::val] = is8; \
411 (FloatRegisters)[RegisterSet::val] = isXmm; \
412 (VectorRegisters)[RegisterSet::val] = isXmm; \
333 (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \ 413 (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \
414 for (SizeT RegAlias : aliases) { \
415 assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \
416 "Duplicate alias for " #val); \
417 (*RegisterAliases)[RegisterSet::val].set(RegAlias); \
418 } \
334 (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \ 419 (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \
335 (*ScratchRegs)[RegisterSet::val] = scratch; 420 (*ScratchRegs)[RegisterSet::val] = scratch;
336 REGX8632_TABLE; 421 REGX8632_TABLE;
337 #undef X 422 #undef X
338 423
339 (*TypeToRegisterSet)[IceType_void] = InvalidRegisters; 424 (*TypeToRegisterSet)[IceType_void] = InvalidRegisters;
340 (*TypeToRegisterSet)[IceType_i1] = IntegerRegistersI8; 425 (*TypeToRegisterSet)[IceType_i1] = IntegerRegistersI8;
341 (*TypeToRegisterSet)[IceType_i8] = IntegerRegistersI8; 426 (*TypeToRegisterSet)[IceType_i8] = IntegerRegistersI8;
342 (*TypeToRegisterSet)[IceType_i16] = IntegerRegisters; 427 (*TypeToRegisterSet)[IceType_i16] = IntegerRegistersI16;
343 (*TypeToRegisterSet)[IceType_i32] = IntegerRegisters; 428 (*TypeToRegisterSet)[IceType_i32] = IntegerRegistersI32;
344 (*TypeToRegisterSet)[IceType_i64] = IntegerRegisters; 429 (*TypeToRegisterSet)[IceType_i64] = IntegerRegistersI32;
345 (*TypeToRegisterSet)[IceType_f32] = FloatRegisters; 430 (*TypeToRegisterSet)[IceType_f32] = FloatRegisters;
346 (*TypeToRegisterSet)[IceType_f64] = FloatRegisters; 431 (*TypeToRegisterSet)[IceType_f64] = FloatRegisters;
347 (*TypeToRegisterSet)[IceType_v4i1] = VectorRegisters; 432 (*TypeToRegisterSet)[IceType_v4i1] = VectorRegisters;
348 (*TypeToRegisterSet)[IceType_v8i1] = VectorRegisters; 433 (*TypeToRegisterSet)[IceType_v8i1] = VectorRegisters;
349 (*TypeToRegisterSet)[IceType_v16i1] = VectorRegisters; 434 (*TypeToRegisterSet)[IceType_v16i1] = VectorRegisters;
350 (*TypeToRegisterSet)[IceType_v16i8] = VectorRegisters; 435 (*TypeToRegisterSet)[IceType_v16i8] = VectorRegisters;
351 (*TypeToRegisterSet)[IceType_v8i16] = VectorRegisters; 436 (*TypeToRegisterSet)[IceType_v8i16] = VectorRegisters;
352 (*TypeToRegisterSet)[IceType_v4i32] = VectorRegisters; 437 (*TypeToRegisterSet)[IceType_v4i32] = VectorRegisters;
353 (*TypeToRegisterSet)[IceType_v4f32] = VectorRegisters; 438 (*TypeToRegisterSet)[IceType_v4f32] = VectorRegisters;
354 } 439 }
355 440
356 static llvm::SmallBitVector 441 static llvm::SmallBitVector
357 getRegisterSet(TargetLowering::RegSetMask Include, 442 getRegisterSet(TargetLowering::RegSetMask Include,
358 TargetLowering::RegSetMask Exclude) { 443 TargetLowering::RegSetMask Exclude) {
359 llvm::SmallBitVector Registers(RegisterSet::Reg_NUM); 444 llvm::SmallBitVector Registers(RegisterSet::Reg_NUM);
360 445
361 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \ 446 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
362 frameptr, isI8, isInt, isFP) \ 447 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
448 isTrunc8Rcvr, isAhRcvr, aliases) \
363 if (scratch && (Include & ::Ice::TargetLowering::RegSet_CallerSave)) \ 449 if (scratch && (Include & ::Ice::TargetLowering::RegSet_CallerSave)) \
364 Registers[RegisterSet::val] = true; \ 450 Registers[RegisterSet::val] = true; \
365 if (preserved && (Include & ::Ice::TargetLowering::RegSet_CalleeSave)) \ 451 if (preserved && (Include & ::Ice::TargetLowering::RegSet_CalleeSave)) \
366 Registers[RegisterSet::val] = true; \ 452 Registers[RegisterSet::val] = true; \
367 if (stackptr && (Include & ::Ice::TargetLowering::RegSet_StackPointer)) \ 453 if (stackptr && (Include & ::Ice::TargetLowering::RegSet_StackPointer)) \
368 Registers[RegisterSet::val] = true; \ 454 Registers[RegisterSet::val] = true; \
369 if (frameptr && (Include & ::Ice::TargetLowering::RegSet_FramePointer)) \ 455 if (frameptr && (Include & ::Ice::TargetLowering::RegSet_FramePointer)) \
370 Registers[RegisterSet::val] = true; \ 456 Registers[RegisterSet::val] = true; \
371 if (scratch && (Exclude & ::Ice::TargetLowering::RegSet_CallerSave)) \ 457 if (scratch && (Exclude & ::Ice::TargetLowering::RegSet_CallerSave)) \
372 Registers[RegisterSet::val] = false; \ 458 Registers[RegisterSet::val] = false; \
(...skipping 24 matching lines...) Expand all
397 // performance, not correctness. 483 // performance, not correctness.
398 static const unsigned MaxEquivalenceClassSize = 8; 484 static const unsigned MaxEquivalenceClassSize = 8;
399 using RegisterList = llvm::SmallVector<int32_t, MaxEquivalenceClassSize>; 485 using RegisterList = llvm::SmallVector<int32_t, MaxEquivalenceClassSize>;
400 using EquivalenceClassMap = std::map<uint32_t, RegisterList>; 486 using EquivalenceClassMap = std::map<uint32_t, RegisterList>;
401 EquivalenceClassMap EquivalenceClasses; 487 EquivalenceClassMap EquivalenceClasses;
402 SizeT NumShuffled = 0, NumPreserved = 0; 488 SizeT NumShuffled = 0, NumPreserved = 0;
403 489
404 // Build up the equivalence classes of registers by looking at the register 490 // Build up the equivalence classes of registers by looking at the register
405 // properties as well as whether the registers should be explicitly excluded 491 // properties as well as whether the registers should be explicitly excluded
406 // from shuffling. 492 // from shuffling.
407 #define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \ 493 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
408 frameptr, isI8, isInt, isFP) \ 494 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
495 isTrunc8Rcvr, isAhRcvr, aliases) \
409 if (ExcludeRegisters[RegisterSet::val]) { \ 496 if (ExcludeRegisters[RegisterSet::val]) { \
410 /* val stays the same in the resulting permutation. */ \ 497 /* val stays the same in the resulting permutation. */ \
411 Permutation[RegisterSet::val] = RegisterSet::val; \ 498 Permutation[RegisterSet::val] = RegisterSet::val; \
412 ++NumPreserved; \ 499 ++NumPreserved; \
413 } else { \ 500 } else { \
414 const uint32_t Index = (scratch << 0) | (preserved << 1) | (isI8 << 2) | \ 501 const uint32_t Index = (scratch << 0) | (preserved << 1) | (is8 << 2) | \
415 (isInt << 3) | (isFP << 4); \ 502 (is16 << 3) | (is32 << 4) | (isXmm << 5); \
416 /* val is assigned to an equivalence class based on its properties. */ \ 503 /* val is assigned to an equivalence class based on its properties. */ \
417 EquivalenceClasses[Index].push_back(RegisterSet::val); \ 504 EquivalenceClasses[Index].push_back(RegisterSet::val); \
418 } 505 }
419 REGX8632_TABLE 506 REGX8632_TABLE
420 #undef X 507 #undef X
421 508
422 // Create a random number generator for regalloc randomization. 509 // Create a random number generator for regalloc randomization.
423 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(), 510 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(),
424 RPE_RegAllocRandomization, Salt); 511 RPE_RegAllocRandomization, Salt);
425 RandomNumberGeneratorWrapper RNGW(RNG); 512 RandomNumberGeneratorWrapper RNGW(RNG);
(...skipping 16 matching lines...) Expand all
442 Ostream &Str = Func->getContext()->getStrDump(); 529 Ostream &Str = Func->getContext()->getStrDump();
443 Str << "Register equivalence classes:\n"; 530 Str << "Register equivalence classes:\n";
444 for (auto I : EquivalenceClasses) { 531 for (auto I : EquivalenceClasses) {
445 Str << "{"; 532 Str << "{";
446 const RegisterList &List = I.second; 533 const RegisterList &List = I.second;
447 bool First = true; 534 bool First = true;
448 for (int32_t Register : List) { 535 for (int32_t Register : List) {
449 if (!First) 536 if (!First)
450 Str << " "; 537 Str << " ";
451 First = false; 538 First = false;
452 Str << getRegName(Register, IceType_i32); 539 Str << getRegName(Register);
453 } 540 }
454 Str << "}\n"; 541 Str << "}\n";
455 } 542 }
456 } 543 }
457 } 544 }
458 545
459 /// The maximum number of arguments to pass in XMM registers 546 /// The maximum number of arguments to pass in XMM registers
460 static const uint32_t X86_MAX_XMM_ARGS = 4; 547 static const uint32_t X86_MAX_XMM_ARGS = 4;
461 /// The number of bits in a byte 548 /// The number of bits in a byte
462 static const uint32_t X86_CHAR_BIT = 8; 549 static const uint32_t X86_CHAR_BIT = 8;
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 828
742 } // end of namespace X86Internal 829 } // end of namespace X86Internal
743 830
744 namespace X8632 { 831 namespace X8632 {
745 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8632>; 832 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8632>;
746 } // end of namespace X8632 833 } // end of namespace X8632
747 834
748 } // end of namespace Ice 835 } // end of namespace Ice
749 836
750 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H 837 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698