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

Side by Side Diff: src/IceTargetLoweringX8632Traits.h

Issue 1427973003: Subzero: Refactor x86 register representation to actively use aliases. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Reformat 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
« no previous file with comments | « src/IceTargetLoweringX8632.cpp ('k') | src/IceTargetLoweringX8664.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
11 /// This file declares the X8632 Target Lowering Traits. 11 /// This file declares the X8632 Target Lowering Traits.
12 /// 12 ///
13 //===----------------------------------------------------------------------===// 13 //===----------------------------------------------------------------------===//
14 14
15 #ifndef SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H 15 #ifndef SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H
16 #define SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H 16 #define SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H
17 17
18 #include "IceAssembler.h" 18 #include "IceAssembler.h"
19 #include "IceConditionCodesX8632.h" 19 #include "IceConditionCodesX8632.h"
20 #include "IceDefs.h" 20 #include "IceDefs.h"
21 #include "IceInst.h" 21 #include "IceInst.h"
22 #include "IceInstX8632.def" 22 #include "IceInstX8632.def"
23 #include "IceOperand.h" 23 #include "IceOperand.h"
24 #include "IceRegistersX8632.h" 24 #include "IceRegistersX8632.h"
25 #include "IceTargetLowering.h"
25 #include "IceTargetLoweringX8632.def" 26 #include "IceTargetLoweringX8632.def"
26 #include "IceTargetLowering.h" 27 #include "IceTargetLoweringX86RegClass.h"
27 28
28 #include <array> 29 #include <array>
29 30
30 namespace Ice { 31 namespace Ice {
31 32
32 class TargetX8632; 33 class TargetX8632;
33 34
34 namespace X8632 { 35 namespace X8632 {
35 class AssemblerX8632; 36 class AssemblerX8632;
36 } // end of namespace X8632 37 } // end of namespace X8632
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 case RegisterSet::Reg_esi: 392 case RegisterSet::Reg_esi:
392 return RegisterSet::Reg_si; 393 return RegisterSet::Reg_si;
393 case RegisterSet::Reg_edi: 394 case RegisterSet::Reg_edi:
394 return RegisterSet::Reg_di; 395 return RegisterSet::Reg_di;
395 } 396 }
396 } 397 }
397 return RegNum; 398 return RegNum;
398 } 399 }
399 400
400 static void initRegisterSet( 401 static void initRegisterSet(
401 std::array<llvm::SmallBitVector, IceType_NUM> *TypeToRegisterSet, 402 std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet,
402 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases, 403 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases,
403 llvm::SmallBitVector *ScratchRegs) { 404 llvm::SmallBitVector *ScratchRegs) {
404 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM); 405 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM);
405 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM); 406 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM);
406 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM); 407 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM);
407 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM); 408 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM);
408 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM); 409 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM);
410 llvm::SmallBitVector Trunc64To8Registers(RegisterSet::Reg_NUM);
411 llvm::SmallBitVector Trunc32To8Registers(RegisterSet::Reg_NUM);
412 llvm::SmallBitVector Trunc16To8Registers(RegisterSet::Reg_NUM);
413 llvm::SmallBitVector Trunc8RcvrRegisters(RegisterSet::Reg_NUM);
414 llvm::SmallBitVector AhRcvrRegisters(RegisterSet::Reg_NUM);
409 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM); 415 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM);
410 ScratchRegs->resize(RegisterSet::Reg_NUM); 416 ScratchRegs->resize(RegisterSet::Reg_NUM);
411 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ 417 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
412 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ 418 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
413 isTrunc8Rcvr, isAhRcvr, aliases) \ 419 isTrunc8Rcvr, isAhRcvr, aliases) \
414 (IntegerRegistersI32)[RegisterSet::val] = is32; \ 420 (IntegerRegistersI32)[RegisterSet::val] = is32; \
415 (IntegerRegistersI16)[RegisterSet::val] = is16; \ 421 (IntegerRegistersI16)[RegisterSet::val] = is16; \
416 (IntegerRegistersI8)[RegisterSet::val] = is8; \ 422 (IntegerRegistersI8)[RegisterSet::val] = is8; \
417 (FloatRegisters)[RegisterSet::val] = isXmm; \ 423 (FloatRegisters)[RegisterSet::val] = isXmm; \
418 (VectorRegisters)[RegisterSet::val] = isXmm; \ 424 (VectorRegisters)[RegisterSet::val] = isXmm; \
425 (Trunc64To8Registers)[RegisterSet::val] = is64To8; \
426 (Trunc32To8Registers)[RegisterSet::val] = is32To8; \
427 (Trunc16To8Registers)[RegisterSet::val] = is16To8; \
428 (Trunc8RcvrRegisters)[RegisterSet::val] = isTrunc8Rcvr; \
429 (AhRcvrRegisters)[RegisterSet::val] = isAhRcvr; \
419 (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \ 430 (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \
420 for (SizeT RegAlias : aliases) { \ 431 for (SizeT RegAlias : aliases) { \
421 assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \ 432 assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \
422 "Duplicate alias for " #val); \ 433 "Duplicate alias for " #val); \
423 (*RegisterAliases)[RegisterSet::val].set(RegAlias); \ 434 (*RegisterAliases)[RegisterSet::val].set(RegAlias); \
424 } \ 435 } \
425 (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \ 436 (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \
426 (*ScratchRegs)[RegisterSet::val] = scratch; 437 (*ScratchRegs)[RegisterSet::val] = scratch;
427 REGX8632_TABLE; 438 REGX8632_TABLE;
428 #undef X 439 #undef X
429 440
430 (*TypeToRegisterSet)[IceType_void] = InvalidRegisters; 441 (*TypeToRegisterSet)[RC_void] = InvalidRegisters;
431 (*TypeToRegisterSet)[IceType_i1] = IntegerRegistersI8; 442 (*TypeToRegisterSet)[RC_i1] = IntegerRegistersI8;
432 (*TypeToRegisterSet)[IceType_i8] = IntegerRegistersI8; 443 (*TypeToRegisterSet)[RC_i8] = IntegerRegistersI8;
433 (*TypeToRegisterSet)[IceType_i16] = IntegerRegistersI16; 444 (*TypeToRegisterSet)[RC_i16] = IntegerRegistersI16;
434 (*TypeToRegisterSet)[IceType_i32] = IntegerRegistersI32; 445 (*TypeToRegisterSet)[RC_i32] = IntegerRegistersI32;
435 (*TypeToRegisterSet)[IceType_i64] = IntegerRegistersI32; 446 (*TypeToRegisterSet)[RC_i64] = IntegerRegistersI32;
436 (*TypeToRegisterSet)[IceType_f32] = FloatRegisters; 447 (*TypeToRegisterSet)[RC_f32] = FloatRegisters;
437 (*TypeToRegisterSet)[IceType_f64] = FloatRegisters; 448 (*TypeToRegisterSet)[RC_f64] = FloatRegisters;
438 (*TypeToRegisterSet)[IceType_v4i1] = VectorRegisters; 449 (*TypeToRegisterSet)[RC_v4i1] = VectorRegisters;
439 (*TypeToRegisterSet)[IceType_v8i1] = VectorRegisters; 450 (*TypeToRegisterSet)[RC_v8i1] = VectorRegisters;
440 (*TypeToRegisterSet)[IceType_v16i1] = VectorRegisters; 451 (*TypeToRegisterSet)[RC_v16i1] = VectorRegisters;
441 (*TypeToRegisterSet)[IceType_v16i8] = VectorRegisters; 452 (*TypeToRegisterSet)[RC_v16i8] = VectorRegisters;
442 (*TypeToRegisterSet)[IceType_v8i16] = VectorRegisters; 453 (*TypeToRegisterSet)[RC_v8i16] = VectorRegisters;
443 (*TypeToRegisterSet)[IceType_v4i32] = VectorRegisters; 454 (*TypeToRegisterSet)[RC_v4i32] = VectorRegisters;
444 (*TypeToRegisterSet)[IceType_v4f32] = VectorRegisters; 455 (*TypeToRegisterSet)[RC_v4f32] = VectorRegisters;
456 (*TypeToRegisterSet)[RCX86_Is64To8] = Trunc64To8Registers;
457 (*TypeToRegisterSet)[RCX86_Is32To8] = Trunc32To8Registers;
458 (*TypeToRegisterSet)[RCX86_Is16To8] = Trunc16To8Registers;
459 (*TypeToRegisterSet)[RCX86_IsTrunc8Rcvr] = Trunc8RcvrRegisters;
460 (*TypeToRegisterSet)[RCX86_IsAhRcvr] = AhRcvrRegisters;
445 } 461 }
446 462
447 static llvm::SmallBitVector 463 static llvm::SmallBitVector
448 getRegisterSet(TargetLowering::RegSetMask Include, 464 getRegisterSet(TargetLowering::RegSetMask Include,
449 TargetLowering::RegSetMask Exclude) { 465 TargetLowering::RegSetMask Exclude) {
450 llvm::SmallBitVector Registers(RegisterSet::Reg_NUM); 466 llvm::SmallBitVector Registers(RegisterSet::Reg_NUM);
451 467
452 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ 468 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \
453 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ 469 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \
454 isTrunc8Rcvr, isAhRcvr, aliases) \ 470 isTrunc8Rcvr, isAhRcvr, aliases) \
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 ++NumPreserved; \ 521 ++NumPreserved; \
506 } else { \ 522 } else { \
507 uint32_t AttrKey = 0; \ 523 uint32_t AttrKey = 0; \
508 uint32_t Index = 0; \ 524 uint32_t Index = 0; \
509 /* Combine relevant attributes into an equivalence class key. */ \ 525 /* Combine relevant attributes into an equivalence class key. */ \
510 Index |= (scratch << (AttrKey++)); \ 526 Index |= (scratch << (AttrKey++)); \
511 Index |= (preserved << (AttrKey++)); \ 527 Index |= (preserved << (AttrKey++)); \
512 Index |= (is8 << (AttrKey++)); \ 528 Index |= (is8 << (AttrKey++)); \
513 Index |= (is16 << (AttrKey++)); \ 529 Index |= (is16 << (AttrKey++)); \
514 Index |= (is32 << (AttrKey++)); \ 530 Index |= (is32 << (AttrKey++)); \
531 Index |= (is64 << (AttrKey++)); \
515 Index |= (isXmm << (AttrKey++)); \ 532 Index |= (isXmm << (AttrKey++)); \
533 Index |= (is16To8 << (AttrKey++)); \
534 Index |= (is32To8 << (AttrKey++)); \
535 Index |= (is64To8 << (AttrKey++)); \
536 Index |= (isTrunc8Rcvr << (AttrKey++)); \
516 /* val is assigned to an equivalence class based on its properties. */ \ 537 /* val is assigned to an equivalence class based on its properties. */ \
517 EquivalenceClasses[Index].push_back(RegisterSet::val); \ 538 EquivalenceClasses[Index].push_back(RegisterSet::val); \
518 } 539 }
519 REGX8632_TABLE 540 REGX8632_TABLE
520 #undef X 541 #undef X
521 542
522 // Create a random number generator for regalloc randomization. 543 // Create a random number generator for regalloc randomization.
523 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(), 544 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(),
524 RPE_RegAllocRandomization, Salt); 545 RPE_RegAllocRandomization, Salt);
525 RandomNumberGeneratorWrapper RNGW(RNG); 546 RandomNumberGeneratorWrapper RNGW(RNG);
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 862
842 } // end of namespace X86Internal 863 } // end of namespace X86Internal
843 864
844 namespace X8632 { 865 namespace X8632 {
845 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8632>; 866 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8632>;
846 } // end of namespace X8632 867 } // end of namespace X8632
847 868
848 } // end of namespace Ice 869 } // end of namespace Ice
849 870
850 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H 871 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX8632.cpp ('k') | src/IceTargetLoweringX8664.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698