diff options
Diffstat (limited to 'deps/v8/src/ia32/assembler-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/assembler-ia32.cc | 128 |
1 files changed, 90 insertions, 38 deletions
diff --git a/deps/v8/src/ia32/assembler-ia32.cc b/deps/v8/src/ia32/assembler-ia32.cc index 38b65c583f..ff589c820b 100644 --- a/deps/v8/src/ia32/assembler-ia32.cc +++ b/deps/v8/src/ia32/assembler-ia32.cc @@ -55,6 +55,7 @@ #include "src/deoptimizer.h" #include "src/disassembler.h" #include "src/macro-assembler.h" +#include "src/string-constants.h" #include "src/v8.h" namespace v8 { @@ -76,6 +77,13 @@ Immediate Immediate::EmbeddedCode(CodeStub* stub) { return result; } +Immediate Immediate::EmbeddedStringConstant(const StringConstantBase* str) { + Immediate result(0, RelocInfo::EMBEDDED_OBJECT); + result.is_heap_object_request_ = true; + result.value_.heap_object_request = HeapObjectRequest(str); + return result; +} + // ----------------------------------------------------------------------------- // Implementation of CpuFeatures @@ -300,6 +308,7 @@ Register Operand::reg() const { } void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { + DCHECK_IMPLIES(isolate == nullptr, heap_object_requests_.empty()); for (auto& request : heap_object_requests_) { Handle<HeapObject> object; switch (request.kind()) { @@ -311,6 +320,12 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) { request.code_stub()->set_isolate(isolate); object = request.code_stub()->GetCode(); break; + case HeapObjectRequest::kStringConstant: { + const StringConstantBase* str = request.string(); + CHECK_NOT_NULL(str); + object = str->AllocateStringConstant(isolate); + break; + } } Address pc = reinterpret_cast<Address>(buffer_) + request.offset(); Memory<Handle<Object>>(pc) = object; @@ -486,6 +501,7 @@ void Assembler::pushad() { void Assembler::popad() { EnsureSpace ensure_space(this); + AssertIsAddressable(ebx); EMIT(0x61); } @@ -522,6 +538,7 @@ void Assembler::push_imm32(int32_t imm32) { void Assembler::push(Register src) { + AssertIsAddressable(src); EnsureSpace ensure_space(this); EMIT(0x50 | src.code()); } @@ -534,6 +551,7 @@ void Assembler::push(Operand src) { void Assembler::pop(Register dst) { + AssertIsAddressable(dst); DCHECK_NOT_NULL(reloc_info_writer.last_pc()); EnsureSpace ensure_space(this); EMIT(0x58 | dst.code()); @@ -605,6 +623,7 @@ void Assembler::mov_w(Operand dst, const Immediate& src) { void Assembler::mov(Register dst, int32_t imm32) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0xB8 | dst.code()); emit(imm32); @@ -612,12 +631,14 @@ void Assembler::mov(Register dst, int32_t imm32) { void Assembler::mov(Register dst, const Immediate& x) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0xB8 | dst.code()); emit(x); } void Assembler::mov(Register dst, Handle<HeapObject> handle) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0xB8 | dst.code()); emit(handle); @@ -631,6 +652,8 @@ void Assembler::mov(Register dst, Operand src) { void Assembler::mov(Register dst, Register src) { + AssertIsAddressable(src); + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0x89); EMIT(0xC0 | src.code() << 3 | dst.code()); @@ -735,6 +758,8 @@ void Assembler::stos() { void Assembler::xchg(Register dst, Register src) { + AssertIsAddressable(src); + AssertIsAddressable(dst); EnsureSpace ensure_space(this); if (src == eax || dst == eax) { // Single-byte encoding. EMIT(0x90 | (src == eax ? dst.code() : src.code())); @@ -965,6 +990,7 @@ void Assembler::cmpw_ax(Operand op) { void Assembler::dec_b(Register dst) { + AssertIsAddressable(dst); CHECK(dst.is_byte_register()); EnsureSpace ensure_space(this); EMIT(0xFE); @@ -979,6 +1005,7 @@ void Assembler::dec_b(Operand dst) { void Assembler::dec(Register dst) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0x48 | dst.code()); } @@ -1009,6 +1036,7 @@ void Assembler::div(Operand src) { void Assembler::imul(Register reg) { + AssertIsAddressable(reg); EnsureSpace ensure_space(this); EMIT(0xF7); EMIT(0xE8 | reg.code()); @@ -1041,6 +1069,7 @@ void Assembler::imul(Register dst, Operand src, int32_t imm32) { void Assembler::inc(Register dst) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0x40 | dst.code()); } @@ -1059,6 +1088,7 @@ void Assembler::lea(Register dst, Operand src) { void Assembler::mul(Register src) { + AssertIsAddressable(src); EnsureSpace ensure_space(this); EMIT(0xF7); EMIT(0xE0 | src.code()); @@ -1066,12 +1096,14 @@ void Assembler::mul(Register src) { void Assembler::neg(Register dst) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0xF7); EMIT(0xD8 | dst.code()); } void Assembler::neg(Operand dst) { + AllowExplicitEbxAccessScope register_used_for_regcode(this); EnsureSpace ensure_space(this); EMIT(0xF7); emit_operand(ebx, dst); @@ -1079,6 +1111,7 @@ void Assembler::neg(Operand dst) { void Assembler::not_(Register dst) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0xF7); EMIT(0xD0 | dst.code()); @@ -1115,6 +1148,7 @@ void Assembler::or_(Operand dst, Register src) { void Assembler::rcl(Register dst, uint8_t imm8) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); DCHECK(is_uint5(imm8)); // illegal shift count if (imm8 == 1) { @@ -1129,6 +1163,7 @@ void Assembler::rcl(Register dst, uint8_t imm8) { void Assembler::rcr(Register dst, uint8_t imm8) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); DCHECK(is_uint5(imm8)); // illegal shift count if (imm8 == 1) { @@ -1286,6 +1321,7 @@ void Assembler::test(Register reg, const Immediate& imm) { return; } + AssertIsAddressable(reg); EnsureSpace ensure_space(this); // This is not using emit_arith because test doesn't support // sign-extension of 8-bit operands. @@ -1326,6 +1362,7 @@ void Assembler::test(Operand op, const Immediate& imm) { } void Assembler::test_b(Register reg, Immediate imm8) { + AssertIsAddressable(reg); DCHECK(imm8.is_uint8()); EnsureSpace ensure_space(this); // Only use test against byte for registers that have a byte @@ -1355,6 +1392,7 @@ void Assembler::test_b(Operand op, Immediate imm8) { } void Assembler::test_w(Register reg, Immediate imm16) { + AssertIsAddressable(reg); DCHECK(imm16.is_int16() || imm16.is_uint16()); EnsureSpace ensure_space(this); if (reg == eax) { @@ -1411,6 +1449,7 @@ void Assembler::xor_(Operand dst, const Immediate& x) { } void Assembler::bswap(Register dst) { + AssertIsAddressable(dst); EnsureSpace ensure_space(this); EMIT(0x0F); EMIT(0xC8 + dst.code()); @@ -1839,6 +1878,7 @@ void Assembler::fld_d(Operand adr) { } void Assembler::fstp_s(Operand adr) { + AllowExplicitEbxAccessScope register_used_for_regcode(this); EnsureSpace ensure_space(this); EMIT(0xD9); emit_operand(ebx, adr); @@ -1851,6 +1891,7 @@ void Assembler::fst_s(Operand adr) { } void Assembler::fstp_d(Operand adr) { + AllowExplicitEbxAccessScope register_used_for_regcode(this); EnsureSpace ensure_space(this); EMIT(0xDD); emit_operand(ebx, adr); @@ -1875,6 +1916,7 @@ void Assembler::fild_d(Operand adr) { } void Assembler::fistp_s(Operand adr) { + AllowExplicitEbxAccessScope register_used_for_regcode(this); EnsureSpace ensure_space(this); EMIT(0xDB); emit_operand(ebx, adr); @@ -2162,6 +2204,7 @@ void Assembler::sahf() { void Assembler::setcc(Condition cc, Register reg) { + AssertIsAddressable(reg); DCHECK(reg.is_byte_register()); EnsureSpace ensure_space(this); EMIT(0x0F); @@ -2358,7 +2401,7 @@ void Assembler::maxps(XMMRegister dst, Operand src) { emit_sse_operand(dst, src); } -void Assembler::cmpps(XMMRegister dst, Operand src, int8_t cmp) { +void Assembler::cmpps(XMMRegister dst, Operand src, uint8_t cmp) { EnsureSpace ensure_space(this); EMIT(0x0F); EMIT(0xC2); @@ -2617,7 +2660,7 @@ void Assembler::extractps(Register dst, XMMRegister src, byte imm8) { EMIT(imm8); } -void Assembler::psllw(XMMRegister reg, int8_t shift) { +void Assembler::psllw(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2626,7 +2669,7 @@ void Assembler::psllw(XMMRegister reg, int8_t shift) { EMIT(shift); } -void Assembler::pslld(XMMRegister reg, int8_t shift) { +void Assembler::pslld(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2635,7 +2678,7 @@ void Assembler::pslld(XMMRegister reg, int8_t shift) { EMIT(shift); } -void Assembler::psrlw(XMMRegister reg, int8_t shift) { +void Assembler::psrlw(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2644,7 +2687,7 @@ void Assembler::psrlw(XMMRegister reg, int8_t shift) { EMIT(shift); } -void Assembler::psrld(XMMRegister reg, int8_t shift) { +void Assembler::psrld(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2653,7 +2696,7 @@ void Assembler::psrld(XMMRegister reg, int8_t shift) { EMIT(shift); } -void Assembler::psraw(XMMRegister reg, int8_t shift) { +void Assembler::psraw(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2662,7 +2705,7 @@ void Assembler::psraw(XMMRegister reg, int8_t shift) { EMIT(shift); } -void Assembler::psrad(XMMRegister reg, int8_t shift) { +void Assembler::psrad(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2671,7 +2714,7 @@ void Assembler::psrad(XMMRegister reg, int8_t shift) { EMIT(shift); } -void Assembler::psllq(XMMRegister reg, int8_t shift) { +void Assembler::psllq(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2689,8 +2732,7 @@ void Assembler::psllq(XMMRegister dst, XMMRegister src) { emit_sse_operand(dst, src); } - -void Assembler::psrlq(XMMRegister reg, int8_t shift) { +void Assembler::psrlq(XMMRegister reg, uint8_t shift) { EnsureSpace ensure_space(this); EMIT(0x66); EMIT(0x0F); @@ -2757,7 +2799,7 @@ void Assembler::palignr(XMMRegister dst, Operand src, uint8_t mask) { EMIT(mask); } -void Assembler::pextrb(Operand dst, XMMRegister src, int8_t offset) { +void Assembler::pextrb(Operand dst, XMMRegister src, uint8_t offset) { DCHECK(IsEnabled(SSE4_1)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2768,7 +2810,7 @@ void Assembler::pextrb(Operand dst, XMMRegister src, int8_t offset) { EMIT(offset); } -void Assembler::pextrw(Operand dst, XMMRegister src, int8_t offset) { +void Assembler::pextrw(Operand dst, XMMRegister src, uint8_t offset) { DCHECK(IsEnabled(SSE4_1)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2779,7 +2821,7 @@ void Assembler::pextrw(Operand dst, XMMRegister src, int8_t offset) { EMIT(offset); } -void Assembler::pextrd(Operand dst, XMMRegister src, int8_t offset) { +void Assembler::pextrd(Operand dst, XMMRegister src, uint8_t offset) { DCHECK(IsEnabled(SSE4_1)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2790,7 +2832,7 @@ void Assembler::pextrd(Operand dst, XMMRegister src, int8_t offset) { EMIT(offset); } -void Assembler::insertps(XMMRegister dst, Operand src, int8_t offset) { +void Assembler::insertps(XMMRegister dst, Operand src, uint8_t offset) { DCHECK(IsEnabled(SSE4_1)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2801,7 +2843,7 @@ void Assembler::insertps(XMMRegister dst, Operand src, int8_t offset) { EMIT(offset); } -void Assembler::pinsrb(XMMRegister dst, Operand src, int8_t offset) { +void Assembler::pinsrb(XMMRegister dst, Operand src, uint8_t offset) { DCHECK(IsEnabled(SSE4_1)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2812,7 +2854,7 @@ void Assembler::pinsrb(XMMRegister dst, Operand src, int8_t offset) { EMIT(offset); } -void Assembler::pinsrw(XMMRegister dst, Operand src, int8_t offset) { +void Assembler::pinsrw(XMMRegister dst, Operand src, uint8_t offset) { DCHECK(is_uint8(offset)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2822,7 +2864,7 @@ void Assembler::pinsrw(XMMRegister dst, Operand src, int8_t offset) { EMIT(offset); } -void Assembler::pinsrd(XMMRegister dst, Operand src, int8_t offset) { +void Assembler::pinsrd(XMMRegister dst, Operand src, uint8_t offset) { DCHECK(IsEnabled(SSE4_1)); EnsureSpace ensure_space(this); EMIT(0x66); @@ -2933,7 +2975,7 @@ void Assembler::vpd(byte op, XMMRegister dst, XMMRegister src1, Operand src2) { } void Assembler::vcmpps(XMMRegister dst, XMMRegister src1, Operand src2, - int8_t cmp) { + uint8_t cmp) { vps(0xC2, dst, src1, src2); EMIT(cmp); } @@ -2945,37 +2987,37 @@ void Assembler::vshufps(XMMRegister dst, XMMRegister src1, Operand src2, EMIT(imm8); } -void Assembler::vpsllw(XMMRegister dst, XMMRegister src, int8_t imm8) { +void Assembler::vpsllw(XMMRegister dst, XMMRegister src, uint8_t imm8) { XMMRegister iop = XMMRegister::from_code(6); vinstr(0x71, iop, dst, Operand(src), k66, k0F, kWIG); EMIT(imm8); } -void Assembler::vpslld(XMMRegister dst, XMMRegister src, int8_t imm8) { +void Assembler::vpslld(XMMRegister dst, XMMRegister src, uint8_t imm8) { XMMRegister iop = XMMRegister::from_code(6); vinstr(0x72, iop, dst, Operand(src), k66, k0F, kWIG); EMIT(imm8); } -void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, int8_t imm8) { +void Assembler::vpsrlw(XMMRegister dst, XMMRegister src, uint8_t imm8) { XMMRegister iop = XMMRegister::from_code(2); vinstr(0x71, iop, dst, Operand(src), k66, k0F, kWIG); EMIT(imm8); } -void Assembler::vpsrld(XMMRegister dst, XMMRegister src, int8_t imm8) { +void Assembler::vpsrld(XMMRegister dst, XMMRegister src, uint8_t imm8) { XMMRegister iop = XMMRegister::from_code(2); vinstr(0x72, iop, dst, Operand(src), k66, k0F, kWIG); EMIT(imm8); } -void Assembler::vpsraw(XMMRegister dst, XMMRegister src, int8_t imm8) { +void Assembler::vpsraw(XMMRegister dst, XMMRegister src, uint8_t imm8) { XMMRegister iop = XMMRegister::from_code(4); vinstr(0x71, iop, dst, Operand(src), k66, k0F, kWIG); EMIT(imm8); } -void Assembler::vpsrad(XMMRegister dst, XMMRegister src, int8_t imm8) { +void Assembler::vpsrad(XMMRegister dst, XMMRegister src, uint8_t imm8) { XMMRegister iop = XMMRegister::from_code(4); vinstr(0x72, iop, dst, Operand(src), k66, k0F, kWIG); EMIT(imm8); @@ -3008,41 +3050,41 @@ void Assembler::vpalignr(XMMRegister dst, XMMRegister src1, Operand src2, EMIT(mask); } -void Assembler::vpextrb(Operand dst, XMMRegister src, int8_t offset) { +void Assembler::vpextrb(Operand dst, XMMRegister src, uint8_t offset) { vinstr(0x14, src, xmm0, dst, k66, k0F3A, kWIG); EMIT(offset); } -void Assembler::vpextrw(Operand dst, XMMRegister src, int8_t offset) { +void Assembler::vpextrw(Operand dst, XMMRegister src, uint8_t offset) { vinstr(0x15, src, xmm0, dst, k66, k0F3A, kWIG); EMIT(offset); } -void Assembler::vpextrd(Operand dst, XMMRegister src, int8_t offset) { +void Assembler::vpextrd(Operand dst, XMMRegister src, uint8_t offset) { vinstr(0x16, src, xmm0, dst, k66, k0F3A, kWIG); EMIT(offset); } void Assembler::vinsertps(XMMRegister dst, XMMRegister src1, Operand src2, - int8_t offset) { + uint8_t offset) { vinstr(0x21, dst, src1, src2, k66, k0F3A, kWIG); EMIT(offset); } void Assembler::vpinsrb(XMMRegister dst, XMMRegister src1, Operand src2, - int8_t offset) { + uint8_t offset) { vinstr(0x20, dst, src1, src2, k66, k0F3A, kWIG); EMIT(offset); } void Assembler::vpinsrw(XMMRegister dst, XMMRegister src1, Operand src2, - int8_t offset) { + uint8_t offset) { vinstr(0xC4, dst, src1, src2, k66, k0F, kWIG); EMIT(offset); } void Assembler::vpinsrd(XMMRegister dst, XMMRegister src1, Operand src2, - int8_t offset) { + uint8_t offset) { vinstr(0x22, dst, src1, src2, k66, k0F3A, kWIG); EMIT(offset); } @@ -3143,6 +3185,7 @@ void Assembler::vinstr(byte op, XMMRegister dst, XMMRegister src1, Operand src2, } void Assembler::emit_sse_operand(XMMRegister reg, Operand adr) { + AllowExplicitEbxAccessScope accessing_xmm_register(this); Register ireg = Register::from_code(reg.code()); emit_operand(ireg, adr); } @@ -3154,11 +3197,13 @@ void Assembler::emit_sse_operand(XMMRegister dst, XMMRegister src) { void Assembler::emit_sse_operand(Register dst, XMMRegister src) { + AssertIsAddressable(dst); EMIT(0xC0 | dst.code() << 3 | src.code()); } void Assembler::emit_sse_operand(XMMRegister dst, Register src) { + AssertIsAddressable(src); EMIT(0xC0 | (dst.code() << 3) | src.code()); } @@ -3244,6 +3289,7 @@ void Assembler::GrowBuffer() { void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { + AssertIsAddressable(dst); DCHECK(is_uint8(op1) && is_uint8(op2)); // wrong opcode DCHECK(is_uint8(imm8)); DCHECK_EQ(op1 & 0x01, 0); // should be 8bit operation @@ -3254,6 +3300,7 @@ void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) { void Assembler::emit_arith(int sel, Operand dst, const Immediate& x) { + AssertIsAddressable(dst); DCHECK((0 <= sel) && (sel <= 7)); Register ireg = Register::from_code(sel); if (x.is_int8()) { @@ -3280,6 +3327,8 @@ void Assembler::emit_operand(XMMRegister reg, Operand adr) { } void Assembler::emit_operand(int code, Operand adr) { + AssertIsAddressable(adr); + AssertIsAddressable(Register::from_code(code)); // Isolate-independent code may not embed relocatable addresses. DCHECK(!options().isolate_independent_code || adr.rmode_ != RelocInfo::CODE_TARGET); @@ -3356,17 +3405,20 @@ void Assembler::dd(Label* label) { void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { - DCHECK(!RelocInfo::IsNone(rmode)); - if (options().disable_reloc_info_for_patching) return; - // Don't record external references unless the heap will be serialized. - if (RelocInfo::IsOnlyForSerializer(rmode) && - !options().record_reloc_info_for_serialization && !emit_debug_code()) { - return; - } + if (!ShouldRecordRelocInfo(rmode)) return; RelocInfo rinfo(reinterpret_cast<Address>(pc_), rmode, data, nullptr); reloc_info_writer.Write(&rinfo); } +#ifdef DEBUG +void Assembler::AssertIsAddressable(const Operand& operand) { + DCHECK(is_ebx_addressable_ || !operand.UsesEbx()); +} + +void Assembler::AssertIsAddressable(const Register& reg) { + DCHECK(is_ebx_addressable_ || reg != ebx); +} +#endif // DEBUG } // namespace internal } // namespace v8 |