37 #ifndef V8_X64_ASSEMBLER_X64_H_
38 #define V8_X64_ASSEMBLER_X64_H_
49 static const uint64_t
kMaxUInt32 = V8_UINT64_C(0xffffffff);
50 return static_cast<uint64_t
>(x) <= kMaxUInt32;
54 static const int64_t kMinInt32 = -V8_INT64_C(0x80000000);
59 static const uint64_t kMaxInt32 = V8_UINT64_C(0x7fffffff);
60 return x <= kMaxInt32;
64 static const uint64_t
kMaxUInt32 = V8_UINT64_C(0xffffffff);
102 return kAllocationIndexByRegisterCode[reg.code()];
107 Register result = { kRegisterCodeByAllocationIndex[index] };
113 const char*
const names[] = {
161 static const int kAllocationIndexByRegisterCode[
kNumRegisters];
207 return reg.code() - 1;
218 const char*
const names[] = {
265 const XMMRegister
xmm0 = { 0 };
266 const XMMRegister
xmm1 = { 1 };
267 const XMMRegister
xmm2 = { 2 };
268 const XMMRegister
xmm3 = { 3 };
269 const XMMRegister
xmm4 = { 4 };
270 const XMMRegister
xmm5 = { 5 };
271 const XMMRegister
xmm6 = { 6 };
272 const XMMRegister
xmm7 = { 7 };
386 Operand(Register base,
int32_t disp);
389 Operand(Register base,
395 Operand(Register index,
402 Operand(
const Operand& base,
int32_t offset);
406 bool AddressUsesRegister(Register reg)
const;
424 inline void set_modrm(
int mod,
Register rm);
431 inline void set_disp8(
int disp);
432 inline void set_disp32(
int disp);
447 class CpuFeatures :
public AllStatic {
456 if (f ==
SSE2 && !FLAG_enable_sse2)
return false;
457 if (f ==
SSE3 && !FLAG_enable_sse3)
return false;
458 if (f ==
CMOV && !FLAG_enable_cmov)
return false;
459 if (f ==
RDTSC && !FLAG_enable_rdtsc)
return false;
460 if (f ==
SAHF && !FLAG_enable_sahf)
return false;
461 return (supported_ & (V8_UINT64_C(1) << f)) != 0;
468 Isolate* isolate = Isolate::UncheckedCurrent();
469 if (isolate ==
NULL) {
474 uint64_t enabled = isolate->enabled_cpu_features();
475 return (enabled & (V8_UINT64_C(1) << f)) != 0;
485 uint64_t mask = V8_UINT64_C(1) << f;
488 (CpuFeatures::found_by_runtime_probing_ & mask) == 0);
489 isolate_ = Isolate::UncheckedCurrent();
491 if (isolate_ !=
NULL) {
492 old_enabled_ = isolate_->enabled_cpu_features();
493 isolate_->set_enabled_cpu_features(old_enabled_ | mask);
497 ASSERT_EQ(Isolate::UncheckedCurrent(), isolate_);
498 if (isolate_ !=
NULL) {
499 isolate_->set_enabled_cpu_features(old_enabled_);
505 uint64_t old_enabled_;
518 static const uint64_t kDefaultCpuFeatures = (1 <<
SSE2 | 1 <<
CMOV);
521 static bool initialized_;
523 static uint64_t supported_;
524 static uint64_t found_by_runtime_probing_;
530 class Assembler :
public AssemblerBase {
541 static const int kGap = 32;
589 *
reinterpret_cast<Address*
>(instruction_payload) = target;
659 void Nop(
int bytes = 1);
667 void push(Immediate value);
672 void push(
const Operand& src);
675 void pop(
const Operand& dst);
677 void enter(Immediate size);
692 void movl(
const Operand& dst, Immediate imm);
705 void movl(
const Operand& dst, Label* src);
708 void movq(
const Operand& dst, Immediate value);
711 void movq(
Register dst,
void* ptr, RelocInfo::Mode rmode);
712 void movq(
Register dst, int64_t value, RelocInfo::Mode rmode);
713 void movq(
Register dst,
const char* s, RelocInfo::Mode rmode);
735 void load_rax(
void* ptr, RelocInfo::Mode rmode);
736 void load_rax(ExternalReference ext);
749 arithmetic_op_32(0x03, dst, src);
753 immediate_arithmetic_op_32(0x0, dst, src);
757 arithmetic_op_32(0x03, dst, src);
760 void addl(
const Operand& dst, Immediate src) {
761 immediate_arithmetic_op_32(0x0, dst, src);
765 arithmetic_op_32(0x01, src, dst);
769 arithmetic_op(0x03, dst, src);
773 arithmetic_op(0x03, dst, src);
777 arithmetic_op(0x01, src, dst);
781 immediate_arithmetic_op(0x0, dst, src);
784 void addq(
const Operand& dst, Immediate src) {
785 immediate_arithmetic_op(0x0, dst, src);
789 arithmetic_op_32(0x1b, dst, src);
793 arithmetic_op(0x1b, dst, src);
797 immediate_arithmetic_op_8(0x7, dst, src);
803 arithmetic_op(0x3A, dst, src);
807 arithmetic_op(0x3A, dst, src);
811 arithmetic_op(0x38, src, dst);
814 void cmpb(
const Operand& dst, Immediate src) {
815 immediate_arithmetic_op_8(0x7, dst, src);
818 void cmpw(
const Operand& dst, Immediate src) {
819 immediate_arithmetic_op_16(0x7, dst, src);
823 immediate_arithmetic_op_16(0x7, dst, src);
827 arithmetic_op_16(0x3B, dst, src);
831 arithmetic_op_16(0x3B, dst, src);
835 arithmetic_op_16(0x39, src, dst);
839 arithmetic_op_32(0x3B, dst, src);
843 arithmetic_op_32(0x3B, dst, src);
847 arithmetic_op_32(0x39, src, dst);
851 immediate_arithmetic_op_32(0x7, dst, src);
854 void cmpl(
const Operand& dst, Immediate src) {
855 immediate_arithmetic_op_32(0x7, dst, src);
859 arithmetic_op(0x3B, dst, src);
863 arithmetic_op(0x3B, dst, src);
867 arithmetic_op(0x39, src, dst);
871 immediate_arithmetic_op(0x7, dst, src);
874 void cmpq(
const Operand& dst, Immediate src) {
875 immediate_arithmetic_op(0x7, dst, src);
879 arithmetic_op(0x23, dst, src);
883 arithmetic_op(0x23, dst, src);
887 arithmetic_op(0x21, src, dst);
891 immediate_arithmetic_op(0x4, dst, src);
894 void and_(
const Operand& dst, Immediate src) {
895 immediate_arithmetic_op(0x4, dst, src);
899 immediate_arithmetic_op_32(0x4, dst, src);
903 arithmetic_op_32(0x23, dst, src);
907 arithmetic_op_32(0x23, dst, src);
911 immediate_arithmetic_op_8(0x4, dst, src);
915 void decq(
const Operand& dst);
917 void decl(
const Operand& dst);
919 void decb(
const Operand& dst);
942 void incq(
const Operand& dst);
944 void incl(
const Operand& dst);
953 void neg(
const Operand& dst);
957 void not_(
const Operand& dst);
961 arithmetic_op(0x0B, dst, src);
965 arithmetic_op_32(0x0B, dst, src);
969 arithmetic_op(0x0B, dst, src);
973 arithmetic_op_32(0x0B, dst, src);
977 arithmetic_op(0x09, src, dst);
981 immediate_arithmetic_op(0x1, dst, src);
985 immediate_arithmetic_op_32(0x1, dst, src);
988 void or_(
const Operand& dst, Immediate src) {
989 immediate_arithmetic_op(0x1, dst, src);
992 void orl(
const Operand& dst, Immediate src) {
993 immediate_arithmetic_op_32(0x1, dst, src);
998 shift(dst, imm8, 0x2);
1002 shift(dst, imm8, 0x0);
1006 shift(dst, imm8, 0x3);
1010 shift(dst, imm8, 0x1);
1022 shift(dst, shift_amount, 0x7);
1028 shift_32(dst, shift_amount, 0x7);
1042 shift(dst, shift_amount, 0x4);
1054 shift_32(dst, shift_amount, 0x4);
1058 shift(dst, shift_amount, 0x5);
1070 shift_32(dst, shift_amount, 0x5);
1073 void store_rax(
void* dst, RelocInfo::Mode mode);
1077 arithmetic_op(0x2B, dst, src);
1081 arithmetic_op(0x2B, dst, src);
1085 arithmetic_op(0x29, src, dst);
1089 immediate_arithmetic_op(0x5, dst, src);
1092 void subq(
const Operand& dst, Immediate src) {
1093 immediate_arithmetic_op(0x5, dst, src);
1097 arithmetic_op_32(0x2B, dst, src);
1101 arithmetic_op_32(0x2B, dst, src);
1104 void subl(
const Operand& dst, Immediate src) {
1105 immediate_arithmetic_op_32(0x5, dst, src);
1109 immediate_arithmetic_op_32(0x5, dst, src);
1113 immediate_arithmetic_op_8(0x5, dst, src);
1118 void testb(
const Operand& op, Immediate mask);
1122 void testl(
const Operand& op, Immediate mask);
1128 if (dst.code() == src.code()) {
1129 arithmetic_op_32(0x33, dst, src);
1131 arithmetic_op(0x33, dst, src);
1136 arithmetic_op_32(0x33, dst, src);
1140 arithmetic_op_32(0x33, dst, src);
1144 immediate_arithmetic_op_32(0x6, dst, src);
1147 void xorl(
const Operand& dst, Immediate src) {
1148 immediate_arithmetic_op_32(0x6, dst, src);
1152 arithmetic_op(0x33, dst, src);
1156 arithmetic_op(0x31, src, dst);
1160 immediate_arithmetic_op(0x6, dst, src);
1163 void xor_(
const Operand& dst, Immediate src) {
1164 immediate_arithmetic_op(0x6, dst, src);
1179 void ret(
int imm16);
1197 void bind(Label*
L);
1201 void call(Label*
L);
1203 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
1216 void call(
const Operand& operand);
1222 void jmp(Label*
L, Label::Distance distance = Label::kFar);
1229 void jmp(
const Operand& src);
1234 Label::Distance distance = Label::kFar);
1245 void fld_s(
const Operand& adr);
1246 void fld_d(
const Operand& adr);
1248 void fstp_s(
const Operand& adr);
1249 void fstp_d(
const Operand& adr);
1250 void fstp(
int index);
1252 void fild_s(
const Operand& adr);
1253 void fild_d(
const Operand& adr);
1255 void fist_s(
const Operand& adr);
1257 void fistp_s(
const Operand& adr);
1258 void fistp_d(
const Operand& adr);
1271 void fisub_s(
const Operand& adr);
1273 void faddp(
int i = 1);
1274 void fsubp(
int i = 1);
1276 void fmulp(
int i = 1);
1277 void fdivp(
int i = 1);
1281 void fxch(
int i = 1);
1283 void ffree(
int i = 0);
1405 void db(uint8_t data);
1406 void dd(uint32_t data);
1408 int pc_offset()
const {
return static_cast<int>(pc_ - buffer_); }
1416 return pc_ >= reloc_info_writer.pos() - kGap;
1421 return static_cast<int>(reloc_info_writer.pos() - pc_);
1438 uint32_t long_at(
int pos) {
1439 return *
reinterpret_cast<uint32_t*
>(
addr_at(pos));
1441 void long_at_put(
int pos, uint32_t x) {
1442 *
reinterpret_cast<uint32_t*
>(
addr_at(pos)) = x;
1448 void emit(
byte x) { *pc_++ = x; }
1449 inline void emitl(uint32_t x);
1450 inline void emitq(uint64_t x, RelocInfo::Mode rmode);
1452 inline void emit_code_target(Handle<Code> target,
1453 RelocInfo::Mode rmode,
1455 void emit(Immediate x) { emitl(x.value_); }
1461 inline void emit_rex_64(XMMRegister reg, Register rm_reg);
1462 inline void emit_rex_64(Register reg, XMMRegister rm_reg);
1463 inline void emit_rex_64(Register reg, Register rm_reg);
1470 inline void emit_rex_64(Register reg,
const Operand& op);
1471 inline void emit_rex_64(XMMRegister reg,
const Operand& op);
1477 inline void emit_rex_64(Register rm_reg);
1484 inline void emit_rex_64(
const Operand& op);
1487 void emit_rex_64() { emit(0x48); }
1491 inline void emit_rex_32(Register reg, Register rm_reg);
1496 inline void emit_rex_32(Register reg,
const Operand& op);
1500 inline void emit_rex_32(Register rm_reg);
1504 inline void emit_rex_32(
const Operand& op);
1508 inline void emit_optional_rex_32(Register reg, Register rm_reg);
1514 inline void emit_optional_rex_32(Register reg,
const Operand& op);
1518 inline void emit_optional_rex_32(XMMRegister reg, XMMRegister base);
1522 inline void emit_optional_rex_32(XMMRegister reg, Register base);
1526 inline void emit_optional_rex_32(Register reg, XMMRegister base);
1530 inline void emit_optional_rex_32(XMMRegister reg,
const Operand& op);
1534 inline void emit_optional_rex_32(Register rm_reg);
1538 inline void emit_optional_rex_32(
const Operand& op);
1545 void emit_operand(Register reg,
const Operand& adr) {
1546 emit_operand(reg.low_bits(), adr);
1552 void emit_operand(
int rm,
const Operand& adr);
1555 void emit_modrm(Register reg, Register rm_reg) {
1556 emit(0xC0 | reg.low_bits() << 3 | rm_reg.low_bits());
1561 void emit_modrm(
int code, Register rm_reg) {
1563 emit(0xC0 | code << 3 | rm_reg.low_bits());
1567 inline void emit_code_relative_offset(Label* label);
1573 void arithmetic_op_16(
byte opcode, Register reg, Register rm_reg);
1574 void arithmetic_op_16(
byte opcode, Register reg,
const Operand& rm_reg);
1575 void arithmetic_op_32(
byte opcode, Register reg, Register rm_reg);
1576 void arithmetic_op_32(
byte opcode, Register reg,
const Operand& rm_reg);
1577 void arithmetic_op(
byte opcode, Register reg, Register rm_reg);
1578 void arithmetic_op(
byte opcode, Register reg,
const Operand& rm_reg);
1579 void immediate_arithmetic_op(
byte subcode, Register dst, Immediate src);
1580 void immediate_arithmetic_op(
byte subcode,
const Operand& dst, Immediate src);
1582 void immediate_arithmetic_op_8(
byte subcode,
1585 void immediate_arithmetic_op_8(
byte subcode,
1589 void immediate_arithmetic_op_16(
byte subcode,
1592 void immediate_arithmetic_op_16(
byte subcode,
1596 void immediate_arithmetic_op_32(
byte subcode,
1599 void immediate_arithmetic_op_32(
byte subcode,
1604 void shift(Register dst, Immediate shift_amount,
int subcode);
1605 void shift_32(Register dst, Immediate shift_amount,
int subcode);
1607 void shift(Register dst,
int subcode);
1608 void shift_32(Register dst,
int subcode);
1610 void emit_farith(
int b1,
int b2,
int i);
1614 void bind_to(Label*
L,
int pos);
1617 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0);
1632 RelocInfoWriter reloc_info_writer;
1638 bool emit_debug_code_;
1651 if (assembler_->buffer_overflow()) assembler_->GrowBuffer();
1653 space_before_ = assembler_->available_space();
1659 int bytes_generated = space_before_ - assembler_->available_space();
1660 ASSERT(bytes_generated < assembler_->kGap);
1665 Assembler* assembler_;
1673 #endif // V8_X64_ASSEMBLER_X64_H_
void shl(Register dst, Immediate shift_amount)
void xor_(Register dst, Immediate src)
void cvtlsi2ss(XMMRegister dst, Register src)
void movapd(XMMRegister dst, XMMRegister src)
static const int kMaximalBufferSize
void cmpb(const Operand &dst, Register src)
void xorl(Register dst, const Operand &src)
void or_(Register dst, Immediate src)
void addq(Register dst, Immediate src)
void load_rax(void *ptr, RelocInfo::Mode rmode)
const int kRegister_r14_Code
const int kRegister_rsp_Code
void addq(const Operand &dst, Register src)
static const byte kJccShortPrefix
void ucomisd(XMMRegister dst, XMMRegister src)
void cvttss2si(Register dst, const Operand &src)
void movzxbl(Register dst, const Operand &src)
void cmpw(Register dst, const Operand &src)
void or_(Register dst, Register src)
void ror(Register dst, Immediate imm8)
void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode)
void or_(const Operand &dst, Register src)
void addq(Register dst, const Operand &src)
bool buffer_overflow() const
void mulsd(XMMRegister dst, XMMRegister src)
bool is_byte_register() const
void cvtsd2si(Register dst, XMMRegister src)
void cmpl(Register dst, Register src)
const int kRegister_r13_Code
void andl(Register dst, const Operand &src)
void and_(Register dst, const Operand &src)
const int kRegister_rbp_Code
void orpd(XMMRegister dst, XMMRegister src)
int SizeOfCodeGeneratedSince(Label *label)
void cmpw(const Operand &dst, Immediate src)
void addq(Register dst, Register src)
void push(Register src, Condition cond=al)
void subl(Register dst, Register src)
void xorl(const Operand &dst, Immediate src)
void cvtss2sd(XMMRegister dst, XMMRegister src)
void orl(Register dst, Immediate src)
void sqrtsd(XMMRegister dst, XMMRegister src)
static XMMRegister FromAllocationIndex(int index)
void xorl(Register dst, Immediate src)
static bool IsSupported(CpuFeature f)
void andpd(XMMRegister dst, XMMRegister src)
static const int kCallInstructionLength
void subq(const Operand &dst, Register src)
void xor_(Register dst, const Operand &src)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
static Register FromAllocationIndex(int index)
static const int kMinimalBufferSize
void cmpq(Register dst, const Operand &src)
#define ASSERT(condition)
static const int kPatchReturnSequenceAddressOffset
void subq(Register dst, Register src)
void cvtlsi2sd(XMMRegister dst, const Operand &src)
static const int kShortCallInstructionLength
void and_(const Operand &dst, Register src)
void addl(Register dst, Register src)
static const char * AllocationIndexToString(int index)
void movsxlq(Register dst, Register src)
void xorpd(XMMRegister dst, XMMRegister src)
void cmpl(Register dst, Immediate src)
StringInputBuffer *const buffer_
void bt(const Operand &dst, Register src)
bool is_uint32(int64_t x)
void sarl_cl(Register dst)
void orl(Register dst, const Operand &src)
static const byte kTestAlByte
void shll(Register dst, Immediate shift_amount)
void cmovl(Condition cc, Register dst, Register src)
void testb(Register dst, Register src)
const int kRegister_rcx_Code
void cmpb(Register dst, Register src)
void fistp_s(const Operand &adr)
void addsd(XMMRegister dst, XMMRegister src)
const int kRegister_r12_Code
void shr_cl(Register dst)
void fld_d(const Operand &adr)
void addq(const Operand &dst, Immediate src)
static const int kNumRegisters
void imull(Register dst, Register src)
void cmpb_al(const Operand &op)
void xchg(Register dst, Register src)
void fild_s(const Operand &adr)
EnsureSpace(Assembler *assembler)
void orl(Register dst, Register src)
void cmpl(const Operand &dst, Immediate src)
void shr(Register dst, Immediate shift_amount)
static const char * AllocationIndexToString(int index)
void enter(const Immediate &size)
Condition ReverseCondition(Condition cond)
static const int kJumpInstructionLength
static const byte kJcShortOpcode
void testl(Register dst, Register src)
void movzxbq(Register dst, const Operand &src)
void shld(Register dst, Register src)
void subl(Register dst, const Operand &src)
void sbbl(Register dst, Register src)
DwVfpRegister DoubleRegister
void fisttp_d(const Operand &adr)
static const int kRealPatchReturnSequenceAddressOffset
void movss(XMMRegister dst, const Operand &src)
void movb(Register dst, const Operand &src)
void set_byte_at(int pos, byte value)
void cvtsd2ss(XMMRegister dst, XMMRegister src)
static const int kSpecialTargetSize
void cmpl(Register dst, const Operand &src)
const int kRegister_r11_Code
void or_(const Operand &dst, Immediate src)
void movsd(XMMRegister dst, XMMRegister src)
void GetCode(CodeDesc *desc)
void movdqa(XMMRegister dst, const Operand &src)
void andl(Register dst, Register src)
void rol(Register dst, Immediate imm8)
static const int kJSReturnSequenceLength
void sar(Register dst, Immediate shift_amount)
static const byte kNopByte
int available_space() const
void movsxbq(Register dst, const Operand &src)
static void set_target_address_at(Address pc, Address target)
static const byte kJzShortOpcode
void movmskpd(Register dst, XMMRegister src)
void subq(const Operand &dst, Immediate src)
void fisttp_s(const Operand &adr)
void subq(Register dst, Immediate src)
void addl(const Operand &dst, Register src)
void movzxwq(Register dst, const Operand &src)
void subb(Register dst, Immediate src)
void cmpb(const Operand &dst, Immediate src)
static void set_external_target_at(Address instruction_payload, Address target)
void cmpq(Register dst, Immediate src)
void movzxwl(Register dst, const Operand &src)
void addl(Register dst, Immediate src)
static Register from_code(int code)
void set_emit_debug_code(bool value)
const int kRegister_r8_Code
void cmpb(Register dst, Immediate src)
void emit_sse_operand(XMMRegister reg, const Operand &adr)
void cvtqsi2sd(XMMRegister dst, const Operand &src)
const int kRegister_r15_Code
void xorps(XMMRegister dst, XMMRegister src)
static const int kCallTargetAddressOffset
const int kRegister_rsi_Code
void subl(const Operand &dst, Immediate src)
void andb(Register dst, Immediate src)
static const int kDebugBreakSlotLength
void setcc(Condition cc, Register reg)
const int kRegister_rbx_Code
void fld_s(const Operand &adr)
static bool IsNop(Instr instr, int type=NON_MARKING_NOP)
void RecordDebugBreakSlot()
const int kRegister_r10_Code
void fstp_d(const Operand &adr)
void movw(Register reg, uint32_t immediate, Condition cond=al)
static const int kNumAllocatableRegisters
static int ToAllocationIndex(XMMRegister reg)
void store_rax(void *dst, RelocInfo::Mode mode)
void cmpq(const Operand &dst, Immediate src)
void push_imm32(int32_t imm32)
void fistp_d(const Operand &adr)
bool is(Register reg) const
static Address target_address_at(Address pc)
void cvtsd2siq(Register dst, XMMRegister src)
static const byte kTestEaxByte
void orl(const Operand &dst, Immediate src)
static const byte kJncShortOpcode
void shrd(Register dst, Register src)
void movaps(XMMRegister dst, XMMRegister src)
void rcr(Register dst, Immediate imm8)
void RecordComment(const char *msg)
static void deserialization_set_special_target_at(Address instruction_payload, Address target)
void fstp_s(const Operand &adr)
void divsd(XMMRegister dst, XMMRegister src)
void shrl_cl(Register dst)
void lea(Register dst, const Operand &src)
void fild_d(const Operand &adr)
void shll_cl(Register dst)
friend class PositionsRecorder
void shrl(Register dst, Immediate shift_amount)
static const int kNumAllocatableRegisters
void andl(Register dst, Immediate src)
Assembler(Isolate *isolate, void *buffer, int buffer_size)
void xorl(Register dst, Register src)
void movl(Register dst, Register src)
Condition NegateCondition(Condition cond)
#define ASSERT_EQ(v1, v2)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
const int kRegister_rdx_Code
static XMMRegister from_code(int code)
void cmpw(const Operand &dst, Register src)
void cmpq(Register dst, Register src)
void xor_(const Operand &dst, Register src)
void and_(Register dst, Immediate src)
void testq(const Operand &op, Register reg)
void sar_cl(Register dst)
void movd(XMMRegister dst, Register src)
void sbbq(Register dst, Register src)
PositionsRecorder * positions_recorder()
const uint32_t kMaxUInt32
void fisub_s(const Operand &adr)
void or_(Register dst, const Operand &src)
void extractps(Register dst, XMMRegister src, byte imm8)
static const byte kJnzShortOpcode
void cmpw(Register dst, Immediate src)
Handle< Object > code_target_object_handle_at(Address pc)
bool requires_rex() const
void subl(Register dst, Immediate src)
void cmpb(Register dst, const Operand &src)
void xor_(const Operand &dst, Immediate src)
void subq(Register dst, const Operand &src)
static int ToAllocationIndex(Register reg)
void fist_s(const Operand &adr)
void cmpw(Register dst, Register src)
void rcl(Register dst, Immediate imm8)
bool is(XMMRegister reg) const
void and_(const Operand &dst, Immediate src)
const int kRegister_r9_Code
void movsxwq(Register dst, const Operand &src)
static const int kNumRegisters
void bts(Register dst, Register src)
void cmpq(const Operand &dst, Register src)
void sarl(Register dst, Immediate shift_amount)
void addl(Register dst, const Operand &src)
void cmovq(Condition cc, Register dst, Register src)
const int kRegister_rax_Code
static const int kPatchDebugBreakSlotAddressOffset
bool emit_debug_code() const
void subsd(XMMRegister dst, XMMRegister src)
bool uint_is_int32(uint64_t x)
const int kRegister_rdi_Code
const int kRegister_no_reg_Code
void cvttsd2siq(Register dst, XMMRegister src)
void xor_(Register dst, Register src)
void movq(const Operand &dst, Register src)
void cmpl(const Operand &dst, Register src)
void addl(const Operand &dst, Immediate src)
void mul(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
void cvttsd2si(Register dst, const Operand &src)
void and_(Register dst, Register src)
void shl_cl(Register dst)
void leal(Register dst, const Operand &src)