| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8664Traits.h - x86-64 traits -*- C++ -*-=// | 1 //===- subzero/src/IceTargetLoweringX8664Traits.h - x86-64 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 X8664 Target Lowering Traits. | 11 /// This file declares the X8664 Target Lowering Traits. |
| 12 /// | 12 /// |
| 13 //===----------------------------------------------------------------------===// | 13 //===----------------------------------------------------------------------===// |
| 14 | 14 |
| 15 #ifndef SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H | 15 #ifndef SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H |
| 16 #define SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H | 16 #define SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H |
| 17 | 17 |
| 18 #include "IceAssembler.h" | 18 #include "IceAssembler.h" |
| 19 #include "IceConditionCodesX8664.h" | 19 #include "IceConditionCodesX8664.h" |
| 20 #include "IceDefs.h" | 20 #include "IceDefs.h" |
| 21 #include "IceInst.h" | 21 #include "IceInst.h" |
| 22 #include "IceInstX8664.def" | 22 #include "IceInstX8664.def" |
| 23 #include "IceOperand.h" | 23 #include "IceOperand.h" |
| 24 #include "IceRegistersX8664.h" | 24 #include "IceRegistersX8664.h" |
| 25 #include "IceTargetLowering.h" | 25 #include "IceTargetLowering.h" |
| 26 #include "IceTargetLoweringX8664.def" | 26 #include "IceTargetLoweringX8664.def" |
| 27 #include "IceTargetLoweringX86RegClass.h" |
| 27 | 28 |
| 28 #include <array> | 29 #include <array> |
| 29 | 30 |
| 30 namespace Ice { | 31 namespace Ice { |
| 31 | 32 |
| 32 class TargetX8664; | 33 class TargetX8664; |
| 33 | 34 |
| 34 namespace X8664 { | 35 namespace X8664 { |
| 35 class AssemblerX8664; | 36 class AssemblerX8664; |
| 36 } // end of namespace X8664 | 37 } // end of namespace X8664 |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 #undef X | 373 #undef X |
| 373 }; | 374 }; |
| 374 assert(RegNum >= 0); | 375 assert(RegNum >= 0); |
| 375 assert(RegNum < RegisterSet::Reg_NUM); | 376 assert(RegNum < RegisterSet::Reg_NUM); |
| 376 return BaseRegs[RegNum]; | 377 return BaseRegs[RegNum]; |
| 377 } | 378 } |
| 378 | 379 |
| 379 static int32_t getGprForType(Type, int32_t RegNum) { return RegNum; } | 380 static int32_t getGprForType(Type, int32_t RegNum) { return RegNum; } |
| 380 | 381 |
| 381 static void initRegisterSet( | 382 static void initRegisterSet( |
| 382 std::array<llvm::SmallBitVector, IceType_NUM> *TypeToRegisterSet, | 383 std::array<llvm::SmallBitVector, RCX86_NUM> *TypeToRegisterSet, |
| 383 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases, | 384 std::array<llvm::SmallBitVector, RegisterSet::Reg_NUM> *RegisterAliases, |
| 384 llvm::SmallBitVector *ScratchRegs) { | 385 llvm::SmallBitVector *ScratchRegs) { |
| 385 llvm::SmallBitVector IntegerRegistersI64(RegisterSet::Reg_NUM); | 386 llvm::SmallBitVector IntegerRegistersI64(RegisterSet::Reg_NUM); |
| 386 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM); | 387 llvm::SmallBitVector IntegerRegistersI32(RegisterSet::Reg_NUM); |
| 387 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM); | 388 llvm::SmallBitVector IntegerRegistersI16(RegisterSet::Reg_NUM); |
| 388 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM); | 389 llvm::SmallBitVector IntegerRegistersI8(RegisterSet::Reg_NUM); |
| 389 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM); | 390 llvm::SmallBitVector FloatRegisters(RegisterSet::Reg_NUM); |
| 390 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM); | 391 llvm::SmallBitVector VectorRegisters(RegisterSet::Reg_NUM); |
| 392 llvm::SmallBitVector Trunc64To8Registers(RegisterSet::Reg_NUM); |
| 393 llvm::SmallBitVector Trunc32To8Registers(RegisterSet::Reg_NUM); |
| 394 llvm::SmallBitVector Trunc16To8Registers(RegisterSet::Reg_NUM); |
| 395 llvm::SmallBitVector Trunc8RcvrRegisters(RegisterSet::Reg_NUM); |
| 396 llvm::SmallBitVector AhRcvrRegisters(RegisterSet::Reg_NUM); |
| 391 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM); | 397 llvm::SmallBitVector InvalidRegisters(RegisterSet::Reg_NUM); |
| 392 ScratchRegs->resize(RegisterSet::Reg_NUM); | 398 ScratchRegs->resize(RegisterSet::Reg_NUM); |
| 393 | 399 |
| 394 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ | 400 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ |
| 395 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ | 401 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ |
| 396 isTrunc8Rcvr, isAhRcvr, aliases) \ | 402 isTrunc8Rcvr, isAhRcvr, aliases) \ |
| 397 (IntegerRegistersI64)[RegisterSet::val] = is64; \ | 403 (IntegerRegistersI64)[RegisterSet::val] = is64; \ |
| 398 (IntegerRegistersI32)[RegisterSet::val] = is32; \ | 404 (IntegerRegistersI32)[RegisterSet::val] = is32; \ |
| 399 (IntegerRegistersI16)[RegisterSet::val] = is16; \ | 405 (IntegerRegistersI16)[RegisterSet::val] = is16; \ |
| 400 (IntegerRegistersI8)[RegisterSet::val] = is8; \ | 406 (IntegerRegistersI8)[RegisterSet::val] = is8; \ |
| 401 (FloatRegisters)[RegisterSet::val] = isXmm; \ | 407 (FloatRegisters)[RegisterSet::val] = isXmm; \ |
| 402 (VectorRegisters)[RegisterSet::val] = isXmm; \ | 408 (VectorRegisters)[RegisterSet::val] = isXmm; \ |
| 409 (Trunc64To8Registers)[RegisterSet::val] = is64To8; \ |
| 410 (Trunc32To8Registers)[RegisterSet::val] = is32To8; \ |
| 411 (Trunc16To8Registers)[RegisterSet::val] = is16To8; \ |
| 412 (Trunc8RcvrRegisters)[RegisterSet::val] = isTrunc8Rcvr; \ |
| 413 (AhRcvrRegisters)[RegisterSet::val] = isAhRcvr; \ |
| 403 (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \ | 414 (*RegisterAliases)[RegisterSet::val].resize(RegisterSet::Reg_NUM); \ |
| 404 for (SizeT RegAlias : aliases) { \ | 415 for (SizeT RegAlias : aliases) { \ |
| 405 assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \ | 416 assert(!(*RegisterAliases)[RegisterSet::val][RegAlias] && \ |
| 406 "Duplicate alias for " #val); \ | 417 "Duplicate alias for " #val); \ |
| 407 (*RegisterAliases)[RegisterSet::val].set(RegAlias); \ | 418 (*RegisterAliases)[RegisterSet::val].set(RegAlias); \ |
| 408 } \ | 419 } \ |
| 409 (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \ | 420 (*RegisterAliases)[RegisterSet::val].set(RegisterSet::val); \ |
| 410 (*ScratchRegs)[RegisterSet::val] = scratch; | 421 (*ScratchRegs)[RegisterSet::val] = scratch; |
| 411 REGX8664_TABLE; | 422 REGX8664_TABLE; |
| 412 #undef X | 423 #undef X |
| 413 | 424 |
| 414 (*TypeToRegisterSet)[IceType_void] = InvalidRegisters; | 425 (*TypeToRegisterSet)[RC_void] = InvalidRegisters; |
| 415 (*TypeToRegisterSet)[IceType_i1] = IntegerRegistersI8; | 426 (*TypeToRegisterSet)[RC_i1] = IntegerRegistersI8; |
| 416 (*TypeToRegisterSet)[IceType_i8] = IntegerRegistersI8; | 427 (*TypeToRegisterSet)[RC_i8] = IntegerRegistersI8; |
| 417 (*TypeToRegisterSet)[IceType_i16] = IntegerRegistersI16; | 428 (*TypeToRegisterSet)[RC_i16] = IntegerRegistersI16; |
| 418 (*TypeToRegisterSet)[IceType_i32] = IntegerRegistersI32; | 429 (*TypeToRegisterSet)[RC_i32] = IntegerRegistersI32; |
| 419 (*TypeToRegisterSet)[IceType_i64] = IntegerRegistersI64; | 430 (*TypeToRegisterSet)[RC_i64] = IntegerRegistersI64; |
| 420 (*TypeToRegisterSet)[IceType_f32] = FloatRegisters; | 431 (*TypeToRegisterSet)[RC_f32] = FloatRegisters; |
| 421 (*TypeToRegisterSet)[IceType_f64] = FloatRegisters; | 432 (*TypeToRegisterSet)[RC_f64] = FloatRegisters; |
| 422 (*TypeToRegisterSet)[IceType_v4i1] = VectorRegisters; | 433 (*TypeToRegisterSet)[RC_v4i1] = VectorRegisters; |
| 423 (*TypeToRegisterSet)[IceType_v8i1] = VectorRegisters; | 434 (*TypeToRegisterSet)[RC_v8i1] = VectorRegisters; |
| 424 (*TypeToRegisterSet)[IceType_v16i1] = VectorRegisters; | 435 (*TypeToRegisterSet)[RC_v16i1] = VectorRegisters; |
| 425 (*TypeToRegisterSet)[IceType_v16i8] = VectorRegisters; | 436 (*TypeToRegisterSet)[RC_v16i8] = VectorRegisters; |
| 426 (*TypeToRegisterSet)[IceType_v8i16] = VectorRegisters; | 437 (*TypeToRegisterSet)[RC_v8i16] = VectorRegisters; |
| 427 (*TypeToRegisterSet)[IceType_v4i32] = VectorRegisters; | 438 (*TypeToRegisterSet)[RC_v4i32] = VectorRegisters; |
| 428 (*TypeToRegisterSet)[IceType_v4f32] = VectorRegisters; | 439 (*TypeToRegisterSet)[RC_v4f32] = VectorRegisters; |
| 440 (*TypeToRegisterSet)[RCX86_Is64To8] = Trunc64To8Registers; |
| 441 (*TypeToRegisterSet)[RCX86_Is32To8] = Trunc32To8Registers; |
| 442 (*TypeToRegisterSet)[RCX86_Is16To8] = Trunc16To8Registers; |
| 443 (*TypeToRegisterSet)[RCX86_IsTrunc8Rcvr] = Trunc8RcvrRegisters; |
| 444 (*TypeToRegisterSet)[RCX86_IsAhRcvr] = AhRcvrRegisters; |
| 429 } | 445 } |
| 430 | 446 |
| 431 static llvm::SmallBitVector | 447 static llvm::SmallBitVector |
| 432 getRegisterSet(TargetLowering::RegSetMask Include, | 448 getRegisterSet(TargetLowering::RegSetMask Include, |
| 433 TargetLowering::RegSetMask Exclude) { | 449 TargetLowering::RegSetMask Exclude) { |
| 434 llvm::SmallBitVector Registers(RegisterSet::Reg_NUM); | 450 llvm::SmallBitVector Registers(RegisterSet::Reg_NUM); |
| 435 | 451 |
| 436 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ | 452 #define X(val, encode, name, base, scratch, preserved, stackptr, frameptr, \ |
| 437 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ | 453 isGPR, is64, is32, is16, is8, isXmm, is64To8, is32To8, is16To8, \ |
| 438 isTrunc8Rcvr, isAhRcvr, aliases) \ | 454 isTrunc8Rcvr, isAhRcvr, aliases) \ |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 uint32_t AttrKey = 0; \ | 507 uint32_t AttrKey = 0; \ |
| 492 uint32_t Index = 0; \ | 508 uint32_t Index = 0; \ |
| 493 /* Combine relevant attributes into an equivalence class key. */ \ | 509 /* Combine relevant attributes into an equivalence class key. */ \ |
| 494 Index |= (scratch << (AttrKey++)); \ | 510 Index |= (scratch << (AttrKey++)); \ |
| 495 Index |= (preserved << (AttrKey++)); \ | 511 Index |= (preserved << (AttrKey++)); \ |
| 496 Index |= (is8 << (AttrKey++)); \ | 512 Index |= (is8 << (AttrKey++)); \ |
| 497 Index |= (is16 << (AttrKey++)); \ | 513 Index |= (is16 << (AttrKey++)); \ |
| 498 Index |= (is32 << (AttrKey++)); \ | 514 Index |= (is32 << (AttrKey++)); \ |
| 499 Index |= (is64 << (AttrKey++)); \ | 515 Index |= (is64 << (AttrKey++)); \ |
| 500 Index |= (isXmm << (AttrKey++)); \ | 516 Index |= (isXmm << (AttrKey++)); \ |
| 517 Index |= (is16To8 << (AttrKey++)); \ |
| 518 Index |= (is32To8 << (AttrKey++)); \ |
| 519 Index |= (is64To8 << (AttrKey++)); \ |
| 520 Index |= (isTrunc8Rcvr << (AttrKey++)); \ |
| 501 /* val is assigned to an equivalence class based on its properties. */ \ | 521 /* val is assigned to an equivalence class based on its properties. */ \ |
| 502 EquivalenceClasses[Index].push_back(RegisterSet::val); \ | 522 EquivalenceClasses[Index].push_back(RegisterSet::val); \ |
| 503 } | 523 } |
| 504 REGX8664_TABLE | 524 REGX8664_TABLE |
| 505 #undef X | 525 #undef X |
| 506 | 526 |
| 507 // Create a random number generator for regalloc randomization. | 527 // Create a random number generator for regalloc randomization. |
| 508 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(), | 528 RandomNumberGenerator RNG(Ctx->getFlags().getRandomSeed(), |
| 509 RPE_RegAllocRandomization, Salt); | 529 RPE_RegAllocRandomization, Salt); |
| 510 RandomNumberGeneratorWrapper RNGW(RNG); | 530 RandomNumberGeneratorWrapper RNGW(RNG); |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 | 839 |
| 820 } // end of namespace X86Internal | 840 } // end of namespace X86Internal |
| 821 | 841 |
| 822 namespace X8664 { | 842 namespace X8664 { |
| 823 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8664>; | 843 using Traits = ::Ice::X86Internal::MachineTraits<TargetX8664>; |
| 824 } // end of namespace X8664 | 844 } // end of namespace X8664 |
| 825 | 845 |
| 826 } // end of namespace Ice | 846 } // end of namespace Ice |
| 827 | 847 |
| 828 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H | 848 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8664TRAITS_H |
| OLD | NEW |