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

Side by Side Diff: src/IceTargetLoweringX8664Traits.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/IceTargetLoweringX8664.cpp ('k') | src/IceTargetLoweringX86Base.h » ('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/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
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
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
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
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX8664.cpp ('k') | src/IceTargetLoweringX86Base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698