OLD | NEW |
1 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 1 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
5 // | 5 // |
6 // Modified by the Subzero authors. | 6 // Modified by the Subzero authors. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // The Subzero Code Generator | 10 // The Subzero Code Generator |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 StrBuf << "L$" << Ty << "$" << Imm->getPoolEntryID(); | 60 StrBuf << "L$" << Ty << "$" << Imm->getPoolEntryID(); |
61 const RelocOffsetT Offset = 0; | 61 const RelocOffsetT Offset = 0; |
62 const bool SuppressMangling = true; | 62 const bool SuppressMangling = true; |
63 Constant *Sym = | 63 Constant *Sym = |
64 Ctx->getConstantSym(Ty, Offset, StrBuf.str(), SuppressMangling); | 64 Ctx->getConstantSym(Ty, Offset, StrBuf.str(), SuppressMangling); |
65 AssemblerFixup *Fixup = x86::DisplacementRelocation::create( | 65 AssemblerFixup *Fixup = x86::DisplacementRelocation::create( |
66 Asm, FK_Abs_4, llvm::cast<ConstantRelocatable>(Sym)); | 66 Asm, FK_Abs_4, llvm::cast<ConstantRelocatable>(Sym)); |
67 return x86::Address::Absolute(Fixup); | 67 return x86::Address::Absolute(Fixup); |
68 } | 68 } |
69 | 69 |
| 70 AssemblerX86::~AssemblerX86() { |
| 71 #ifndef NDEBUG |
| 72 for (const Label *Label : CfgNodeLabels) { |
| 73 Label->FinalCheck(); |
| 74 } |
| 75 for (const Label *Label : LocalLabels) { |
| 76 Label->FinalCheck(); |
| 77 } |
| 78 #endif |
| 79 } |
| 80 |
| 81 Label *AssemblerX86::GetOrCreateLabel(SizeT Number, LabelVector &Labels) { |
| 82 Label *L = nullptr; |
| 83 if (Number == Labels.size()) { |
| 84 L = new (this->Allocate<Label>()) Label(); |
| 85 Labels.push_back(L); |
| 86 return L; |
| 87 } |
| 88 if (Number > Labels.size()) { |
| 89 Labels.resize(Number + 1); |
| 90 } |
| 91 L = Labels[Number]; |
| 92 if (!L) { |
| 93 L = new (this->Allocate<Label>()) Label(); |
| 94 Labels[Number] = L; |
| 95 } |
| 96 return L; |
| 97 } |
| 98 |
| 99 Label *AssemblerX86::GetOrCreateCfgNodeLabel(SizeT NodeNumber) { |
| 100 return GetOrCreateLabel(NodeNumber, CfgNodeLabels); |
| 101 } |
| 102 |
| 103 Label *AssemblerX86::GetOrCreateLocalLabel(SizeT Number) { |
| 104 return GetOrCreateLabel(Number, LocalLabels); |
| 105 } |
| 106 |
| 107 void AssemblerX86::BindCfgNodeLabel(SizeT NodeNumber) { |
| 108 Label *L = GetOrCreateCfgNodeLabel(NodeNumber); |
| 109 this->Bind(L); |
| 110 } |
| 111 |
| 112 void AssemblerX86::BindLocalLabel(SizeT Number) { |
| 113 Label *L = GetOrCreateLocalLabel(Number); |
| 114 this->Bind(L); |
| 115 } |
| 116 |
70 void AssemblerX86::call(GPRRegister reg) { | 117 void AssemblerX86::call(GPRRegister reg) { |
71 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 118 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
72 EmitUint8(0xFF); | 119 EmitUint8(0xFF); |
73 EmitRegisterOperand(2, reg); | 120 EmitRegisterOperand(2, reg); |
74 } | 121 } |
75 | 122 |
76 void AssemblerX86::call(const Address &address) { | 123 void AssemblerX86::call(const Address &address) { |
77 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 124 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
78 EmitUint8(0xFF); | 125 EmitUint8(0xFF); |
79 EmitOperand(2, address); | 126 EmitOperand(2, address); |
(...skipping 2394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2474 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2521 assert(shifter == RegX8632::Encoded_Reg_ecx); |
2475 (void)shifter; | 2522 (void)shifter; |
2476 if (Ty == IceType_i16) | 2523 if (Ty == IceType_i16) |
2477 EmitOperandSizeOverride(); | 2524 EmitOperandSizeOverride(); |
2478 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 2525 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
2479 EmitOperand(rm, operand); | 2526 EmitOperand(rm, operand); |
2480 } | 2527 } |
2481 | 2528 |
2482 } // end of namespace x86 | 2529 } // end of namespace x86 |
2483 } // end of namespace Ice | 2530 } // end of namespace Ice |
OLD | NEW |