| ... | @@ -329,6 +329,11 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -329,6 +329,11 @@ fn _start() callconv(.Naked) noreturn { |
| 329 | \\ jsr (%%pc, %%a0) | 329 | \\ jsr (%%pc, %%a0) |
| 330 | , | 330 | , |
| 331 | .mips, .mipsel => | 331 | .mips, .mipsel => |
| | 332 | \\ bal 1f |
| | 333 | \\ .gpword . |
| | 334 | \\ 1: |
| | 335 | \\ lw $gp, 0($ra) |
| | 336 | \\ subu $gp, $ra, $gp |
| 332 | \\ move $fp, $0 | 337 | \\ move $fp, $0 |
| 333 | \\ move $ra, $0 | 338 | \\ move $ra, $0 |
| 334 | \\ move $a0, $sp | 339 | \\ move $a0, $sp |
| ... | @@ -336,6 +341,14 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -336,6 +341,14 @@ fn _start() callconv(.Naked) noreturn { |
| 336 | \\ j %[posixCallMainAndExit] | 341 | \\ j %[posixCallMainAndExit] |
| 337 | , | 342 | , |
| 338 | .mips64, .mips64el => | 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 | \\ move $fp, $0 | 352 | \\ move $fp, $0 |
| 340 | \\ move $ra, $0 | 353 | \\ move $ra, $0 |
| 341 | \\ move $a0, $sp | 354 | \\ move $a0, $sp |