summaryrefslogtreecommitdiff
path: root/deps/v8/src/mips64/assembler-mips64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/mips64/assembler-mips64.cc')
-rw-r--r--deps/v8/src/mips64/assembler-mips64.cc261
1 files changed, 136 insertions, 125 deletions
diff --git a/deps/v8/src/mips64/assembler-mips64.cc b/deps/v8/src/mips64/assembler-mips64.cc
index 46d4fca740..5099ec1db9 100644
--- a/deps/v8/src/mips64/assembler-mips64.cc
+++ b/deps/v8/src/mips64/assembler-mips64.cc
@@ -189,6 +189,17 @@ void RelocInfo::set_embedded_size(Isolate* isolate, uint32_t size,
reinterpret_cast<Address>(size), flush_mode);
}
+void RelocInfo::set_js_to_wasm_address(Isolate* isolate, Address address,
+ ICacheFlushMode icache_flush_mode) {
+ DCHECK_EQ(rmode_, JS_TO_WASM_CALL);
+ set_embedded_address(isolate, address, icache_flush_mode);
+}
+
+Address RelocInfo::js_to_wasm_address() const {
+ DCHECK_EQ(rmode_, JS_TO_WASM_CALL);
+ return embedded_address();
+}
+
// -----------------------------------------------------------------------------
// Implementation of Operand and MemOperand.
// See assembler-mips-inl.h for inlined constructors.
@@ -624,7 +635,7 @@ bool Assembler::IsOri(Instr instr) {
bool Assembler::IsNop(Instr instr, unsigned int type) {
// See Assembler::nop(type).
- DCHECK(type < 32);
+ DCHECK_LT(type, 32);
uint32_t opcode = GetOpcodeField(instr);
uint32_t function = GetFunctionField(instr);
uint32_t rt = GetRt(instr);
@@ -804,7 +815,7 @@ static inline Instr SetBranchOffset(int32_t pos, int32_t target_pos,
Instr instr) {
int32_t bits = OffsetSizeInBits(instr);
int32_t imm = target_pos - (pos + Assembler::kBranchPCOffset);
- DCHECK((imm & 3) == 0);
+ DCHECK_EQ(imm & 3, 0);
imm >>= 2;
const int32_t mask = (1 << bits) - 1;
@@ -841,7 +852,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool is_internal) {
DCHECK(IsOri(instr_ori2));
uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos;
- DCHECK((imm & 3) == 0);
+ DCHECK_EQ(imm & 3, 0);
instr_lui &= ~kImm16Mask;
instr_ori &= ~kImm16Mask;
@@ -855,7 +866,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool is_internal) {
instr_ori2 | (imm & kImm16Mask));
} else if (IsJ(instr) || IsJal(instr)) {
int32_t imm28 = target_pos - pos;
- DCHECK((imm28 & 3) == 0);
+ DCHECK_EQ(imm28 & 3, 0);
uint32_t imm26 = static_cast<uint32_t>(imm28 >> 2);
DCHECK(is_uint26(imm26));
@@ -865,7 +876,7 @@ void Assembler::target_at_put(int pos, int target_pos, bool is_internal) {
instr_at_put(pos, mark | (imm26 & kImm26Mask));
} else {
int32_t imm28 = target_pos - pos;
- DCHECK((imm28 & 3) == 0);
+ DCHECK_EQ(imm28 & 3, 0);
uint32_t imm26 = static_cast<uint32_t>(imm28 >> 2);
DCHECK(is_uint26(imm26));
@@ -876,14 +887,14 @@ void Assembler::target_at_put(int pos, int target_pos, bool is_internal) {
}
}
-
-void Assembler::print(Label* L) {
+void Assembler::print(const Label* L) {
if (L->is_unused()) {
PrintF("unused label\n");
} else if (L->is_bound()) {
PrintF("bound label to %d\n", L->pos());
} else if (L->is_linked()) {
- Label l = *L;
+ Label l;
+ l.link_to(L->pos());
PrintF("unbound label");
while (l.is_linked()) {
PrintF("@ %d ", l.pos());
@@ -927,7 +938,7 @@ void Assembler::bind_to(Label* L, int pos) {
if (dist > branch_offset) {
if (trampoline_pos == kInvalidSlotPos) {
trampoline_pos = get_trampoline_entry(fixup_pos);
- CHECK(trampoline_pos != kInvalidSlotPos);
+ CHECK_NE(trampoline_pos, kInvalidSlotPos);
}
CHECK((trampoline_pos - fixup_pos) <= branch_offset);
target_at_put(fixup_pos, trampoline_pos, false);
@@ -962,7 +973,7 @@ void Assembler::next(Label* L, bool is_internal) {
if (link == kEndOfChain) {
L->Unuse();
} else {
- DCHECK(link >= 0);
+ DCHECK_GE(link, 0);
L->link_to(link);
}
}
@@ -1240,7 +1251,7 @@ void Assembler::GenInstrMsa3RF(SecondaryField operation, uint32_t df,
MSARegister wt, MSARegister ws, MSARegister wd) {
DCHECK((kArchVariant == kMips64r6) && IsEnabled(MIPS_SIMD));
DCHECK(wt.is_valid() && ws.is_valid() && wd.is_valid());
- DCHECK(df < 2);
+ DCHECK_LT(df, 2);
Instr instr = MSA | operation | (df << 21) | (wt.code() << kWtShift) |
(ws.code() << kWsShift) | (wd.code() << kWdShift);
emit(instr);
@@ -1325,7 +1336,7 @@ uint64_t Assembler::jump_address(Label* L) {
}
}
uint64_t imm = reinterpret_cast<uint64_t>(buffer_) + target_pos;
- DCHECK((imm & 3) == 0);
+ DCHECK_EQ(imm & 3, 0);
return imm;
}
@@ -1347,7 +1358,7 @@ uint64_t Assembler::jump_offset(Label* L) {
}
}
int64_t imm = target_pos - (pc_offset() + pad);
- DCHECK((imm & 3) == 0);
+ DCHECK_EQ(imm & 3, 0);
return static_cast<uint64_t>(imm);
}
@@ -1375,7 +1386,7 @@ int32_t Assembler::branch_offset_helper(Label* L, OffsetSize bits) {
int32_t offset = target_pos - (pc_offset() + kBranchPCOffset + pad);
DCHECK(is_intn(offset, bits + 2));
- DCHECK((offset & 3) == 0);
+ DCHECK_EQ(offset & 3, 0);
return offset;
}
@@ -1390,7 +1401,7 @@ void Assembler::label_at_put(Label* L, int at_offset) {
if (L->is_linked()) {
target_pos = L->pos(); // L's link.
int32_t imm18 = target_pos - at_offset;
- DCHECK((imm18 & 3) == 0);
+ DCHECK_EQ(imm18 & 3, 0);
int32_t imm16 = imm18 >> 2;
DCHECK(is_int16(imm16));
instr_at_put(at_offset, (imm16 & kImm16Mask));
@@ -1420,13 +1431,13 @@ void Assembler::bal(int16_t offset) {
void Assembler::bc(int32_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrImmediate(BC, offset, CompactBranchType::COMPACT_BRANCH);
}
void Assembler::balc(int32_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrImmediate(BALC, offset, CompactBranchType::COMPACT_BRANCH);
}
@@ -1446,14 +1457,14 @@ void Assembler::bgez(Register rs, int16_t offset) {
void Assembler::bgezc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
GenInstrImmediate(BLEZL, rt, rt, offset, CompactBranchType::COMPACT_BRANCH);
}
void Assembler::bgeuc(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
DCHECK(rt != zero_reg);
DCHECK(rs.code() != rt.code());
@@ -1462,7 +1473,7 @@ void Assembler::bgeuc(Register rs, Register rt, int16_t offset) {
void Assembler::bgec(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
DCHECK(rt != zero_reg);
DCHECK(rs.code() != rt.code());
@@ -1487,7 +1498,7 @@ void Assembler::bgtz(Register rs, int16_t offset) {
void Assembler::bgtzc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
GenInstrImmediate(BGTZL, zero_reg, rt, offset,
CompactBranchType::COMPACT_BRANCH);
@@ -1502,7 +1513,7 @@ void Assembler::blez(Register rs, int16_t offset) {
void Assembler::blezc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
GenInstrImmediate(BLEZL, zero_reg, rt, offset,
CompactBranchType::COMPACT_BRANCH);
@@ -1510,14 +1521,14 @@ void Assembler::blezc(Register rt, int16_t offset) {
void Assembler::bltzc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
GenInstrImmediate(BGTZL, rt, rt, offset, CompactBranchType::COMPACT_BRANCH);
}
void Assembler::bltuc(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
DCHECK(rt != zero_reg);
DCHECK(rs.code() != rt.code());
@@ -1526,7 +1537,7 @@ void Assembler::bltuc(Register rs, Register rt, int16_t offset) {
void Assembler::bltc(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
DCHECK(rt != zero_reg);
DCHECK(rs.code() != rt.code());
@@ -1558,7 +1569,7 @@ void Assembler::bne(Register rs, Register rt, int16_t offset) {
void Assembler::bovc(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
if (rs.code() >= rt.code()) {
GenInstrImmediate(ADDI, rs, rt, offset, CompactBranchType::COMPACT_BRANCH);
} else {
@@ -1568,7 +1579,7 @@ void Assembler::bovc(Register rs, Register rt, int16_t offset) {
void Assembler::bnvc(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
if (rs.code() >= rt.code()) {
GenInstrImmediate(DADDI, rs, rt, offset, CompactBranchType::COMPACT_BRANCH);
} else {
@@ -1578,7 +1589,7 @@ void Assembler::bnvc(Register rs, Register rt, int16_t offset) {
void Assembler::blezalc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
DCHECK(rt != ra);
GenInstrImmediate(BLEZ, zero_reg, rt, offset,
@@ -1587,7 +1598,7 @@ void Assembler::blezalc(Register rt, int16_t offset) {
void Assembler::bgezalc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
DCHECK(rt != ra);
GenInstrImmediate(BLEZ, rt, rt, offset, CompactBranchType::COMPACT_BRANCH);
@@ -1595,7 +1606,7 @@ void Assembler::bgezalc(Register rt, int16_t offset) {
void Assembler::bgezall(Register rs, int16_t offset) {
- DCHECK(kArchVariant != kMips64r6);
+ DCHECK_NE(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
DCHECK(rs != ra);
BlockTrampolinePoolScope block_trampoline_pool(this);
@@ -1605,7 +1616,7 @@ void Assembler::bgezall(Register rs, int16_t offset) {
void Assembler::bltzalc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
DCHECK(rt != ra);
GenInstrImmediate(BGTZ, rt, rt, offset, CompactBranchType::COMPACT_BRANCH);
@@ -1613,7 +1624,7 @@ void Assembler::bltzalc(Register rt, int16_t offset) {
void Assembler::bgtzalc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
DCHECK(rt != ra);
GenInstrImmediate(BGTZ, zero_reg, rt, offset,
@@ -1622,7 +1633,7 @@ void Assembler::bgtzalc(Register rt, int16_t offset) {
void Assembler::beqzalc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
DCHECK(rt != ra);
GenInstrImmediate(ADDI, zero_reg, rt, offset,
@@ -1631,7 +1642,7 @@ void Assembler::beqzalc(Register rt, int16_t offset) {
void Assembler::bnezalc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rt != zero_reg);
DCHECK(rt != ra);
GenInstrImmediate(DADDI, zero_reg, rt, offset,
@@ -1640,7 +1651,7 @@ void Assembler::bnezalc(Register rt, int16_t offset) {
void Assembler::beqc(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.code() != rt.code() && rs.code() != 0 && rt.code() != 0);
if (rs.code() < rt.code()) {
GenInstrImmediate(ADDI, rs, rt, offset, CompactBranchType::COMPACT_BRANCH);
@@ -1651,14 +1662,14 @@ void Assembler::beqc(Register rs, Register rt, int16_t offset) {
void Assembler::beqzc(Register rs, int32_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
GenInstrImmediate(POP66, rs, offset, CompactBranchType::COMPACT_BRANCH);
}
void Assembler::bnec(Register rs, Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.code() != rt.code() && rs.code() != 0 && rt.code() != 0);
if (rs.code() < rt.code()) {
GenInstrImmediate(DADDI, rs, rt, offset, CompactBranchType::COMPACT_BRANCH);
@@ -1669,7 +1680,7 @@ void Assembler::bnec(Register rs, Register rt, int16_t offset) {
void Assembler::bnezc(Register rs, int32_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs != zero_reg);
GenInstrImmediate(POP76, rs, offset, CompactBranchType::COMPACT_BRANCH);
}
@@ -1735,13 +1746,13 @@ void Assembler::jalr(Register rs, Register rd) {
void Assembler::jic(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrImmediate(POP66, zero_reg, rt, offset);
}
void Assembler::jialc(Register rt, int16_t offset) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrImmediate(POP76, zero_reg, rt, offset);
}
@@ -1775,55 +1786,55 @@ void Assembler::mul(Register rd, Register rs, Register rt) {
void Assembler::muh(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUH_OP, MUL_MUH);
}
void Assembler::mulu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUL_OP, MUL_MUH_U);
}
void Assembler::muhu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUH_OP, MUL_MUH_U);
}
void Assembler::dmul(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUL_OP, D_MUL_MUH);
}
void Assembler::dmuh(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUH_OP, D_MUL_MUH);
}
void Assembler::dmulu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUL_OP, D_MUL_MUH_U);
}
void Assembler::dmuhu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MUH_OP, D_MUL_MUH_U);
}
void Assembler::mult(Register rs, Register rt) {
- DCHECK(kArchVariant != kMips64r6);
+ DCHECK_NE(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, zero_reg, 0, MULT);
}
void Assembler::multu(Register rs, Register rt) {
- DCHECK(kArchVariant != kMips64r6);
+ DCHECK_NE(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, zero_reg, 0, MULTU);
}
@@ -1839,13 +1850,13 @@ void Assembler::div(Register rs, Register rt) {
void Assembler::div(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, DIV_OP, DIV_MOD);
}
void Assembler::mod(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MOD_OP, DIV_MOD);
}
@@ -1856,13 +1867,13 @@ void Assembler::divu(Register rs, Register rt) {
void Assembler::divu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, DIV_OP, DIV_MOD_U);
}
void Assembler::modu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MOD_OP, DIV_MOD_U);
}
@@ -1893,13 +1904,13 @@ void Assembler::ddiv(Register rs, Register rt) {
void Assembler::ddiv(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, DIV_OP, D_DIV_MOD);
}
void Assembler::dmod(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MOD_OP, D_DIV_MOD);
}
@@ -1910,13 +1921,13 @@ void Assembler::ddivu(Register rs, Register rt) {
void Assembler::ddivu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, DIV_OP, D_DIV_MOD_U);
}
void Assembler::dmodu(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, MOD_OP, D_DIV_MOD_U);
}
@@ -2088,8 +2099,8 @@ void Assembler::dsra32(Register rd, Register rt, uint16_t sa) {
void Assembler::lsa(Register rd, Register rt, Register rs, uint8_t sa) {
DCHECK(rd.is_valid() && rt.is_valid() && rs.is_valid());
- DCHECK(sa <= 3);
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_LE(sa, 3);
+ DCHECK_EQ(kArchVariant, kMips64r6);
Instr instr = SPECIAL | rs.code() << kRsShift | rt.code() << kRtShift |
rd.code() << kRdShift | sa << kSaShift | LSA;
emit(instr);
@@ -2098,8 +2109,8 @@ void Assembler::lsa(Register rd, Register rt, Register rs, uint8_t sa) {
void Assembler::dlsa(Register rd, Register rt, Register rs, uint8_t sa) {
DCHECK(rd.is_valid() && rt.is_valid() && rs.is_valid());
- DCHECK(sa <= 3);
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_LE(sa, 3);
+ DCHECK_EQ(kArchVariant, kMips64r6);
Instr instr = SPECIAL | rs.code() << kRsShift | rt.code() << kRtShift |
rd.code() << kRdShift | sa << kSaShift | DLSA;
emit(instr);
@@ -2123,7 +2134,7 @@ void Assembler::AdjustBaseAndOffset(MemOperand& src,
bool doubleword_aligned = (src.offset() & (kDoubleSize - 1)) == 0;
bool two_accesses = static_cast<bool>(access_type) || !doubleword_aligned;
- DCHECK(second_access_add_to_offset <= 7); // Must be <= 7.
+ DCHECK_LE(second_access_add_to_offset, 7); // Must be <= 7.
// is_int16 must be passed a signed value, hence the static cast below.
if (is_int16(src.offset()) &&
@@ -2268,14 +2279,14 @@ void Assembler::lwu(Register rd, const MemOperand& rs) {
void Assembler::lwl(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(LWL, rs.rm(), rd, rs.offset_);
}
void Assembler::lwr(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(LWR, rs.rm(), rd, rs.offset_);
}
@@ -2297,14 +2308,14 @@ void Assembler::sw(Register rd, const MemOperand& rs) {
void Assembler::swl(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(SWL, rs.rm(), rd, rs.offset_);
}
void Assembler::swr(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(SWR, rs.rm(), rd, rs.offset_);
}
@@ -2313,7 +2324,7 @@ void Assembler::ll(Register rd, const MemOperand& rs) {
DCHECK(is_int9(rs.offset_));
GenInstrImmediate(SPECIAL3, rs.rm(), rd, rs.offset_, 0, LL_R6);
} else {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
DCHECK(is_int16(rs.offset_));
GenInstrImmediate(LL, rs.rm(), rd, rs.offset_);
}
@@ -2324,7 +2335,7 @@ void Assembler::lld(Register rd, const MemOperand& rs) {
DCHECK(is_int9(rs.offset_));
GenInstrImmediate(SPECIAL3, rs.rm(), rd, rs.offset_, 0, LLD_R6);
} else {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
DCHECK(is_int16(rs.offset_));
GenInstrImmediate(LLD, rs.rm(), rd, rs.offset_);
}
@@ -2335,7 +2346,7 @@ void Assembler::sc(Register rd, const MemOperand& rs) {
DCHECK(is_int9(rs.offset_));
GenInstrImmediate(SPECIAL3, rs.rm(), rd, rs.offset_, 0, SC_R6);
} else {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(SC, rs.rm(), rd, rs.offset_);
}
}
@@ -2345,7 +2356,7 @@ void Assembler::scd(Register rd, const MemOperand& rs) {
DCHECK(is_int9(rs.offset_));
GenInstrImmediate(SPECIAL3, rs.rm(), rd, rs.offset_, 0, SCD_R6);
} else {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(SCD, rs.rm(), rd, rs.offset_);
}
}
@@ -2385,28 +2396,28 @@ void Assembler::dati(Register rs, int32_t j) {
void Assembler::ldl(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(LDL, rs.rm(), rd, rs.offset_);
}
void Assembler::ldr(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(LDR, rs.rm(), rd, rs.offset_);
}
void Assembler::sdl(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(SDL, rs.rm(), rd, rs.offset_);
}
void Assembler::sdr(Register rd, const MemOperand& rs) {
DCHECK(is_int16(rs.offset_));
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrImmediate(SDR, rs.rm(), rd, rs.offset_);
}
@@ -2424,7 +2435,7 @@ void Assembler::sd(Register rd, const MemOperand& rs) {
// ---------PC-Relative instructions-----------
void Assembler::addiupc(Register rs, int32_t imm19) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.is_valid() && is_int19(imm19));
uint32_t imm21 = ADDIUPC << kImm19Bits | (imm19 & kImm19Mask);
GenInstrImmediate(PCREL, rs, imm21);
@@ -2432,7 +2443,7 @@ void Assembler::addiupc(Register rs, int32_t imm19) {
void Assembler::lwpc(Register rs, int32_t offset19) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.is_valid() && is_int19(offset19));
uint32_t imm21 = LWPC << kImm19Bits | (offset19 & kImm19Mask);
GenInstrImmediate(PCREL, rs, imm21);
@@ -2440,7 +2451,7 @@ void Assembler::lwpc(Register rs, int32_t offset19) {
void Assembler::lwupc(Register rs, int32_t offset19) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.is_valid() && is_int19(offset19));
uint32_t imm21 = LWUPC << kImm19Bits | (offset19 & kImm19Mask);
GenInstrImmediate(PCREL, rs, imm21);
@@ -2448,7 +2459,7 @@ void Assembler::lwupc(Register rs, int32_t offset19) {
void Assembler::ldpc(Register rs, int32_t offset18) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.is_valid() && is_int18(offset18));
uint32_t imm21 = LDPC << kImm18Bits | (offset18 & kImm18Mask);
GenInstrImmediate(PCREL, rs, imm21);
@@ -2456,7 +2467,7 @@ void Assembler::ldpc(Register rs, int32_t offset18) {
void Assembler::auipc(Register rs, int16_t imm16) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.is_valid());
uint32_t imm21 = AUIPC << kImm16Bits | (imm16 & kImm16Mask);
GenInstrImmediate(PCREL, rs, imm21);
@@ -2464,7 +2475,7 @@ void Assembler::auipc(Register rs, int16_t imm16) {
void Assembler::aluipc(Register rs, int16_t imm16) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(rs.is_valid());
uint32_t imm21 = ALUIPC << kImm16Bits | (imm16 & kImm16Mask);
GenInstrImmediate(PCREL, rs, imm21);
@@ -2475,7 +2486,7 @@ void Assembler::aluipc(Register rs, int16_t imm16) {
// Break / Trap instructions.
void Assembler::break_(uint32_t code, bool break_as_stop) {
- DCHECK((code & ~0xfffff) == 0);
+ DCHECK_EQ(code & ~0xfffff, 0);
// We need to invalidate breaks that could be stops as well because the
// simulator expects a char pointer after the stop instruction.
// See constants-mips.h for explanation.
@@ -2491,8 +2502,8 @@ void Assembler::break_(uint32_t code, bool break_as_stop) {
void Assembler::stop(const char* msg, uint32_t code) {
- DCHECK(code > kMaxWatchpointCode);
- DCHECK(code <= kMaxStopCode);
+ DCHECK_GT(code, kMaxWatchpointCode);
+ DCHECK_LE(code, kMaxStopCode);
#if defined(V8_HOST_ARCH_MIPS) || defined(V8_HOST_ARCH_MIPS64)
break_(0x54321);
#else // V8_HOST_ARCH_MIPS
@@ -2652,7 +2663,7 @@ void Assembler::maxa_d(FPURegister fd, FPURegister fs, FPURegister ft) {
void Assembler::max(SecondaryField fmt, FPURegister fd, FPURegister fs,
FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK((fmt == D) || (fmt == S));
GenInstrRegister(COP1, fmt, ft, fs, fd, MAX);
}
@@ -2660,7 +2671,7 @@ void Assembler::max(SecondaryField fmt, FPURegister fd, FPURegister fs,
void Assembler::min(SecondaryField fmt, FPURegister fd, FPURegister fs,
FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK((fmt == D) || (fmt == S));
GenInstrRegister(COP1, fmt, ft, fs, fd, MIN);
}
@@ -2668,14 +2679,14 @@ void Assembler::min(SecondaryField fmt, FPURegister fd, FPURegister fs,
// GPR.
void Assembler::seleqz(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, 0, SELEQZ_S);
}
// GPR.
void Assembler::selnez(Register rd, Register rs, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL, rs, rt, rd, 0, SELNEZ_S);
}
@@ -2761,13 +2772,13 @@ void Assembler::dextu_(Register rt, Register rs, uint16_t pos, uint16_t size) {
void Assembler::bitswap(Register rd, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, BSHFL);
}
void Assembler::dbitswap(Register rd, Register rt) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, DBSHFL);
}
@@ -2781,7 +2792,7 @@ void Assembler::pref(int32_t hint, const MemOperand& rs) {
void Assembler::align(Register rd, Register rs, Register rt, uint8_t bp) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(is_uint3(bp));
uint16_t sa = (ALIGN << kBp2Bits) | bp;
GenInstrRegister(SPECIAL3, rs, rt, rd, sa, BSHFL);
@@ -2789,7 +2800,7 @@ void Assembler::align(Register rd, Register rs, Register rt, uint8_t bp) {
void Assembler::dalign(Register rd, Register rs, Register rt, uint8_t bp) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK(is_uint3(bp));
uint16_t sa = (DALIGN << kBp3Bits) | bp;
GenInstrRegister(SPECIAL3, rs, rt, rd, sa, DBSHFL);
@@ -2892,7 +2903,7 @@ void Assembler::DoubleAsTwoUInt32(double d, uint32_t* lo, uint32_t* hi) {
void Assembler::sel(SecondaryField fmt, FPURegister fd, FPURegister fs,
FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK((fmt == D) || (fmt == S));
GenInstrRegister(COP1, fmt, ft, fs, fd, SEL);
@@ -2938,53 +2949,53 @@ void Assembler::selnez_s(FPURegister fd, FPURegister fs, FPURegister ft) {
void Assembler::movz_s(FPURegister fd, FPURegister fs, Register rt) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrRegister(COP1, S, rt, fs, fd, MOVZ_C);
}
void Assembler::movz_d(FPURegister fd, FPURegister fs, Register rt) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrRegister(COP1, D, rt, fs, fd, MOVZ_C);
}
void Assembler::movt_s(FPURegister fd, FPURegister fs, uint16_t cc) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
FPURegister ft = FPURegister::from_code((cc & 0x0007) << 2 | 1);
GenInstrRegister(COP1, S, ft, fs, fd, MOVF);
}
void Assembler::movt_d(FPURegister fd, FPURegister fs, uint16_t cc) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
FPURegister ft = FPURegister::from_code((cc & 0x0007) << 2 | 1);
GenInstrRegister(COP1, D, ft, fs, fd, MOVF);
}
void Assembler::movf_s(FPURegister fd, FPURegister fs, uint16_t cc) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
FPURegister ft = FPURegister::from_code((cc & 0x0007) << 2 | 0);
GenInstrRegister(COP1, S, ft, fs, fd, MOVF);
}
void Assembler::movf_d(FPURegister fd, FPURegister fs, uint16_t cc) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
FPURegister ft = FPURegister::from_code((cc & 0x0007) << 2 | 0);
GenInstrRegister(COP1, D, ft, fs, fd, MOVF);
}
void Assembler::movn_s(FPURegister fd, FPURegister fs, Register rt) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrRegister(COP1, S, rt, fs, fd, MOVN_C);
}
void Assembler::movn_d(FPURegister fd, FPURegister fs, Register rt) {
- DCHECK(kArchVariant == kMips64r2);
+ DCHECK_EQ(kArchVariant, kMips64r2);
GenInstrRegister(COP1, D, rt, fs, fd, MOVN_C);
}
@@ -2992,7 +3003,7 @@ void Assembler::movn_d(FPURegister fd, FPURegister fs, Register rt) {
// FPR.
void Assembler::selnez(SecondaryField fmt, FPURegister fd, FPURegister fs,
FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK((fmt == D) || (fmt == S));
GenInstrRegister(COP1, fmt, ft, fs, fd, SELNEZ_C);
}
@@ -3058,22 +3069,22 @@ void Assembler::msub_d(FPURegister fd, FPURegister fr, FPURegister fs,
}
void Assembler::maddf_s(FPURegister fd, FPURegister fs, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, S, ft, fs, fd, MADDF_S);
}
void Assembler::maddf_d(FPURegister fd, FPURegister fs, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, D, ft, fs, fd, MADDF_D);
}
void Assembler::msubf_s(FPURegister fd, FPURegister fs, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, S, ft, fs, fd, MSUBF_S);
}
void Assembler::msubf_d(FPURegister fd, FPURegister fs, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, D, ft, fs, fd, MSUBF_D);
}
@@ -3205,7 +3216,7 @@ void Assembler::rint_d(FPURegister fd, FPURegister fs) { rint(D, fd, fs); }
void Assembler::rint(SecondaryField fmt, FPURegister fd, FPURegister fs) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, fmt, f0, fs, fd, RINT);
}
@@ -3265,20 +3276,20 @@ void Assembler::ceil_l_d(FPURegister fd, FPURegister fs) {
void Assembler::class_s(FPURegister fd, FPURegister fs) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, S, f0, fs, fd, CLASS_S);
}
void Assembler::class_d(FPURegister fd, FPURegister fs) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
GenInstrRegister(COP1, D, f0, fs, fd, CLASS_D);
}
void Assembler::mina(SecondaryField fmt, FPURegister fd, FPURegister fs,
FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK((fmt == D) || (fmt == S));
GenInstrRegister(COP1, fmt, ft, fs, fd, MINA);
}
@@ -3286,7 +3297,7 @@ void Assembler::mina(SecondaryField fmt, FPURegister fd, FPURegister fs,
void Assembler::maxa(SecondaryField fmt, FPURegister fd, FPURegister fs,
FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
DCHECK((fmt == D) || (fmt == S));
GenInstrRegister(COP1, fmt, ft, fs, fd, MAXA);
}
@@ -3327,8 +3338,8 @@ void Assembler::cvt_d_s(FPURegister fd, FPURegister fs) {
// Conditions for >= MIPSr6.
void Assembler::cmp(FPUCondition cond, SecondaryField fmt,
FPURegister fd, FPURegister fs, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
- DCHECK((fmt & ~(31 << kRsShift)) == 0);
+ DCHECK_EQ(kArchVariant, kMips64r6);
+ DCHECK_EQ(fmt & ~(31 << kRsShift), 0);
Instr instr = COP1 | fmt | ft.code() << kFtShift |
fs.code() << kFsShift | fd.code() << kFdShift | (0 << 5) | cond;
emit(instr);
@@ -3347,14 +3358,14 @@ void Assembler::cmp_d(FPUCondition cond, FPURegister fd, FPURegister fs,
void Assembler::bc1eqz(int16_t offset, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
Instr instr = COP1 | BC1EQZ | ft.code() << kFtShift | (offset & kImm16Mask);
emit(instr);
}
void Assembler::bc1nez(int16_t offset, FPURegister ft) {
- DCHECK(kArchVariant == kMips64r6);
+ DCHECK_EQ(kArchVariant, kMips64r6);
Instr instr = COP1 | BC1NEZ | ft.code() << kFtShift | (offset & kImm16Mask);
emit(instr);
}
@@ -3363,10 +3374,10 @@ void Assembler::bc1nez(int16_t offset, FPURegister ft) {
// Conditions for < MIPSr6.
void Assembler::c(FPUCondition cond, SecondaryField fmt,
FPURegister fs, FPURegister ft, uint16_t cc) {
- DCHECK(kArchVariant != kMips64r6);
+ DCHECK_NE(kArchVariant, kMips64r6);
DCHECK(is_uint3(cc));
DCHECK(fmt == S || fmt == D);
- DCHECK((fmt & ~(31 << kRsShift)) == 0);
+ DCHECK_EQ(fmt & ~(31 << kRsShift), 0);
Instr instr = COP1 | fmt | ft.code() << kFtShift | fs.code() << kFsShift
| cc << 8 | 3 << 4 | cond;
emit(instr);
@@ -3387,7 +3398,7 @@ void Assembler::c_d(FPUCondition cond, FPURegister fs, FPURegister ft,
void Assembler::fcmp(FPURegister src1, const double src2,
FPUCondition cond) {
- DCHECK(src2 == 0.0);
+ DCHECK_EQ(src2, 0.0);
mtc1(zero_reg, f14);
cvt_d_w(f14, f14);
c(cond, D, src1, f14, 0);
@@ -3950,7 +3961,7 @@ int Assembler::RelocateInternalReference(RelocInfo::Mode rmode, byte* pc,
return 0; // Number of instructions patched.
}
imm += pc_delta;
- DCHECK((imm & 3) == 0);
+ DCHECK_EQ(imm & 3, 0);
instr_lui &= ~kImm16Mask;
instr_ori &= ~kImm16Mask;
@@ -3969,7 +3980,7 @@ int Assembler::RelocateInternalReference(RelocInfo::Mode rmode, byte* pc,
imm28 += pc_delta;
imm28 &= kImm28Mask;
instr &= ~kImm26Mask;
- DCHECK((imm28 & 3) == 0);
+ DCHECK_EQ(imm28 & 3, 0);
uint32_t imm26 = static_cast<uint32_t>(imm28 >> 2);
instr_at_put(pc, instr | (imm26 & kImm26Mask));
return 1; // Number of instructions patched.
@@ -3983,7 +3994,7 @@ int Assembler::RelocateInternalReference(RelocInfo::Mode rmode, byte* pc,
uint64_t target =
static_cast<int64_t>(imm28) + reinterpret_cast<uint64_t>(pc);
target &= kImm28Mask;
- DCHECK((imm28 & 3) == 0);
+ DCHECK_EQ(imm28 & 3, 0);
uint32_t imm26 = static_cast<uint32_t>(target >> 2);
// Check markings whether to emit j or jal.
uint32_t unbox = (instr & kJRawMark) ? J : JAL;
@@ -4081,14 +4092,14 @@ void Assembler::dd(Label* label) {
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
// We do not try to reuse pool constants.
- RelocInfo rinfo(pc_, rmode, data, NULL);
+ RelocInfo rinfo(pc_, rmode, data, nullptr);
if (!RelocInfo::IsNone(rinfo.rmode())) {
// Don't record external references unless the heap will be serialized.
if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
!serializer_enabled() && !emit_debug_code()) {
return;
}
- DCHECK(buffer_space() >= kMaxRelocSize); // Too late to grow buffer here.
+ DCHECK_GE(buffer_space(), kMaxRelocSize); // Too late to grow buffer here.
reloc_info_writer.Write(&rinfo);
}
}
@@ -4119,7 +4130,7 @@ void Assembler::CheckTrampolinePool() {
}
DCHECK(!trampoline_emitted_);
- DCHECK(unbound_labels_count_ >= 0);
+ DCHECK_GE(unbound_labels_count_, 0);
if (unbound_labels_count_ > 0) {
// First we emit jump (2 instructions), then we emit trampoline pool.
{ BlockTrampolinePoolScope block_trampoline_pool(this);
@@ -4250,8 +4261,8 @@ UseScratchRegisterScope::~UseScratchRegisterScope() {
}
Register UseScratchRegisterScope::Acquire() {
- DCHECK(available_ != nullptr);
- DCHECK(*available_ != 0);
+ DCHECK_NOT_NULL(available_);
+ DCHECK_NE(*available_, 0);
int index = static_cast<int>(base::bits::CountTrailingZeros32(*available_));
*available_ &= ~(1UL << index);