Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(833)

Unified Diff: src/assembler_ia32.h

Issue 649463002: Handle "Mov" which is mov, movss, movsd, and used for nacl.read.tp. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: bounds check Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/assembler_ia32.h
diff --git a/src/assembler_ia32.h b/src/assembler_ia32.h
index 676f4f62d464f97d86855b9edfb070716135b650..ae665fc723945a7de47de2eead42cf46bc481df7 100644
--- a/src/assembler_ia32.h
+++ b/src/assembler_ia32.h
@@ -20,8 +20,9 @@
#ifndef SUBZERO_SRC_ASSEMBLER_IA32_H_
#define SUBZERO_SRC_ASSEMBLER_IA32_H_
-#include "IceDefs.h"
#include "IceConditionCodesX8632.h"
+#include "IceDefs.h"
+#include "IceOperand.h"
#include "IceRegistersX8632.h"
#include "IceTypes.h"
#include "IceUtils.h"
@@ -31,7 +32,6 @@
namespace Ice {
class Assembler;
-class ConstantRelocatable;
using RegX8632::GPRRegister;
using RegX8632::XmmRegister;
@@ -67,18 +67,33 @@ private:
class Immediate {
public:
- explicit Immediate(int32_t value) : value_(value) {}
+ explicit Immediate(int32_t value) : value_(value), fixup_(NULL) {}
- Immediate(const Immediate &other) : value_(other.value_) {}
+ explicit Immediate(const Immediate &other)
+ : value_(other.value_), fixup_(other.fixup_) {}
+
+ explicit Immediate(AssemblerFixup *fixup)
+ : value_(fixup->value()->getOffset()), fixup_(fixup) {
+ // Use the Offset in the "value" for now. If the symbol is part of
+ // ".bss", then the relocation's symbol will be plain ".bss" and
+ // the value will need to be adjusted further to be sym's
+ // bss offset + Offset.
+ }
int32_t value() const { return value_; }
+ AssemblerFixup *fixup() const { return fixup_; }
- bool is_int8() const { return Utils::IsInt(8, value_); }
- bool is_uint8() const { return Utils::IsUint(8, value_); }
- bool is_uint16() const { return Utils::IsUint(16, value_); }
+ bool is_int8() const {
+ // We currently only allow 32-bit fixups, and they usually have value = 0,
+ // so if fixup_ != NULL, it shouldn't be classified as int8/16.
+ return fixup_ == NULL && Utils::IsInt(8, value_);
+ }
+ bool is_uint8() const { return fixup_ == NULL && Utils::IsUint(8, value_); }
+ bool is_uint16() const { return fixup_ == NULL && Utils::IsUint(16, value_); }
private:
const int32_t value_;
+ AssemblerFixup *fixup_;
};
class Operand {
@@ -228,10 +243,21 @@ public:
return *this;
}
- static Address Absolute(const uintptr_t addr, AssemblerFixup *fixup) {
+ static Address Absolute(const uintptr_t addr) {
Address result;
result.SetModRM(0, RegX8632::Encoded_Reg_ebp);
result.SetDisp32(addr);
+ return result;
+ }
+
+ static Address Absolute(AssemblerFixup *fixup) {
+ Address result;
+ result.SetModRM(0, RegX8632::Encoded_Reg_ebp);
+ // Use the Offset in the displacement for now. If the symbol is part of
+ // ".bss", then the relocation's symbol will be plain .bss and the
+ // displacement will need to be adjusted further to be sym's
+ // bss offset + Offset.
+ result.SetDisp32(fixup->value()->getOffset());
result.SetFixup(fixup);
return result;
}
@@ -427,28 +453,22 @@ public:
void setcc(CondX86::BrCond condition, ByteRegister dst);
- void movl(GPRRegister dst, const Immediate &src);
- void movl(GPRRegister dst, GPRRegister src);
+ void mov(Type Ty, GPRRegister dst, const Immediate &src);
+ void mov(Type Ty, GPRRegister dst, GPRRegister src);
- void movl(GPRRegister dst, const Address &src);
- void movl(const Address &dst, GPRRegister src);
- void movl(const Address &dst, const Immediate &imm);
+ void mov(Type Ty, GPRRegister dst, const Address &src);
+ void mov(Type Ty, const Address &dst, GPRRegister src);
+ void mov(Type Ty, const Address &dst, const Immediate &imm);
void movzxb(GPRRegister dst, ByteRegister src);
void movzxb(GPRRegister dst, const Address &src);
void movsxb(GPRRegister dst, ByteRegister src);
void movsxb(GPRRegister dst, const Address &src);
- void movb(ByteRegister dst, const Address &src);
- void movb(const Address &dst, ByteRegister src);
- void movb(const Address &dst, const Immediate &imm);
-
void movzxw(GPRRegister dst, GPRRegister src);
void movzxw(GPRRegister dst, const Address &src);
void movsxw(GPRRegister dst, GPRRegister src);
void movsxw(GPRRegister dst, const Address &src);
- void movw(GPRRegister dst, const Address &src);
- void movw(const Address &dst, GPRRegister src);
void lea(Type Ty, GPRRegister dst, const Address &src);
@@ -739,6 +759,8 @@ public:
cmpxchg(Ty, address, reg);
}
+ void EmitSegmentOverride(uint8_t prefix) { EmitUint8(prefix); }
+
intptr_t PreferredLoopAlignment() { return 16; }
void Align(intptr_t alignment, intptr_t offset);
void Bind(Label *label);

Powered by Google App Engine
This is Rietveld 408576698