| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===// |
| 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 14 matching lines...) Expand all Loading... |
| 25 std::unique_ptr<::Ice::TargetDataLowering> | 25 std::unique_ptr<::Ice::TargetDataLowering> |
| 26 createTargetDataLowering(::Ice::GlobalContext *Ctx) { | 26 createTargetDataLowering(::Ice::GlobalContext *Ctx) { |
| 27 return ::Ice::X8664::TargetDataX8664::create(Ctx); | 27 return ::Ice::X8664::TargetDataX8664::create(Ctx); |
| 28 } | 28 } |
| 29 | 29 |
| 30 std::unique_ptr<::Ice::TargetHeaderLowering> | 30 std::unique_ptr<::Ice::TargetHeaderLowering> |
| 31 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { | 31 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
| 32 return ::Ice::X8664::TargetHeaderX8664::create(Ctx); | 32 return ::Ice::X8664::TargetHeaderX8664::create(Ctx); |
| 33 } | 33 } |
| 34 | 34 |
| 35 void staticInit() { ::Ice::X8664::TargetX8664::staticInit(); } | 35 void staticInit(const ::Ice::ClFlags &Flags) { |
| 36 ::Ice::X8664::TargetX8664::staticInit(Flags); |
| 37 } |
| 36 } // end of namespace X8664 | 38 } // end of namespace X8664 |
| 37 | 39 |
| 38 namespace Ice { | 40 namespace Ice { |
| 39 namespace X8664 { | 41 namespace X8664 { |
| 40 | 42 |
| 41 //------------------------------------------------------------------------------ | 43 //------------------------------------------------------------------------------ |
| 42 // ______ ______ ______ __ ______ ______ | 44 // ______ ______ ______ __ ______ ______ |
| 43 // /\__ _\ /\ == \ /\ __ \ /\ \ /\__ _\ /\ ___\ | 45 // /\__ _\ /\ == \ /\ __ \ /\ \ /\__ _\ /\ ___\ |
| 44 // \/_/\ \/ \ \ __< \ \ __ \ \ \ \ \/_/\ \/ \ \___ \ | 46 // \/_/\ \/ \ \ __< \ \ __ \ \ \ \ \/_/\ \/ \ \___ \ |
| 45 // \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_\ \ \_\ \/\_____\ | 47 // \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_\ \ \_\ \/\_____\ |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 107 |
| 106 template <> | 108 template <> |
| 107 std::array<llvm::SmallBitVector, | 109 std::array<llvm::SmallBitVector, |
| 108 TargetX86Base<X8664::Traits>::Traits::RegisterSet::Reg_NUM> | 110 TargetX86Base<X8664::Traits>::Traits::RegisterSet::Reg_NUM> |
| 109 TargetX86Base<X8664::Traits>::RegisterAliases = {{}}; | 111 TargetX86Base<X8664::Traits>::RegisterAliases = {{}}; |
| 110 | 112 |
| 111 template <> | 113 template <> |
| 112 llvm::SmallBitVector | 114 llvm::SmallBitVector |
| 113 TargetX86Base<X8664::Traits>::ScratchRegs = llvm::SmallBitVector(); | 115 TargetX86Base<X8664::Traits>::ScratchRegs = llvm::SmallBitVector(); |
| 114 | 116 |
| 117 template <> |
| 118 FixupKind TargetX86Base<X8664::Traits>::PcRelFixup = |
| 119 TargetX86Base<X8664::Traits>::Traits::FK_PcRel; |
| 120 |
| 121 template <> |
| 122 FixupKind TargetX86Base<X8664::Traits>::AbsFixup = |
| 123 TargetX86Base<X8664::Traits>::Traits::FK_Abs; |
| 124 |
| 115 //------------------------------------------------------------------------------ | 125 //------------------------------------------------------------------------------ |
| 116 // __ ______ __ __ ______ ______ __ __ __ ______ | 126 // __ ______ __ __ ______ ______ __ __ __ ______ |
| 117 // /\ \ /\ __ \/\ \ _ \ \/\ ___\/\ == \/\ \/\ "-.\ \/\ ___\ | 127 // /\ \ /\ __ \/\ \ _ \ \/\ ___\/\ == \/\ \/\ "-.\ \/\ ___\ |
| 118 // \ \ \___\ \ \/\ \ \ \/ ".\ \ \ __\\ \ __<\ \ \ \ \-. \ \ \__ \ | 128 // \ \ \___\ \ \/\ \ \ \/ ".\ \ \ __\\ \ __<\ \ \ \ \-. \ \ \__ \ |
| 119 // \ \_____\ \_____\ \__/".~\_\ \_____\ \_\ \_\ \_\ \_\\"\_\ \_____\ | 129 // \ \_____\ \_____\ \__/".~\_\ \_____\ \_\ \_\ \_\ \_\\"\_\ \_____\ |
| 120 // \/_____/\/_____/\/_/ \/_/\/_____/\/_/ /_/\/_/\/_/ \/_/\/_____/ | 130 // \/_____/\/_____/\/_/ \/_/\/_____/\/_/ /_/\/_/\/_/ \/_/\/_____/ |
| 121 // | 131 // |
| 122 //------------------------------------------------------------------------------ | 132 //------------------------------------------------------------------------------ |
| 123 namespace { | 133 namespace { |
| 124 static inline TargetX8664::Traits::RegisterSet::AllRegisters | 134 static inline TargetX8664::Traits::RegisterSet::AllRegisters |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 _movp(Dest, ReturnReg); | 351 _movp(Dest, ReturnReg); |
| 342 } else { | 352 } else { |
| 343 assert(isScalarFloatingType(Dest->getType()) || | 353 assert(isScalarFloatingType(Dest->getType()) || |
| 344 isScalarIntegerType(Dest->getType())); | 354 isScalarIntegerType(Dest->getType())); |
| 345 _mov(Dest, ReturnReg); | 355 _mov(Dest, ReturnReg); |
| 346 } | 356 } |
| 347 } | 357 } |
| 348 | 358 |
| 349 void TargetX8664::lowerArguments() { | 359 void TargetX8664::lowerArguments() { |
| 350 VarList &Args = Func->getArgs(); | 360 VarList &Args = Func->getArgs(); |
| 351 // The first eight vetcor typed arguments (as well as fp arguments) are | 361 // The first eight vector typed arguments (as well as fp arguments) are |
| 352 // passed in %xmm0 through %xmm7 regardless of their position in the argument | 362 // passed in %xmm0 through %xmm7 regardless of their position in the argument |
| 353 // list. | 363 // list. |
| 354 unsigned NumXmmArgs = 0; | 364 unsigned NumXmmArgs = 0; |
| 355 // The first six integer typed arguments are passed in %rdi, %rsi, %rdx, | 365 // The first six integer typed arguments are passed in %rdi, %rsi, %rdx, |
| 356 // %rcx, %r8, and %r9 regardless of their position in the argument list. | 366 // %rcx, %r8, and %r9 regardless of their position in the argument list. |
| 357 unsigned NumGprArgs = 0; | 367 unsigned NumGprArgs = 0; |
| 358 | 368 |
| 359 Context.init(Func->getEntryNode()); | 369 Context.init(Func->getEntryNode()); |
| 360 Context.setInsertPoint(Context.getCur()); | 370 Context.setInsertPoint(Context.getCur()); |
| 361 | 371 |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 emitConstantPool<PoolTypeConverter<uint16_t>>(Ctx); | 893 emitConstantPool<PoolTypeConverter<uint16_t>>(Ctx); |
| 884 emitConstantPool<PoolTypeConverter<uint32_t>>(Ctx); | 894 emitConstantPool<PoolTypeConverter<uint32_t>>(Ctx); |
| 885 | 895 |
| 886 emitConstantPool<PoolTypeConverter<float>>(Ctx); | 896 emitConstantPool<PoolTypeConverter<float>>(Ctx); |
| 887 emitConstantPool<PoolTypeConverter<double>>(Ctx); | 897 emitConstantPool<PoolTypeConverter<double>>(Ctx); |
| 888 } break; | 898 } break; |
| 889 } | 899 } |
| 890 } | 900 } |
| 891 | 901 |
| 892 void TargetDataX8664::lowerJumpTables() { | 902 void TargetDataX8664::lowerJumpTables() { |
| 903 const bool IsPIC = Ctx->getFlags().getUseNonsfi(); |
| 893 switch (Ctx->getFlags().getOutFileType()) { | 904 switch (Ctx->getFlags().getOutFileType()) { |
| 894 case FT_Elf: { | 905 case FT_Elf: { |
| 895 ELFObjectWriter *Writer = Ctx->getObjectWriter(); | 906 ELFObjectWriter *Writer = Ctx->getObjectWriter(); |
| 896 for (const JumpTableData &JumpTable : Ctx->getJumpTables()) | 907 for (const JumpTableData &JumpTable : Ctx->getJumpTables()) |
| 897 Writer->writeJumpTable(JumpTable, TargetX8664::Traits::RelFixup); | 908 Writer->writeJumpTable(JumpTable, TargetX8664::Traits::FK_Abs, IsPIC); |
| 898 } break; | 909 } break; |
| 899 case FT_Asm: | 910 case FT_Asm: |
| 900 // Already emitted from Cfg | 911 // Already emitted from Cfg |
| 901 break; | 912 break; |
| 902 case FT_Iasm: { | 913 case FT_Iasm: { |
| 903 if (!BuildDefs::dump()) | 914 if (!BuildDefs::dump()) |
| 904 return; | 915 return; |
| 905 Ostream &Str = Ctx->getStrEmit(); | 916 Ostream &Str = Ctx->getStrEmit(); |
| 906 for (const JumpTableData &JT : Ctx->getJumpTables()) { | 917 for (const JumpTableData &JT : Ctx->getJumpTables()) { |
| 907 Str << "\t.section\t.rodata." << JT.getFunctionName() | 918 Str << "\t.section\t.rodata." << JT.getFunctionName() |
| 908 << "$jumptable,\"a\",@progbits\n"; | 919 << "$jumptable,\"a\",@progbits\n"; |
| 909 Str << "\t.align\t" << typeWidthInBytes(getPointerType()) << "\n"; | 920 Str << "\t.align\t" << typeWidthInBytes(getPointerType()) << "\n"; |
| 910 Str << InstJumpTable::makeName(JT.getFunctionName(), JT.getId()) << ":"; | 921 Str << InstJumpTable::makeName(JT.getFunctionName(), JT.getId()) << ":"; |
| 911 | 922 |
| 912 // On X8664 ILP32 pointers are 32-bit hence the use of .long | 923 // On X8664 ILP32 pointers are 32-bit hence the use of .long |
| 913 for (intptr_t TargetOffset : JT.getTargetOffsets()) | 924 for (intptr_t TargetOffset : JT.getTargetOffsets()) |
| 914 Str << "\n\t.long\t" << JT.getFunctionName() << "+" << TargetOffset; | 925 Str << "\n\t.long\t" << JT.getFunctionName() << "+" << TargetOffset; |
| 915 Str << "\n"; | 926 Str << "\n"; |
| 916 } | 927 } |
| 917 } break; | 928 } break; |
| 918 } | 929 } |
| 919 } | 930 } |
| 920 | 931 |
| 921 void TargetDataX8664::lowerGlobals(const VariableDeclarationList &Vars, | 932 void TargetDataX8664::lowerGlobals(const VariableDeclarationList &Vars, |
| 922 const IceString &SectionSuffix) { | 933 const IceString &SectionSuffix) { |
| 934 const bool IsPIC = Ctx->getFlags().getUseNonsfi(); |
| 923 switch (Ctx->getFlags().getOutFileType()) { | 935 switch (Ctx->getFlags().getOutFileType()) { |
| 924 case FT_Elf: { | 936 case FT_Elf: { |
| 925 ELFObjectWriter *Writer = Ctx->getObjectWriter(); | 937 ELFObjectWriter *Writer = Ctx->getObjectWriter(); |
| 926 Writer->writeDataSection(Vars, TargetX8664::Traits::RelFixup, | 938 Writer->writeDataSection(Vars, TargetX8664::Traits::FK_Abs, SectionSuffix, |
| 927 SectionSuffix); | 939 IsPIC); |
| 928 } break; | 940 } break; |
| 929 case FT_Asm: | 941 case FT_Asm: |
| 930 case FT_Iasm: { | 942 case FT_Iasm: { |
| 931 const IceString &TranslateOnly = Ctx->getFlags().getTranslateOnly(); | 943 const IceString &TranslateOnly = Ctx->getFlags().getTranslateOnly(); |
| 932 OstreamLocker L(Ctx); | 944 OstreamLocker L(Ctx); |
| 933 for (const VariableDeclaration *Var : Vars) { | 945 for (const VariableDeclaration *Var : Vars) { |
| 934 if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) { | 946 if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) { |
| 935 emitGlobal(*Var, SectionSuffix); | 947 emitGlobal(*Var, SectionSuffix); |
| 936 } | 948 } |
| 937 } | 949 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 #define X(tag, sizeLog2, align, elts, elty, str) \ | 1050 #define X(tag, sizeLog2, align, elts, elty, str) \ |
| 1039 static_assert(_table1_##tag == _table2_##tag, \ | 1051 static_assert(_table1_##tag == _table2_##tag, \ |
| 1040 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); | 1052 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); |
| 1041 ICETYPE_TABLE | 1053 ICETYPE_TABLE |
| 1042 #undef X | 1054 #undef X |
| 1043 } // end of namespace dummy3 | 1055 } // end of namespace dummy3 |
| 1044 } // end of anonymous namespace | 1056 } // end of anonymous namespace |
| 1045 | 1057 |
| 1046 } // end of namespace X8664 | 1058 } // end of namespace X8664 |
| 1047 } // end of namespace Ice | 1059 } // end of namespace Ice |
| OLD | NEW |