| OLD | NEW |
| 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 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 static constexpr std::size_t value = 1; | 440 static constexpr std::size_t value = 1; |
| 441 }; | 441 }; |
| 442 | 442 |
| 443 const std::size_t Size; | 443 const std::size_t Size; |
| 444 }; | 444 }; |
| 445 | 445 |
| 446 public: | 446 public: |
| 447 static void initRegisterSet( | 447 static void initRegisterSet( |
| 448 const ::Ice::ClFlags & /*Flags*/, | 448 const ::Ice::ClFlags & /*Flags*/, |
| 449 std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet, | 449 std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet, |
| 450 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases, | 450 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases) { |
| 451 llvm::SmallBitVector *ScratchRegs) { | |
| 452 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM); | 451 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM); |
| 453 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM); | 452 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM); |
| 454 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM); | 453 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM); |
| 455 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM); | 454 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM); |
| 456 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM); | 455 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM); |
| 457 llvm::SmallBitVector Trunc64To8Registers(RegisterSet::Reg_NUM); | 456 llvm::SmallBitVector Trunc64To8Registers(RegisterSet::Reg_NUM); |
| 458 llvm::SmallBitVector Trunc32To8Registers(RegisterSet::Reg_NUM); | 457 llvm::SmallBitVector Trunc32To8Registers(RegisterSet::Reg_NUM); |
| 459 llvm::SmallBitVector Trunc16To8Registers(RegisterSet::Reg_NUM); | 458 llvm::SmallBitVector Trunc16To8Registers(RegisterSet::Reg_NUM); |
| 460 llvm::SmallBitVector Trunc8RcvrRegisters(RegisterSet::Reg_NUM); | 459 llvm::SmallBitVector Trunc8RcvrRegisters(RegisterSet::Reg_NUM); |
| 461 llvm::SmallBitVector AhRcvrRegisters(RegisterSet::Reg_NUM); | 460 llvm::SmallBitVector AhRcvrRegisters(RegisterSet::Reg_NUM); |
| 462 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM); | 461 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM); |
| 463 ScratchRegs->resize(RegisterSet::Reg_NUM); | |
| 464 | 462 |
| 465 static constexpr struct { | 463 static constexpr struct { |
| 466 uint16_t Val; | 464 uint16_t Val; |
| 467 unsigned Is64 : 1; | 465 unsigned Is64 : 1; |
| 468 unsigned Is32 : 1; | 466 unsigned Is32 : 1; |
| 469 unsigned Is16 : 1; | 467 unsigned Is16 : 1; |
| 470 unsigned Is8 : 1; | 468 unsigned Is8 : 1; |
| 471 unsigned IsXmm : 1; | 469 unsigned IsXmm : 1; |
| 472 unsigned Is64To8 : 1; | 470 unsigned Is64To8 : 1; |
| 473 unsigned Is32To8 : 1; | 471 unsigned Is32To8 : 1; |
| 474 unsigned Is16To8 : 1; | 472 unsigned Is16To8 : 1; |
| 475 unsigned IsTrunc8Rcvr : 1; | 473 unsigned IsTrunc8Rcvr : 1; |
| 476 unsigned IsAhRcvr : 1; | 474 unsigned IsAhRcvr : 1; |
| 477 unsigned Scratch : 1; | |
| 478 #define NUM_ALIASES_BITS 2 | 475 #define NUM_ALIASES_BITS 2 |
| 479 SizeT NumAliases : (NUM_ALIASES_BITS + 1); | 476 SizeT NumAliases : (NUM_ALIASES_BITS + 1); |
| 480 uint16_t Aliases[1 << NUM_ALIASES_BITS]; | 477 uint16_t Aliases[1 << NUM_ALIASES_BITS]; |
| 481 #undef NUM_ALIASES_BITS | 478 #undef NUM_ALIASES_BITS |
| 482 } X8632RegTable[RegisterSet::Reg_NUM] = { | 479 } X8632RegTable[RegisterSet::Reg_NUM] = { |
| 483 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ | 480 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ |
| 484 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ | 481 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ |
| 485 isTrunc8Rcvr, isAhRcvr, aliases) \ | 482 isTrunc8Rcvr, isAhRcvr, aliases) \ |
| 486 { \ | 483 { \ |
| 487 RegisterSet::val, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ | 484 RegisterSet::val, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ |
| 488 isTrunc8Rcvr, isAhRcvr, scratch, (SizeOf aliases).size(), aliases, \ | 485 isTrunc8Rcvr, isAhRcvr, (SizeOf aliases).size(), aliases, \ |
| 489 } \ | 486 } \ |
| 490 , | 487 , |
| 491 REGX8632_TABLE | 488 REGX8632_TABLE |
| 492 #undef X | 489 #undef X |
| 493 }; | 490 }; |
| 494 | 491 |
| 495 for (SizeT ii = 0; ii < llvm::array_lengthof(X8632RegTable); ++ii) { | 492 for (SizeT ii = 0; ii < llvm::array_lengthof(X8632RegTable); ++ii) { |
| 496 const auto &Entry = X8632RegTable[ii]; | 493 const auto &Entry = X8632RegTable[ii]; |
| 497 (IntegerRegistersI32)[Entry.Val] = Entry.Is32; | 494 (IntegerRegistersI32)[Entry.Val] = Entry.Is32; |
| 498 (IntegerRegistersI16)[Entry.Val] = Entry.Is16; | 495 (IntegerRegistersI16)[Entry.Val] = Entry.Is16; |
| 499 (IntegerRegistersI8)[Entry.Val] = Entry.Is8; | 496 (IntegerRegistersI8)[Entry.Val] = Entry.Is8; |
| 500 (FloatRegisters)[Entry.Val] = Entry.IsXmm; | 497 (FloatRegisters)[Entry.Val] = Entry.IsXmm; |
| 501 (VectorRegisters)[Entry.Val] = Entry.IsXmm; | 498 (VectorRegisters)[Entry.Val] = Entry.IsXmm; |
| 502 (Trunc64To8Registers)[Entry.Val] = Entry.Is64To8; | 499 (Trunc64To8Registers)[Entry.Val] = Entry.Is64To8; |
| 503 (Trunc32To8Registers)[Entry.Val] = Entry.Is32To8; | 500 (Trunc32To8Registers)[Entry.Val] = Entry.Is32To8; |
| 504 (Trunc16To8Registers)[Entry.Val] = Entry.Is16To8; | 501 (Trunc16To8Registers)[Entry.Val] = Entry.Is16To8; |
| 505 (Trunc8RcvrRegisters)[Entry.Val] = Entry.IsTrunc8Rcvr; | 502 (Trunc8RcvrRegisters)[Entry.Val] = Entry.IsTrunc8Rcvr; |
| 506 (AhRcvrRegisters)[Entry.Val] = Entry.IsAhRcvr; | 503 (AhRcvrRegisters)[Entry.Val] = Entry.IsAhRcvr; |
| 507 (*RegisterAliases)[Entry.Val].resize(RegisterSet::Reg_NUM); | 504 (*RegisterAliases)[Entry.Val].resize(RegisterSet::Reg_NUM); |
| 508 for (int J = 0; J < Entry.NumAliases; J++) { | 505 for (int J = 0; J < Entry.NumAliases; J++) { |
| 509 SizeT Alias = Entry.Aliases[J]; | 506 SizeT Alias = Entry.Aliases[J]; |
| 510 assert(!(*RegisterAliases)[Entry.Val][Alias] && "Duplicate alias"); | 507 assert(!(*RegisterAliases)[Entry.Val][Alias] && "Duplicate alias"); |
| 511 (*RegisterAliases)[Entry.Val].set(Alias); | 508 (*RegisterAliases)[Entry.Val].set(Alias); |
| 512 } | 509 } |
| 513 (*RegisterAliases)[Entry.Val].set(Entry.Val); | 510 (*RegisterAliases)[Entry.Val].set(Entry.Val); |
| 514 (*ScratchRegs)[Entry.Val] = Entry.Scratch; | |
| 515 } | 511 } |
| 516 | 512 |
| 517 (*TypeToRegisterSet)[RC_void] = InvalidRegisters; | 513 (*TypeToRegisterSet)[RC_void] = InvalidRegisters; |
| 518 (*TypeToRegisterSet)[RC_i1] = IntegerRegistersI8; | 514 (*TypeToRegisterSet)[RC_i1] = IntegerRegistersI8; |
| 519 (*TypeToRegisterSet)[RC_i8] = IntegerRegistersI8; | 515 (*TypeToRegisterSet)[RC_i8] = IntegerRegistersI8; |
| 520 (*TypeToRegisterSet)[RC_i16] = IntegerRegistersI16; | 516 (*TypeToRegisterSet)[RC_i16] = IntegerRegistersI16; |
| 521 (*TypeToRegisterSet)[RC_i32] = IntegerRegistersI32; | 517 (*TypeToRegisterSet)[RC_i32] = IntegerRegistersI32; |
| 522 (*TypeToRegisterSet)[RC_i64] = IntegerRegistersI32; | 518 (*TypeToRegisterSet)[RC_i64] = IntegerRegistersI32; |
| 523 (*TypeToRegisterSet)[RC_f32] = FloatRegisters; | 519 (*TypeToRegisterSet)[RC_f32] = FloatRegisters; |
| 524 (*TypeToRegisterSet)[RC_f64] = FloatRegisters; | 520 (*TypeToRegisterSet)[RC_f64] = FloatRegisters; |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 | 958 |
| 963 static uint8_t InstSegmentPrefixes[]; | 959 static uint8_t InstSegmentPrefixes[]; |
| 964 }; | 960 }; |
| 965 | 961 |
| 966 using Traits = ::Ice::X8632::TargetX8632Traits; | 962 using Traits = ::Ice::X8632::TargetX8632Traits; |
| 967 } // end of namespace X8632 | 963 } // end of namespace X8632 |
| 968 | 964 |
| 969 } // end of namespace Ice | 965 } // end of namespace Ice |
| 970 | 966 |
| 971 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H | 967 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632TRAITS_H |
| OLD | NEW |