| OLD | NEW | 
|---|
| 1 //===- subzero/src/IceAssemblerARM32.cpp - Assembler for ARM32 --*- C++ -*-===// | 1 //===- subzero/src/IceAssemblerARM32.cpp - Assembler for ARM32 --*- C++ -*-===// | 
| 2 // | 2 // | 
| 3 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 3 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
| 4 // for details. All rights reserved. Use of this source code is governed by a | 4 // for details. All rights reserved. Use of this source code is governed by a | 
| 5 // BSD-style license that can be found in the LICENSE file. | 5 // BSD-style license that can be found in the LICENSE file. | 
| 6 // | 6 // | 
| 7 // Modified by the Subzero authors. | 7 // Modified by the Subzero authors. | 
| 8 // | 8 // | 
| 9 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// | 
| 10 // | 10 // | 
| (...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 586 namespace ARM32 { | 586 namespace ARM32 { | 
| 587 | 587 | 
| 588 size_t MoveRelocatableFixup::emit(GlobalContext *Ctx, | 588 size_t MoveRelocatableFixup::emit(GlobalContext *Ctx, | 
| 589                                   const Assembler &Asm) const { | 589                                   const Assembler &Asm) const { | 
| 590   if (!BuildDefs::dump()) | 590   if (!BuildDefs::dump()) | 
| 591     return InstARM32::InstSize; | 591     return InstARM32::InstSize; | 
| 592   Ostream &Str = Ctx->getStrEmit(); | 592   Ostream &Str = Ctx->getStrEmit(); | 
| 593   IValueT Inst = Asm.load<IValueT>(position()); | 593   IValueT Inst = Asm.load<IValueT>(position()); | 
| 594   const bool IsMovw = kind() == llvm::ELF::R_ARM_MOVW_ABS_NC || | 594   const bool IsMovw = kind() == llvm::ELF::R_ARM_MOVW_ABS_NC || | 
| 595                       kind() == llvm::ELF::R_ARM_MOVW_PREL_NC; | 595                       kind() == llvm::ELF::R_ARM_MOVW_PREL_NC; | 
| 596   const IceString Symbol = symbol(); | 596   const auto Symbol = symbol().toString(); | 
| 597   const bool NeedsPCRelSuffix = | 597   const bool NeedsPCRelSuffix = | 
| 598       (Asm.fixupIsPCRel(kind()) || Symbol == GlobalOffsetTable); | 598       (Asm.fixupIsPCRel(kind()) || Symbol == GlobalOffsetTable); | 
| 599   Str << "\t" | 599   Str << "\t" | 
| 600          "mov" << (IsMovw ? "w" : "t") << "\t" | 600          "mov" << (IsMovw ? "w" : "t") << "\t" | 
| 601       << RegARM32::getRegName(RegNumT::fixme((Inst >> kRdShift) & 0xF)) | 601       << RegARM32::getRegName(RegNumT::fixme((Inst >> kRdShift) & 0xF)) | 
| 602       << ", #:" << (IsMovw ? "lower" : "upper") << "16:" << Symbol | 602       << ", #:" << (IsMovw ? "lower" : "upper") << "16:" << Symbol | 
| 603       << (NeedsPCRelSuffix ? " - ." : "") << "\t@ .word " | 603       << (NeedsPCRelSuffix ? " - ." : "") << "\t@ .word " | 
| 604       // TODO(jpp): This is broken, it also needs to add a magic constant. | 604       // TODO(jpp): This is broken, it also needs to add a magic constant. | 
| 605       << llvm::format_hex_no_prefix(Inst, 8) << "\n"; | 605       << llvm::format_hex_no_prefix(Inst, 8) << "\n"; | 
| 606   return InstARM32::InstSize; | 606   return InstARM32::InstSize; | 
| 607 } | 607 } | 
| 608 | 608 | 
| 609 IValueT AssemblerARM32::encodeElmtType(Type ElmtTy) { | 609 IValueT AssemblerARM32::encodeElmtType(Type ElmtTy) { | 
| 610   switch (ElmtTy) { | 610   switch (ElmtTy) { | 
| 611   case IceType_i8: | 611   case IceType_i8: | 
| 612     return 0; | 612     return 0; | 
| 613   case IceType_i16: | 613   case IceType_i16: | 
| 614     return 1; | 614     return 1; | 
| 615   case IceType_i32: | 615   case IceType_i32: | 
| 616   case IceType_f32: | 616   case IceType_f32: | 
| 617     return 2; | 617     return 2; | 
| 618   case IceType_i64: | 618   case IceType_i64: | 
| 619     return 3; | 619     return 3; | 
| 620   default: | 620   default: | 
| 621     llvm::report_fatal_error("SIMD op: Don't understand element type " + | 621     llvm::report_fatal_error("SIMD op: Don't understand element type " + | 
| 622                              typeIceString(ElmtTy)); | 622                              typeStdString(ElmtTy)); | 
| 623   } | 623   } | 
| 624 } | 624 } | 
| 625 | 625 | 
| 626 // This fixup points to an ARM32 instruction with the following format: | 626 // This fixup points to an ARM32 instruction with the following format: | 
| 627 void MoveRelocatableFixup::emitOffset(Assembler *Asm) const { | 627 void MoveRelocatableFixup::emitOffset(Assembler *Asm) const { | 
| 628   // cccc00110T00iiiiddddiiiiiiiiiiii where cccc=Cond, dddd=Rd, | 628   // cccc00110T00iiiiddddiiiiiiiiiiii where cccc=Cond, dddd=Rd, | 
| 629   // iiiiiiiiiiiiiiii = Imm16, and T=1 for movt. | 629   // iiiiiiiiiiiiiiii = Imm16, and T=1 for movt. | 
| 630 | 630 | 
| 631   const IValueT Inst = Asm->load<IValueT>(position()); | 631   const IValueT Inst = Asm->load<IValueT>(position()); | 
| 632   constexpr IValueT Imm16Mask = 0x000F0FFF; | 632   constexpr IValueT Imm16Mask = 0x000F0FFF; | 
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1035   assert(Rt != RegARM32::Encoded_Reg_pc); | 1035   assert(Rt != RegARM32::Encoded_Reg_pc); | 
| 1036   assert(Rt != RegARM32::Encoded_Reg_sp); | 1036   assert(Rt != RegARM32::Encoded_Reg_sp); | 
| 1037   assert(CondARM32::isDefined(Cond)); | 1037   assert(CondARM32::isDefined(Cond)); | 
| 1038   const uint32_t BitSize = typeWidthInBytes(OpRt->getType()) * CHAR_BIT; | 1038   const uint32_t BitSize = typeWidthInBytes(OpRt->getType()) * CHAR_BIT; | 
| 1039   IValueT Opcode1 = 0; | 1039   IValueT Opcode1 = 0; | 
| 1040   IValueT Opcode2 = 0; | 1040   IValueT Opcode2 = 0; | 
| 1041   switch (BitSize) { | 1041   switch (BitSize) { | 
| 1042   default: | 1042   default: | 
| 1043     llvm::report_fatal_error(std::string(InstName) + | 1043     llvm::report_fatal_error(std::string(InstName) + | 
| 1044                              ": Unable to process type " + | 1044                              ": Unable to process type " + | 
| 1045                              typeIceString(OpRt->getType())); | 1045                              typeStdString(OpRt->getType())); | 
| 1046   case 8: | 1046   case 8: | 
| 1047     assert(Index < 16); | 1047     assert(Index < 16); | 
| 1048     Dn = Dn | mask(Index, 3, 1); | 1048     Dn = Dn | mask(Index, 3, 1); | 
| 1049     Opcode1 = B1 | mask(Index, 2, 1); | 1049     Opcode1 = B1 | mask(Index, 2, 1); | 
| 1050     Opcode2 = mask(Index, 0, 2); | 1050     Opcode2 = mask(Index, 0, 2); | 
| 1051     break; | 1051     break; | 
| 1052   case 16: | 1052   case 16: | 
| 1053     assert(Index < 8); | 1053     assert(Index < 8); | 
| 1054     Dn = Dn | mask(Index, 2, 1); | 1054     Dn = Dn | mask(Index, 2, 1); | 
| 1055     Opcode1 = mask(Index, 1, 1); | 1055     Opcode1 = mask(Index, 1, 1); | 
| (...skipping 2145 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3201   constexpr const char *Vsqrts = "vsqrts"; | 3201   constexpr const char *Vsqrts = "vsqrts"; | 
| 3202   IValueT Sd = encodeSRegister(OpSd, "Sd", Vsqrts); | 3202   IValueT Sd = encodeSRegister(OpSd, "Sd", Vsqrts); | 
| 3203   IValueT Sm = encodeSRegister(OpSm, "Sm", Vsqrts); | 3203   IValueT Sm = encodeSRegister(OpSm, "Sm", Vsqrts); | 
| 3204   constexpr IValueT VsqrtsOpcode = B23 | B21 | B20 | B16 | B7 | B6; | 3204   constexpr IValueT VsqrtsOpcode = B23 | B21 | B20 | B16 | B7 | B6; | 
| 3205   constexpr IValueT S0 = 0; | 3205   constexpr IValueT S0 = 0; | 
| 3206   emitVFPsss(Cond, VsqrtsOpcode, Sd, S0, Sm); | 3206   emitVFPsss(Cond, VsqrtsOpcode, Sd, S0, Sm); | 
| 3207 } | 3207 } | 
| 3208 | 3208 | 
| 3209 } // end of namespace ARM32 | 3209 } // end of namespace ARM32 | 
| 3210 } // end of namespace Ice | 3210 } // end of namespace Ice | 
| OLD | NEW | 
|---|