зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1678049 - Use CBZ/CBNZ on ARM64 when we can. r=nbp
Arm64 has special instructions for compare-with-zero for equality/nonequality, so use them when we can. This makes code more compact, and may be a very small speed win. Differential Revision: https://phabricator.services.mozilla.com/D97454
This commit is contained in:
Родитель
97e68c3664
Коммит
1df6e0e75f
|
@ -820,8 +820,14 @@ void MacroAssembler::branch32(Condition cond, Register lhs, Register rhs,
|
||||||
template <class L>
|
template <class L>
|
||||||
void MacroAssembler::branch32(Condition cond, Register lhs, Imm32 imm,
|
void MacroAssembler::branch32(Condition cond, Register lhs, Imm32 imm,
|
||||||
L label) {
|
L label) {
|
||||||
|
if (imm.value == 0 && cond == Assembler::Equal) {
|
||||||
|
Cbz(ARMRegister(lhs, 32), label);
|
||||||
|
} else if (imm.value == 0 && cond == Assembler::NotEqual) {
|
||||||
|
Cbnz(ARMRegister(lhs, 32), label);
|
||||||
|
} else {
|
||||||
cmp32(lhs, imm);
|
cmp32(lhs, imm);
|
||||||
B(label, cond);
|
B(label, cond);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::branch32(Condition cond, Register lhs, const Address& rhs,
|
void MacroAssembler::branch32(Condition cond, Register lhs, const Address& rhs,
|
||||||
|
@ -889,8 +895,14 @@ void MacroAssembler::branch32(Condition cond, wasm::SymbolicAddress lhs,
|
||||||
|
|
||||||
void MacroAssembler::branch64(Condition cond, Register64 lhs, Imm64 val,
|
void MacroAssembler::branch64(Condition cond, Register64 lhs, Imm64 val,
|
||||||
Label* success, Label* fail) {
|
Label* success, Label* fail) {
|
||||||
|
if (val.value == 0 && cond == Assembler::Equal) {
|
||||||
|
Cbz(ARMRegister(lhs.reg, 64), success);
|
||||||
|
} else if (val.value == 0 && cond == Assembler::NotEqual) {
|
||||||
|
Cbnz(ARMRegister(lhs.reg, 64), success);
|
||||||
|
} else {
|
||||||
Cmp(ARMRegister(lhs.reg, 64), val.value);
|
Cmp(ARMRegister(lhs.reg, 64), val.value);
|
||||||
B(success, cond);
|
B(success, cond);
|
||||||
|
}
|
||||||
if (fail) {
|
if (fail) {
|
||||||
B(fail);
|
B(fail);
|
||||||
}
|
}
|
||||||
|
@ -934,14 +946,26 @@ void MacroAssembler::branchPtr(Condition cond, Register lhs, Register rhs,
|
||||||
|
|
||||||
void MacroAssembler::branchPtr(Condition cond, Register lhs, Imm32 rhs,
|
void MacroAssembler::branchPtr(Condition cond, Register lhs, Imm32 rhs,
|
||||||
Label* label) {
|
Label* label) {
|
||||||
|
if (rhs.value == 0 && cond == Assembler::Equal) {
|
||||||
|
Cbz(ARMRegister(lhs, 64), label);
|
||||||
|
} else if (rhs.value == 0 && cond == Assembler::NotEqual) {
|
||||||
|
Cbnz(ARMRegister(lhs, 64), label);
|
||||||
|
} else {
|
||||||
cmpPtr(lhs, rhs);
|
cmpPtr(lhs, rhs);
|
||||||
B(label, cond);
|
B(label, cond);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmPtr rhs,
|
void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmPtr rhs,
|
||||||
Label* label) {
|
Label* label) {
|
||||||
|
if (rhs.value == 0 && cond == Assembler::Equal) {
|
||||||
|
Cbz(ARMRegister(lhs, 64), label);
|
||||||
|
} else if (rhs.value == 0 && cond == Assembler::NotEqual) {
|
||||||
|
Cbnz(ARMRegister(lhs, 64), label);
|
||||||
|
} else {
|
||||||
cmpPtr(lhs, rhs);
|
cmpPtr(lhs, rhs);
|
||||||
B(label, cond);
|
B(label, cond);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs,
|
void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs,
|
||||||
|
@ -955,8 +979,14 @@ void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmGCPtr rhs,
|
||||||
|
|
||||||
void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmWord rhs,
|
void MacroAssembler::branchPtr(Condition cond, Register lhs, ImmWord rhs,
|
||||||
Label* label) {
|
Label* label) {
|
||||||
|
if (rhs.value == 0 && cond == Assembler::Equal) {
|
||||||
|
Cbz(ARMRegister(lhs, 64), label);
|
||||||
|
} else if (rhs.value == 0 && cond == Assembler::NotEqual) {
|
||||||
|
Cbnz(ARMRegister(lhs, 64), label);
|
||||||
|
} else {
|
||||||
cmpPtr(lhs, rhs);
|
cmpPtr(lhs, rhs);
|
||||||
B(label, cond);
|
B(label, cond);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class L>
|
template <class L>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче