From: Thiemo S. <th...@ne...> - 2005-05-07 04:59:03
|
The appended patch adds support for 64bit "long long" integers for mips and mipsel. It uses now the first two lisp argument registers for the C return value in order to keep it away from the pa flag. The patch also adds further fixes to the branch emulation (the computation of jump targets was broken there), an alignment issue in fun_end_breakpoint_guts, and an accidentially introduced endless loop in fun_end_breakpoint_trap (The code there does now thesame as the CMUCL version did). Tested only for big endianness, but for both the normal build which doesn't use long long values, and for a build via EXTRA_CFLAGS=$(getconf LFS_CFLAGS) sh make.sh which uses the correct 64bit LFS values used by mips glibc. Thiemo Index: src/compiler/mips/c-call.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/c-call.lisp,v retrieving revision 1.3 diff -u -p -r1.3 c-call.lisp --- src/compiler/mips/c-call.lisp 1 Nov 2004 12:36:07 -0000 1.3 +++ src/compiler/mips/c-call.lisp 7 May 2005 04:30:17 -0000 @@ -90,28 +90,25 @@ (defstruct result-state (num-results 0)) -(defun offset-for-result (n) - (+ n 2) - #+nil - (if (= n 0) - cfunc-offset - (+ n 2))) +(defun result-reg-offset (slot) + (ecase slot + (0 a0-offset) + (1 a1-offset))) (define-alien-type-method (integer :result-tn) (type state) (let ((num-results (result-state-num-results state))) (setf (result-state-num-results state) (1+ num-results)) - (multiple-value-bind - (ptype reg-sc) + (multiple-value-bind (ptype reg-sc) (if (alien-integer-type-signed type) (values 'signed-byte-32 'signed-reg) (values 'unsigned-byte-32 'unsigned-reg)) - (my-make-wired-tn ptype reg-sc (offset-for-result num-results))))) + (my-make-wired-tn ptype reg-sc (result-reg-offset num-results))))) (define-alien-type-method (system-area-pointer :result-tn) (type state) (declare (ignore type)) (let ((num-results (result-state-num-results state))) (setf (result-state-num-results state) (1+ num-results)) - (my-make-wired-tn 'system-area-pointer 'sap-reg (offset-for-result num-results)))) + (my-make-wired-tn 'system-area-pointer 'sap-reg (result-reg-offset num-results)))) ;;; FIXME: do these still work? -- CSR, 2002-08-28 (define-alien-type-method (double-float :result-tn) (type state) @@ -127,9 +124,12 @@ (my-make-wired-tn 'single-float 'single-reg (* num-results 2)))) (define-alien-type-method (values :result-tn) (type state) - (mapcar #'(lambda (type) - (invoke-alien-type-method :result-tn type state)) - (alien-values-type-values type))) + (let ((values (alien-values-type-values type))) + (when (> (length values) 2) + (error "Too many result values from c-call.")) + (mapcar #'(lambda (type) + (invoke-alien-type-method :result-tn type state)) + values))) (!def-vm-support-routine make-call-out-tns (type) (let ((arg-state (make-arg-state))) @@ -143,6 +143,88 @@ (alien-fun-type-result-type type) (make-result-state)))))) +(deftransform %alien-funcall ((function type &rest args)) + (aver (sb!c::constant-lvar-p type)) + (let* ((type (sb!c::lvar-value type)) + (env (sb!kernel:make-null-lexenv)) + (arg-types (alien-fun-type-arg-types type)) + (result-type (alien-fun-type-result-type type))) + (aver (= (length arg-types) (length args))) + ;; We need to do something special for 64-bit integer arguments + ;; and results. + (if (or (some #'(lambda (type) + (and (alien-integer-type-p type) + (> (sb!alien::alien-integer-type-bits type) 32))) + arg-types) + (and (alien-integer-type-p result-type) + (> (sb!alien::alien-integer-type-bits result-type) 32))) + (collect ((new-args) (lambda-vars) (new-arg-types)) + (dolist (type arg-types) + (let ((arg (gensym))) + (lambda-vars arg) + (cond ((and (alien-integer-type-p type) + (> (sb!alien::alien-integer-type-bits type) 32)) + ;; 64-bit long long types are stored in + ;; consecutive locations, endian word order, + ;; aligned to 8 bytes. + (if (oddp (length (new-args))) + (new-args nil)) + #!-little-endian + (progn (new-args `(ash ,arg -32)) + (new-args `(logand ,arg #xffffffff)) + (if (oddp (length (new-arg-types))) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + (if (alien-integer-type-signed type) + (new-arg-types (parse-alien-type '(signed 32) env)) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + #!+little-endian + (progn (new-args `(logand ,arg #xffffffff)) + (new-args `(ash ,arg -32)) + (if (oddp (length (new-arg-types))) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + (new-arg-types (parse-alien-type '(unsigned 32) env)) + (if (alien-integer-type-signed type) + (new-arg-types (parse-alien-type '(signed 32) env)) + (new-arg-types (parse-alien-type '(unsigned 32) env))))) + (t + (new-args arg) + (new-arg-types type))))) + (cond ((and (alien-integer-type-p result-type) + (> (sb!alien::alien-integer-type-bits result-type) 32)) + (let ((new-result-type + (let ((sb!alien::*values-type-okay* t)) + (parse-alien-type + (if (alien-integer-type-signed result-type) + #!-little-endian + '(values (signed 32) (unsigned 32)) + #!+little-endian + '(values (unsigned 32) (signed 32)) + '(values (unsigned 32) (unsigned 32))) + env)))) + `(lambda (function type ,@(lambda-vars)) + (declare (ignore type)) + (multiple-value-bind + #!-little-endian + (high low) + #!+little-endian + (low high) + (%alien-funcall function + ',(make-alien-fun-type + :arg-types (new-arg-types) + :result-type new-result-type) + ,@(new-args)) + (logior low (ash high 32)))))) + (t + `(lambda (function type ,@(lambda-vars)) + (declare (ignore type)) + (%alien-funcall function + ',(make-alien-fun-type + :arg-types (new-arg-types) + :result-type result-type) + ,@(new-args)))))) + (sb!c::give-up-ir1-transform)))) + (define-vop (foreign-symbol-address) (:translate foreign-symbol-address) (:policy :fast-safe) Index: src/runtime/mips-arch.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-arch.c,v retrieving revision 1.8 diff -u -p -r1.8 mips-arch.c --- src/runtime/mips-arch.c 30 Apr 2005 09:40:41 -0000 1.8 +++ src/runtime/mips-arch.c 7 May 2005 04:30:17 -0000 @@ -44,30 +44,43 @@ emulate_branch(os_context_t *context, un unsigned int opcode = inst >> 26; unsigned int r1 = (inst >> 21) & 0x1f; unsigned int r2 = (inst >> 16) & 0x1f; - unsigned int bdisp = ((inst&(1<<15)) ? inst | (-1 << 16) : inst&0x7fff) << 2; - unsigned int jdisp = (inst&0x3ffffff) << 2; - unsigned int disp = 0; + unsigned int r3 = (inst >> 11) & 0x1f; + unsigned int disp = ((inst&(1<<15)) ? inst | (-1 << 16) : inst&0x7fff) << 2; + unsigned int jtgt = (*os_context_pc_addr(context) & ~0x0fffffff) | (inst&0x3ffffff) << 2; + unsigned int tgt = *os_context_pc_addr(context); switch(opcode) { + case 0x0: /* jr, jalr */ + switch(inst & 0x3f) { + case 0x08: /* jr */ + tgt = *os_context_register_addr(context, r1); + break; + case 0x09: /* jalr */ + tgt = *os_context_register_addr(context, r1); + *os_context_register_addr(context, r3) + = *os_context_pc_addr(context) + 4; + break; + } + break; case 0x1: /* bltz, bgez, bltzal, bgezal */ switch((inst >> 16) & 0x1f) { case 0x00: /* bltz */ if(*os_context_register_addr(context, r1) < 0) - disp = bdisp; + tgt += disp; break; case 0x01: /* bgez */ if(*os_context_register_addr(context, r1) >= 0) - disp = bdisp; + tgt += disp; break; case 0x10: /* bltzal */ if(*os_context_register_addr(context, r1) < 0) - disp = bdisp; + tgt += disp; *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; case 0x11: /* bgezal */ if(*os_context_register_addr(context, r1) >= 0) - disp = bdisp; + tgt += disp; *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; @@ -76,33 +89,33 @@ emulate_branch(os_context_t *context, un case 0x4: /* beq */ if(*os_context_register_addr(context, r1) == *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x5: /* bne */ if(*os_context_register_addr(context, r1) != *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x6: /* blez */ if(*os_context_register_addr(context, r1) <= *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x7: /* bgtz */ if(*os_context_register_addr(context, r1) > *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x2: /* j */ - disp = jdisp; + tgt = jtgt; break; case 0x3: /* jal */ - disp = jdisp; + tgt = jtgt; *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; } - return *os_context_pc_addr(context) + disp; + return tgt; } void @@ -121,9 +134,6 @@ arch_skip_instruction(os_context_t *cont = emulate_branch(context, *os_context_pc_addr(context)); } else *os_context_pc_addr(context) += 4; - - os_flush_icache((os_vm_address_t)*os_context_pc_addr(context), - sizeof(unsigned int)); } unsigned char * Index: src/runtime/mips-assem.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-assem.S,v retrieving revision 1.4 diff -u -p -r1.4 mips-assem.S --- src/runtime/mips-assem.S 30 Apr 2005 09:40:41 -0000 1.4 +++ src/runtime/mips-assem.S 7 May 2005 04:30:17 -0000 @@ -176,13 +176,10 @@ lra: /* Multiple value return spot, clear stack. */ move reg_CSP, reg_OCFP - nop + nop /* Single value return spot. */ - /* Pass one return value back to C land. */ - move v0, reg_A0 # reg_CFUNC - /* Nested lisp -> C calls may have clobbered gp. */ lw gp, framesize-16(sp) @@ -208,6 +205,11 @@ lra: break 0x10 1: .set reorder + /* Pass one return value back to C land. For a 64bit value, we may + need to clobber v1 aka reg_NL4. */ + move v0, reg_A0 # reg_CFUNC + move v1, reg_A1 # reg_NL4 + /* Restore C regs */ lw ra, framesize-8(sp) lw s8, framesize-12(sp) @@ -278,16 +282,18 @@ lra: 1: .set reorder /* Into C land we go. */ move t9, reg_CFUNC jalr t9 lw gp, 8(reg_CFP) + /* Pass 64bit return value to lisp land. */ + move reg_A0, v0 # reg_CFUNC + move reg_A1, v1 # reg_NL4 + li reg_NIL, NIL /* Clear unsaved boxed descriptor regs */ - li reg_A0, 0 # t0 - li reg_A1, 0 # t1 li reg_A2, 0 # t2 li reg_A3, 0 # t3 li reg_A4, 0 # t4 @@ -339,7 +350,7 @@ lra: * The undefined-function trampoline. */ LEAF(undefined_tramp) - break 10 + break trap_Error .byte 4 .byte UNDEFINED_FUN_ERROR .byte 254 @@ -363,13 +374,14 @@ lra: /* * Function-end breakpoint magic. */ + .align 3 LEAF(fun_end_breakpoint_guts) .set noreorder - .align 3 .word RETURN_PC_HEADER_WIDETAG - + b multiple_value_return nop + .set reorder move reg_OCFP, reg_CSP addu reg_CSP, 4 @@ -384,9 +396,6 @@ multiple_value_return: FEXPORT(fun_end_breakpoint_trap) break trap_FunEndBreakpoint -1: b 1b + b multiple_value_return - nop - EXPORT(fun_end_breakpoint_end) - .set reorder END(fun_end_breakpoint_guts) |
From: Thiemo S. <th...@ne...> - 2005-05-09 16:27:01
|
Thiemo Seufer wrote: > The appended patch adds support for 64bit "long long" integers for mips > and mipsel. It uses now the first two lisp argument registers for the > C return value in order to keep it away from the pa flag. > > The patch also adds further fixes to the branch emulation (the > computation of jump targets was broken there), an alignment issue in > fun_end_breakpoint_guts, and an accidentially introduced endless loop > in fun_end_breakpoint_trap (The code there does now thesame as the > CMUCL version did). > > Tested only for big endianness, but for both the normal build > which doesn't use long long values, and for a build via > > EXTRA_CFLAGS=$(getconf LFS_CFLAGS) sh make.sh > > which uses the correct 64bit LFS values used by mips glibc. Updated version which doesn't use boxed registers for C return values. Thiemo Index: src/compiler/mips/c-call.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/c-call.lisp,v retrieving revision 1.3 diff -u -p -r1.3 c-call.lisp --- src/compiler/mips/c-call.lisp 1 Nov 2004 12:36:07 -0000 1.3 +++ src/compiler/mips/c-call.lisp 9 May 2005 16:20:49 -0000 @@ -90,28 +90,25 @@ (defstruct result-state (num-results 0)) -(defun offset-for-result (n) - (+ n 2) - #+nil - (if (= n 0) - cfunc-offset - (+ n 2))) +(defun result-reg-offset (slot) + (ecase slot + (0 nl0-offset) + (1 nl1-offset))) (define-alien-type-method (integer :result-tn) (type state) (let ((num-results (result-state-num-results state))) (setf (result-state-num-results state) (1+ num-results)) - (multiple-value-bind - (ptype reg-sc) + (multiple-value-bind (ptype reg-sc) (if (alien-integer-type-signed type) (values 'signed-byte-32 'signed-reg) (values 'unsigned-byte-32 'unsigned-reg)) - (my-make-wired-tn ptype reg-sc (offset-for-result num-results))))) + (my-make-wired-tn ptype reg-sc (result-reg-offset num-results))))) (define-alien-type-method (system-area-pointer :result-tn) (type state) (declare (ignore type)) (let ((num-results (result-state-num-results state))) (setf (result-state-num-results state) (1+ num-results)) - (my-make-wired-tn 'system-area-pointer 'sap-reg (offset-for-result num-results)))) + (my-make-wired-tn 'system-area-pointer 'sap-reg (result-reg-offset num-results)))) ;;; FIXME: do these still work? -- CSR, 2002-08-28 (define-alien-type-method (double-float :result-tn) (type state) @@ -127,9 +124,12 @@ (my-make-wired-tn 'single-float 'single-reg (* num-results 2)))) (define-alien-type-method (values :result-tn) (type state) - (mapcar #'(lambda (type) - (invoke-alien-type-method :result-tn type state)) - (alien-values-type-values type))) + (let ((values (alien-values-type-values type))) + (when (> (length values) 2) + (error "Too many result values from c-call.")) + (mapcar #'(lambda (type) + (invoke-alien-type-method :result-tn type state)) + values))) (!def-vm-support-routine make-call-out-tns (type) (let ((arg-state (make-arg-state))) @@ -143,6 +143,88 @@ (alien-fun-type-result-type type) (make-result-state)))))) +(deftransform %alien-funcall ((function type &rest args)) + (aver (sb!c::constant-lvar-p type)) + (let* ((type (sb!c::lvar-value type)) + (env (sb!kernel:make-null-lexenv)) + (arg-types (alien-fun-type-arg-types type)) + (result-type (alien-fun-type-result-type type))) + (aver (= (length arg-types) (length args))) + ;; We need to do something special for 64-bit integer arguments + ;; and results. + (if (or (some #'(lambda (type) + (and (alien-integer-type-p type) + (> (sb!alien::alien-integer-type-bits type) 32))) + arg-types) + (and (alien-integer-type-p result-type) + (> (sb!alien::alien-integer-type-bits result-type) 32))) + (collect ((new-args) (lambda-vars) (new-arg-types)) + (dolist (type arg-types) + (let ((arg (gensym))) + (lambda-vars arg) + (cond ((and (alien-integer-type-p type) + (> (sb!alien::alien-integer-type-bits type) 32)) + ;; 64-bit long long types are stored in + ;; consecutive locations, endian word order, + ;; aligned to 8 bytes. + (if (oddp (length (new-args))) + (new-args nil)) + #!-little-endian + (progn (new-args `(ash ,arg -32)) + (new-args `(logand ,arg #xffffffff)) + (if (oddp (length (new-arg-types))) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + (if (alien-integer-type-signed type) + (new-arg-types (parse-alien-type '(signed 32) env)) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + #!+little-endian + (progn (new-args `(logand ,arg #xffffffff)) + (new-args `(ash ,arg -32)) + (if (oddp (length (new-arg-types))) + (new-arg-types (parse-alien-type '(unsigned 32) env))) + (new-arg-types (parse-alien-type '(unsigned 32) env)) + (if (alien-integer-type-signed type) + (new-arg-types (parse-alien-type '(signed 32) env)) + (new-arg-types (parse-alien-type '(unsigned 32) env))))) + (t + (new-args arg) + (new-arg-types type))))) + (cond ((and (alien-integer-type-p result-type) + (> (sb!alien::alien-integer-type-bits result-type) 32)) + (let ((new-result-type + (let ((sb!alien::*values-type-okay* t)) + (parse-alien-type + (if (alien-integer-type-signed result-type) + #!-little-endian + '(values (signed 32) (unsigned 32)) + #!+little-endian + '(values (unsigned 32) (signed 32)) + '(values (unsigned 32) (unsigned 32))) + env)))) + `(lambda (function type ,@(lambda-vars)) + (declare (ignore type)) + (multiple-value-bind + #!-little-endian + (high low) + #!+little-endian + (low high) + (%alien-funcall function + ',(make-alien-fun-type + :arg-types (new-arg-types) + :result-type new-result-type) + ,@(new-args)) + (logior low (ash high 32)))))) + (t + `(lambda (function type ,@(lambda-vars)) + (declare (ignore type)) + (%alien-funcall function + ',(make-alien-fun-type + :arg-types (new-arg-types) + :result-type result-type) + ,@(new-args)))))) + (sb!c::give-up-ir1-transform)))) + (define-vop (foreign-symbol-address) (:translate foreign-symbol-address) (:policy :fast-safe) Index: src/runtime/mips-arch.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-arch.c,v retrieving revision 1.8 diff -u -p -r1.8 mips-arch.c --- src/runtime/mips-arch.c 30 Apr 2005 09:40:41 -0000 1.8 +++ src/runtime/mips-arch.c 9 May 2005 16:20:49 -0000 @@ -44,30 +44,43 @@ emulate_branch(os_context_t *context, un unsigned int opcode = inst >> 26; unsigned int r1 = (inst >> 21) & 0x1f; unsigned int r2 = (inst >> 16) & 0x1f; - unsigned int bdisp = ((inst&(1<<15)) ? inst | (-1 << 16) : inst&0x7fff) << 2; - unsigned int jdisp = (inst&0x3ffffff) << 2; - unsigned int disp = 0; + unsigned int r3 = (inst >> 11) & 0x1f; + unsigned int disp = ((inst&(1<<15)) ? inst | (-1 << 16) : inst&0x7fff) << 2; + unsigned int jtgt = (*os_context_pc_addr(context) & ~0x0fffffff) | (inst&0x3ffffff) << 2; + unsigned int tgt = *os_context_pc_addr(context); switch(opcode) { + case 0x0: /* jr, jalr */ + switch(inst & 0x3f) { + case 0x08: /* jr */ + tgt = *os_context_register_addr(context, r1); + break; + case 0x09: /* jalr */ + tgt = *os_context_register_addr(context, r1); + *os_context_register_addr(context, r3) + = *os_context_pc_addr(context) + 4; + break; + } + break; case 0x1: /* bltz, bgez, bltzal, bgezal */ switch((inst >> 16) & 0x1f) { case 0x00: /* bltz */ if(*os_context_register_addr(context, r1) < 0) - disp = bdisp; + tgt += disp; break; case 0x01: /* bgez */ if(*os_context_register_addr(context, r1) >= 0) - disp = bdisp; + tgt += disp; break; case 0x10: /* bltzal */ if(*os_context_register_addr(context, r1) < 0) - disp = bdisp; + tgt += disp; *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; case 0x11: /* bgezal */ if(*os_context_register_addr(context, r1) >= 0) - disp = bdisp; + tgt += disp; *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; @@ -76,33 +89,33 @@ emulate_branch(os_context_t *context, un case 0x4: /* beq */ if(*os_context_register_addr(context, r1) == *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x5: /* bne */ if(*os_context_register_addr(context, r1) != *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x6: /* blez */ if(*os_context_register_addr(context, r1) <= *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x7: /* bgtz */ if(*os_context_register_addr(context, r1) > *os_context_register_addr(context, r2)) - disp = bdisp; + tgt += disp; break; case 0x2: /* j */ - disp = jdisp; + tgt = jtgt; break; case 0x3: /* jal */ - disp = jdisp; + tgt = jtgt; *os_context_register_addr(context, 31) = *os_context_pc_addr(context) + 4; break; } - return *os_context_pc_addr(context) + disp; + return tgt; } void @@ -121,9 +134,6 @@ arch_skip_instruction(os_context_t *cont = emulate_branch(context, *os_context_pc_addr(context)); } else *os_context_pc_addr(context) += 4; - - os_flush_icache((os_vm_address_t)*os_context_pc_addr(context), - sizeof(unsigned int)); } unsigned char * Index: src/runtime/mips-assem.S =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/mips-assem.S,v retrieving revision 1.4 diff -u -p -r1.4 mips-assem.S --- src/runtime/mips-assem.S 30 Apr 2005 09:40:41 -0000 1.4 +++ src/runtime/mips-assem.S 9 May 2005 16:20:49 -0000 @@ -176,13 +176,10 @@ lra: /* Multiple value return spot, clear stack. */ move reg_CSP, reg_OCFP - nop + nop /* Single value return spot. */ - /* Pass one return value back to C land. */ - move v0, reg_A0 # reg_CFUNC - /* Nested lisp -> C calls may have clobbered gp. */ lw gp, framesize-16(sp) @@ -208,6 +205,11 @@ lra: break 0x10 1: .set reorder + /* Pass one return value back to C land. For a 64bit value, we may + need to clobber v1 aka reg_NL4. */ + move v0, reg_A0 # reg_CFUNC + move v1, reg_A1 # reg_NL4 + /* Restore C regs */ lw ra, framesize-8(sp) lw s8, framesize-12(sp) @@ -283,6 +285,10 @@ lra: lw gp, 8(reg_CFP) + /* Pass 64bit return value to lisp land. */ + move reg_NL0, v0 # reg_CFUNC + move reg_NL1, v1 # reg_NL4 + li reg_NIL, NIL /* Clear unsaved boxed descriptor regs */ @@ -339,7 +345,7 @@ lra: * The undefined-function trampoline. */ LEAF(undefined_tramp) - break 10 + break trap_Error .byte 4 .byte UNDEFINED_FUN_ERROR .byte 254 @@ -363,13 +369,14 @@ lra: /* * Function-end breakpoint magic. */ + .align 3 LEAF(fun_end_breakpoint_guts) .set noreorder - .align 3 .word RETURN_PC_HEADER_WIDETAG - + b multiple_value_return nop + .set reorder move reg_OCFP, reg_CSP addu reg_CSP, 4 @@ -384,9 +391,6 @@ multiple_value_return: FEXPORT(fun_end_breakpoint_trap) break trap_FunEndBreakpoint -1: b 1b - nop - + b multiple_value_return EXPORT(fun_end_breakpoint_end) - .set reorder END(fun_end_breakpoint_guts) |
From: Christophe R. <cs...@ca...> - 2005-05-20 09:45:48
|
Thiemo Seufer <th...@ne...> writes: > Thiemo Seufer wrote: >> The appended patch adds support for 64bit "long long" integers for mips >> and mipsel. It uses now the first two lisp argument registers for the >> C return value in order to keep it away from the pa flag. > > Updated version which doesn't use boxed registers for C return values. Thanks; I've merged this as sbcl-0.9.0.39. Cheers, Christophe |