| ... | ... | @@ -340,16 +340,15 @@ fn gen(self: *Self) !void { |
| 340 | 340 | if (cc != .Naked) { |
| 341 | 341 | // TODO Finish function prologue and epilogue for sparcv9. |
| 342 | 342 | |
| 343 | | // TODO Backpatch stack offset |
| 344 | | // save %sp, -176, %sp |
| 345 | | _ = try self.addInst(.{ |
| 343 | // save %sp, stack_save_area, %sp |
| 344 | const save_inst = try self.addInst(.{ |
| 346 | 345 | .tag = .save, |
| 347 | 346 | .data = .{ |
| 348 | 347 | .arithmetic_3op = .{ |
| 349 | 348 | .is_imm = true, |
| 350 | 349 | .rd = .sp, |
| 351 | 350 | .rs1 = .sp, |
| 352 | | .rs2_or_imm = .{ .imm = -176 }, |
| 351 | .rs2_or_imm = .{ .imm = -abi.stack_save_area }, |
| 353 | 352 | }, |
| 354 | 353 | }, |
| 355 | 354 | }); |
| ... | ... | @@ -382,6 +381,28 @@ fn gen(self: *Self) !void { |
| 382 | 381 | return self.fail("TODO add branches in sparcv9", .{}); |
| 383 | 382 | } |
| 384 | 383 | |
| 384 | // Backpatch stack offset |
| 385 | const total_stack_size = self.max_end_stack + abi.stack_save_area; // TODO + self.saved_regs_stack_space; |
| 386 | const stack_size = mem.alignForwardGeneric(u32, total_stack_size, self.stack_align); |
| 387 | if (math.cast(i13, stack_size)) |size| { |
| 388 | self.mir_instructions.set(save_inst, .{ |
| 389 | .tag = .save, |
| 390 | .data = .{ |
| 391 | .arithmetic_3op = .{ |
| 392 | .is_imm = true, |
| 393 | .rd = .sp, |
| 394 | .rs1 = .sp, |
| 395 | .rs2_or_imm = .{ .imm = -size }, |
| 396 | }, |
| 397 | }, |
| 398 | }); |
| 399 | } else |_| { |
| 400 | // TODO for large stacks, replace the prologue with: |
| 401 | // setx stack_size, %g1 |
| 402 | // save %sp, %g1, %sp |
| 403 | return self.fail("TODO SPARCv9: allow larger stacks", .{}); |
| 404 | } |
| 405 | |
| 385 | 406 | // return %i7 + 8 |
| 386 | 407 | _ = try self.addInst(.{ |
| 387 | 408 | .tag = .@"return", |
| ... | ... | @@ -1367,8 +1388,8 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void |
| 1367 | 1388 | try self.genLoad(reg, reg, i13, 0, ty.abiSize(self.target.*)); |
| 1368 | 1389 | }, |
| 1369 | 1390 | .stack_offset => |off| { |
| 1370 | | const biased_offset = off + abi.stack_bias; |
| 1371 | | const simm13 = math.cast(i13, biased_offset) catch |
| 1391 | const real_offset = off + abi.stack_bias + abi.stack_save_area; |
| 1392 | const simm13 = math.cast(i13, real_offset) catch |
| 1372 | 1393 | return self.fail("TODO larger stack offsets", .{}); |
| 1373 | 1394 | try self.genLoad(reg, .sp, i13, simm13, ty.abiSize(self.target.*)); |
| 1374 | 1395 | }, |
| ... | ... | @@ -1399,8 +1420,8 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 1399 | 1420 | return self.genSetStack(ty, stack_offset, MCValue{ .register = reg }); |
| 1400 | 1421 | }, |
| 1401 | 1422 | .register => |reg| { |
| 1402 | | const biased_offset = stack_offset + abi.stack_bias; |
| 1403 | | const simm13 = math.cast(i13, biased_offset) catch |
| 1423 | const real_offset = stack_offset + abi.stack_bias + abi.stack_save_area; |
| 1424 | const simm13 = math.cast(i13, real_offset) catch |
| 1404 | 1425 | return self.fail("TODO larger stack offsets", .{}); |
| 1405 | 1426 | return self.genStore(reg, .sp, i13, simm13, abi_size); |
| 1406 | 1427 | }, |