| ... | ... | @@ -329,6 +329,11 @@ fn _start() callconv(.Naked) noreturn { |
| 329 | 329 | \\ jsr (%%pc, %%a0) |
| 330 | 330 | , |
| 331 | 331 | .mips, .mipsel => |
| 332 | \\ bal 1f |
| 333 | \\ .gpword . |
| 334 | \\ 1: |
| 335 | \\ lw $gp, 0($ra) |
| 336 | \\ subu $gp, $ra, $gp |
| 332 | 337 | \\ move $fp, $0 |
| 333 | 338 | \\ move $ra, $0 |
| 334 | 339 | \\ move $a0, $sp |
| ... | ... | @@ -336,6 +341,14 @@ fn _start() callconv(.Naked) noreturn { |
| 336 | 341 | \\ j %[posixCallMainAndExit] |
| 337 | 342 | , |
| 338 | 343 | .mips64, .mips64el => |
| 344 | \\ bal 1f |
| 345 | \\ .gpdword . |
| 346 | \\ 1: |
| 347 | // The `gp` register on MIPS serves a similar purpose to `r2` (ToC pointer) on PPC64. |
| 348 | // We need to set it up in order for dynamically-linked / position-independent code to |
| 349 | // work. |
| 350 | \\ ld $gp, 0($ra) |
| 351 | \\ dsubu $gp, $ra, $gp |
| 339 | 352 | \\ move $fp, $0 |
| 340 | 353 | \\ move $ra, $0 |
| 341 | 354 | \\ move $a0, $sp |