zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 0c727604540df7dbff4f57e4599fa01e01b36695 (tree)
parent fc015231ad4e2e449e848fd08dd003efd049ad43
Author: Jakub Konka <kubkon@jakubkonka.com>
Date:   Tue,  7 Jun 2022 18:10:28 +0200

x64: optimise element offset calculation if dealing with immediates

If `index` MCValue is actually an immediate, we can calculate offset
directly at "comptime" rather than at runtime.

Diffstat:
Msrc/arch/x86_64/CodeGen.zig | 18++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig @@ -2100,8 +2100,22 @@ fn airPtrSlicePtrPtr(self: *Self, inst: Air.Inst.Index) !void { } fn elemOffset(self: *Self, index_ty: Type, index: MCValue, elem_size: u64) !Register { - const reg = try self.copyToTmpRegister(index_ty, index); - try self.genIntMulComplexOpMir(index_ty, .{ .register = reg }, .{ .immediate = elem_size }); + const reg: Register = blk: { + switch (index) { + .immediate => |imm| { + // Optimisation: if index MCValue is an immediate, we can multiply in `comptime` + // and set the register directly to the scaled offset as an immediate. + const reg = try self.register_manager.allocReg(null, gp); + try self.genSetReg(index_ty, reg, .{ .immediate = imm * elem_size }); + break :blk reg; + }, + else => { + const reg = try self.copyToTmpRegister(index_ty, index); + try self.genIntMulComplexOpMir(index_ty, .{ .register = reg }, .{ .immediate = elem_size }); + break :blk reg; + }, + } + }; return reg; }