authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-16 14:05:48+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-16 14:13:06+01:00
log3383064b27cc8ad7aa997f6504d627af1fa8c960
treec2d7ff26bdfca9587860800e3790e731d6f358b2
parent78e6f9c44c054b922ed1eaafcc4534edcf2dc9ba

x64: implement airSlice


1 files changed, 15 insertions(+), 4 deletions(-)

src/arch/x86_64/CodeGen.zig+15-4
......@@ -1071,10 +1071,21 @@ fn airMax(self: *Self, inst: Air.Inst.Index) !void {
10711071fn airSlice(self: *Self, inst: Air.Inst.Index) !void {
10721072 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
10731073 const bin_op = self.air.extraData(Air.Bin, ty_pl.payload).data;
1074 const result: MCValue = if (self.liveness.isUnused(inst))
1075 .dead
1076 else
1077 return self.fail("TODO implement slice for {}", .{self.target.cpu.arch});
1074
1075 if (self.liveness.isUnused(inst)) {
1076 return self.finishAir(inst, .dead, .{ bin_op.lhs, bin_op.rhs, .none });
1077 }
1078
1079 const ptr = try self.resolveInst(bin_op.lhs);
1080 const ptr_ty = self.air.typeOf(bin_op.lhs);
1081 const len = try self.resolveInst(bin_op.rhs);
1082 const len_ty = self.air.typeOf(bin_op.rhs);
1083
1084 const stack_offset = @intCast(i32, try self.allocMem(inst, 16, 16));
1085 try self.genSetStack(ptr_ty, stack_offset + 8, ptr);
1086 try self.genSetStack(len_ty, stack_offset, len);
1087 const result = MCValue{ .stack_offset = stack_offset };
1088
10781089 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
10791090}
10801091