Chromium Code Reviews| Index: src/IceAssemblerX86BaseImpl.h |
| diff --git a/src/IceAssemblerX86BaseImpl.h b/src/IceAssemblerX86BaseImpl.h |
| index 912130a38a73346e3e7f57b8e8ef40b9e2d583b0..e20e950858b1feb6f9d872a61dd7037e176cff15 100644 |
| --- a/src/IceAssemblerX86BaseImpl.h |
| +++ b/src/IceAssemblerX86BaseImpl.h |
| @@ -152,6 +152,24 @@ void AssemblerX86Base<TraitsType>::pushl(GPRRegister reg) { |
| } |
| template <typename TraitsType> |
| +void AssemblerX86Base<TraitsType>::pushl(const Immediate &Imm) { |
| + AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| + emitUint8(0x68); |
| + emitInt32(Imm.value()); |
| +} |
| + |
| +template <typename TraitsType> |
| +void AssemblerX86Base<TraitsType>::pushl(const ConstantRelocatable *Label) { |
| + AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| + intptr_t call_start = Buffer.getPosition(); |
| + emitUint8(0x68); |
| + emitFixup(this->createFixup(Traits::FK_Abs, Label)); |
| + emitInt32(-4); |
|
sehr
2016/01/13 21:14:01
Magic constant -4? What's the relevance of that n
John
2016/01/13 21:40:25
-4 is usually emitted because, in x86-32, this val
|
| + assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize); |
| + (void)call_start; |
| +} |
| + |
| +template <typename TraitsType> |
| void AssemblerX86Base<TraitsType>::popl(GPRRegister reg) { |
| AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| // Any type that would not force a REX prefix to be emitted can be provided |
| @@ -382,7 +400,8 @@ template <typename TraitsType> |
| void AssemblerX86Base<TraitsType>::lea(Type Ty, GPRRegister dst, |
| const Address &src) { |
| AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| - assert(Ty == IceType_i16 || Ty == IceType_i32); |
| + assert(Ty == IceType_i16 || Ty == IceType_i32 || |
| + (Traits::Is64Bit && Ty == IceType_i64)); |
| if (Ty == IceType_i16) |
| emitOperandSizeOverride(); |
| emitAddrSizeOverridePrefix(); |
| @@ -3140,7 +3159,6 @@ void AssemblerX86Base<TraitsType>::jmp(Label *label, bool near) { |
| template <typename TraitsType> |
| void AssemblerX86Base<TraitsType>::jmp(const ConstantRelocatable *label) { |
| - llvm::report_fatal_error("Untested - please verify and then reenable."); |
| AssemblerBuffer::EnsureCapacity ensured(&Buffer); |
| emitUint8(0xE9); |
| emitFixup(this->createFixup(Traits::FK_PcRel, label)); |
| @@ -3308,21 +3326,22 @@ void AssemblerX86Base<TraitsType>::align(intptr_t alignment, intptr_t offset) { |
| template <typename TraitsType> |
| void AssemblerX86Base<TraitsType>::bind(Label *label) { |
| - intptr_t bound = Buffer.size(); |
| + const intptr_t Bound = Buffer.size(); |
| assert(!label->isBound()); // Labels can only be bound once. |
| while (label->isLinked()) { |
| - intptr_t position = label->getLinkPosition(); |
| - intptr_t next = Buffer.load<int32_t>(position); |
| - Buffer.store<int32_t>(position, bound - (position + 4)); |
| - label->Position = next; |
| + const intptr_t Position = label->getLinkPosition(); |
| + const intptr_t Next = Buffer.load<int32_t>(Position); |
| + const intptr_t Offset = Bound - (Position + 4); |
| + Buffer.store<int32_t>(Position, Offset); |
| + label->Position = Next; |
| } |
| while (label->hasNear()) { |
| - intptr_t position = label->getNearPosition(); |
| - intptr_t offset = bound - (position + 1); |
| - assert(Utils::IsInt(8, offset)); |
| - Buffer.store<int8_t>(position, offset); |
| + intptr_t Position = label->getNearPosition(); |
| + const intptr_t Offset = Bound - (Position + 1); |
| + assert(Utils::IsInt(8, Offset)); |
| + Buffer.store<int8_t>(Position, Offset); |
| } |
| - label->bindTo(bound); |
| + label->bindTo(Bound); |
| } |
| template <typename TraitsType> |