commit 66d5a654c006126949e5a92be042d3b1179785d9
parent 46af4d9a893a594fd1dbc8ee5d2dbe4ba8a69baf
Author: André Bargull <andre.bargull@gmail.com>
Date: Thu, 23 Oct 2025 09:56:07 +0000
Bug 1995491 - Part 1: Avoid unnecessary shift in ExtractBits. r=spidermonkey-reviewers,iain
`slli` isn't needed when `MaxBits - (pos + size)` is zero. This case happens
when `extractTag` calls `ExtractBits`.
Drive-by change:
- Merge code paths for `JS_CODEGEN_RISCV64` and `JS_CODEGEN_RISCV32`.
Differential Revision: https://phabricator.services.mozilla.com/D269358
Diffstat:
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/js/src/jit/riscv64/MacroAssembler-riscv64.cpp b/js/src/jit/riscv64/MacroAssembler-riscv64.cpp
@@ -5112,27 +5112,30 @@ void MacroAssemblerRiscv64::ma_b(Register lhs, Register rhs, Label* label,
void MacroAssemblerRiscv64::ExtractBits(Register rt, Register rs, uint16_t pos,
uint16_t size, bool sign_extend) {
#if JS_CODEGEN_RISCV64
- MOZ_ASSERT(pos < 64 && 0 < size && size <= 64 && 0 < pos + size &&
- pos + size <= 64);
- slli(rt, rs, 64 - (pos + size));
- if (sign_extend) {
- srai(rt, rt, 64 - size);
- } else {
- srli(rt, rt, 64 - size);
- }
+ constexpr uint16_t MaxBits = 64;
#elif JS_CODEGEN_RISCV32
- MOZ_ASSERT(pos < 32);
+ constexpr uint16_t MaxBits = 32;
+#endif
+
+ MOZ_ASSERT(pos < MaxBits);
MOZ_ASSERT(size > 0);
- MOZ_ASSERT(size <= 32);
+ MOZ_ASSERT(size <= MaxBits);
MOZ_ASSERT((pos + size) > 0);
- MOZ_ASSERT((pos + size) <= 32);
- slli(rt, rs, 32 - (pos + size));
+ MOZ_ASSERT((pos + size) <= MaxBits);
+
+ Register src;
+ if (uint16_t shift = MaxBits - (pos + size)) {
+ slli(rt, rs, shift);
+ src = rt;
+ } else {
+ src = rs;
+ }
+
if (sign_extend) {
- srai(rt, rt, 32 - size);
+ srai(rt, src, MaxBits - size);
} else {
- srli(rt, rt, 32 - size);
+ srli(rt, src, MaxBits - size);
}
-#endif
}
void MacroAssemblerRiscv64::InsertBits(Register dest, Register source, int pos,