mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
rt: improve mips backend
This commit is contained in:
parent
99b156e78a
commit
fdf48a7b52
@ -189,6 +189,7 @@ fn initialize_call_frame(regs: &mut Registers, fptr: *c_void, arg: *c_void, sp:
|
||||
|
||||
regs[4] = arg as uint;
|
||||
regs[29] = sp as uint;
|
||||
regs[25] = fptr as uint;
|
||||
regs[31] = fptr as uint;
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ pub fn default_configuration(sess: Session, +argv0: ~str, input: input) ->
|
||||
abi::X86 => (~"little",~"x86",~"32"),
|
||||
abi::X86_64 => (~"little",~"x86_64",~"64"),
|
||||
abi::Arm => (~"little",~"arm",~"32"),
|
||||
abi::Mips => (~"little",~"arm",~"32")
|
||||
abi::Mips => (~"big",~"mips",~"32")
|
||||
};
|
||||
|
||||
return ~[ // Target bindings.
|
||||
|
@ -51,7 +51,6 @@ swap_registers:
|
||||
lw $2, 2 * 4($5)
|
||||
lw $3, 3 * 4($5)
|
||||
lw $4, 4 * 4($5)
|
||||
lw $5, 5 * 4($5)
|
||||
lw $6, 6 * 4($5)
|
||||
lw $7, 7 * 4($5)
|
||||
|
||||
@ -82,6 +81,8 @@ swap_registers:
|
||||
lw $30, 30 * 4($5)
|
||||
lw $31, 31 * 4($5)
|
||||
|
||||
lw $5, 5 * 4($5)
|
||||
|
||||
jr $31
|
||||
nop
|
||||
.end swap_registers
|
||||
|
@ -5,30 +5,39 @@
|
||||
|
||||
.text
|
||||
|
||||
.align 2
|
||||
.globl __morestack
|
||||
.hidden __morestack
|
||||
.align 2
|
||||
.cfi_sections .eh_frame_entry
|
||||
.cfi_startproc
|
||||
.set nomips16
|
||||
.ent __morestack
|
||||
__morestack:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
move $7, $29
|
||||
|
||||
addiu $29, $29, -8
|
||||
sw $31, 4($29)
|
||||
sw $30, 0($29)
|
||||
|
||||
.cfi_def_cfa_offset 8
|
||||
.cfi_offset 31, -4
|
||||
.cfi_offset 30, -8
|
||||
|
||||
move $30, $29
|
||||
.cfi_def_cfa_register 30
|
||||
|
||||
move $29, $6
|
||||
|
||||
sw $7, 0($29)
|
||||
sw $31, -4($29)
|
||||
|
||||
addiu $29, $29, -24
|
||||
move $25, $5
|
||||
jalr $25
|
||||
nop
|
||||
addiu $29, $29, 24
|
||||
move $29, $30
|
||||
|
||||
lw $31, -4($29)
|
||||
lw $7, 0($29)
|
||||
lw $30, 0($29)
|
||||
lw $31, 4($29)
|
||||
addiu $29, $29, 8
|
||||
|
||||
move $29, $7
|
||||
jr $31
|
||||
nop
|
||||
.end __morestack
|
||||
.cfi_endproc
|
||||
|
@ -40,6 +40,7 @@ void context::call(void *f, void *arg, void *stack)
|
||||
|
||||
regs.data[4] = (uint32_t)arg;
|
||||
regs.data[29] = (uint32_t)sp;
|
||||
regs.data[25] = (uint32_t)f;
|
||||
regs.data[31] = (uint32_t)f;
|
||||
|
||||
// Last base pointer on the stack should be 0
|
||||
|
@ -41,6 +41,9 @@ rust_thread::start() {
|
||||
#if defined(__WIN32__)
|
||||
thread = CreateThread(NULL, stack_sz, rust_thread_start, this, 0, NULL);
|
||||
#else
|
||||
if (stack_sz < PTHREAD_STACK_MIN) {
|
||||
stack_sz = PTHREAD_STACK_MIN;
|
||||
}
|
||||
pthread_attr_t attr;
|
||||
CHECKED(pthread_attr_init(&attr));
|
||||
CHECKED(pthread_attr_setstacksize(&attr, stack_sz));
|
||||
|
Loading…
Reference in New Issue
Block a user