| ... | ... | @@ -352,7 +352,7 @@ fn gen(self: *Self) !void { |
| 352 | 352 | if (cc != .Naked) { |
| 353 | 353 | // TODO Finish function prologue and epilogue for sparc64. |
| 354 | 354 | |
| 355 | | // save %sp, stack_save_area, %sp |
| 355 | // save %sp, stack_reserved_area, %sp |
| 356 | 356 | const save_inst = try self.addInst(.{ |
| 357 | 357 | .tag = .save, |
| 358 | 358 | .data = .{ |
| ... | ... | @@ -360,7 +360,7 @@ fn gen(self: *Self) !void { |
| 360 | 360 | .is_imm = true, |
| 361 | 361 | .rd = .sp, |
| 362 | 362 | .rs1 = .sp, |
| 363 | | .rs2_or_imm = .{ .imm = -abi.stack_save_area }, |
| 363 | .rs2_or_imm = .{ .imm = -abi.stack_reserved_area }, |
| 364 | 364 | }, |
| 365 | 365 | }, |
| 366 | 366 | }); |
| ... | ... | @@ -407,7 +407,7 @@ fn gen(self: *Self) !void { |
| 407 | 407 | } |
| 408 | 408 | |
| 409 | 409 | // Backpatch stack offset |
| 410 | | const total_stack_size = self.max_end_stack + abi.stack_save_area; // TODO + self.saved_regs_stack_space; |
| 410 | const total_stack_size = self.max_end_stack + abi.stack_reserved_area; |
| 411 | 411 | const stack_size = mem.alignForwardGeneric(u32, total_stack_size, self.stack_align); |
| 412 | 412 | if (math.cast(i13, stack_size)) |size| { |
| 413 | 413 | self.mir_instructions.set(save_inst, .{ |
| ... | ... | @@ -1677,7 +1677,7 @@ fn binOp( |
| 1677 | 1677 | |
| 1678 | 1678 | const mir_tag: Mir.Inst.Tag = switch (tag) { |
| 1679 | 1679 | .add => .add, |
| 1680 | | .cmp_eq => .subcc, |
| 1680 | .cmp_eq => .cmp, |
| 1681 | 1681 | else => unreachable, |
| 1682 | 1682 | }; |
| 1683 | 1683 | |
| ... | ... | @@ -1891,7 +1891,7 @@ fn binOpImmediate( |
| 1891 | 1891 | .is_imm = true, |
| 1892 | 1892 | .rd = dest_reg, |
| 1893 | 1893 | .rs1 = lhs_reg, |
| 1894 | | .rs2_or_imm = .{ .imm = @intCast(i13, rhs.immediate) }, |
| 1894 | .rs2_or_imm = .{ .imm = @intCast(u12, rhs.immediate) }, |
| 1895 | 1895 | }, |
| 1896 | 1896 | }, |
| 1897 | 1897 | .sllx => .{ |
| ... | ... | @@ -1903,6 +1903,13 @@ fn binOpImmediate( |
| 1903 | 1903 | .rs2_or_imm = .{ .imm = @intCast(u6, rhs.immediate) }, |
| 1904 | 1904 | }, |
| 1905 | 1905 | }, |
| 1906 | .cmp => .{ |
| 1907 | .arithmetic_2op = .{ |
| 1908 | .is_imm = true, |
| 1909 | .rs1 = lhs_reg, |
| 1910 | .rs2_or_imm = .{ .imm = @intCast(u12, rhs.immediate) }, |
| 1911 | }, |
| 1912 | }, |
| 1906 | 1913 | else => unreachable, |
| 1907 | 1914 | }; |
| 1908 | 1915 | |
| ... | ... | @@ -2012,6 +2019,13 @@ fn binOpRegister( |
| 2012 | 2019 | .rs2_or_imm = .{ .rs2 = rhs_reg }, |
| 2013 | 2020 | }, |
| 2014 | 2021 | }, |
| 2022 | .cmp => .{ |
| 2023 | .arithmetic_2op = .{ |
| 2024 | .is_imm = false, |
| 2025 | .rs1 = lhs_reg, |
| 2026 | .rs2_or_imm = .{ .rs2 = rhs_reg }, |
| 2027 | }, |
| 2028 | }, |
| 2015 | 2029 | else => unreachable, |
| 2016 | 2030 | }; |
| 2017 | 2031 | |
| ... | ... | @@ -2285,7 +2299,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 2285 | 2299 | return self.genSetReg(ty, reg, .{ .immediate = 0xaaaaaaaaaaaaaaaa }); |
| 2286 | 2300 | }, |
| 2287 | 2301 | .ptr_stack_offset => |off| { |
| 2288 | | const simm13 = math.cast(u12, off) catch |
| 2302 | const simm13 = math.cast(u12, off + abi.stack_bias + abi.stack_reserved_area) catch |
| 2289 | 2303 | return self.fail("TODO larger stack offsets", .{}); |
| 2290 | 2304 | |
| 2291 | 2305 | _ = try self.addInst(.{ |
| ... | ... | @@ -2303,12 +2317,11 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 2303 | 2317 | .immediate => |x| { |
| 2304 | 2318 | if (x <= math.maxInt(u12)) { |
| 2305 | 2319 | _ = try self.addInst(.{ |
| 2306 | | .tag = .@"or", |
| 2320 | .tag = .mov, |
| 2307 | 2321 | .data = .{ |
| 2308 | | .arithmetic_3op = .{ |
| 2322 | .arithmetic_2op = .{ |
| 2309 | 2323 | .is_imm = true, |
| 2310 | | .rd = reg, |
| 2311 | | .rs1 = .g0, |
| 2324 | .rs1 = reg, |
| 2312 | 2325 | .rs2_or_imm = .{ .imm = @truncate(u12, x) }, |
| 2313 | 2326 | }, |
| 2314 | 2327 | }, |
| ... | ... | @@ -2400,14 +2413,12 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 2400 | 2413 | if (src_reg.id() == reg.id()) |
| 2401 | 2414 | return; |
| 2402 | 2415 | |
| 2403 | | // or %g0, src, dst (aka mov src, dst) |
| 2404 | 2416 | _ = try self.addInst(.{ |
| 2405 | | .tag = .@"or", |
| 2417 | .tag = .mov, |
| 2406 | 2418 | .data = .{ |
| 2407 | | .arithmetic_3op = .{ |
| 2419 | .arithmetic_2op = .{ |
| 2408 | 2420 | .is_imm = false, |
| 2409 | | .rd = reg, |
| 2410 | | .rs1 = .g0, |
| 2421 | .rs1 = reg, |
| 2411 | 2422 | .rs2_or_imm = .{ .rs2 = src_reg }, |
| 2412 | 2423 | }, |
| 2413 | 2424 | }, |
| ... | ... | @@ -2420,7 +2431,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 2420 | 2431 | try self.genLoad(reg, reg, i13, 0, ty.abiSize(self.target.*)); |
| 2421 | 2432 | }, |
| 2422 | 2433 | .stack_offset => |off| { |
| 2423 | | const real_offset = off + abi.stack_bias + abi.stack_save_area; |
| 2434 | const real_offset = off + abi.stack_bias + abi.stack_reserved_area; |
| 2424 | 2435 | const simm13 = math.cast(i13, real_offset) catch |
| 2425 | 2436 | return self.fail("TODO larger stack offsets", .{}); |
| 2426 | 2437 | try self.genLoad(reg, .sp, i13, simm13, ty.abiSize(self.target.*)); |
| ... | ... | @@ -2454,7 +2465,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 2454 | 2465 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }); |
| 2455 | 2466 | }, |
| 2456 | 2467 | .register => |reg| { |
| 2457 | | const real_offset = stack_offset + abi.stack_bias + abi.stack_save_area; |
| 2468 | const real_offset = stack_offset + abi.stack_bias + abi.stack_reserved_area; |
| 2458 | 2469 | const simm13 = math.cast(i13, real_offset) catch |
| 2459 | 2470 | return self.fail("TODO larger stack offsets", .{}); |
| 2460 | 2471 | return self.genStore(reg, .sp, i13, simm13, abi_size); |
| ... | ... | @@ -2625,12 +2636,11 @@ fn isErr(self: *Self, ty: Type, operand: MCValue) !MCValue { |
| 2625 | 2636 | }; |
| 2626 | 2637 | |
| 2627 | 2638 | _ = try self.addInst(.{ |
| 2628 | | .tag = .subcc, |
| 2629 | | .data = .{ .arithmetic_3op = .{ |
| 2639 | .tag = .cmp, |
| 2640 | .data = .{ .arithmetic_2op = .{ |
| 2630 | 2641 | .is_imm = true, |
| 2631 | 2642 | .rs1 = reg_mcv.register, |
| 2632 | 2643 | .rs2_or_imm = .{ .imm = 0 }, |
| 2633 | | .rd = .g0, |
| 2634 | 2644 | } }, |
| 2635 | 2645 | }); |
| 2636 | 2646 | |
| ... | ... | @@ -3163,12 +3173,11 @@ fn truncRegister( |
| 3163 | 3173 | }, |
| 3164 | 3174 | 64 => { |
| 3165 | 3175 | _ = try self.addInst(.{ |
| 3166 | | .tag = .@"or", |
| 3176 | .tag = .mov, |
| 3167 | 3177 | .data = .{ |
| 3168 | | .arithmetic_3op = .{ |
| 3178 | .arithmetic_2op = .{ |
| 3169 | 3179 | .is_imm = true, |
| 3170 | | .rd = dest_reg, |
| 3171 | | .rs1 = .g0, |
| 3180 | .rs1 = dest_reg, |
| 3172 | 3181 | .rs2_or_imm = .{ .rs2 = operand_reg }, |
| 3173 | 3182 | }, |
| 3174 | 3183 | }, |