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 |
11 // | 11 // |
12 // This file is distributed under the University of Illinois Open Source | 12 // This file is distributed under the University of Illinois Open Source |
13 // License. See LICENSE.TXT for details. | 13 // License. See LICENSE.TXT for details. |
14 // | 14 // |
15 //===----------------------------------------------------------------------===// | 15 //===----------------------------------------------------------------------===// |
16 // | 16 // |
17 // This file implements the Assembler class for x86-32. | 17 // This file implements the Assembler class for x86-32. |
18 // | 18 // |
19 //===----------------------------------------------------------------------===// | 19 //===----------------------------------------------------------------------===// |
20 | 20 |
21 #include "assembler_ia32.h" | 21 #include "assembler_ia32.h" |
22 #include "IceCfg.h" | 22 #include "IceCfg.h" |
23 #include "IceMemoryRegion.h" | |
24 #include "IceOperand.h" | 23 #include "IceOperand.h" |
25 | 24 |
26 namespace Ice { | 25 namespace Ice { |
27 namespace x86 { | 26 namespace x86 { |
28 | 27 |
29 class DirectCallRelocation : public AssemblerFixup { | 28 class DirectCallRelocation : public AssemblerFixup { |
30 DirectCallRelocation(const DirectCallRelocation &) = delete; | 29 DirectCallRelocation(const DirectCallRelocation &) = delete; |
31 DirectCallRelocation &operator=(const DirectCallRelocation &) = delete; | 30 DirectCallRelocation &operator=(const DirectCallRelocation &) = delete; |
32 | 31 |
33 public: | 32 public: |
34 static DirectCallRelocation *create(Assembler *Asm, FixupKind Kind, | 33 static DirectCallRelocation *create(Assembler *Asm, FixupKind Kind, |
35 const ConstantRelocatable *Sym) { | 34 const ConstantRelocatable *Sym) { |
36 return new (Asm->Allocate<DirectCallRelocation>()) | 35 return new (Asm->Allocate<DirectCallRelocation>()) |
37 DirectCallRelocation(Kind, Sym); | 36 DirectCallRelocation(Kind, Sym); |
38 } | 37 } |
39 | 38 |
40 void Process(const MemoryRegion ®ion, intptr_t position) override { | |
41 // Direct calls are relative to the following instruction on x86. | |
42 int32_t pointer = region.Load<int32_t>(position); | |
43 int32_t delta = region.start() + position + sizeof(int32_t); | |
44 region.Store<int32_t>(position, pointer - delta); | |
45 } | |
46 | |
47 private: | 39 private: |
48 DirectCallRelocation(FixupKind Kind, const ConstantRelocatable *Sym) | 40 DirectCallRelocation(FixupKind Kind, const ConstantRelocatable *Sym) |
49 : AssemblerFixup(Kind, Sym) {} | 41 : AssemblerFixup(Kind, Sym) {} |
50 }; | 42 }; |
51 | 43 |
52 Address Address::ofConstPool(GlobalContext *Ctx, Assembler *Asm, | 44 Address Address::ofConstPool(GlobalContext *Ctx, Assembler *Asm, |
53 const Constant *Imm) { | 45 const Constant *Imm) { |
54 // We should make this much lighter-weight. E.g., just record the const pool | 46 // We should make this much lighter-weight. E.g., just record the const pool |
55 // entry ID. | 47 // entry ID. |
56 std::string Buffer; | 48 std::string Buffer; |
(...skipping 14 matching lines...) Expand all Loading... |
71 #ifndef NDEBUG | 63 #ifndef NDEBUG |
72 for (const Label *Label : CfgNodeLabels) { | 64 for (const Label *Label : CfgNodeLabels) { |
73 Label->FinalCheck(); | 65 Label->FinalCheck(); |
74 } | 66 } |
75 for (const Label *Label : LocalLabels) { | 67 for (const Label *Label : LocalLabels) { |
76 Label->FinalCheck(); | 68 Label->FinalCheck(); |
77 } | 69 } |
78 #endif | 70 #endif |
79 } | 71 } |
80 | 72 |
| 73 void AssemblerX86::alignFunction() { |
| 74 intptr_t Pos = buffer_.GetPosition(); |
| 75 SizeT Align = 1 << getBundleAlignLog2Bytes(); |
| 76 intptr_t Mod = Pos & (Align - 1); |
| 77 if (Mod == 0) { |
| 78 return; |
| 79 } |
| 80 SizeT BytesNeeded = Align - Mod; |
| 81 const SizeT HltSize = 1; |
| 82 while (BytesNeeded > 0) { |
| 83 hlt(); |
| 84 BytesNeeded -= HltSize; |
| 85 } |
| 86 assert((buffer_.GetPosition() & (Align - 1)) == 0); |
| 87 } |
| 88 |
81 Label *AssemblerX86::GetOrCreateLabel(SizeT Number, LabelVector &Labels) { | 89 Label *AssemblerX86::GetOrCreateLabel(SizeT Number, LabelVector &Labels) { |
82 Label *L = nullptr; | 90 Label *L = nullptr; |
83 if (Number == Labels.size()) { | 91 if (Number == Labels.size()) { |
84 L = new (this->Allocate<Label>()) Label(); | 92 L = new (this->Allocate<Label>()) Label(); |
85 Labels.push_back(L); | 93 Labels.push_back(L); |
86 return L; | 94 return L; |
87 } | 95 } |
88 if (Number > Labels.size()) { | 96 if (Number > Labels.size()) { |
89 Labels.resize(Number + 1); | 97 Labels.resize(Number + 1); |
90 } | 98 } |
(...skipping 2430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2521 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2529 assert(shifter == RegX8632::Encoded_Reg_ecx); |
2522 (void)shifter; | 2530 (void)shifter; |
2523 if (Ty == IceType_i16) | 2531 if (Ty == IceType_i16) |
2524 EmitOperandSizeOverride(); | 2532 EmitOperandSizeOverride(); |
2525 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 2533 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
2526 EmitOperand(rm, operand); | 2534 EmitOperand(rm, operand); |
2527 } | 2535 } |
2528 | 2536 |
2529 } // end of namespace x86 | 2537 } // end of namespace x86 |
2530 } // end of namespace Ice | 2538 } // end of namespace Ice |
OLD | NEW |