Index: src/ppc/assembler-ppc.cc |
diff --git a/src/ppc/assembler-ppc.cc b/src/ppc/assembler-ppc.cc |
index d3c57a479b75c89f1fca675c24ecf1602b4f3264..13f358ab27f4bf74b4f74775d72e7200dd8ee904 100644 |
--- a/src/ppc/assembler-ppc.cc |
+++ b/src/ppc/assembler-ppc.cc |
@@ -204,15 +204,23 @@ Operand::Operand(Handle<Object> handle) { |
// Verify all Objects referred by code are NOT in new space. |
Object* obj = *handle; |
if (obj->IsHeapObject()) { |
- imm_ = reinterpret_cast<intptr_t>(handle.location()); |
+ value_.immediate = reinterpret_cast<intptr_t>(handle.location()); |
rmode_ = RelocInfo::EMBEDDED_OBJECT; |
} else { |
// no relocation needed |
- imm_ = reinterpret_cast<intptr_t>(obj); |
+ value_.immediate = reinterpret_cast<intptr_t>(obj); |
rmode_ = kRelocInfo_NONEPTR; |
} |
} |
+Operand Operand::EmbeddedNumber(double value) { |
+ int32_t smi; |
+ if (DoubleToSmiInteger(value, &smi)) return Operand(Smi::FromInt(smi)); |
+ Operand result(0, RelocInfo::EMBEDDED_OBJECT); |
+ result.is_heap_number_ = true; |
+ result.value_.heap_number = value; |
+ return result; |
+} |
MemOperand::MemOperand(Register rn, int32_t offset) { |
ra_ = rn; |
@@ -251,12 +259,14 @@ Assembler::Assembler(IsolateData isolate_data, void* buffer, int buffer_size) |
} |
-void Assembler::GetCode(CodeDesc* desc) { |
+void Assembler::GetCode(Isolate* isolate, CodeDesc* desc) { |
// Emit constant pool if necessary. |
int constant_pool_offset = EmitConstantPool(); |
EmitRelocations(); |
+ AllocateRequestedHeapNumbers(isolate); |
+ |
// Set up code descriptor. |
desc->buffer = buffer_; |
desc->buffer_size = buffer_size_; |
@@ -743,12 +753,12 @@ void Assembler::b(int branch_offset, LKBit lk) { |
void Assembler::xori(Register dst, Register src, const Operand& imm) { |
- d_form(XORI, src, dst, imm.imm_, false); |
+ d_form(XORI, src, dst, imm.immediate(), false); |
} |
void Assembler::xoris(Register ra, Register rs, const Operand& imm) { |
- d_form(XORIS, rs, ra, imm.imm_, false); |
+ d_form(XORIS, rs, ra, imm.immediate(), false); |
} |
@@ -782,28 +792,28 @@ void Assembler::rlwimi(Register ra, Register rs, int sh, int mb, int me, |
void Assembler::slwi(Register dst, Register src, const Operand& val, RCBit rc) { |
- DCHECK((32 > val.imm_) && (val.imm_ >= 0)); |
- rlwinm(dst, src, val.imm_, 0, 31 - val.imm_, rc); |
+ DCHECK((32 > val.immediate()) && (val.immediate() >= 0)); |
+ rlwinm(dst, src, val.immediate(), 0, 31 - val.immediate(), rc); |
} |
void Assembler::srwi(Register dst, Register src, const Operand& val, RCBit rc) { |
- DCHECK((32 > val.imm_) && (val.imm_ >= 0)); |
- rlwinm(dst, src, 32 - val.imm_, val.imm_, 31, rc); |
+ DCHECK((32 > val.immediate()) && (val.immediate() >= 0)); |
+ rlwinm(dst, src, 32 - val.immediate(), val.immediate(), 31, rc); |
} |
void Assembler::clrrwi(Register dst, Register src, const Operand& val, |
RCBit rc) { |
- DCHECK((32 > val.imm_) && (val.imm_ >= 0)); |
- rlwinm(dst, src, 0, 0, 31 - val.imm_, rc); |
+ DCHECK((32 > val.immediate()) && (val.immediate() >= 0)); |
+ rlwinm(dst, src, 0, 0, 31 - val.immediate(), rc); |
} |
void Assembler::clrlwi(Register dst, Register src, const Operand& val, |
RCBit rc) { |
- DCHECK((32 > val.imm_) && (val.imm_ >= 0)); |
- rlwinm(dst, src, 0, val.imm_, 31, rc); |
+ DCHECK((32 > val.immediate()) && (val.immediate() >= 0)); |
+ rlwinm(dst, src, 0, val.immediate(), 31, rc); |
} |
@@ -823,7 +833,7 @@ void Assembler::rotrwi(Register ra, Register rs, int sh, RCBit r) { |
void Assembler::subi(Register dst, Register src, const Operand& imm) { |
- addi(dst, src, Operand(-(imm.imm_))); |
+ addi(dst, src, Operand(-(imm.immediate()))); |
} |
void Assembler::addc(Register dst, Register src1, Register src2, OEBit o, |
@@ -858,7 +868,7 @@ void Assembler::sube(Register dst, Register src1, Register src2, OEBit o, |
} |
void Assembler::subfic(Register dst, Register src, const Operand& imm) { |
- d_form(SUBFIC, dst, src, imm.imm_, true); |
+ d_form(SUBFIC, dst, src, imm.immediate(), true); |
} |
@@ -903,43 +913,43 @@ void Assembler::divwu(Register dst, Register src1, Register src2, OEBit o, |
void Assembler::addi(Register dst, Register src, const Operand& imm) { |
DCHECK(!src.is(r0)); // use li instead to show intent |
- d_form(ADDI, dst, src, imm.imm_, true); |
+ d_form(ADDI, dst, src, imm.immediate(), true); |
} |
void Assembler::addis(Register dst, Register src, const Operand& imm) { |
DCHECK(!src.is(r0)); // use lis instead to show intent |
- d_form(ADDIS, dst, src, imm.imm_, true); |
+ d_form(ADDIS, dst, src, imm.immediate(), true); |
} |
void Assembler::addic(Register dst, Register src, const Operand& imm) { |
- d_form(ADDIC, dst, src, imm.imm_, true); |
+ d_form(ADDIC, dst, src, imm.immediate(), true); |
} |
void Assembler::andi(Register ra, Register rs, const Operand& imm) { |
- d_form(ANDIx, rs, ra, imm.imm_, false); |
+ d_form(ANDIx, rs, ra, imm.immediate(), false); |
} |
void Assembler::andis(Register ra, Register rs, const Operand& imm) { |
- d_form(ANDISx, rs, ra, imm.imm_, false); |
+ d_form(ANDISx, rs, ra, imm.immediate(), false); |
} |
void Assembler::ori(Register ra, Register rs, const Operand& imm) { |
- d_form(ORI, rs, ra, imm.imm_, false); |
+ d_form(ORI, rs, ra, imm.immediate(), false); |
} |
void Assembler::oris(Register dst, Register src, const Operand& imm) { |
- d_form(ORIS, src, dst, imm.imm_, false); |
+ d_form(ORIS, src, dst, imm.immediate(), false); |
} |
void Assembler::cmpi(Register src1, const Operand& src2, CRegister cr) { |
- intptr_t imm16 = src2.imm_; |
+ intptr_t imm16 = src2.immediate(); |
#if V8_TARGET_ARCH_PPC64 |
int L = 1; |
#else |
@@ -953,7 +963,7 @@ void Assembler::cmpi(Register src1, const Operand& src2, CRegister cr) { |
void Assembler::cmpli(Register src1, const Operand& src2, CRegister cr) { |
- uintptr_t uimm16 = src2.imm_; |
+ uintptr_t uimm16 = src2.immediate(); |
#if V8_TARGET_ARCH_PPC64 |
int L = 1; |
#else |
@@ -967,7 +977,7 @@ void Assembler::cmpli(Register src1, const Operand& src2, CRegister cr) { |
void Assembler::cmpwi(Register src1, const Operand& src2, CRegister cr) { |
- intptr_t imm16 = src2.imm_; |
+ intptr_t imm16 = src2.immediate(); |
int L = 0; |
int pos = pc_offset(); |
DCHECK(is_int16(imm16)); |
@@ -985,7 +995,7 @@ void Assembler::cmpwi(Register src1, const Operand& src2, CRegister cr) { |
void Assembler::cmplwi(Register src1, const Operand& src2, CRegister cr) { |
- uintptr_t uimm16 = src2.imm_; |
+ uintptr_t uimm16 = src2.immediate(); |
int L = 0; |
DCHECK(is_uint16(uimm16)); |
DCHECK(cr.code() >= 0 && cr.code() <= 7); |
@@ -1002,12 +1012,12 @@ void Assembler::isel(Register rt, Register ra, Register rb, int cb) { |
// Pseudo op - load immediate |
void Assembler::li(Register dst, const Operand& imm) { |
- d_form(ADDI, dst, r0, imm.imm_, true); |
+ d_form(ADDI, dst, r0, imm.immediate(), true); |
} |
void Assembler::lis(Register dst, const Operand& imm) { |
- d_form(ADDIS, dst, r0, imm.imm_, true); |
+ d_form(ADDIS, dst, r0, imm.immediate(), true); |
} |
@@ -1148,28 +1158,28 @@ void Assembler::rldicr(Register ra, Register rs, int sh, int me, RCBit r) { |
void Assembler::sldi(Register dst, Register src, const Operand& val, RCBit rc) { |
- DCHECK((64 > val.imm_) && (val.imm_ >= 0)); |
- rldicr(dst, src, val.imm_, 63 - val.imm_, rc); |
+ DCHECK((64 > val.immediate()) && (val.immediate() >= 0)); |
+ rldicr(dst, src, val.immediate(), 63 - val.immediate(), rc); |
} |
void Assembler::srdi(Register dst, Register src, const Operand& val, RCBit rc) { |
- DCHECK((64 > val.imm_) && (val.imm_ >= 0)); |
- rldicl(dst, src, 64 - val.imm_, val.imm_, rc); |
+ DCHECK((64 > val.immediate()) && (val.immediate() >= 0)); |
+ rldicl(dst, src, 64 - val.immediate(), val.immediate(), rc); |
} |
void Assembler::clrrdi(Register dst, Register src, const Operand& val, |
RCBit rc) { |
- DCHECK((64 > val.imm_) && (val.imm_ >= 0)); |
- rldicr(dst, src, 0, 63 - val.imm_, rc); |
+ DCHECK((64 > val.immediate()) && (val.immediate() >= 0)); |
+ rldicr(dst, src, 0, 63 - val.immediate(), rc); |
} |
void Assembler::clrldi(Register dst, Register src, const Operand& val, |
RCBit rc) { |
- DCHECK((64 > val.imm_) && (val.imm_ >= 0)); |
- rldicl(dst, src, 0, val.imm_, rc); |
+ DCHECK((64 > val.immediate()) && (val.immediate() >= 0)); |
+ rldicl(dst, src, 0, val.immediate(), rc); |
} |