Skip to content

Commit b4ad2f2

Browse files
Artem Serovcommit-bot@chromium.org
Artem Serov
authored andcommitted
[vm/compiler] ARM64: Improve shifts assembly instructions.
Use asr/lsr/lsl instructions instead of add ZR with shifted operand as those are prefered instructions for Arm. Change-Id: Ice2629bf5a23a745c3bf5138d8a220f7522dca52 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121710 Commit-Queue: Vyacheslav Egorov <[email protected]> Reviewed-by: Vyacheslav Egorov <[email protected]> Reviewed-by: Aart Bik <[email protected]>
1 parent 9ae7b10 commit b4ad2f2

File tree

2 files changed

+330
-14
lines changed

2 files changed

+330
-14
lines changed

runtime/vm/compiler/assembler/assembler_arm64.h

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,31 +1327,25 @@ class Assembler : public AssemblerBase {
13271327
void tst(Register rn, Operand o) { ands(ZR, rn, o); }
13281328
void tsti(Register rn, const Immediate& imm) { andis(ZR, rn, imm); }
13291329

1330-
// We use an alias of add, where ARM recommends an alias of ubfm.
13311330
void LslImmediate(Register rd,
13321331
Register rn,
13331332
int shift,
13341333
OperandSize sz = kDoubleWord) {
1335-
if (sz == kDoubleWord) {
1336-
add(rd, ZR, Operand(rn, LSL, shift));
1337-
} else {
1338-
addw(rd, ZR, Operand(rn, LSL, shift));
1339-
}
1334+
const int reg_size =
1335+
(sz == kDoubleWord) ? kXRegSizeInBits : kWRegSizeInBits;
1336+
ubfm(rd, rn, (reg_size - shift) % reg_size, reg_size - shift - 1, sz);
13401337
}
1341-
// We use an alias of add, where ARM recommends an alias of ubfm.
13421338
void LsrImmediate(Register rd,
13431339
Register rn,
13441340
int shift,
13451341
OperandSize sz = kDoubleWord) {
1346-
if (sz == kDoubleWord) {
1347-
add(rd, ZR, Operand(rn, LSR, shift));
1348-
} else {
1349-
addw(rd, ZR, Operand(rn, LSR, shift));
1350-
}
1342+
const int reg_size =
1343+
(sz == kDoubleWord) ? kXRegSizeInBits : kWRegSizeInBits;
1344+
ubfm(rd, rn, shift, reg_size - 1, sz);
13511345
}
1352-
// We use an alias of add, where ARM recommends an alias of sbfm.
13531346
void AsrImmediate(Register rd, Register rn, int shift) {
1354-
add(rd, ZR, Operand(rn, ASR, shift));
1347+
const int reg_size = kXRegSizeInBits;
1348+
sbfm(rd, rn, shift, reg_size - 1);
13551349
}
13561350

13571351
void VRecps(VRegister vd, VRegister vn);

0 commit comments

Comments
 (0)