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 |
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...) Loading... |
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...) Loading... |
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...) Loading... |
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 |
OLD | NEW |