7#if V8_TARGET_ARCH_MIPS64
35#define __ ACCESS_MASM(masm)
40static inline bool IsZero(
const Operand& rt) {
42 return rt.rm() == zero_reg;
44 return rt.immediate() == 0;
51 Register exclusion3)
const {
53 RegList exclusions = {exclusion1, exclusion2, exclusion3};
65 Register exclusion2, Register exclusion3) {
68 RegList exclusions = {exclusion1, exclusion2, exclusion3};
82 Register exclusion2, Register exclusion3) {
90 RegList exclusions = {exclusion1, exclusion2, exclusion3};
104 const Operand& src2) {
110 if (marker_reg.is_valid()) {
121 if (function_reg.is_valid()) {
128 Daddu(fp, sp, Operand(
offset));
135 Register value, Register dst,
159 Branch(&ok,
eq, t8, Operand(zero_reg));
187 Register slot_address,
201 Pop(slot_address_parameter);
202 Pop(object_parameter);
209 Register slot_address,
223 Pop(slot_address_parameter);
224 Pop(object_parameter);
238#if V8_ENABLE_WEBASSEMBLY
239 if (mode == StubCallMode::kCallWasmRuntimeStub) {
265 Assert(
eq, AbortReason::kWrongAddressOrValuePassedToRecordWrite, scratch,
269 if (
v8_flags.disable_write_barriers) {
296 mov(slot_address, address);
317void MacroAssembler::Addu(Register rd, Register rs,
const Operand&
rt) {
329 addu(rd, rs, scratch);
334void MacroAssembler::Daddu(Register rd, Register rs,
const Operand&
rt) {
346 daddu(rd, rs, scratch);
351void MacroAssembler::Subu(Register rd, Register rs,
const Operand&
rt) {
366 li(scratch, -
rt.immediate());
367 addu(rd, rs, scratch);
371 subu(rd, rs, scratch);
377void MacroAssembler::Dsubu(Register rd, Register rs,
const Operand&
rt) {
380 }
else if (is_int16(-
rt.immediate()) && !
MustUseReg(
rt.rmode())) {
388 if (li_neg_count < li_count && !
MustUseReg(
rt.rmode())) {
390 DCHECK(
rt.immediate() != std::numeric_limits<int32_t>::min());
393 li(scratch, Operand(-
rt.immediate()));
394 Daddu(rd, rs, scratch);
400 dsubu(rd, rs, scratch);
407 mul(rd, rs,
rt.rm());
414 mul(rd, rs, scratch);
418void MacroAssembler::Mulh(Register rd, Register rs,
const Operand&
rt) {
424 muh(rd, rs,
rt.rm());
436 muh(rd, rs, scratch);
441void MacroAssembler::Mulhu(Register rd, Register rs,
const Operand&
rt) {
459 muhu(rd, rs, scratch);
464void MacroAssembler::Dmul(Register rd, Register rs,
const Operand&
rt) {
479 dmul(rd, rs, scratch);
487void MacroAssembler::Dmulh(Register rd, Register rs,
const Operand&
rt) {
502 dmuh(rd, rs, scratch);
510void MacroAssembler::Dmulhu(Register rd, Register rs,
const Operand&
rt) {
525 dmuhu(rd, rs, scratch);
533void MacroAssembler::Mult(Register rs,
const Operand&
rt) {
546void MacroAssembler::Dmult(Register rs,
const Operand&
rt) {
559void MacroAssembler::Multu(Register rs,
const Operand&
rt) {
572void MacroAssembler::Dmultu(Register rs,
const Operand&
rt) {
585void MacroAssembler::Div(Register rs,
const Operand&
rt) {
598void MacroAssembler::Div(Register res, Register rs,
const Operand&
rt) {
604 div(res, rs,
rt.rm());
616 div(res, rs, scratch);
621void MacroAssembler::Mod(Register rd, Register rs,
const Operand&
rt) {
627 mod(rd, rs,
rt.rm());
639 mod(rd, rs, scratch);
644void MacroAssembler::Modu(Register rd, Register rs,
const Operand&
rt) {
662 modu(rd, rs, scratch);
667void MacroAssembler::Ddiv(Register rs,
const Operand&
rt) {
680void MacroAssembler::Ddiv(Register rd, Register rs,
const Operand&
rt) {
703 ddiv(rd, rs, scratch);
708void MacroAssembler::Divu(Register rs,
const Operand&
rt) {
721void MacroAssembler::Divu(Register res, Register rs,
const Operand&
rt) {
739 divu(res, rs, scratch);
744void MacroAssembler::Ddivu(Register rs,
const Operand&
rt) {
757void MacroAssembler::Ddivu(Register res, Register rs,
const Operand&
rt) {
775 ddivu(res, rs, scratch);
780void MacroAssembler::Dmod(Register rd, Register rs,
const Operand&
rt) {
803 dmod(rd, rs, scratch);
808void MacroAssembler::Dmodu(Register rd, Register rs,
const Operand&
rt) {
831 dmodu(rd, rs, scratch);
848 and_(rd, rs, scratch);
855 or_(rd, rs,
rt.rm());
865 or_(rd, rs, scratch);
882 xor_(rd, rs, scratch);
887void MacroAssembler::Nor(Register rd, Register rs,
const Operand&
rt) {
889 nor(rd, rs,
rt.rm());
896 nor(rd, rs, scratch);
904void MacroAssembler::Slt(Register rd, Register rs,
const Operand&
rt) {
906 slt(rd, rs,
rt.rm());
914 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
917 slt(rd, rs, scratch);
922void MacroAssembler::Sltu(Register rd, Register rs,
const Operand&
rt) {
926 const uint64_t int16_min = std::numeric_limits<int16_t>::min();
930 }
else if (is_uint15(
rt.immediate() - int16_min) &&
938 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
941 sltu(rd, rs, scratch);
946void MacroAssembler::Sle(Register rd, Register rs,
const Operand&
rt) {
948 slt(rd,
rt.rm(), rs);
951 slt(rd, zero_reg, rs);
955 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
959 slt(rd, scratch, rs);
965void MacroAssembler::Sleu(Register rd, Register rs,
const Operand&
rt) {
970 sltu(rd, zero_reg, rs);
974 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
978 sltu(rd, scratch, rs);
984void MacroAssembler::Sge(Register rd, Register rs,
const Operand&
rt) {
989void MacroAssembler::Sgeu(Register rd, Register rs,
const Operand&
rt) {
994void MacroAssembler::Sgt(Register rd, Register rs,
const Operand&
rt) {
996 slt(rd,
rt.rm(), rs);
999 slt(rd, zero_reg, rs);
1003 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
1007 slt(rd, scratch, rs);
1012void MacroAssembler::Sgtu(Register rd, Register rs,
const Operand&
rt) {
1017 sltu(rd, zero_reg, rs);
1021 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
1025 sltu(rd, scratch, rs);
1034 int64_t ror_value =
rt.immediate() % 32;
1035 if (ror_value < 0) {
1038 rotr(rd, rs, ror_value);
1042void MacroAssembler::Dror(Register rd, Register rs,
const Operand&
rt) {
1046 int64_t dror_value =
rt.immediate() % 64;
1047 if (dror_value < 0) dror_value += 64;
1048 if (dror_value <= 31) {
1049 drotr(rd, rs, dror_value);
1051 drotr32(rd, rs, dror_value - 32);
1062 DCHECK(sa >= 1 && sa <= 31);
1064 lsa(rd,
rt, rs, sa - 1);
1075 DCHECK(sa >= 1 && sa <= 63);
1077 dlsa(rd,
rt, rs, sa - 1);
1084 dsll32(tmp, rs, sa - 32);
1116 DCHECK(operand_size == 2 || operand_size == 4 || operand_size == 8);
1118 if (operand_size == 2) {
1121 }
else if (operand_size == 4) {
1123 rotr(dest, dest, 16);
1132 DCHECK(operand_size == 2 || operand_size == 4);
1133 if (operand_size == 2) {
1135 andi(dest, dest, 0xFFFF);
1138 rotr(dest, dest, 16);
1139 dinsu_(dest, zero_reg, 32, 32);
1150 DCHECK(kMipsLwrOffset <= 3 && kMipsLwlOffset <= 3);
1154 if (rd != source.rm()) {
1155 lwr(rd,
MemOperand(source.rm(), source.offset() + kMipsLwrOffset));
1156 lwl(rd,
MemOperand(source.rm(), source.offset() + kMipsLwlOffset));
1159 Register scratch = temps.Acquire();
1160 lwr(scratch,
MemOperand(rs.rm(), rs.offset() + kMipsLwrOffset));
1161 lwl(scratch,
MemOperand(rs.rm(), rs.offset() + kMipsLwlOffset));
1173 Dext(rd, rd, 0, 32);
1185 DCHECK(kMipsSwrOffset <= 3 && kMipsSwlOffset <= 3);
1189 swr(rd,
MemOperand(source.rm(), source.offset() + kMipsSwrOffset));
1190 swl(rd,
MemOperand(source.rm(), source.offset() + kMipsSwlOffset));
1205 Register scratch = temps.Acquire();
1206 if (source.rm() == scratch) {
1207#if defined(V8_TARGET_LITTLE_ENDIAN)
1209 Lbu(scratch, source);
1210#elif defined(V8_TARGET_BIG_ENDIAN)
1215#if defined(V8_TARGET_LITTLE_ENDIAN)
1216 Lbu(scratch, source);
1218#elif defined(V8_TARGET_BIG_ENDIAN)
1224 or_(rd, rd, scratch);
1239 Register scratch = temps.Acquire();
1240 if (source.rm() == scratch) {
1241#if defined(V8_TARGET_LITTLE_ENDIAN)
1243 Lbu(scratch, source);
1244#elif defined(V8_TARGET_BIG_ENDIAN)
1249#if defined(V8_TARGET_LITTLE_ENDIAN)
1250 Lbu(scratch, source);
1252#elif defined(V8_TARGET_BIG_ENDIAN)
1258 or_(rd, rd, scratch);
1265 DCHECK(rs.rm() != scratch);
1275 if (scratch != rd) {
1279#if defined(V8_TARGET_LITTLE_ENDIAN)
1280 Sb(scratch, source);
1281 srl(scratch, scratch, 8);
1282 Sb(scratch,
MemOperand(source.rm(), source.offset() + 1));
1283#elif defined(V8_TARGET_BIG_ENDIAN)
1284 Sb(scratch,
MemOperand(source.rm(), source.offset() + 1));
1285 srl(scratch, scratch, 8);
1286 Sb(scratch, source);
1298 DCHECK(kMipsLdrOffset <= 7 && kMipsLdlOffset <= 7);
1302 if (rd != source.rm()) {
1303 ldr(rd,
MemOperand(source.rm(), source.offset() + kMipsLdrOffset));
1304 ldl(rd,
MemOperand(source.rm(), source.offset() + kMipsLdlOffset));
1307 Register scratch = temps.Acquire();
1308 ldr(scratch,
MemOperand(rs.rm(), rs.offset() + kMipsLdrOffset));
1309 ldl(scratch,
MemOperand(rs.rm(), rs.offset() + kMipsLdlOffset));
1322 dsll32(scratch, scratch, 0);
1323 Daddu(rd, rd, scratch);
1333 DCHECK(kMipsSdrOffset <= 7 && kMipsSdlOffset <= 7);
1337 sdr(rd,
MemOperand(source.rm(), source.offset() + kMipsSdrOffset));
1338 sdl(rd,
MemOperand(source.rm(), source.offset() + kMipsSdlOffset));
1488 : is_int16(rs.offset());
1489 if (is_one_instruction) {
1493 Register scratch = temps.Acquire();
1494 li(scratch, rs.offset());
1495 daddu(scratch, scratch, rs.rm());
1502 : is_int16(rs.offset());
1503 if (is_one_instruction) {
1507 Register scratch = temps.Acquire();
1508 li(scratch, rs.offset());
1509 daddu(scratch, scratch, rs.rm());
1516 : is_int16(rs.offset());
1517 if (is_one_instruction) {
1521 Register scratch = temps.Acquire();
1522 li(scratch, rs.offset());
1523 daddu(scratch, scratch, rs.rm());
1530 : is_int16(rs.offset());
1531 if (is_one_instruction) {
1535 Register scratch = temps.Acquire();
1536 li(scratch, rs.offset());
1537 daddu(scratch, scratch, rs.rm());
1550 li(dst, Operand(value), mode);
1556 if (reference.IsIsolateFieldId()) {
1557 Daddu(dst,
kRootRegister, Operand(reference.offset_from_root_register()));
1560 if (
options().isolate_independent_code) {
1568 CHECK(!reference.IsIsolateFieldId());
1569 li(dst, Operand(reference), mode);
1582 if (is_int16(
static_cast<int32_t>(
j.immediate()))) {
1594static inline int InstrCountForLoadReplicatedConst32(int64_t value) {
1595 uint32_t
x =
static_cast<uint32_t
>(
value);
1596 uint32_t
y =
static_cast<uint32_t
>(value >> 32);
1599 return (is_uint16(
x) || is_int16(
x) || (
x &
kImm16Mask) == 0) ? 2 : 3;
1606 if (is_int32(value)) {
1609 int bit31 = value >> 31 & 0x1;
1616 }
else if ((value &
kImm16Mask) == 0 && is_int16((value >> 32) + bit31) &&
1620 ((value >> 31) & 0x1FFFF) == ((0x20000 - bit31) & 0x1FFFF) &&
1623 }
else if (is_int16(
static_cast<int32_t>(value)) &&
1626 }
else if (is_int16(
static_cast<int32_t>(value)) &&
1627 ((value >> 31) & 0x1FFFF) == ((0x20000 - bit31) & 0x1FFFF) &&
1631 value == std::numeric_limits<int64_t>::max()) {
1635 int rep32_count = InstrCountForLoadReplicatedConst32(value);
1636 int64_t tmp = value >> shift_cnt;
1637 if (is_uint16(tmp)) {
1639 }
else if (is_int16(tmp)) {
1641 }
else if (rep32_count < 3) {
1643 }
else if (is_int32(tmp)) {
1647 tmp = value >> shift_cnt;
1648 if (is_uint16(tmp)) {
1650 }
else if (is_int16(tmp)) {
1652 }
else if (rep32_count < 4) {
1655 int64_t imm =
value;
1657 imm = (imm >> 32) + bit31;
1661 imm = (imm >> 16) + (imm >> 15 & 0x1);
1667 if (is_int48(value)) {
1668 int64_t k = value >> 16;
1675 int64_t k = value >> 32;
1706 if (is_int32(
j.immediate())) {
1709 int bit31 =
j.immediate() >> 31 & 0x1;
1725 is_int16((
j.immediate() >> 32) + bit31) &&
1732 ((
j.immediate() >> 31) & 0x1FFFF) ==
1733 ((0x20000 - bit31) & 0x1FFFF) &&
1740 }
else if (is_int16(
static_cast<int32_t>(
j.immediate())) &&
1741 is_int16((
j.immediate() >> 32) + bit31) &&
1747 }
else if (is_int16(
static_cast<int32_t>(
j.immediate())) &&
1748 ((
j.immediate() >> 31) & 0x1FFFF) ==
1749 ((0x20000 - bit31) & 0x1FFFF) &&
1756 j.immediate() == std::numeric_limits<int64_t>::max()) {
1760 daddiu(rd, zero_reg, -1);
1761 if (shift_cnt < 32) {
1762 dsrl(rd, rd, shift_cnt);
1764 dsrl32(rd, rd, shift_cnt & 31);
1768 int rep32_count = InstrCountForLoadReplicatedConst32(
j.immediate());
1769 int64_t tmp =
j.immediate() >> shift_cnt;
1770 if (is_uint16(tmp)) {
1774 if (shift_cnt < 32) {
1775 dsll(rd, rd, shift_cnt);
1777 dsll32(rd, rd, shift_cnt & 31);
1779 }
else if (is_int16(tmp)) {
1783 if (shift_cnt < 32) {
1784 dsll(rd, rd, shift_cnt);
1786 dsll32(rd, rd, shift_cnt & 31);
1788 }
else if (rep32_count < 3) {
1793 Dins(rd, rd, 32, 32);
1794 }
else if (is_int32(tmp)) {
1800 if (shift_cnt < 32) {
1801 dsll(rd, rd, shift_cnt);
1803 dsll32(rd, rd, shift_cnt & 31);
1807 tmp =
j.immediate() >> shift_cnt;
1808 if (is_uint16(tmp)) {
1812 if (shift_cnt < 32) {
1813 dsll(rd, rd, shift_cnt);
1815 dsll32(rd, rd, shift_cnt & 31);
1818 }
else if (is_int16(tmp)) {
1822 if (shift_cnt < 32) {
1823 dsll(rd, rd, shift_cnt);
1825 dsll32(rd, rd, shift_cnt & 31);
1828 }
else if (rep32_count < 4) {
1832 Dins(rd, rd, 32, 32);
1837 int64_t imm =
j.immediate();
1839 imm = (imm >> 32) + bit31;
1843 imm = (imm >> 16) + (imm >> 15 & 0x1);
1848 if (is_int48(
j.immediate())) {
1849 Operand k = Operand(
j.immediate() >> 16);
1856 Operand k = Operand(
j.immediate() >> 32);
1887 if (li_neg_count <= li_not_count && li_neg_count < li_count - 1) {
1888 DCHECK(
j.immediate() != std::numeric_limits<int64_t>::min());
1890 Dsubu(rd, zero_reg, rd);
1891 }
else if (li_neg_count > li_not_count && li_not_count < li_count - 1) {
1892 DCHECK(
j.immediate() != std::numeric_limits<int64_t>::min());
1900 if (
j.IsHeapNumberRequest()) {
1904 immediate =
j.immediate();
1912 DCHECK(is_int32(immediate));
1931 int64_t imm =
j.immediate();
1934 imm = (imm >> 32) + ((imm >> 31) & 0x1);
1936 imm = (imm >> 16) + ((imm >> 15) & 0x1);
1954 int16_t num_to_push = regs.Count();
1957 Dsubu(sp, sp, Operand(stack_offset));
1959 if ((regs.bits() & (1 <<
i)) != 0) {
1970 if ((regs.bits() & (1 <<
i)) != 0) {
1975 daddiu(sp, sp, stack_offset);
1979 int16_t num_to_push = regs.Count();
1982 Dsubu(sp, sp, Operand(stack_offset));
1984 if ((regs.bits() & (1 <<
i)) != 0) {
1995 if ((regs.bits() & (1 <<
i)) != 0) {
2000 daddiu(sp, sp, stack_offset);
2004 int16_t num_to_push = regs.Count();
2007 Dsubu(sp, sp, Operand(stack_offset));
2009 if ((regs.bits() & (1 <<
i)) != 0) {
2020 if ((regs.bits() & (1 <<
i)) != 0) {
2025 daddiu(sp, sp, stack_offset);
2037 DCHECK(
pos < 64 && 0 < size && size <= 64 && 0 <
pos + size &&
2041 }
else if (
pos >= 32) {
2058 DCHECK(
pos < 64 && 0 < size && size <= 64 && 0 <
pos + size &&
2060 if (
pos + size <= 32) {
2062 }
else if (
pos < 32) {
2070 int size,
bool sign_extend) {
2072 Dext(dest, dest, 0, size);
2093 Dror(dest, dest,
pos);
2094 Dins(dest, source, 0, size);
2097 Register scratch = temps.Acquire();
2098 Dsubu(scratch, zero_reg,
pos);
2099 Dror(dest, dest, scratch);
2122 Xor(scratch1, scratch1, scratch2);
2145 dmfc1(scratch1, fs);
2147 Xor(scratch1, scratch1, scratch2);
2148 dmtc1(scratch1, fd);
2168 Dext(t9, rs, 0, 32);
2187 Label msb_clear, conversion_done;
2189 Branch(&msb_clear,
ge, rs, Operand(zero_reg));
2205 bind(&conversion_done);
2222 Dext(t9, rs, 0, 32);
2259 bind(&conversion_done);
2279 FPURegister scratch) {
2286 Register scratch1 = temps.Acquire();
2287 li(scratch1, 0x7FFFFFFFFFFFFFFF);
2288 and_(t8, t8, scratch1);
2295 FPURegister scratch) {
2302 FPURegister scratch) {
2309 FPURegister scratch, Register
result) {
2316 FPURegister scratch, Register
result) {
2339 FPURegister scratch) {
2346 Register scratch1 = temps.Acquire();
2347 li(scratch1, 0x41F00000);
2348 mtc1(zero_reg, scratch);
2349 mthc1(scratch1, scratch);
2353 Label simple_convert;
2358 Addu(rd, zero_reg, -1);
2363 bind(&simple_convert);
2372 FPURegister scratch) {
2379 Register scratch1 = temps.Acquire();
2380 li(scratch1, 0x4F800000);
2381 mtc1(scratch1, scratch);
2385 Label simple_convert;
2390 Addu(rd, zero_reg, -1);
2395 bind(&simple_convert);
2404 FPURegister scratch, Register
result) {
2408 Label simple_convert, done, fail;
2411 Move(scratch, -1.0);
2418 li(at, 0x43E0000000000000);
2428 sub_d(scratch, fs, scratch);
2431 Or(rd, rd, Operand(1UL << 63));
2435 bind(&simple_convert);
2444 Register scratch1 = temps.Acquire();
2445 addiu(scratch1, zero_reg, -1);
2446 dsrl(scratch1, scratch1, 1);
2457 FPURegister scratch, Register
result) {
2461 Label simple_convert, done, fail;
2464 Move(scratch, -1.0f);
2473 Register scratch1 = temps.Acquire();
2474 li(scratch1, 0x5F000000);
2475 mtc1(scratch1, scratch);
2485 sub_s(scratch, fs, scratch);
2488 Or(rd, rd, Operand(1UL << 63));
2492 bind(&simple_convert);
2501 Register scratch1 = temps.Acquire();
2502 addiu(scratch1, zero_reg, -1);
2503 dsrl(scratch1, scratch1, 1);
2513template <
typename RoundFunc>
2520 li(at, Operand(mode));
2529 mfhc1(scratch, src);
2535 round(
this, dst, src);
2539 srl(at, scratch, 31);
2548 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2549 masm->floor_l_d(dst, src);
2555 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2556 masm->ceil_l_d(dst, src);
2562 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2563 masm->trunc_l_d(dst, src);
2569 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2570 masm->round_l_d(dst, src);
2574template <
typename RoundFunc>
2581 li(at, Operand(mode));
2599 round(
this, dst, src);
2603 srl(at, scratch, 31);
2612 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2613 masm->floor_w_s(dst, src);
2619 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2620 masm->ceil_w_s(dst, src);
2626 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2627 masm->trunc_w_s(dst, src);
2633 [](MacroAssembler* masm, FPURegister dst, FPURegister src) {
2634 masm->round_w_s(dst, src);
2641 Register scratch = temps.Acquire();
2667 Register scratch = temps.Acquire();
2700#define EXT_MUL_BINOP(type, ilv_instr, dotp_instr) \
2702 xor_v(kSimd128RegZero, kSimd128RegZero, kSimd128RegZero); \
2703 ilv_instr(kSimd128ScratchReg, kSimd128RegZero, src1); \
2704 ilv_instr(kSimd128RegZero, kSimd128RegZero, src2); \
2705 dotp_instr(dst, kSimd128ScratchReg, kSimd128RegZero); \
2709 MSARegister src1, MSARegister src2) {
2723 MSARegister src1, MSARegister src2) {
2739 Register scratch = temps.Acquire();
2789 scratch2 = zero_reg;
2791 li(scratch2, Operand(mode));
2805 scratch2 = zero_reg;
2807 li(scratch2, Operand(mode));
2815 FPURegister ft, FPURegister scratch) {
2816 DCHECK(fr != scratch && fs != scratch && ft != scratch);
2817 mul_s(scratch, fs, ft);
2818 add_s(fd, fr, scratch);
2822 FPURegister ft, FPURegister scratch) {
2823 DCHECK(fr != scratch && fs != scratch && ft != scratch);
2824 mul_d(scratch, fs, ft);
2825 add_d(fd, fr, scratch);
2829 FPURegister ft, FPURegister scratch) {
2830 DCHECK(fr != scratch && fs != scratch && ft != scratch);
2831 mul_s(scratch, fs, ft);
2832 sub_s(fd, scratch, fr);
2836 FPURegister ft, FPURegister scratch) {
2837 DCHECK(fr != scratch && fs != scratch && ft != scratch);
2838 mul_d(scratch, fs, ft);
2839 sub_d(fd, scratch, fr);
2843 FPURegister cmp1, FPURegister cmp2) {
2845 sizeField = sizeField ==
D ?
L :
W;
2849 c(
cc, sizeField, cmp1, cmp2);
2987 Register scratch = temps.Acquire();
2988 DCHECK(src_low != scratch);
2989 mfhc1(scratch, dst);
2991 mthc1(scratch, dst);
2996 Register scratch = temps.Acquire();
2997 li(scratch, Operand(
static_cast<int32_t>(src)));
3009 uint32_t
lo = src & 0xFFFFFFFF;
3010 uint32_t
hi = src >> 32;
3015 Register scratch = temps.Acquire();
3016 li(scratch, Operand(
lo));
3019 mtc1(zero_reg, dst);
3025 Register scratch = temps.Acquire();
3026 li(scratch, Operand(
hi));
3027 mthc1(scratch, dst);
3029 mthc1(zero_reg, dst);
3080 Movt(dest, zero_reg);
3089 Movf(dest, zero_reg);
3118 Register scratch = temps.Acquire();
3119 Daddu(scratch, rs, -1);
3120 Xor(rd, scratch, rs);
3121 And(rd, rd, scratch);
3127 Subu(rd, scratch, rd);
3144 Register scratch = temps.Acquire();
3145 Daddu(scratch, rs, -1);
3146 Xor(rd, scratch, rs);
3147 And(rd, rd, scratch);
3153 Dsubu(rd, scratch, rd);
3181 uint32_t
B0 = 0x55555555;
3182 uint32_t
B1 = 0x33333333;
3183 uint32_t
B2 = 0x0F0F0F0F;
3184 uint32_t value = 0x01010101;
3185 uint32_t
shift = 24;
3189 Register scratch = temps.Acquire();
3191 srl(scratch, rs, 1);
3193 And(scratch, scratch, scratch2);
3194 Subu(scratch, rs, scratch);
3196 And(rd, scratch, scratch2);
3197 srl(scratch, scratch, 2);
3198 And(scratch, scratch, scratch2);
3199 Addu(scratch, rd, scratch);
3200 srl(rd, scratch, 4);
3201 Addu(rd, rd, scratch);
3203 And(rd, rd, scratch2);
3205 Mul(rd, rd, scratch);
3211 uint64_t
B0 = 0x5555555555555555l;
3212 uint64_t
B1 = 0x3333333333333333l;
3213 uint64_t
B2 = 0x0F0F0F0F0F0F0F0Fl;
3214 uint64_t value = 0x0101010101010101l;
3215 uint64_t
shift = 24;
3219 Register scratch = temps.Acquire();
3221 dsrl(scratch, rs, 1);
3223 And(scratch, scratch, scratch2);
3224 Dsubu(scratch, rs, scratch);
3226 And(rd, scratch, scratch2);
3227 dsrl(scratch, scratch, 2);
3228 And(scratch, scratch, scratch2);
3229 Daddu(scratch, rd, scratch);
3230 dsrl(rd, scratch, 4);
3231 Daddu(rd, rd, scratch);
3233 And(rd, rd, scratch2);
3235 Dmul(rd, rd, scratch);
3247 trunc_w_d(single_scratch, double_input);
3252 And(scratch, scratch,
3256 Branch(done,
eq, scratch, Operand(zero_reg));
3272#if V8_ENABLE_WEBASSEMBLY
3273 if (stub_mode == StubCallMode::kCallWasmRuntimeStub) {
3291 const Operand& rhs) {
3295 if (rhs.IsImmediate()) {
3296 if (rhs.immediate() == 0) {
3300 Sltu(dst, zero_reg, lhs);
3302 }
else if (is_int16(-rhs.immediate())) {
3303 Daddu(dst, lhs, Operand(-rhs.immediate()));
3307 Sltu(dst, zero_reg, dst);
3314 Sltu(dst, zero_reg, dst);
3322 Sltu(dst, zero_reg, dst);
3340 Sltu(dst, lhs, rhs);
3343 Sgeu(dst, lhs, rhs);
3346 Sgtu(dst, lhs, rhs);
3349 Sleu(dst, lhs, rhs);
3359#define BRANCH_ARGS_CHECK(cond, rs, rt) \
3360 DCHECK((cond == cc_always && rs == zero_reg && rt.rm() == zero_reg) || \
3361 (cond != cc_always && (rs != zero_reg || rt.rm() != zero_reg)))
3376 if (
L->is_bound()) {
3393 if (
L->is_bound()) {
3425 Register scratch = temps.Acquire();
3427 Branch(
L, cond, rs, Operand(scratch), bdslot);
3488 if (!
is_near(
L, bits))
return false;
3494 Register* scratch,
const Operand&
rt) {
3495 if (!
is_near(
L, bits))
return false;
3503 const Operand&
rt) {
3507 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
3561 }
else if (rs == zero_reg) {
3580 }
else if (rs == zero_reg) {
3598 }
else if (rs == zero_reg) {
3617 }
else if (rs == zero_reg) {
3637 }
else if (rs == zero_reg) {
3656 }
else if (rs == zero_reg) {
3674 }
else if (rs == zero_reg) {
3692 }
else if (rs == zero_reg) {
3715 Register rs,
const Operand&
rt,
3718 if (!
is_near(
L, OffsetSize::kOffset16))
return false;
3722 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
3738 beq(rs, zero_reg, offset32);
3743 beq(rs, scratch, offset32);
3749 bne(rs, zero_reg, offset32);
3754 bne(rs, scratch, offset32);
3766 bne(scratch, zero_reg, offset32);
3774 Slt(scratch, rs,
rt);
3776 beq(scratch, zero_reg, offset32);
3784 Slt(scratch, rs,
rt);
3786 bne(scratch, zero_reg, offset32);
3796 beq(scratch, zero_reg, offset32);
3804 bne(rs, zero_reg, offset32);
3808 bne(scratch, zero_reg, offset32);
3816 Sltu(scratch, rs,
rt);
3818 beq(scratch, zero_reg, offset32);
3825 Sltu(scratch, rs,
rt);
3827 bne(scratch, zero_reg, offset32);
3833 beq(rs, zero_reg, offset32);
3837 beq(scratch, zero_reg, offset32);
3852 Register rs,
const Operand&
rt,
3888void MacroAssembler::BranchAndLink(int32_t
offset,
Condition cond, Register rs,
3896 if (
L->is_bound()) {
3911void MacroAssembler::BranchAndLink(Label*
L,
Condition cond, Register rs,
3913 if (
L->is_bound()) {
3971 const Operand&
rt) {
3974 Register scratch = temps.hasAvailable() ? temps.Acquire() : t8;
3985 if (!
is_near(
L, bits))
return false;
3986 Subu(scratch, rs,
rt);
3991 if (!
is_near(
L, bits))
return false;
3992 Subu(scratch, rs,
rt);
4000 if (rs.code() ==
rt.rm().
code()) {
4002 }
else if (rs == zero_reg) {
4010 if (!
is_near(
L, bits))
return false;
4018 if (rs.code() ==
rt.rm().
code()) {
4021 }
else if (rs == zero_reg) {
4029 if (!
is_near(
L, bits))
return false;
4030 Slt(scratch, rs,
rt);
4037 if (rs.code() ==
rt.rm().
code()) {
4039 }
else if (rs == zero_reg) {
4047 if (!
is_near(
L, bits))
return false;
4048 Slt(scratch, rs,
rt);
4055 if (rs.code() ==
rt.rm().
code()) {
4058 }
else if (rs == zero_reg) {
4066 if (!
is_near(
L, bits))
return false;
4076 if (!
is_near(
L, bits))
return false;
4083 if (!
is_near(
L, bits))
return false;
4084 Sltu(scratch, rs,
rt);
4090 if (!
is_near(
L, bits))
return false;
4091 Sltu(scratch, rs,
rt);
4097 if (!
is_near(
L, bits))
return false;
4116 if (!
is_near(
L, OffsetSize::kOffset16))
return false;
4142 addiu(scratch, scratch, -1);
4147 Slt(scratch, rs,
rt);
4148 addiu(scratch, scratch, -1);
4153 Slt(scratch, rs,
rt);
4154 addiu(scratch, scratch, -1);
4160 addiu(scratch, scratch, -1);
4168 addiu(scratch, scratch, -1);
4173 Sltu(scratch, rs,
rt);
4174 addiu(scratch, scratch, -1);
4179 Sltu(scratch, rs,
rt);
4180 addiu(scratch, scratch, -1);
4186 addiu(scratch, scratch, -1);
4226 int constant_index) {
4253 ExternalReference reference, Register scratch) {
4255 if (reference.IsIsolateFieldId()) {
4258 if (
options().enable_root_relative_access) {
4275 DCHECK(scratch.is_valid());
4283 DCHECK(scratch.is_valid());
4284 li(scratch, reference);
4323 li(t9, Operand(target, rmode));
4324 Jump(t9,
al, zero_reg, Operand(zero_reg), bd);
4332 Jump(
static_cast<intptr_t
>(target), rmode, cond, rs,
rt, bd);
4346 if (
isolate()->builtins()->IsBuiltinHandle(code, &builtin)) {
4352 Jump(
static_cast<intptr_t
>(code.address()), rmode,
cc_always, rs,
rt, bd);
4388 unsigned higher_limit,
4389 Label* on_in_range) {
4391 if (lower_limit != 0) {
4393 Register scratch = temps.Acquire();
4394 Dsubu(scratch, value, Operand(lower_limit));
4395 Branch(on_in_range,
ls, scratch, Operand(higher_limit - lower_limit));
4397 Branch(on_in_range,
ls, value, Operand(higher_limit - lower_limit));
4404 li(t9, Operand(
static_cast<int64_t
>(target), rmode),
ADDRESS_LOAD);
4405 Call(t9, cond, rs,
rt, bd);
4413 if (
isolate()->builtins()->IsBuiltinHandle(code, &builtin)) {
4418 Call(code.address(), rmode, cond, rs,
rt, bd);
4431 Ld(target,
MemOperand(target, IsolateData::builtin_entry_table_offset()));
4452 switch (
options().builtin_call_jump_mode) {
4476 Register type, Operand range) {
4492 switch (
options().builtin_call_jump_mode) {
4518 Register scratch = temps.Acquire();
4526 *
reinterpret_cast<uint64_t*
>(
pc_) = target;
4527 pc_ +=
sizeof(uint64_t);
4548 static constexpr int kNumInstructionsToJump = 4;
4554 addiupc(
ra, kNumInstructionsToJump + 1);
4591 or_(t8,
ra, zero_reg);
4597 or_(
ra, t8, zero_reg);
4610 or_(t8,
ra, zero_reg);
4616 or_(
ra, t8, zero_reg);
4657 DCHECK(is_int31(drop_size));
4659 if (is_int16(drop_size)) {
4661 daddiu(sp, sp, drop_size);
4664 Register scratch = temps.Acquire();
4665 li(scratch, drop_size);
4667 daddu(sp, sp, scratch);
4672 const Operand& r2) {
4688 const Operand& op) {
4708 Xor(reg1, reg1, Operand(reg2));
4709 Xor(reg2, reg2, Operand(reg1));
4710 Xor(reg1, reg1, Operand(reg2));
4738 Register scratch = temps.Acquire();
4739 li(scratch, Operand(smi));
4745 Register scratch = temps.Acquire();
4755 mov(scratch, zero_reg);
4761 Daddu(scratch, scratch, Operand(1));
4772 Daddu(scratch, scratch, Operand(-1));
4804 Register scratch = temps.Acquire();
4894 : IsolateData::jslimit_offset();
4901 Label* stack_overflow) {
4910 dsubu(scratch1, sp, scratch1);
4914 Branch(stack_overflow,
le, scratch1, Operand(scratch2));
4917#ifdef V8_ENABLE_LEAPTIERING
4918void MacroAssembler::LoadEntrypointFromJSDispatchTable(Register
destination,
4919 Register dispatch_handle,
4925 li(scratch, ExternalReference::js_dispatch_table_address());
4926 dsrl(index, dispatch_handle, kJSDispatchHandleShift);
4932void MacroAssembler::LoadParameterCountFromJSDispatchTable(
4933 Register
destination, Register dispatch_handle, Register scratch) {
4939 li(scratch, ExternalReference::js_dispatch_table_address());
4940 dsrl(index, dispatch_handle, kJSDispatchHandleShift);
4943 static_assert(JSDispatchEntry::kParameterCountMask == 0xffff);
4947void MacroAssembler::LoadEntrypointAndParameterCountFromJSDispatchTable(
4948 Register entrypoint, Register
parameter_count, Register dispatch_handle,
4955 li(scratch, ExternalReference::js_dispatch_table_address());
4956 dsrl(index, dispatch_handle, kJSDispatchHandleShift);
4959 Ld(entrypoint,
MemOperand(scratch, JSDispatchEntry::kEntrypointOffset));
4960 static_assert(JSDispatchEntry::kParameterCountMask == 0xffff);
4966 Register code_data_container, Register scratch,
Condition cond,
4970 Branch(target, cond, scratch, Operand(zero_reg));
4978 Register actual_parameter_count,
4981 Label regular_invoke;
4988 DCHECK_EQ(expected_parameter_count, a2);
4992 Dsubu(expected_parameter_count, expected_parameter_count,
4993 actual_parameter_count);
4994 Branch(®ular_invoke,
le, expected_parameter_count, Operand(zero_reg));
4996 Label stack_overflow;
5005 Dsubu(sp, sp, Operand(t0));
5008 mov(t0, actual_parameter_count);
5012 Dsubu(t0, t0, Operand(1));
5015 Branch(©,
gt, t0, Operand(zero_reg));
5019 LoadRoot(t0, RootIndex::kUndefinedValue);
5024 Dsubu(expected_parameter_count, expected_parameter_count, Operand(1));
5026 Branch(&loop,
gt, expected_parameter_count, Operand(zero_reg));
5031 bind(&stack_overflow);
5039 bind(®ular_invoke);
5044 Register expected_parameter_count_or_dispatch_handle,
5045 Register actual_parameter_count) {
5047 expected_parameter_count_or_dispatch_handle,
5048 actual_parameter_count));
5051 li(t0, ExternalReference::debug_hook_on_function_call_address(
isolate()));
5053 Branch(&skip_hook,
eq, t0, Operand(zero_reg));
5059 SmiTag(expected_parameter_count_or_dispatch_handle);
5060 SmiTag(actual_parameter_count);
5061 Push(expected_parameter_count_or_dispatch_handle, actual_parameter_count);
5072 Pop(expected_parameter_count_or_dispatch_handle, actual_parameter_count);
5075 SmiUntag(expected_parameter_count_or_dispatch_handle);
5080#ifdef V8_ENABLE_LEAPTIERING
5082 Register function, Register actual_parameter_count,
InvokeType type,
5096 argument_adaption_mode);
5100 Register function, Register
new_target, Register actual_parameter_count,
5116 Register function, Register
new_target, Register actual_parameter_count,
5129 Label debug_hook, continue_after_hook;
5131 li(t0, ExternalReference::debug_hook_on_function_call_address(
isolate()));
5135 bind(&continue_after_hook);
5139 LoadRoot(a3, RootIndex::kUndefinedValue);
5144 Register expected_parameter_count = a2;
5145 LoadParameterCountFromJSDispatchTable(expected_parameter_count,
5146 dispatch_handle, scratch);
5147 InvokePrologue(expected_parameter_count, actual_parameter_count, type);
5154 dispatch_handle, scratch);
5169 Branch(&continue_after_hook);
5175 Register expected_parameter_count,
5176 Register actual_parameter_count,
5185 actual_parameter_count);
5189 LoadRoot(a3, RootIndex::kUndefinedValue);
5192 InvokePrologue(expected_parameter_count, actual_parameter_count, type);
5196 constexpr int unused_argument_count = 0;
5212 Register function, Register
new_target, Register actual_parameter_count,
5220 Register expected_parameter_count = a2;
5225 Lhu(expected_parameter_count,
5227 SharedFunctionInfo::kFormalParameterCountOffset));
5230 actual_parameter_count, type);
5234 Register expected_parameter_count,
5235 Register actual_parameter_count,
5248 actual_parameter_count, type);
5255 Register type_reg) {
5264 Dsubu(range, type_reg, Operand(lower_limit));
5271 const Operand& right, Register overflow) {
5276 if (!right.is_reg()) {
5277 li(at, Operand(right));
5280 right_reg = right.rm();
5283 DCHECK(left != scratch && right_reg != scratch && dst != scratch &&
5284 overflow != scratch);
5285 DCHECK(overflow != left && overflow != right_reg);
5287 if (dst == left || dst == right_reg) {
5288 daddu(scratch, left, right_reg);
5289 xor_(overflow, scratch, left);
5290 xor_(at, scratch, right_reg);
5291 and_(overflow, overflow, at);
5294 daddu(dst, left, right_reg);
5295 xor_(overflow, dst, left);
5296 xor_(at, dst, right_reg);
5297 and_(overflow, overflow, at);
5302 const Operand& right, Register overflow) {
5307 if (!right.is_reg()) {
5308 li(at, Operand(right));
5311 right_reg = right.rm();
5314 DCHECK(left != scratch && right_reg != scratch && dst != scratch &&
5315 overflow != scratch);
5316 DCHECK(overflow != left && overflow != right_reg);
5318 if (dst == left || dst == right_reg) {
5319 dsubu(scratch, left, right_reg);
5320 xor_(overflow, left, scratch);
5321 xor_(at, left, right_reg);
5322 and_(overflow, overflow, at);
5325 dsubu(dst, left, right_reg);
5326 xor_(overflow, left, dst);
5327 xor_(at, left, right_reg);
5328 and_(overflow, overflow, at);
5333 const Operand& right, Register overflow) {
5338 if (!right.is_reg()) {
5339 li(at, Operand(right));
5342 right_reg = right.rm();
5345 DCHECK(left != scratch && right_reg != scratch && dst != scratch &&
5346 overflow != scratch);
5347 DCHECK(overflow != left && overflow != right_reg);
5349 if (dst == left || dst == right_reg) {
5350 Mul(scratch, left, right_reg);
5351 Mulh(overflow, left, right_reg);
5354 Mul(dst, left, right_reg);
5355 Mulh(overflow, left, right_reg);
5359 xor_(overflow, overflow, scratch);
5363 const Operand& right, Register overflow) {
5368 if (!right.is_reg()) {
5369 li(at, Operand(right));
5372 right_reg = right.rm();
5375 DCHECK(left != scratch && right_reg != scratch && dst != scratch &&
5376 overflow != scratch);
5377 DCHECK(overflow != left && overflow != right_reg);
5379 if (dst == left || dst == right_reg) {
5380 Dmul(scratch, left, right_reg);
5381 Dmulh(overflow, left, right_reg);
5384 Dmul(dst, left, right_reg);
5385 Dmulh(overflow, left, right_reg);
5388 dsra32(scratch, dst, 31);
5389 xor_(overflow, overflow, scratch);
5393 int num_arguments) {
5400 CHECK(f->nargs < 0 || f->nargs == num_arguments);
5408 bool switch_to_central_stack =
options().is_wasm;
5416 if (function->nargs >= 0) {
5423 bool builtin_exit_frame) {
5429 Label* target_if_cleared) {
5437 Register scratch2) {
5439 if (
v8_flags.native_code_counters && counter->Enabled()) {
5446 Addu(scratch1, scratch1, Operand(value));
5453 Register scratch2) {
5455 if (
v8_flags.native_code_counters && counter->Enabled()) {
5462 Subu(scratch1, scratch1, Operand(value));
5502 li(a0, Operand(
static_cast<int>(reason)));
5503 li(a1, ExternalReference::abort_with_reason());
5537 static const int kExpectedAbortInstructions = 10;
5539 DCHECK_LE(abort_instructions, kExpectedAbortInstructions);
5540 while (abort_instructions++ < kExpectedAbortInstructions) {
5551 Register scratch, Label* fbv_undef) {
5560 Branch(&done,
eq, scratch, Operand(FEEDBACK_VECTOR_TYPE));
5563 LoadRoot(dst, RootIndex::kUndefinedValue);
5572 FieldMemOperand(dst, Map::kConstructorOrBackPointerOrNativeContextOffset));
5578 Register scratch = temps.Acquire();
5594#if V8_ENABLE_WEBASSEMBLY
5595 if (type == StackFrame::WASM || type == StackFrame::WASM_LIFTOFF_SETUP) {
5611 DCHECK(frame_type == StackFrame::EXIT ||
5612 frame_type == StackFrame::BUILTIN_EXIT ||
5613 frame_type == StackFrame::API_ACCESSOR_EXIT ||
5614 frame_type == StackFrame::API_CALLBACK_EXIT);
5616 using ER = ExternalReference;
5647 ER c_entry_fp_address =
5648 ER::Create(IsolateAddressId::kCEntryFPAddress,
isolate());
5651 ER context_address = ER::Create(IsolateAddressId::kContextAddress,
isolate());
5659 Dsubu(sp, sp, Operand((stack_space + 1) *
kPointerSize));
5660 if (frame_alignment > 0) {
5662 And(sp, sp, Operand(-frame_alignment));
5675 using ER = ExternalReference;
5678 ER context_address = ER::Create(IsolateAddressId::kContextAddress,
isolate());
5687 ER c_entry_fp_address =
5688 ER::Create(IsolateAddressId::kCEntryFPAddress,
isolate());
5700#if V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64
5711 return v8_flags.sim_stack_alignment;
5729 Register scratch = temps.Acquire();
5731 Branch(bd, smi_label,
eq, scratch, Operand(zero_reg));
5738 Register scratch = temps.Acquire();
5740 Branch(bd, not_smi_label,
ne, scratch, Operand(zero_reg));
5743#ifdef V8_ENABLE_DEBUG_CODE
5766 Branch(&ok,
kEqual, map_tmp, RootIndex::kHeapNumberMap);
5770 Branch(&ok,
kEqual,
object, RootIndex::kUndefinedValue);
5778 Abort(abort_reason);
5787 Register scratch = temps.Acquire();
5789 Check(
ne, AbortReason::kOperandIsASmi, scratch, Operand(zero_reg));
5798 Register scratch = temps.Acquire();
5800 Check(
eq, AbortReason::kOperandIsASmi, scratch, Operand(zero_reg));
5808 const int frame_alignment_mask = frame_alignment - 1;
5811 Label alignment_as_expected;
5815 Register scratch = temps.Acquire();
5816 andi(scratch, sp, frame_alignment_mask);
5817 Branch(&alignment_as_expected,
eq, scratch, Operand(zero_reg));
5821 bind(&alignment_as_expected);
5832 Check(
ne, AbortReason::kOperandIsASmiAndNotAConstructor, t8,
5837 And(t8, t8, Operand(Map::Bits1::IsConstructorBit::kMask));
5838 Check(
ne, AbortReason::kOperandIsNotAConstructor, t8, Operand(zero_reg));
5848 Check(
ne, AbortReason::kOperandIsASmiAndNotAFunction, t8,
5853 Check(
ls, AbortReason::kOperandIsNotAFunction, t8,
5854 Operand(LAST_JS_FUNCTION_TYPE - FIRST_JS_FUNCTION_TYPE));
5865 Check(
ne, AbortReason::kOperandIsASmiAndNotAFunction, t8,
5870 Check(
ls, AbortReason::kOperandIsNotACallableFunction, t8,
5883 Check(
ne, AbortReason::kOperandIsASmiAndNotABoundFunction, t8,
5886 Check(
eq, AbortReason::kOperandIsNotABoundFunction, t8,
5887 Operand(JS_BOUND_FUNCTION_TYPE));
5897 Check(
ne, AbortReason::kOperandIsASmiAndNotAGeneratorObject, t8,
5900 Dsubu(t8, t8, Operand(FIRST_JS_GENERATOR_OBJECT_TYPE));
5902 ls, AbortReason::kOperandIsNotAGeneratorObject, t8,
5903 Operand(LAST_JS_GENERATOR_OBJECT_TYPE - FIRST_JS_GENERATOR_OBJECT_TYPE));
5910 Label done_checking;
5912 LoadRoot(scratch, RootIndex::kUndefinedValue);
5913 Branch(&done_checking,
eq,
object, Operand(scratch));
5915 Assert(
eq, AbortReason::kExpectedUndefinedOrCell, scratch,
5916 Operand(ALLOCATION_SITE_TYPE));
5917 bind(&done_checking);
5924 FPURegister src2, Label* out_of_line) {
5936 max_s(dst, src1, src2);
5938 Label return_left, return_right, done;
5950 Branch(&return_left,
eq, t8, Operand(zero_reg));
5954 bind(&return_right);
5971 add_s(dst, src1, src2);
5975 FPURegister src2, Label* out_of_line) {
5987 min_s(dst, src1, src2);
5989 Label return_left, return_right, done;
6001 Branch(&return_right,
eq, t8, Operand(zero_reg));
6005 bind(&return_right);
6022 add_s(dst, src1, src2);
6026 FPURegister src2, Label* out_of_line) {
6038 max_d(dst, src1, src2);
6040 Label return_left, return_right, done;
6051 Branch(&return_left,
eq, t8, Operand(zero_reg));
6055 bind(&return_right);
6072 add_d(dst, src1, src2);
6076 FPURegister src2, Label* out_of_line) {
6088 min_d(dst, src1, src2);
6090 Label return_left, return_right, done;
6101 Branch(&return_right,
eq, t8, Operand(zero_reg));
6105 bind(&return_right);
6122 add_d(dst, src1, src2);
6126 int num_double_arguments) {
6127 int stack_passed_words = 0;
6128 int num_args = num_reg_arguments + num_double_arguments;
6135 return stack_passed_words;
6139 int num_double_arguments,
6151 int stack_passed_arguments =
6157 Dsubu(sp, sp, Operand((stack_passed_arguments + 1) *
kPointerSize));
6159 And(sp, sp, Operand(-frame_alignment));
6162 Dsubu(sp, sp, Operand(stack_passed_arguments *
kPointerSize));
6172 int num_reg_arguments,
6173 int num_double_arguments,
6175 Label* return_location) {
6180 set_isolate_data_slots, return_location);
6184 int num_double_arguments,
6186 Label* return_location) {
6189 set_isolate_data_slots, return_location);
6194 Label* return_location) {
6195 return CallCFunction(function, num_arguments, 0, set_isolate_data_slots,
6201 Label* return_location) {
6202 return CallCFunction(function, num_arguments, 0, set_isolate_data_slots,
6207 Register function,
int num_reg_arguments,
int num_double_arguments,
6220#if V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64
6223 int frame_alignment_mask = frame_alignment - 1;
6226 Label alignment_as_expected;
6229 Register scratch = temps.Acquire();
6230 And(scratch, sp, Operand(frame_alignment_mask));
6231 Branch(&alignment_as_expected,
eq, scratch, Operand(zero_reg));
6236 bind(&alignment_as_expected);
6247 if (function != t9) {
6271 if (return_location)
bind(return_location);
6279 int stack_passed_arguments =
6285 Daddu(sp, sp, Operand(stack_passed_arguments *
kPointerSize));
6290 return call_pc_offset;
6294#undef BRANCH_ARGS_CHECK
6301 And(scratch, scratch, Operand(
mask));
6302 Branch(condition_met,
cc, scratch, Operand(zero_reg));
6306 Register reg4, Register reg5,
6308 RegList regs = {reg1, reg2, reg3, reg4, reg5, reg6};
6311 for (
int i = 0;
i < config->num_allocatable_general_registers(); ++
i) {
6312 int code = config->GetAllocatableGeneralCode(
i);
6314 if (regs.has(candidate))
continue;
6333 li(dst, Operand(
pc));
6334 Dsubu(dst,
ra, dst);
6358#ifdef V8_ENABLE_LEAPTIERING
6360 Label not_deoptimized;
6364 Abort(AbortReason::kInvalidDeoptimizedCode);
6365 bind(¬_deoptimized);
6389 Register
destination, Register code_data_container_object,
6393 Code::kInstructionStartOffset));
6400 code_data_container_object, tag);
6401 Call(code_data_container_object);
6409 code_data_container_object, tag);
6410 Jump(code_data_container_object);
6414 uint16_t argument_count) {
6416#ifdef V8_ENABLE_LEAPTIERING
6423 LoadEntrypointAndParameterCountFromJSDispatchTable(code,
parameter_count,
6424 dispatch_handle, scratch);
6428 Operand(argument_count));
6438#ifdef V8_ENABLE_LEAPTIERING
6450#ifdef V8_ENABLE_WEBASSEMBLY
6452void MacroAssembler::ResolveWasmCodePointer(Register target) {
6454 ExternalReference global_jump_table =
6455 ExternalReference::wasm_code_pointer_table();
6457 Register scratch = temps.Acquire();
6458 xor_(zero_reg, scratch, scratch);
6459 li(scratch, global_jump_table);
6462 daddu(scratch, scratch, target);
6466void MacroAssembler::CallWasmCodePointer(Register target,
6468 ResolveWasmCodePointer(target);
6480#ifndef V8_ENABLE_LEAPTIERING
6482void TailCallOptimizedCodeSlot(MacroAssembler* masm,
6483 Register optimized_code_entry, Register scratch1,
6484 Register scratch2) {
6493 Label heal_optimized_code_slot;
6498 &heal_optimized_code_slot);
6501 __ Ld(optimized_code_entry,
6507 ne, &heal_optimized_code_slot);
6523 __ bind(&heal_optimized_code_slot);
6530#ifdef V8_ENABLE_DEBUG_CODE
6534 Assert(
eq, AbortReason::kExpectedFeedbackCell, scratch,
6535 Operand(FEEDBACK_CELL_TYPE));
6541 Assert(
eq, AbortReason::kExpectedFeedbackVector, scratch,
6542 Operand(FEEDBACK_VECTOR_TYPE));
6548 Register optimized_code, Register closure, Register scratch1,
6549 Register scratch2) {
6553#ifdef V8_ENABLE_LEAPTIERING
6558 mov(scratch1, optimized_code);
6574 FrameScope scope(
this, StackFrame::INTERNAL);
6581#ifdef V8_ENABLE_LEAPTIERING
6583 static_assert(kJSDispatchHandleShift > 0);
6590#ifdef V8_ENABLE_LEAPTIERING
6602#ifndef V8_ENABLE_LEAPTIERING
6604 Register flags, Register feedback_vector,
CodeKind current_code_kind,
6605 Label* flags_need_processing) {
6609 uint32_t flag_mask =
6612 And(scratch, flags, Operand(flag_mask));
6613 Branch(flags_need_processing,
ne, scratch, Operand(zero_reg));
6617 Register flags, Register feedback_vector) {
6619 Label maybe_has_optimized_code, maybe_needs_logging;
6623 Register scratch = temps.Acquire();
6626 Branch(&maybe_needs_logging,
eq, scratch, Operand(zero_reg));
6631 bind(&maybe_needs_logging);
6634 Register scratch = temps.Acquire();
6635 And(scratch, flags, Operand(FeedbackVector::LogNextExecutionBit::kMask));
6636 Branch(&maybe_has_optimized_code,
eq, scratch, Operand(zero_reg));
6641 bind(&maybe_has_optimized_code);
6643 Ld(optimized_code_entry,
6645 FeedbackVector::kMaybeOptimizedCodeOffset));
6646 TailCallOptimizedCodeSlot(
this, optimized_code_entry, t3, a5);
6657 Register function_address,
6658 ExternalReference thunk_ref, Register thunk_arg,
6659 int slots_to_drop_on_return,
6662 using ER = ExternalReference;
6664 Isolate* isolate = masm->isolate();
6666 ER::handle_scope_next_address(isolate),
no_reg);
6668 ER::handle_scope_limit_address(isolate),
no_reg);
6670 ER::handle_scope_level_address(isolate),
no_reg);
6679 Register prev_next_address_reg = s0;
6688 scratch, scratch2, prev_next_address_reg, prev_limit_reg));
6693 scratch, scratch2, prev_next_address_reg, prev_limit_reg));
6695 scratch, scratch2, prev_next_address_reg, prev_limit_reg));
6699 "Allocate HandleScope in callee-save registers.");
6700 __ Ld(prev_next_address_reg, next_mem_op);
6701 __ Ld(prev_limit_reg, limit_mem_op);
6702 __ Lw(prev_level_reg, level_mem_op);
6703 __ Addu(scratch, prev_level_reg, Operand(1));
6704 __ Sw(scratch, level_mem_op);
6707 Label profiler_or_side_effects_check_enabled, done_api_call;
6708 if (with_profiling) {
6709 __ RecordComment(
"Check if profiler or side effects check is enabled");
6712 __ Branch(&profiler_or_side_effects_check_enabled,
ne, scratch,
6714#ifdef V8_RUNTIME_CALL_STATS
6716 __ li(scratch, ER::address_of_runtime_stats_flag());
6718 __ Branch(&profiler_or_side_effects_check_enabled,
ne, scratch,
6727 Label propagate_exception;
6728 Label delete_allocated_handles;
6729 Label leave_exit_frame;
6732 __ Ld(return_value, return_value_operand);
6737 "No more valid handles (the result handle was the last one)."
6738 "Restore previous handle scope.");
6739 __ Sd(prev_next_address_reg, next_mem_op);
6741 __ Lw(scratch, level_mem_op);
6742 __ Subu(scratch, scratch, Operand(1));
6743 __ Check(
eq, AbortReason::kUnexpectedLevelAfterReturnFromApiCall, scratch,
6744 Operand(prev_level_reg));
6746 __ Sw(prev_level_reg, level_mem_op);
6747 __ Ld(scratch, limit_mem_op);
6748 __ Branch(&delete_allocated_handles,
ne, prev_limit_reg, Operand(scratch));
6752 __ bind(&leave_exit_frame);
6754 Register argc_reg = prev_limit_reg;
6755 if (argc_operand !=
nullptr) {
6757 __ Ld(argc_reg, *argc_operand);
6764 "Check if the function scheduled an exception.");
6765 __ LoadRoot(scratch, RootIndex::kTheHoleValue);
6767 ER::exception_address(isolate),
no_reg));
6768 __ Branch(&propagate_exception,
ne, scratch, Operand(scratch2));
6772 AbortReason::kAPICallReturnedInvalidObject);
6774 if (argc_operand ==
nullptr) {
6779 if (slots_to_drop_on_return != 0) {
6787 if (with_profiling) {
6789 __ bind(&profiler_or_side_effects_check_enabled);
6791 if (thunk_arg.is_valid()) {
6793 IsolateFieldId::kApiCallbackThunkArgument);
6794 __ Sd(thunk_arg, thunk_arg_mem_op);
6796 __ li(scratch, thunk_ref);
6802 __ bind(&propagate_exception);
6807 masm,
"HandleScope limit has changed. Delete allocated extensions.");
6808 __ bind(&delete_allocated_handles);
6809 __ Sd(prev_limit_reg, limit_mem_op);
6811 Register saved_result = prev_limit_reg;
6812 __ mov(saved_result, v0);
6817 __ mov(v0, saved_result);
6818 __ jmp(&leave_exit_frame);
#define Assert(condition)
static constexpr uint64_t kSignMask
static int ActivationFrameAlignment()
void RequestHeapNumber(HeapNumberRequest request)
bool IsEnabled(CpuFeature f)
V8_INLINE void RecordComment(const char *comment, const SourceLocation &loc=SourceLocation::Current())
const AssemblerOptions & options() const
void beqc(Register rs, Register rt, int16_t offset)
void dsubu(Register rd, Register rs, Register rt)
void bltz(Register rs, int16_t offset)
void copy_u_h(Register rd, MSARegister ws, uint32_t n)
void ld(Register rd, const MemOperand &rs)
void dmuhu(Register rd, Register rs, Register rt)
void sd(Register rd, const MemOperand &rs)
void fill_w(MSARegister wd, Register rs)
void seb(Register rd, Register rt)
void dextm_(Register rt, Register rs, uint16_t pos, uint16_t size)
bool is_near(Label *L, OffsetSize bits)
void frint_d(FPURegister fd, FPURegister fj)
void dotp_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void lwl(Register rd, const MemOperand &rs)
void jic(Register rt, int16_t offset)
void ld_d(Register rd, Register rj, int32_t si12)
void lbu(Register rd, const MemOperand &rs)
void dati(Register rs, int32_t j)
void movf(Register rd, Register rs, uint16_t cc=0)
void break_(uint32_t code, bool break_as_stop=false)
void mfhc1(Register rt, FPURegister fs)
void dmod(Register rd, Register rs, Register rt)
void bgezal(Register rs, int16_t offset)
void cvt_s_w(FPURegister fd, FPURegister fs)
void round_l_d(FPURegister fd, FPURegister fs)
void fill_d(MSARegister wd, Register rs)
void bgeuc(Register rs, Register rt, int16_t offset)
void addu(Register rd, Register rs, Register rt)
void and_(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void frint_w(MSARegister wd, MSARegister ws)
bool is_trampoline_emitted() const
void movn(const Register &rd, uint64_t imm, int shift=-1)
void scd(Register rd, const MemOperand &rs)
void hint(SystemHint code)
void pref(int32_t hint, const MemOperand &rs)
void dmult(Register rs, Register rt)
void ctc1(Register rt, FPUControlRegister fs)
void mul_d(Register rd, Register rj, Register rk)
void beqzalc(Register rt, int16_t offset)
void copy_u_b(Register rd, MSARegister ws, uint32_t n)
void lwr(Register rd, const MemOperand &rs)
void bgez(Register rs, int16_t offset)
void swc1(FPURegister fs, const MemOperand &dst)
void lb(Register rd, const MemOperand &rs)
void jalr(Register rs, Register rd=ra)
void sltiu(Register rd, Register rs, int32_t j)
void b(int branch_offset, Condition cond=al, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
void bc1f(int16_t offset, uint16_t cc=0)
void jialc(Register rt, int16_t offset)
void bnezalc(Register rt, int16_t offset)
void dbitswap(Register rd, Register rt)
void bc1nez(int16_t offset, FPURegister ft)
void bc1eqz(int16_t offset, FPURegister ft)
void bne(Register rj, Register rd, int32_t offset)
void sdc1(FPURegister fs, const MemOperand &dst)
void bltuc(Register rs, Register rt, int16_t offset)
void mov_d(FPURegister fd, FPURegister fs)
void min_d(FPURegister fd, FPURegister fs, FPURegister ft)
void modu(Register rd, Register rs, Register rt)
void rint_d(FPURegister fd, FPURegister fs)
void ddivu(Register rs, Register rt)
void lld(Register rd, const MemOperand &rs)
void hadd_s_h(MSARegister wd, MSARegister ws, MSARegister wt)
void sdr(Register rd, const MemOperand &rs)
void dlsa(Register rd, Register rt, Register rs, uint8_t sa)
friend class BlockTrampolinePoolScope
void c(FPUCondition cond, SecondaryField fmt, FPURegister ft, FPURegister fs, uint16_t cc=0)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
void mul_s(FPURegister fd, FPURegister fs, FPURegister ft)
void mul(Register dst, Register src1, Register src2, SBit s=LeaveCC, Condition cond=al)
bool is_trampoline_pool_blocked() const
void slti(Register rd, Register rj, int32_t si12)
void bc1t(int16_t offset, uint16_t cc=0)
void ilvr_h(MSARegister wd, MSARegister ws, MSARegister wt)
int InstructionsGeneratedSince(Label *label)
void balc(int32_t offset)
void insert_b(MSARegister wd, uint32_t n, Register rs)
void neg_d(FPURegister fd, FPURegister fs)
void blezc(Register rt, int16_t offset)
void rint_s(FPURegister fd, FPURegister fs)
void bnec(Register rs, Register rt, int16_t offset)
void ilvl_b(MSARegister wd, MSARegister ws, MSARegister wt)
void bltc(Register rs, Register rt, int16_t offset)
void bnvc(Register rs, Register rt, int16_t offset)
void trunc_l_d(FPURegister fd, FPURegister fs)
void hadd_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void ll(Register rd, const MemOperand &rs)
void fill_b(MSARegister wd, Register rs)
Simd128Register Simd128Register ra
void dsrl(Register rd, Register rt, uint16_t sa)
void lsa(Register rd, Register rt, Register rs, uint8_t sa)
void cmp(Register src1, const Operand &src2, Condition cond=al)
void dmuh(Register rd, Register rs, Register rt)
bool is_near_r6(Label *L)
void bnz_d(MSARegister wt, int16_t offset)
uint64_t jump_address(Label *L)
void dotp_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void rotr(Register rd, Register rt, uint16_t sa)
void dmul(Register rd, Register rs, Register rt)
void bz_h(MSARegister wt, int16_t offset)
void mtc1(Register rt, FPURegister fs)
void lw(Register rd, const MemOperand &rs)
void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data=0)
void dmodu(Register rd, Register rs, Register rt)
void floor_l_d(FPURegister fd, FPURegister fs)
void bz_w(MSARegister wt, int16_t offset)
void dsrl32(Register rt, Register rd, uint16_t sa)
void bltzc(Register rt, int16_t offset)
void dsra32(Register rt, Register rd, uint16_t sa)
void xori(Register rd, Register rj, int32_t ui12)
friend class UseScratchRegisterScope
void ilvr_w(MSARegister wd, MSARegister ws, MSARegister wt)
bool MustUseReg(RelocInfo::Mode rmode)
void insert_d(MSARegister wd, uint32_t n, Register rs)
void set_pc_for_safepoint()
void ilvl_w(MSARegister wd, MSARegister ws, MSARegister wt)
void dotp_s_d(MSARegister wd, MSARegister ws, MSARegister wt)
void addiu(Register rd, Register rs, int32_t j)
void rotrv(Register rd, Register rt, Register rs)
void trunc_w_d(FPURegister fd, FPURegister fs)
void dshd(Register rd, Register rt)
void nor(Register rd, Register rj, Register rk)
void addiupc(Register rs, int32_t imm19)
void max_d(FPURegister fd, FPURegister fs, FPURegister ft)
void selnez(Register rs, Register rt, Register rd)
void shift(Operand dst, Immediate shift_amount, int subcode, int size)
void dmultu(Register rs, Register rt)
void clz(Register dst, Register src, Condition cond=al)
void sc(Register rd, const MemOperand &rs)
void or_(Register dst, int32_t imm32)
void bz_d(MSARegister wt, int16_t offset)
void sub_s(FPURegister fd, FPURegister fs, FPURegister ft)
void add_s(FPURegister fd, FPURegister fs, FPURegister ft)
void mov_s(FPURegister fd, FPURegister fs)
void swl(Register rd, const MemOperand &rs)
void trunc_l_s(FPURegister fd, FPURegister fs)
void sb(Register rd, const MemOperand &rs)
void xor_(Register dst, int32_t imm32)
void daddiu(Register rd, Register rs, int32_t j)
void ins_(Register rt, Register rs, uint16_t pos, uint16_t size)
void dotp_u_w(MSARegister wd, MSARegister ws, MSARegister wt)
void andi(Register rd, Register rj, int32_t ui12)
void lui(Register rd, int32_t j)
void lh(Register rd, const MemOperand &rs)
void dext_(Register rt, Register rs, uint16_t pos, uint16_t size)
void dinsu_(Register rt, Register rs, uint16_t pos, uint16_t size)
void max_s(FPURegister fd, FPURegister fs, FPURegister ft)
void muh(Register rd, Register rs, Register rt)
void sltu(Register rd, Register rj, Register rk)
void sdl(Register rd, const MemOperand &rs)
void ldc1(FPURegister fd, const MemOperand &src)
void bltzal(Register rs, int16_t offset)
void dotp_u_d(MSARegister wd, MSARegister ws, MSARegister wt)
void ext_(Register rt, Register rs, uint16_t pos, uint16_t size)
void mult(Register rs, Register rt)
void ctcmsa(MSAControlRegister cd, Register rs)
void dotp_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void cfcmsa(Register rd, MSAControlRegister cs)
void add_d(Register rd, Register rj, Register rk)
void lwu(Register rd, const MemOperand &rs)
void dinsm_(Register rt, Register rs, uint16_t pos, uint16_t size)
void beqzc(Register rs, int32_t offset)
void bz_v(MSARegister wt, int16_t offset)
void bovc(Register rs, Register rt, int16_t offset)
void srl(Register rd, Register rt, uint16_t sa)
void cfc1(Register rt, FPUControlRegister fs)
void mod(Register rd, Register rs, Register rt)
void movz(const Register &rd, uint64_t imm, int shift=-1)
void sll(Register rd, Register rt, uint16_t sa, bool coming_from_nop=false)
int32_t branch_offset_helper(Label *L, OffsetSize bits)
void copy_u_w(Register rd, MSARegister ws, uint32_t n)
void dsrav(Register rd, Register rt, Register rs)
void cvt_d_l(FPURegister fd, FPURegister fs)
void insert_h(MSARegister wd, uint32_t n, Register rs)
void mfc1(Register rt, FPURegister fs)
void dclz(Register rd, Register rs)
void ddiv(Register rs, Register rt)
void bnz_b(MSARegister wt, int16_t offset)
void blez(Register rs, int16_t offset)
void round_w_d(FPURegister fd, FPURegister fs)
void ori(Register rd, Register rj, int32_t ui12)
void ilvl_h(MSARegister wd, MSARegister ws, MSARegister wt)
void bgezalc(Register rt, int16_t offset)
void cvt_s_l(FPURegister fd, FPURegister fs)
void neg_s(FPURegister fd, FPURegister fs)
void dextu_(Register rt, Register rs, uint16_t pos, uint16_t size)
void bnz_v(MSARegister wt, int16_t offset)
void ilvr_b(MSARegister wd, MSARegister ws, MSARegister wt)
void movt(Register reg, uint32_t immediate, Condition cond=al)
bool is_near_branch(Label *L)
void dmtc1(Register rt, FPURegister fs)
void min_s(FPURegister fd, FPURegister fs, FPURegister ft)
void copy_s_d(Register rd, MSARegister ws, uint32_t n)
void bnezc(Register rt, int32_t offset)
void lhu(Register rd, const MemOperand &rs)
void bgtz(Register rs, int16_t offset)
void bgec(Register rs, Register rt, int16_t offset)
void sw(Register rd, const MemOperand &rs)
void hadd_s_w(MSARegister wd, MSARegister ws, MSARegister wt)
void drotrv(Register rd, Register rt, Register rs)
void insert_w(MSARegister wd, uint32_t n, Register rs)
void blezalc(Register rt, int16_t offset)
void ldl(Register rd, const MemOperand &rs)
void muhu(Register rd, Register rs, Register rt)
void ldr(Register dst, const MemOperand &src, Condition cond=al)
uint64_t branch_long_offset(Label *L)
void mthc1(Register rt, FPURegister fs)
void AdjustBaseAndOffset(MemOperand *src)
void slt(Register rd, Register rj, Register rk)
void ceil_l_d(FPURegister fd, FPURegister fs)
void dsbh(Register rd, Register rt)
void hadd_u_h(MSARegister wd, MSARegister ws, MSARegister wt)
void seleqz(Register rd, Register rs, Register rt)
void dahi(Register rs, int32_t j)
void daddu(Register rd, Register rs, Register rt)
void lwc1(FPURegister fd, const MemOperand &src)
void bz_b(MSARegister wt, int16_t offset)
void sh(Register rd, const MemOperand &rs)
void multu(Register rs, Register rt)
void bitswap(Register rd, Register rt)
void bnz_w(MSARegister wt, int16_t offset)
void st_d(Register rd, Register rj, int32_t si12)
void bltzalc(Register rt, int16_t offset)
void fill_h(MSARegister wd, Register rs)
void wsbh(Register rd, Register rt)
void divu(Register rs, Register rt)
void bnz_h(MSARegister wt, int16_t offset)
void dins_(Register rt, Register rs, uint16_t pos, uint16_t size)
void stop(Condition cond=al, int32_t code=kDefaultStopCode)
void swr(Register rd, const MemOperand &rs)
void drotr32(Register rd, Register rt, uint16_t sa)
void CheckTrampolinePoolQuick(int extra_instructions=0)
int SizeOfCodeGeneratedSince(Label *label)
void bgtzc(Register rt, int16_t offset)
void ceil_w_d(FPURegister fd, FPURegister fs)
void dsll(Register rd, Register rt, uint16_t sa)
void dsll32(Register rt, Register rd, uint16_t sa)
void dmfc1(Register rt, FPURegister fs)
void beq(Register rj, Register rd, int32_t offset)
void floor_w_d(FPURegister fd, FPURegister fs)
void sub_d(Register rd, Register rj, Register rk)
void bgtzalc(Register rt, int16_t offset)
void drotr(Register rd, Register rt, uint16_t sa)
void subu(Register rd, Register rs, Register rt)
void bgezc(Register rt, int16_t offset)
void seh(Register rd, Register rt)
static constexpr Builtin RecordWrite(SaveFPRegsMode fp_mode)
V8_EXPORT_PRIVATE Handle< Code > code_handle(Builtin builtin)
static constexpr Builtin RuntimeCEntry(int result_size, bool switch_to_central_stack=false)
static constexpr Builtin EphemeronKeyBarrier(SaveFPRegsMode fp_mode)
static constexpr Builtin CEntry(int result_size, ArgvMode argv_mode, bool builtin_exit_frame=false, bool switch_to_central_stack=false)
static const int kMarkedForDeoptimizationBit
static constexpr int kCallerFPOffset
static constexpr int kCallerPCOffset
static const int kInvalidContext
static V8_INLINE constexpr int SlotOffset(int index)
static V8_EXPORT_PRIVATE const int kEagerDeoptExitSize
static V8_EXPORT_PRIVATE const int kLazyDeoptExitSize
static constexpr int kSPOffset
static constexpr int kCallerSPDisplacement
static ExternalReference Create(const SCTableReference &table_ref)
static constexpr uint32_t kFlagsTieringStateIsAnyRequested
static constexpr uint32_t FlagMaskForNeedsProcessingCheckFrom(CodeKind code_kind)
static const int kMantissaBits
static const int kExponentBits
static const int kExponentBias
static const int kExponentShift
static constexpr int kHeaderSize
static constexpr int kMapOffset
static constexpr int BuiltinEntrySlotOffset(Builtin id)
static constexpr int real_jslimit_offset()
Address BuiltinEntry(Builtin builtin)
bool root_array_available_
static bool IsAddressableThroughRootRegister(Isolate *isolate, const ExternalReference &reference)
V8_INLINE std::string CommentForOffHeapTrampoline(const char *prefix, Builtin builtin)
static int32_t RootRegisterOffsetForExternalReferenceTableEntry(Isolate *isolate, const ExternalReference &reference)
static int32_t RootRegisterOffsetForRootIndex(RootIndex root_index)
Isolate * isolate() const
bool root_array_available() const
void IndirectLoadConstant(Register destination, Handle< HeapObject > object)
static intptr_t RootRegisterOffsetForExternalReference(Isolate *isolate, const ExternalReference &reference)
bool should_abort_hard() const
void IndirectLoadExternalReference(Register destination, ExternalReference reference)
void Mul(const Register &rd, const Register &rn, const Register &rm)
void Abort(AbortReason msg)
void LoadStackLimit(Register destination, StackLimitKind kind)
void LoadReceiver(Register dest)
void GetObjectType(Register function, Register map, Register type_reg)
void Call(Register target, Condition cond=al)
void CallJSFunction(Register function_object, uint16_t argument_count)
void LiLower32BitHelper(Register rd, Operand j)
void Lbu(Register rd, const MemOperand &rs)
void LoadAddress(Register destination, ExternalReference source)
void BranchAndLinkLong(Label *L, BranchDelaySlot bdslot)
void LoadSplat(MSASize sz, MSARegister dst, MemOperand src)
void ExtractBits(Register dest, Register source, Register pos, int size, bool sign_extend=false)
void JumpIfIsInRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit, Label *on_in_range)
void Trunc_uw_s(FPURegister fd, FPURegister fj, FPURegister scratch)
void MultiPopFPU(DoubleRegList regs)
void Drop(int count, Condition cond=al)
void Ctz(Register rd, Register rs)
void Cvt_s_uw(FPURegister fd, FPURegister fs)
int CalculateStackPassedWords(int num_reg_arguments, int num_double_arguments)
void MultiPushFPU(DoubleRegList regs)
void Neg(const Register &rd, const Operand &operand)
void MovFromFloatResult(DwVfpRegister dst)
void Trunc_l_d(FPURegister fd, FPURegister fs)
void Scd(Register rd, const MemOperand &rs)
void mov(Register rd, Register rj)
void Dins(Register rt, Register rs, uint16_t pos, uint16_t size)
void Sh(Register rd, const MemOperand &rs)
void SmiUntag(Register reg, SBit s=LeaveCC)
void AssertFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void Neg_s(FPURegister fd, FPURegister fj)
void Ceil_l_d(FPURegister fd, FPURegister fs)
void Uswc1(FPURegister fd, const MemOperand &rs, Register scratch)
void AssertNotSmi(Register object, AbortReason reason=AbortReason::kOperandIsASmi) NOOP_UNLESS_DEBUG_CODE
void Ext(const VRegister &vd, const VRegister &vn, const VRegister &vm, int index)
void Float64Min(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void CompareIsNanF64(FPURegister cmp1, FPURegister cmp2, CFRegister cd=FCC0)
void Lb(Register rd, const MemOperand &rs)
void CompareF32(FPURegister cmp1, FPURegister cmp2, FPUCondition cc, CFRegister cd=FCC0)
void LoadEntryFromBuiltin(Builtin builtin, Register destination)
void TestCodeIsMarkedForDeoptimizationAndJump(Register code_data_container, Register scratch, Condition cond, Label *target)
void PushStandardFrame(Register function_reg)
void Floor_l_d(FPURegister fd, FPURegister fs)
void BranchFalseF(Label *target, CFRegister cc=FCC0)
void LoadZeroIfNotFPUCondition(Register dest, CFRegister=FCC0)
void Uld(Register rd, const MemOperand &rs)
void Swc1(FPURegister fs, const MemOperand &dst)
void MovFromFloatParameter(DwVfpRegister dst)
void LoadLane(NeonSize sz, NeonListOperand dst_list, uint8_t lane, NeonMemOperand src)
void BranchAndLinkShort(int32_t offset, BranchDelaySlot bdslot=PROTECT)
void Move(Register dst, Tagged< Smi > smi)
void CompareIsNanF(FPURegister cmp1, FPURegister cmp2, CFRegister cd, bool f32=true)
void SmiTst(Register value)
bool has_double_zero_reg_set_
void Assert(Condition cond, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void li_optimized(Register rd, Operand j, LiFlags mode=OPTIMIZE_SIZE)
void StoreReturnAddressAndCall(Register target)
void LoadZeroIfConditionZero(Register dest, Register condition)
void Float64Max(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void Trunc_l_ud(FPURegister fd, FPURegister fs, FPURegister scratch)
void StackOverflowCheck(Register num_args, Register scratch, Label *stack_overflow)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallBuiltinByIndex(Register builtin_index, Register target)
int32_t GetOffset(Label *L, OffsetSize bits)
void Movz(Register rd, Register rj, Register rk)
void LoadRootRelative(Register destination, int32_t offset) final
void JumpIfSmi(Register value, Label *smi_label)
void Round_d_d(FPURegister fd, FPURegister fs)
void BranchShort(Label *label, Condition cond, Register r1, const Operand &r2, bool need_link=false)
void Cvt_s_ul(FPURegister fd, FPURegister fs)
void MultiPush(RegList regs)
void CallCodeObject(Register code_object)
void Ceil_d_d(FPURegister fd, FPURegister fs)
void Lwu(Register rd, const MemOperand &rs)
int CallCFunctionHelper(Register function, int num_reg_arguments, int num_double_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void Ror(const Register &rd, const Register &rs, unsigned shift)
void LoadCodeInstructionStart(Register destination, Register code_object, CodeEntrypointTag tag=kDefaultCodeEntrypointTag)
bool IsDoubleZeroRegSet()
void BranchFalseShortF(Label *target, CFRegister cc=FCC0)
void CheckDebugHook(Register fun, Register new_target, Register expected_parameter_count_or_dispatch_handle, Register actual_parameter_count)
void Clz(const Register &rd, const Register &rn)
void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register flags, Register feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
void Trunc_w_d(FPURegister fd, FPURegister fs)
void Ulwu(Register rd, const MemOperand &rs)
void LoadFeedbackVector(Register dst, Register closure, Register scratch, Label *fbv_undef)
bool BranchAndLinkShortCheck(int32_t offset, Label *L, Condition cond, Register rs, const Operand &rt, BranchDelaySlot bdslot)
void EmitIncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void Cvt_d_ul(FPURegister fd, FPURegister fs)
void MultiPushMSA(DoubleRegList regs)
void Bnvc(Register rt, Register rs, Label *L)
void LoadAddressPCRelative(Register dst, Label *target)
void Movn(Register rd, Register rj, Register rk)
void BranchTrueF(Label *target, CFRegister cc=FCC0)
void InvokeFunctionCode(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void BailoutIfDeoptimized()
void Trunc_ul_s(FPURegister fd, FPURegister fs, FPURegister scratch, Register result=no_reg)
void Sd(Register rd, const MemOperand &rs)
void BranchShortHelper(int16_t offset, Label *L, BranchDelaySlot bdslot)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg) const
void Lwc1(FPURegister fd, const MemOperand &src)
void Move_d(FPURegister dst, FPURegister src)
void Trunc_s_s(FPURegister fd, FPURegister fs)
void InvokePrologue(Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void RoundFloat(FPURegister dst, FPURegister src, FPURoundingMode mode)
void DaddOverflow(Register dst, Register left, const Operand &right, Register overflow)
void Uldc1(FPURegister fd, const MemOperand &rs, Register scratch)
void DropAndRet(int drop)
void SmiTag(Register reg, SBit s=LeaveCC)
void SbxCheck(Condition cc, AbortReason reason)
void PushArray(Register array, Register size, Register scratch, PushArrayOrder order=PushArrayOrder::kNormal)
void EnterExitFrame(Register scratch, int stack_space, StackFrame::Type frame_type)
void MovToFloatResult(DwVfpRegister src)
void RecordWriteField(Register object, int offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
void CompareWord(Condition cond, Register dst, Register lhs, const Operand &rhs)
void Ins(const VRegister &vd, int vd_index, const VRegister &vn, int vn_index)
MemOperand ExternalReferenceAsOperand(ExternalReference reference, Register scratch)
void MovToFloatParameter(DwVfpRegister src)
void AssertSmi(Register object, AbortReason reason=AbortReason::kOperandIsNotASmi) NOOP_UNLESS_DEBUG_CODE
void PushCommonFrame(Register marker_reg=no_reg)
void Lsa(Register rd, Register rs, Register rt, uint8_t sa, Register scratch=at)
void RoundDouble(FPURegister dst, FPURegister src, FPURoundingMode mode)
int LeaveFrame(StackFrame::Type type)
void li(Register rd, Operand j, LiFlags mode=OPTIMIZE_SIZE)
void Movt(Register rd, Register rs, uint16_t cc=0)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void Sw(Register rd, const MemOperand &rs)
void And(Register dst, Register src1, const Operand &src2, Condition cond=al)
static int InstrCountForLi64Bit(int64_t value)
void MultiPopMSA(DoubleRegList regs)
void JumpToExternalReference(const ExternalReference &builtin, bool builtin_exit_frame=false)
void Float64MaxOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
Operand ClearedValue() const
void BranchAndLinkShortHelper(int16_t offset, Label *L, BranchDelaySlot bdslot)
void MulOverflow(Register dst, Register left, const Operand &right, Register overflow)
void Lhu(Register rd, const MemOperand &rs)
void InsertBits(Register dest, Register source, Register pos, int size)
void BranchLong(int32_t offset, BranchDelaySlot bdslot=PROTECT)
void MultiPop(RegList regs)
void Msub_d(FPURegister fd, FPURegister fa, FPURegister fj, FPURegister fk)
void InvokeFunctionWithNewTarget(Register function, Register new_target, Register actual_parameter_count, InvokeType type)
void FmoveLow(Register dst_low, FPURegister src)
void Jump(Register target, Condition cond=al)
void Usw(Register rd, const MemOperand &rs)
void ExtMulHigh(MSADataType type, MSARegister dst, MSARegister src1, MSARegister src2)
void LoadRoot(Register destination, RootIndex index) final
void Trunc_d_d(FPURegister fd, FPURegister fs)
void RecordWrite(Register object, Operand offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
void BranchShortMSA(MSABranchDF df, Label *target, MSABranchCondition cond, MSARegister wt, BranchDelaySlot bd=PROTECT)
void Madd_d(FPURegister fd, FPURegister fa, FPURegister fj, FPURegister fk)
void PrepareCEntryArgs(int num_args)
void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg=false)
void Float64MinOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
void InvokeFunction(Register function, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void Floor_d_d(FPURegister fd, FPURegister fs)
void Float32MinOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
void Trunc_uw_d(FPURegister fd, FPURegister fs, FPURegister scratch)
void Ceil_w_d(FPURegister fd, FPURegister fs)
void PatchAndJump(Address target)
void Float32Min(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void Round_s_s(FPURegister fd, FPURegister fs)
void JumpCodeObject(Register code_object, JumpMode jump_mode=JumpMode::kJump)
void MSARoundD(MSARegister dst, MSARegister src, FPURoundingMode mode)
void LoadZeroIfConditionNotZero(Register dest, Register condition)
void Dlsa(Register rd, Register rs, Register rt, uint8_t sa, Register scratch=at)
void EmitDecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
static int ActivationFrameAlignment()
void StoreLane(NeonSize sz, NeonListOperand src_list, uint8_t lane, NeonMemOperand dst)
void LoadFromConstantsTable(Register destination, int constant_index) final
MemOperand EntryFromBuiltinAsOperand(Builtin builtin)
void Sdc1(FPURegister fs, const MemOperand &dst)
void PrepareCEntryFunction(const ExternalReference &ref)
void ComputeCodeStartAddress(Register dst)
void MaybeSaveRegisters(RegList registers)
void CheckPageFlag(Register object, int mask, Condition cc, Label *condition_met)
void ExtAddPairwise(MSADataType type, MSARegister dst, MSARegister src)
void LoadWordPair(Register rd, const MemOperand &rs, Register scratch=at)
void Lld(Register rd, const MemOperand &rs)
void JumpIfNotSmi(Register value, Label *not_smi_label)
int CallCFunction(ExternalReference function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_label=nullptr)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
void Ulhu(Register rd, const MemOperand &rs)
void Lw(Register rd, const MemOperand &rs)
void Neg_d(FPURegister fd, FPURegister fk)
void BranchShortHelperR6(int32_t offset, Label *L)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
bool BranchShortCheck(int32_t offset, Label *L, Condition cond, Register rs, const Operand &rt, BranchDelaySlot bdslot)
void CallRuntime(const Runtime::Function *f, int num_arguments)
void LoadWeakValue(Register out, Register in, Label *target_if_cleared)
void CallBuiltin(Builtin builtin, Condition cond=al)
void ByteSwapUnsigned(Register dest, Register src, int operand_size)
void Lh(Register rd, const MemOperand &rs)
void Usdc1(FPURegister fd, const MemOperand &rs, Register scratch)
void FPUCanonicalizeNaN(const DoubleRegister dst, const DoubleRegister src)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id)
void TruncateDoubleToI(Isolate *isolate, Zone *zone, Register result, DwVfpRegister double_input, StubCallMode stub_mode)
void AssertJSAny(Register object, Register map_tmp, Register tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void Xor(Register dst, Register src)
void Cvt_d_uw(FPURegister fd, FPURegister fs)
void CallEphemeronKeyBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode)
void Float32MaxOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
void Float32Max(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void Check(Condition cond, AbortReason reason)
void Usd(Register rd, const MemOperand &rs)
void AssertFeedbackCell(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Or(Register dst, Register src)
bool CalculateOffset(Label *L, int32_t *offset, OffsetSize bits)
void CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
void Sc(Register rd, const MemOperand &rs)
void Bovc(Register rt, Register rs, Label *L)
void DropArgumentsAndPushNewReceiver(Register argc, Register receiver)
void MSARoundW(MSARegister dst, MSARegister src, FPURoundingMode mode)
Register GetRtAsRegisterHelper(const Operand &rt, Register scratch)
void LoadEntryFromBuiltinIndex(Register builtin_index, Register target)
void Popcnt(Register dst, Register src)
void Dpopcnt(Register rd, Register rs)
void Ll(Register rd, const MemOperand &rs)
void Ulwc1(FPURegister fd, const MemOperand &rs, Register scratch)
void ReplaceClosureCodeWithOptimizedCode(Register optimized_code, Register closure)
void Round_l_d(FPURegister fd, FPURegister fs)
void DMulOverflow(Register dst, Register left, const Operand &right, Register overflow)
void AssertBoundFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void CallRecordWriteStubSaveRegisters(Register object, Operand offset, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void Madd_s(FPURegister fd, FPURegister fa, FPURegister fj, FPURegister fk)
void StoreWordPair(Register rd, const MemOperand &rs, Register scratch=at)
void Trunc_ul_d(FPURegister fd, FPURegister fs, FPURegister scratch, Register result=no_reg)
void Sb(Register rd, const MemOperand &rs)
void Branch(Label *label, bool need_link=false)
void Ld(Register rd, const MemOperand &rs)
void Ceil_s_s(FPURegister fd, FPURegister fs)
void GetInstanceTypeRange(Register map, Register type_reg, InstanceType lower_limit, Register range)
void Ulw(Register rd, const MemOperand &rs)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, Register feedback_vector)
void Ulh(Register rd, const MemOperand &rs)
void Movf(Register rd, Register rs, uint16_t cc=0)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers=0, Register scratch=no_reg)
void LoadIsolateField(Register dst, IsolateFieldId id)
void LoadZeroIfFPUCondition(Register dest, CFRegister=FCC0)
void TryInlineTruncateDoubleToI(Register result, DwVfpRegister input, Label *done)
void CompareIsNanF32(FPURegister cmp1, FPURegister cmp2, CFRegister cd=FCC0)
void Move_s(FPURegister dst, FPURegister src)
void BranchTrueShortF(Label *target, CFRegister cc=FCC0)
void ByteSwapSigned(Register dest, Register src, int operand_size)
void MaybeRestoreRegisters(RegList registers)
void CallRecordWriteStub(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void Floor_s_s(FPURegister fd, FPURegister fs)
void Dclz(Register rd, Register rs)
void BranchAndLinkShortHelperR6(int32_t offset, Label *L)
void Dctz(Register rd, Register rs)
int PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void AssertUndefinedOrAllocationSite(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Pref(int32_t hint, const MemOperand &rs)
void Round_w_d(FPURegister fd, FPURegister fs)
void BranchMSA(Label *target, MSABranchDF df, MSABranchCondition cond, MSARegister wt, BranchDelaySlot bd=PROTECT)
void DsubOverflow(Register dst, Register left, const Operand &right, Register overflow)
void StubPrologue(StackFrame::Type type)
void MovToFloatParameters(DwVfpRegister src1, DwVfpRegister src2)
void StoreRootRelative(int32_t offset, Register value) final
void LoadMap(Register destination, Register object)
void CompareF64(FPURegister cmp1, FPURegister cmp2, FPUCondition cc, CFRegister cd=FCC0)
void AssertStackIsAligned() NOOP_UNLESS_DEBUG_CODE
void TailCallRuntime(Runtime::FunctionId fid)
void ExtMulLow(MSADataType type, MSARegister dst, MSARegister src1, MSARegister src2)
void Swap(Register srcdst0, Register srcdst1)
void Dext(Register rt, Register rs, uint16_t pos, uint16_t size)
void LoadNativeContextSlot(Register dst, int index)
void TailCallBuiltin(Builtin builtin, Condition cond=al)
void Floor_w_d(FPURegister fd, FPURegister fs)
void CompareF(FPURegister cmp1, FPURegister cmp2, FPUCondition cc, CFRegister cd, bool f32=true)
void Ldc1(FPURegister fd, const MemOperand &src)
void Msub_s(FPURegister fd, FPURegister fa, FPURegister fj, FPURegister fk)
void DropArguments(Register count)
void AssertCallableFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void Ush(Register rd, const MemOperand &rs, Register scratch)
static constexpr MainThreadFlags kPointersToHereAreInterestingMask
static constexpr intptr_t FlagsOffset()
static constexpr MainThreadFlags kPointersFromHereAreInterestingMask
static constexpr intptr_t GetAlignmentMaskForAssembler()
static constexpr FPURegister from_code(int8_t code)
constexpr int8_t code() const
static const RegisterConfiguration * Default()
static constexpr Register from_code(int code)
static constexpr bool IsWasmCanonicalSigId(Mode mode)
static constexpr bool IsCodeTarget(Mode mode)
static constexpr bool IsWasmCodePointerTableEntry(Mode mode)
static constexpr bool IsImmortalImmovable(RootIndex root_index)
static V8_EXPORT_PRIVATE const Function * FunctionForId(FunctionId id)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr Tagged< Smi > zero()
static constexpr int32_t TypeToMarker(Type type)
static bool IsJavaScript(Type t)
static const int kNextOffset
static constexpr int kContextOffset
static constexpr int kFixedFrameSizeFromFp
static constexpr Register ObjectRegister()
static constexpr RegList ComputeSavedRegisters(Register object, Register slot_address=no_reg)
static constexpr Register SlotAddressRegister()
static constexpr Builtin GetRecordWriteBuiltin(SaveFPRegsMode fp_mode)
#define ASM_CODE_COMMENT_STRING(asm,...)
#define ASM_CODE_COMMENT(asm)
#define V8_ENABLE_LEAPTIERING_BOOL
const bool IsMipsSoftFloatABI
static const ArchVariants kArchVariant
DirectHandle< Object > new_target
ZoneVector< RpoNumber > & result
#define SmiWordOffset(offset)
#define BRANCH_ARGS_CHECK(cond, rs, rt)
RegListBase< RegisterT > registers
InstructionOperand destination
constexpr unsigned CountTrailingZeros64(uint64_t value)
constexpr bool IsPowerOfTwo(T value)
V8_INLINE Dest bit_cast(Source const &source)
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr Register kRootRegister
constexpr VFPRoundingMode kRoundToNearest
RegListBase< DoubleRegister > DoubleRegList
MSABranchCondition NegateMSABranchCondition(MSABranchCondition cond)
constexpr int kSimd128Size
@ kUnsignedGreaterThanEqual
constexpr int kPointerSizeLog2
constexpr DoubleRegister kDoubleCompareReg
DwVfpRegister DoubleRegister
const uint32_t kFCSRInvalidOpCauseMask
constexpr DoubleRegister kScratchDoubleReg
constexpr uint32_t kBinary32SignMask
RegListBase< Register > RegList
constexpr bool CodeKindCanTierUp(CodeKind kind)
constexpr Register kJavaScriptCallTargetRegister
constexpr int kPointerSize
static int InstrCountForLiLower32Bit(int64_t value)
const Address kWeakHeapObjectMask
const int64_t kUpper16MaskOf64
constexpr FPUControlRegister FCSR
const int kFloat32ExponentBias
constexpr Register kJavaScriptCallArgCountRegister
constexpr int kSystemPointerSizeLog2
constexpr Register kScratchReg
static const int kRegisterPassedArguments
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
const char * GetAbortReason(AbortReason reason)
static constexpr int kMaxCParameters
constexpr uint32_t kZapValue
constexpr MSAControlRegister MSACSR
constexpr bool SmiValuesAre31Bits()
Condition NegateCondition(Condition cond)
constexpr bool is_intn(int64_t x, unsigned n)
const uint32_t kFCSROverflowCauseMask
@ LAST_CALLABLE_JS_FUNCTION_TYPE
@ FIRST_CALLABLE_JS_FUNCTION_TYPE
constexpr Register kWasmImplicitArgRegister
const DoubleRegList kCallerSavedFPU
V8_EXPORT_PRIVATE bool AreAliased(const CPURegister ®1, const CPURegister ®2, const CPURegister ®3=NoReg, const CPURegister ®4=NoReg, const CPURegister ®5=NoReg, const CPURegister ®6=NoReg, const CPURegister ®7=NoReg, const CPURegister ®8=NoReg)
const int kCArgsSlotsSize
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
const int kFloat32ExponentBits
constexpr LowDwVfpRegister kDoubleRegZero
V8_EXPORT_PRIVATE FlagValues v8_flags
const RegList kJSCallerSaved
Register ToRegister(int num)
constexpr bool SmiValuesAre32Bits()
const uint32_t kFCSRUnderflowCauseMask
const int kFloat32MantissaBits
constexpr Register kJavaScriptCallCodeStartRegister
constexpr int kJSDispatchTableEntrySizeLog2
const intptr_t kSmiTagMask
const int64_t kHigher16MaskOf64
void CallApiFunctionAndReturn(MacroAssembler *masm, bool with_profiling, Register function_address, ExternalReference thunk_ref, Register thunk_arg, int slots_to_drop_on_return, MemOperand *argc_operand, MemOperand return_value_operand)
constexpr uint8_t kInstrSize
Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2=no_reg, Register reg3=no_reg, Register reg4=no_reg, Register reg5=no_reg, Register reg6=no_reg)
constexpr Register kCArgRegs[]
constexpr int kDoubleSize
constexpr Register kJavaScriptCallDispatchHandleRegister
const uint32_t kClearedWeakHeapObjectLower32
constexpr Register kJavaScriptCallNewTargetRegister
constexpr int kNumRegisters
static bool IsZero(const Operand &rt)
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr bool IsAligned(T value, U alignment)
#define OFFSET_OF_DATA_START(Type)