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:
Lars T Hansen 2020-11-19 19:55:21 +00:00
Родитель 97e68c3664
Коммит 1df6e0e75f
1 изменённых файлов: 40 добавлений и 10 удалений

Просмотреть файл

@ -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>