| Index: src/IceAssemblerX86BaseImpl.h
|
| diff --git a/src/IceAssemblerX86BaseImpl.h b/src/IceAssemblerX86BaseImpl.h
|
| index 58cd98f55bc780878c5ea9ae2b606f23d6b6de93..00856caefba8845423584112f24903efbdf3a6a5 100644
|
| --- a/src/IceAssemblerX86BaseImpl.h
|
| +++ b/src/IceAssemblerX86BaseImpl.h
|
| @@ -134,8 +134,10 @@ void AssemblerX86Base<TraitsType>::call(const ConstantRelocatable *label) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| intptr_t call_start = Buffer.getPosition();
|
| emitUint8(0xE8);
|
| - emitFixup(this->createFixup(Traits::FK_PcRel, label));
|
| - emitInt32(-4);
|
| + auto *Fixup = this->createFixup(Traits::FK_PcRel, label);
|
| + Fixup->set_addend(-4);
|
| + emitFixup(Fixup);
|
| + emitInt32(0);
|
| assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
|
| (void)call_start;
|
| }
|
| @@ -145,8 +147,10 @@ void AssemblerX86Base<TraitsType>::call(const Immediate &abs_address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| intptr_t call_start = Buffer.getPosition();
|
| emitUint8(0xE8);
|
| - emitFixup(this->createFixup(Traits::FK_PcRel, AssemblerFixup::NullSymbol));
|
| - emitInt32(abs_address.value() - 4);
|
| + auto *Fixup = this->createFixup(Traits::FK_PcRel, AssemblerFixup::NullSymbol);
|
| + Fixup->set_addend(abs_address.value() - 4);
|
| + emitFixup(Fixup);
|
| + emitInt32(0);
|
| assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
|
| (void)call_start;
|
| }
|
| @@ -3140,8 +3144,10 @@ void AssemblerX86Base<TraitsType>::j(BrCond condition,
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0x0F);
|
| emitUint8(0x80 + condition);
|
| - emitFixup(this->createFixup(Traits::FK_PcRel, label));
|
| - emitInt32(-4);
|
| + auto *Fixup = this->createFixup(Traits::FK_PcRel, label);
|
| + Fixup->set_addend(-4);
|
| + emitFixup(Fixup);
|
| + emitInt32(0);
|
| }
|
|
|
| template <typename TraitsType>
|
| @@ -3180,8 +3186,10 @@ template <typename TraitsType>
|
| void AssemblerX86Base<TraitsType>::jmp(const ConstantRelocatable *label) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0xE9);
|
| - emitFixup(this->createFixup(Traits::FK_PcRel, label));
|
| - emitInt32(-4);
|
| + auto *Fixup = this->createFixup(Traits::FK_PcRel, label);
|
| + Fixup->set_addend(-4);
|
| + emitFixup(Fixup);
|
| + emitInt32(0);
|
| }
|
|
|
| template <typename TraitsType>
|
| @@ -3189,10 +3197,10 @@ void AssemblerX86Base<TraitsType>::jmp(const Immediate &abs_address) {
|
| AssemblerBuffer::EnsureCapacity ensured(&Buffer);
|
| emitUint8(0xE9);
|
| AssemblerFixup *Fixup =
|
| - this->createFixup(Traits::FK_PcRel, AssemblerFixup::NullSymbol);
|
| - Fixup->set_addend(abs_address.value());
|
| + createFixup(Traits::FK_PcRel, AssemblerFixup::NullSymbol);
|
| + Fixup->set_addend(abs_address.value() - 4);
|
| emitFixup(Fixup);
|
| - emitInt32(abs_address.value() - 4);
|
| + emitInt32(0);
|
| }
|
|
|
| template <typename TraitsType> void AssemblerX86Base<TraitsType>::mfence() {
|
| @@ -3391,23 +3399,26 @@ void AssemblerX86Base<TraitsType>::emitOperand(int rm, const Operand &operand,
|
| emitUint8(operand.encoding_[1]);
|
| displacement_start = 2;
|
| }
|
| - // Emit the displacement and the fixup that affects it, if any.
|
| +
|
| AssemblerFixup *Fixup = operand.fixup();
|
| - if (Fixup != nullptr) {
|
| - emitFixup(Fixup);
|
| - assert(length - displacement_start == 4);
|
| - if (fixupIsPCRel(Fixup->kind())) {
|
| - Fixup->set_addend(-Addend);
|
| - int32_t Offset;
|
| - memmove(&Offset, &operand.encoding_[displacement_start], sizeof(Offset));
|
| - Offset -= Addend;
|
| - emitInt32(Offset);
|
| - return;
|
| + if (Fixup == nullptr) {
|
| + for (intptr_t i = displacement_start; i < length; i++) {
|
| + emitUint8(operand.encoding_[i]);
|
| }
|
| + return;
|
| }
|
| - for (intptr_t i = displacement_start; i < length; i++) {
|
| - emitUint8(operand.encoding_[i]);
|
| +
|
| + // Emit the fixup, and a dummy 4-byte immediate. Note that the Disp32 in
|
| + // operand.encoding_[i, i+1, i+2, i+3] is part of the constant relocatable
|
| + // used to create the fixup, so there's no need to add it to the addend.
|
| + assert(length - displacement_start == 4);
|
| + if (fixupIsPCRel(Fixup->kind())) {
|
| + Fixup->set_addend(Fixup->get_addend() - Addend);
|
| + } else {
|
| + Fixup->set_addend(Fixup->get_addend());
|
| }
|
| + emitFixup(Fixup);
|
| + emitInt32(0);
|
| }
|
|
|
| template <typename TraitsType>
|
| @@ -3420,10 +3431,14 @@ void AssemblerX86Base<TraitsType>::emitImmediate(Type Ty,
|
| return;
|
| }
|
|
|
| - if (Fixup != nullptr) {
|
| - emitFixup(Fixup);
|
| + if (Fixup == nullptr) {
|
| + emitInt32(imm.value());
|
| + return;
|
| }
|
| - emitInt32(imm.value());
|
| +
|
| + Fixup->set_addend(Fixup->get_addend() + imm.value());
|
| + emitFixup(Fixup);
|
| + emitInt32(0);
|
| }
|
|
|
| template <typename TraitsType>
|
|
|