authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-07-23 21:33:30+07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-09-14 16:58:13-07:00
loged546a7aada0b7f54ea37693c47a39064e1cc1b2
tree42c618155d085d304d41ef0cbe4b1f92fe55349a
parent0910cb6fcb889b82d9d10d28f800525a85ad6d91

stage2: sparc64: Add placeholder for some Air instructions

airAddSat airSubSat airMulSat airShlSat airUnaryMath airPopcount airPrefetch airPtrElemVal airOptionalPayload airOptionalPayloadPtr airOptionalPayloadPtrSet

1 files changed, 81 insertions(+), 11 deletions(-)

src/arch/sparc64/CodeGen.zig+81-11
......@@ -514,10 +514,10 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
514514 .bit_or => try self.airBinOp(inst, .bit_or),
515515 .xor => try self.airBinOp(inst, .xor),
516516
517 .add_sat => @panic("TODO try self.airAddSat(inst)"),
518 .sub_sat => @panic("TODO try self.airSubSat(inst)"),
519 .mul_sat => @panic("TODO try self.airMulSat(inst)"),
520 .shl_sat => @panic("TODO try self.airShlSat(inst)"),
517 .add_sat => try self.airAddSat(inst),
518 .sub_sat => try self.airSubSat(inst),
519 .mul_sat => try self.airMulSat(inst),
520 .shl_sat => try self.airShlSat(inst),
521521 .min => @panic("TODO try self.airMin(inst)"),
522522 .max => @panic("TODO try self.airMax(inst)"),
523523 .rem => try self.airRem(inst),
......@@ -539,7 +539,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
539539 .round,
540540 .trunc_float,
541541 .neg,
542 => @panic("TODO try self.airUnaryMath(inst)"),
542 => try self.airUnaryMath(inst),
543543
544544 .add_with_overflow => try self.airAddSubWithOverflow(inst),
545545 .sub_with_overflow => try self.airAddSubWithOverflow(inst),
......@@ -605,7 +605,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
605605 .get_union_tag => @panic("TODO try self.airGetUnionTag(inst)"),
606606 .clz => try self.airClz(inst),
607607 .ctz => try self.airCtz(inst),
608 .popcount => @panic("TODO try self.airPopcount(inst)"),
608 .popcount => try self.airPopcount(inst),
609609 .byte_swap => @panic("TODO try self.airByteSwap(inst)"),
610610 .bit_reverse => @panic("TODO try self.airBitReverse(inst)"),
611611 .tag_name => try self.airTagName(inst),
......@@ -616,7 +616,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
616616 .reduce => @panic("TODO try self.airReduce(inst)"),
617617 .aggregate_init => try self.airAggregateInit(inst),
618618 .union_init => @panic("TODO try self.airUnionInit(inst)"),
619 .prefetch => @panic("TODO try self.airPrefetch(inst)"),
619 .prefetch => try self.airPrefetch(inst),
620620 .mul_add => @panic("TODO try self.airMulAdd(inst)"),
621621
622622 .@"try" => try self.airTry(inst),
......@@ -661,16 +661,16 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
661661 .array_elem_val => try self.airArrayElemVal(inst),
662662 .slice_elem_val => try self.airSliceElemVal(inst),
663663 .slice_elem_ptr => @panic("TODO try self.airSliceElemPtr(inst)"),
664 .ptr_elem_val => @panic("TODO try self.airPtrElemVal(inst)"),
664 .ptr_elem_val => try self.airPtrElemVal(inst),
665665 .ptr_elem_ptr => try self.airPtrElemPtr(inst),
666666
667667 .constant => unreachable, // excluded from function bodies
668668 .const_ty => unreachable, // excluded from function bodies
669669 .unreach => self.finishAirBookkeeping(),
670670
671 .optional_payload => @panic("TODO try self.airOptionalPayload(inst)"),
672 .optional_payload_ptr => @panic("TODO try self.airOptionalPayloadPtr(inst)"),
673 .optional_payload_ptr_set => @panic("TODO try self.airOptionalPayloadPtrSet(inst)"),
671 .optional_payload => try self.airOptionalPayload(inst),
672 .optional_payload_ptr => try self.airOptionalPayloadPtr(inst),
673 .optional_payload_ptr_set => try self.airOptionalPayloadPtrSet(inst),
674674 .unwrap_errunion_err => try self.airUnwrapErrErr(inst),
675675 .unwrap_errunion_payload => try self.airUnwrapErrPayload(inst),
676676 .unwrap_errunion_err_ptr => @panic("TODO try self.airUnwrapErrErrPtr(inst)"),
......@@ -725,6 +725,12 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
725725 }
726726}
727727
728fn airAddSat(self: *Self, inst: Air.Inst.Index) !void {
729 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
730 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement add_sat for {}", .{self.target.cpu.arch});
731 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
732}
733
728734fn airAddSubWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
729735 const tag = self.air.instructions.items(.tag)[inst];
730736 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
......@@ -1805,6 +1811,12 @@ fn airMod(self: *Self, inst: Air.Inst.Index) !void {
18051811 return self.finishAir(inst, .{ .register = mod_reg }, .{ bin_op.lhs, bin_op.rhs, .none });
18061812}
18071813
1814fn airMulSat(self: *Self, inst: Air.Inst.Index) !void {
1815 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1816 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement mul_sat for {}", .{self.target.cpu.arch});
1817 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
1818}
1819
18081820fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
18091821 //const tag = self.air.instructions.items(.tag)[inst];
18101822 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
......@@ -1966,6 +1978,43 @@ fn airNot(self: *Self, inst: Air.Inst.Index) !void {
19661978 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
19671979}
19681980
1981fn airOptionalPayload(self: *Self, inst: Air.Inst.Index) !void {
1982 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1983 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement .optional_payload for {}", .{self.target.cpu.arch});
1984 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
1985}
1986
1987fn airOptionalPayloadPtr(self: *Self, inst: Air.Inst.Index) !void {
1988 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1989 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement .optional_payload_ptr for {}", .{self.target.cpu.arch});
1990 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
1991}
1992
1993fn airOptionalPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {
1994 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
1995 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement .optional_payload_ptr_set for {}", .{self.target.cpu.arch});
1996 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
1997}
1998
1999fn airPopcount(self: *Self, inst: Air.Inst.Index) !void {
2000 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2001 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airPopcount for {}", .{self.target.cpu.arch});
2002 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
2003}
2004
2005fn airPrefetch(self: *Self, inst: Air.Inst.Index) !void {
2006 const prefetch = self.air.instructions.items(.data)[inst].prefetch;
2007 // TODO Emit a PREFETCH/IPREFETCH as necessary, see A.7 and A.42
2008 return self.finishAir(inst, MCValue.dead, .{ prefetch.ptr, .none, .none });
2009}
2010
2011fn airPtrElemVal(self: *Self, inst: Air.Inst.Index) !void {
2012 const is_volatile = false; // TODO
2013 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
2014 const result: MCValue = if (!is_volatile and self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement ptr_elem_val for {}", .{self.target.cpu.arch});
2015 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
2016}
2017
19692018fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {
19702019 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
19712020 const extra = self.air.extraData(Air.Bin, ty_pl.payload).data;
......@@ -2020,6 +2069,12 @@ fn airRetPtr(self: *Self, inst: Air.Inst.Index) !void {
20202069 return self.finishAir(inst, .{ .ptr_stack_offset = stack_offset }, .{ .none, .none, .none });
20212070}
20222071
2072fn airShlSat(self: *Self, inst: Air.Inst.Index) !void {
2073 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
2074 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement shl_sat for {}", .{self.target.cpu.arch});
2075 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
2076}
2077
20232078fn airShlWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
20242079 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
20252080 const extra = self.air.extraData(Air.Bin, ty_pl.payload).data;
......@@ -2281,6 +2336,12 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
22812336 return self.finishAir(inst, result, .{ extra.struct_operand, .none, .none });
22822337}
22832338
2339fn airSubSat(self: *Self, inst: Air.Inst.Index) !void {
2340 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
2341 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement sub_sat for {}", .{self.target.cpu.arch});
2342 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
2343}
2344
22842345fn airSwitch(self: *Self, inst: Air.Inst.Index) !void {
22852346 _ = inst;
22862347 return self.fail("TODO implement switch for {}", .{self.target.cpu.arch});
......@@ -2314,6 +2375,15 @@ fn airTry(self: *Self, inst: Air.Inst.Index) !void {
23142375 return self.finishAir(inst, result, .{ pl_op.operand, .none, .none });
23152376}
23162377
2378fn airUnaryMath(self: *Self, inst: Air.Inst.Index) !void {
2379 const un_op = self.air.instructions.items(.data)[inst].un_op;
2380 const result: MCValue = if (self.liveness.isUnused(inst))
2381 .dead
2382 else
2383 return self.fail("TODO implement airUnaryMath for {}", .{self.target.cpu.arch});
2384 return self.finishAir(inst, result, .{ un_op, .none, .none });
2385}
2386
23172387fn airUnwrapErrErr(self: *Self, inst: Air.Inst.Index) !void {
23182388 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
23192389 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {