Re: freeze for sbcl-2.6.8
Douglas Katzman via Sbcl-devel <[email protected]>
| Newsgroups | gmane.lisp.steel-bank.devel |
|---|---|
| Message-ID | <CAOrNasxhjp-0XUzu0d3d+XnFUhU2Qi88Ti0wbzXtcmK6F8zQLw@mail.gmail.com> |
I was hoping to land the attached patch by yesterday but I lost access to my #+win32 environment which I just now regained access to . It's a nice cleanup but it warranted testing on more than my usual setup. Any objection to it landing soon, like within a few hours? _______________________________________________ Sbcl-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/sbcl-devel
0001-Permute-the-Lisp-arg-passing-registers.patch
(application/x-patch, 21.5 KB)
From 3665ae5bdbc9da0ce2e8ca902b8dec7bcb728853 Mon Sep 17 00:00:00 2001 From: Douglas Katzman <[email protected]> Date: Fri, 21 Aug 2026 23:31:55 -0400 Subject: [PATCH] Permute the Lisp arg-passing registers Lisp and C are the same for #+unix, not #+win32 but either way the FPR save/restore routines look nicer now. Co-authored by Gemini --- src/assembly/x86-64/arith.lisp | 8 +-- src/assembly/x86-64/array.lisp | 5 +- src/assembly/x86-64/assem-rtns.lisp | 91 +++++++++++++++-------------- src/assembly/x86-64/tramps.lisp | 61 +++++++------------ src/compiler/x86-64/c-call.lisp | 6 +- src/compiler/x86-64/nlx.lisp | 4 +- src/compiler/x86-64/vm.lisp | 4 +- src/runtime/thread.c | 4 +- src/runtime/x86-64-arch.c | 6 +- src/runtime/x86-64-assem.S | 18 +++--- tests/x86-64-codegen.impure.lisp | 2 +- 11 files changed, 97 insertions(+), 112 deletions(-) diff --git a/src/assembly/x86-64/arith.lisp b/src/assembly/x86-64/arith.lisp index 045749ff6..f41bc8fa6 100644 --- a/src/assembly/x86-64/arith.lisp +++ b/src/assembly/x86-64/arith.lisp @@ -102,12 +102,12 @@ (inst clc) (inst ret) BIGNUM - (inst shrd rax x n-fixnum-tag-bits) ; high bits from edx - (inst sar x n-fixnum-tag-bits) ; now shift edx too + (inst shrd rax rdx-tn n-fixnum-tag-bits) ; high bits from edx + (inst sar rdx-tn n-fixnum-tag-bits) ; now shift edx too - (move rcx x) ; save high bits from cqo + (move rcx rdx-tn) ; save high bits from cqo (inst cqo) ; edx:eax <- sign-extend of eax - (inst cmp x rcx) + (inst cmp rdx-tn rcx) (inst jmp :e SINGLE-WORD-BIGNUM) (emit-alloc-other nil thread-tn bignum-widetag (+ bignum-digits-offset 2) res) diff --git a/src/assembly/x86-64/array.lisp b/src/assembly/x86-64/array.lisp index d06e97fa0..edd7e9048 100644 --- a/src/assembly/x86-64/array.lisp +++ b/src/assembly/x86-64/array.lisp @@ -30,7 +30,7 @@ (:arg start (any-reg descriptor-reg) (:lisp-reg 1)) (:arg end (any-reg descriptor-reg) rcx-offset) (:res res (descriptor-reg) (:lisp-reg 0)) - (:temp scratch unsigned-reg rsi-offset) + (:temp scratch unsigned-reg rbx-offset) ;; storage class doesn't matter since all float regs ;; and sse regs map to the same storage base. (:temp wordpair double-reg 0)) @@ -100,8 +100,11 @@ (inst jmp unroll) (inst shr count n-fixnum-tag-bits) + (move scratch vector) ; save it for the return value + (move rdi-tn start) ; implicit operand to STOS (inst rep) (inst stos :qword) + (move rdi-tn scratch) ; restore the return value DONE (inst ret) UNROLL diff --git a/src/assembly/x86-64/assem-rtns.lisp b/src/assembly/x86-64/assem-rtns.lisp index 346278e7a..1ac307b9a 100644 --- a/src/assembly/x86-64/assem-rtns.lisp +++ b/src/assembly/x86-64/assem-rtns.lisp @@ -27,8 +27,9 @@ ;; These we need as temporaries. (:temp rax unsigned-reg rax-offset) (:temp rbx unsigned-reg rbx-offset) - (:temp rdx unsigned-reg rdx-offset) - (:temp rdi unsigned-reg rdi-offset) + (:temp a0 unsigned-reg (:lisp-reg 0)) + (:temp a1 unsigned-reg (:lisp-reg 1)) + (:temp a2 unsigned-reg (:lisp-reg 2)) (:temp temp unsigned-reg r8-offset) (:temp loop-index unsigned-reg r9-offset)) @@ -46,7 +47,7 @@ ;; Save the count, the return address and restore the frame pointer, ;; because the loop is going to destroy them. - (inst mov rdx rcx) + (inst mov a2 rcx) (inst mov rax (ea (frame-byte-offset return-pc-save-offset) rbp-tn)) (inst mov rbp-tn (ea (frame-byte-offset ocfp-save-offset) rbp-tn)) ;; Blit the values down the stack. Note: there might be overlap, so @@ -60,16 +61,16 @@ (inst mov temp (ea rsi loop-index)) (inst mov (ea rbx loop-index) temp) - (inst sub rdx (fixnumize 1)) + (inst sub a2 (fixnumize 1)) (inst jmp :nz LOOP) ;; Set the stack top to the last result. (inst lea rsp-tn (ea rbx loop-index)) ;; Load the register args. - (loadw rdx rbx -1) - (loadw rdi rbx -2) - (loadw rsi rbx -3) + (loadw a0 rbx -1) + (loadw a1 rbx -2) + (loadw a2 rbx -3) ;; And back we go. (emit-mv-return rax t) @@ -77,9 +78,9 @@ ;; Handle the register arg cases. ZERO-VALUES (inst lea rbx (ea (* sp->fp-offset n-word-bytes) rbp-tn)) - (inst mov rdx null-tn) - (inst mov rdi null-tn) - (inst mov rsi null-tn) + (inst mov a0 null-tn) + (inst mov a1 null-tn) + (inst mov a2 null-tn) (inst stc) (inst leave) (inst ret) @@ -87,25 +88,25 @@ ;; Note: we can get this, because the return-multiple vop doesn't ;; check for this case when size > speed. ONE-VALUE - (loadw rdx rsi -1) + (loadw a0 rsi -1) (inst clc) (inst leave) (inst ret) TWO-VALUES (inst lea rbx (ea (* sp->fp-offset n-word-bytes) rbp-tn)) - (loadw rdx rsi -1) - (loadw rdi rsi -2) - (inst mov rsi null-tn) + (loadw a0 rsi -1) + (inst mov a2 null-tn) + (loadw a1 rsi -2) (inst stc) (inst leave) (inst ret) THREE-VALUES (inst lea rbx (ea (* sp->fp-offset n-word-bytes) rbp-tn)) - (loadw rdx rsi -1) - (loadw rdi rsi -2) - (loadw rsi rsi -3) + (loadw a0 rsi -1) + (loadw a2 rsi -3) + (loadw a1 rsi -2) (inst stc) (inst leave) (inst ret)) @@ -123,12 +124,12 @@ ;;; we actually called. We also have to compute RCX from the difference ;;; between RSI and the stack top. #-sb-assembling ; avoid "Redefinition" warning (this file is processed twice) -(defun prepare-for-tail-call-variable (fun temp nargs rdx rdi rsi +(defun prepare-for-tail-call-variable (fun temp nargs a0 a1 a2 r8 r9 r10 &optional jump-to-the-end) (assemble () ;; Calculate NARGS (as a fixnum) - (move nargs rsi) + (move nargs rsi-tn) (inst sub nargs rsp-tn) (inst shr nargs (- word-shift n-fixnum-tag-bits)) @@ -136,12 +137,12 @@ (inst cmp nargs (fixnumize register-arg-count)) (inst jmp :le REGISTER-ARGS) - (inst mov r8 rsi) + (inst mov r8 rsi-tn) ;; Register args - (loadw rdx rsi -1) - (loadw rdi rsi -2) - (loadw rsi rsi -3) + (loadw a0 r8 -1) + (loadw a1 r8 -2) + (loadw a2 r8 -3) ;; Do the blit. Because we are coping from smaller addresses to ;; larger addresses, we have to start at the largest pair and work @@ -169,9 +170,9 @@ ;; All the arguments fit in registers, so load them. REGISTER-ARGS - (loadw rdx rsi -1) - (loadw rdi rsi -2) - (loadw rsi rsi -3) + (loadw a0 rsi-tn -1) + (loadw a2 rsi-tn -3) + (loadw a1 rsi-tn -2) ;; Clear most of the stack. (inst lea rsp-tn (ea (* (- sp->fp-offset 3) n-word-bytes) rbp-tn)) @@ -187,13 +188,13 @@ ((:temp fun unsigned-reg rax-offset) (:temp temp unsigned-reg rbx-offset) (:temp nargs unsigned-reg rcx-offset) - (:temp rdx unsigned-reg rdx-offset) - (:temp rdi unsigned-reg rdi-offset) - (:temp rsi unsigned-reg rsi-offset) + (:temp a0 unsigned-reg (:lisp-reg 0)) + (:temp a1 unsigned-reg (:lisp-reg 1)) + (:temp a2 unsigned-reg (:lisp-reg 2)) (:temp r8 unsigned-reg r8-offset) (:temp r9 unsigned-reg r9-offset) (:temp r10 unsigned-reg r10-offset)) - (prepare-for-tail-call-variable fun temp nargs rdx rdi rsi r8 r9 r10) + (prepare-for-tail-call-variable fun temp nargs a0 a1 a2 r8 r9 r10) (inst jmp (object-slot-ea fun closure-fun-slot fun-pointer-lowtag))) @@ -204,13 +205,13 @@ ((:temp fun unsigned-reg rax-offset) (:temp temp unsigned-reg rbx-offset) (:temp nargs unsigned-reg rcx-offset) - (:temp rdx unsigned-reg rdx-offset) - (:temp rdi unsigned-reg rdi-offset) - (:temp rsi unsigned-reg rsi-offset) + (:temp a0 unsigned-reg (:lisp-reg 0)) + (:temp a1 unsigned-reg (:lisp-reg 1)) + (:temp a2 unsigned-reg (:lisp-reg 2)) (:temp r8 unsigned-reg r8-offset) (:temp r9 unsigned-reg r9-offset) (:temp r10 unsigned-reg r10-offset)) - (prepare-for-tail-call-variable fun temp nargs rdx rdi rsi r8 r9 r10 t) + (prepare-for-tail-call-variable fun temp nargs a0 a1 a2 r8 r9 r10 t) (%lea-for-lowtag-test rbx-tn fun fun-pointer-lowtag) (inst test :byte rbx-tn lowtag-mask) @@ -368,7 +369,7 @@ ((:arg x (descriptor-reg) (:lisp-reg 0)) (:res r (descriptor-reg) (:lisp-reg 0))) (progn x r) - (with-registers-preserved (lisp :except rdx) + (with-registers-preserved (lisp :except #.(first register-arg-names)) (call-lisp-fun 'update-object-layout 1 nil))) (define-assembly-routine (sb-impl:install-hash-table-lock @@ -378,7 +379,7 @@ ((:arg x (descriptor-reg) (:lisp-reg 0)) (:res r (descriptor-reg) (:lisp-reg 0))) (progn x r) - (with-registers-preserved (lisp :except rdx) + (with-registers-preserved (lisp :except #.(first register-arg-names)) (call-lisp-fun 'sb-impl:install-hash-table-lock 1))) (define-assembly-routine @@ -386,9 +387,9 @@ ((:arg list descriptor-reg rax-offset) (:temp rbx unsigned-reg rbx-offset) - (:temp rdx unsigned-reg rdx-offset) - (:temp rdi unsigned-reg rdi-offset) - (:temp rsi unsigned-reg rsi-offset) + (:temp a0 unsigned-reg (:lisp-reg 0)) + (:temp a1 unsigned-reg (:lisp-reg 1)) + (:temp a2 unsigned-reg (:lisp-reg 2)) (:temp count unsigned-reg rcx-offset) (:temp temp unsigned-reg r9-offset) (:temp return unsigned-reg r10-offset)) @@ -404,7 +405,7 @@ (inst cmp list null) (inst jmp :e ZERO-VALUES) - (loadw rdx list cons-car-slot list-pointer-lowtag) + (loadw a0 list cons-car-slot list-pointer-lowtag) (loadw list list cons-cdr-slot list-pointer-lowtag) (inst cmp list null) (inst jmp :ne CONTINUE) @@ -417,14 +418,14 @@ (check ONE-VALUE) (inst mov count (fixnumize 2)) - (loadw rdi list cons-car-slot list-pointer-lowtag) + (loadw a1 list cons-car-slot list-pointer-lowtag) (loadw list list cons-cdr-slot list-pointer-lowtag) (inst cmp list null) (inst jmp :e TWO-VALUES) (check TWO-VALUES) (inst mov count (fixnumize 3)) - (loadw rsi list cons-car-slot list-pointer-lowtag) + (loadw a2 list cons-car-slot list-pointer-lowtag) (loadw list list cons-cdr-slot list-pointer-lowtag) (inst cmp list null) (inst jmp :e THREE-VALUES) @@ -453,11 +454,11 @@ (cerror-call nil 'bogus-arg-to-values-list-error list) ZERO-VALUES (zeroize count) - (inst mov rdx null) - (inst mov rdi null) + (inst mov a0 null) + (inst mov a1 null) TWO-VALUES - (inst mov rsi null) + (inst mov a2 null) THREE-VALUES (inst lea rbx (ea (* sp->fp-offset n-word-bytes) rbp-tn)) diff --git a/src/assembly/x86-64/tramps.lisp b/src/assembly/x86-64/tramps.lisp index bdab924ee..12bf7b581 100644 --- a/src/assembly/x86-64/tramps.lisp +++ b/src/assembly/x86-64/tramps.lisp @@ -79,58 +79,39 @@ (do-fprs push :xmm) (inst ret) HAVE-YMM - ;; Although most of the time RDX can be clobbered, some of the time it can't. - ;; If WITH-REGISTERS-PRESERVED wraps a lisp function to make it appear to preserve - ;; all registers, we obviously need to return its primary value in RDX. - ;; RAX need not be saved though. - (inst push rdx-tn) - (zeroize rdx-tn) - ;; After PUSH the save area is at RSP+16 with the return-PC at [RSP+8] - ;; Zero the header - (inst lea rax-tn (ea (+ 512 16) rsp-tn)) - (dotimes (i 8) - (inst mov (ea (ash i word-shift) rax-tn) rdx-tn)) + ;; EDX:EAX specify the register files to save. Those GPRs are allowed to be + ;; clobbered by this routine, so we don't have to save them. + ;; The save area is at RSP+8 and the save area's "header" is 512 bytes beyond its start + (inst lea rax-tn (ea (+ 512 8) rsp-tn)) + (zeroize rdx-tn) ; Zero-fill the header + (dotimes (i 8) (inst mov (ea (ash i word-shift) rax-tn) rdx-tn)) (inst mov rax-tn 7) - (inst xsave (ea 16 rsp-tn)) - (inst pop rdx-tn)) + (inst xsave (ea 8 rsp-tn))) (define-assembly-routine (fpr-restore) () (test-cpu-feature cpu-has-ymm-registers) (inst jmp :nz have-ymm) (do-fprs pop :xmm) (inst ret) HAVE-YMM - (inst push rdx-tn) - (inst mov rax-tn 7) ; OK to clobber RAX + (inst mov rax-tn 7) ; RDX:RAX may be freely clobbered (zeroize rdx-tn) - (inst xrstor (ea 16 rsp-tn)) - (inst pop rdx-tn))) + (inst xrstor (ea 8 rsp-tn)))) ;; Caller will have allocated xsave-avx512-area-size bytes above the stack-pointer ;; prior to the CALL. Use that as the save area. (define-assembly-routine (fpr-save-avx512) () - ;; Although most of the time RDX can be clobbered, some of the time it can't. - ;; If WITH-REGISTERS-PRESERVED wraps a lisp function to make it appear to preserve - ;; all registers, we obviously need to return its primary value in RDX. - ;; RAX need not be saved though. - (inst push rdx-tn) - (zeroize rdx-tn) - ;; After PUSH the save area is at RSP+16 with the return-PC at [RSP+8] - ;; Zero the header - (inst lea rax-tn (ea (+ 512 16) rsp-tn)) - (dotimes (i 8) - (inst mov (ea (ash i word-shift) rax-tn) rdx-tn)) + (inst lea rax-tn (ea (+ 512 8) rsp-tn)) + (zeroize rdx-tn) ; Zero-fill the header + (dotimes (i 8) (inst mov (ea (ash i word-shift) rax-tn) rdx-tn)) ;; AVX-512 state mask for EAX: ;; x87(0) | SSE(1) | AVX(2) | KMM(5) | ZMM 0-15(6) | ZMM 16-31(7) = 0xE7 (inst mov rax-tn #xE7) - (inst xsave (ea 16 rsp-tn)) - (inst pop rdx-tn)) + (inst xsave (ea 8 rsp-tn))) -(define-assembly-routine (fpr-restore-avx512) () - (inst push rdx-tn) - (inst mov rax-tn #xE7) ; OK to clobber RAX +(define-assembly-routine (fpr-restore-avx512) () ; OK to clobber RDX:RAX + (inst mov rax-tn #xE7) (zeroize rdx-tn) - (inst xrstor (ea 16 rsp-tn)) - (inst pop rdx-tn)) + (inst xrstor (ea 8 rsp-tn))) (define-assembly-routine (switch-to-arena (:return-style :raw)) () ;; RSI and RDI are vop temps, so don't bother preserving them @@ -149,9 +130,9 @@ (let ((save (list rbx-tn r12-tn r13-tn r14-tn r15-tn))) (dolist (reg save) (inst push reg)) ;; count of bytes or elements (always at RBP+16) into 2nd arg - (inst mov rdi-tn (ea 16 rbp-tn)) + (inst mov (second *register-arg-tns*) (ea 16 rbp-tn)) (call-lisp-fun 'handle-arena-request 2) - (inst mov rax-tn rdx-tn) ; Lisp result reg into C result reg + (inst mov rax-tn (first *register-arg-tns*)) ; Lisp result reg into C result reg (dolist (reg (reverse save)) (inst pop reg))) (emit-begin-pseudo-atomic)) @@ -174,9 +155,9 @@ `(progn (inst test rax-tn rax-tn) (inst jmp :nz SUCCESS) ,(ecase units - (:list-elts '(zeroize rdx-tn)) - (:bytes-non-list '(inst mov rdx-tn (fixnumize 1))) - (:bytes-list '(inst mov rdx-tn (fixnumize 2)))) + (:list-elts `(zeroize ,(first *register-arg-tns*))) + (:bytes-non-list `(inst mov ,(first *register-arg-tns*) (fixnumize 1))) + (:bytes-list `(inst mov ,(first *register-arg-tns*) (fixnumize 2)))) (inst call (make-fixup 'handle-arena-request :assembly-routine)) ;; if an oversized object which the predicate determined should be allocated ;; then it was in fact already allocated, and its address is in rax. diff --git a/src/compiler/x86-64/c-call.lisp b/src/compiler/x86-64/c-call.lisp index 163355fd9..1ed96f6cd 100644 --- a/src/compiler/x86-64/c-call.lisp +++ b/src/compiler/x86-64/c-call.lisp @@ -1111,13 +1111,13 @@ Floats are passed in integer registers." #-sb-thread (progn ;; arg0 to ENTER-ALIEN-CALLBACK (trampoline index) - (inst mov rdx (fixnumize index)) + (inst mov rdi (fixnumize index)) ;; arg1 to ENTER-ALIEN-CALLBACK (pointer to argument vector) - (inst mov rdi rsp) + (inst mov rsi rsp) ;; add room on stack for return value (inst sub rsp (* return-slot-count-aligned n-word-bytes)) ;; arg2 to ENTER-ALIEN-CALLBACK (pointer to return value) - (inst mov rsi rsp) + (inst mov rdx rsp) ;; Make new frame (inst push rbp) diff --git a/src/compiler/x86-64/nlx.lisp b/src/compiler/x86-64/nlx.lisp index 03c22b980..bb04ccc53 100644 --- a/src/compiler/x86-64/nlx.lisp +++ b/src/compiler/x86-64/nlx.lisp @@ -143,7 +143,7 @@ (inst cmp count (fixnumize i)) (inst jmp :le default-lab) (when first-stack-arg-p - (storew rdx-tn rbx-tn -1)) + (storew (first *register-arg-tns*) rbx-tn -1)) (sc-case tn ((descriptor-reg any-reg) (loadw tn start (frame-word-offset (+ sp->fp-offset i)))) @@ -157,7 +157,7 @@ (dolist (default (defaults)) (emit-label (car default)) (when (cddr default) - (inst push rdx-tn)) + (inst push (first *register-arg-tns*))) (inst mov (second default) null-tn)) (inst jmp defaulting-done)))))) (inst mov rsp-tn sp))) diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index cde5f0ddd..68b79b046 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -171,8 +171,8 @@ ;; the number of arguments/return values passed in registers (defconstant register-arg-count 3) ;; names and offsets for registers used to pass arguments - (defconstant-eqx register-arg-names '(rdx rdi rsi) #'equal) - (defregset *register-arg-offsets* rdx rdi rsi) + (defconstant-eqx register-arg-names '(rdi rsi rdx) #'equal) + (defregset *register-arg-offsets* rdi rsi rdx) #-win32 (defregset *c-call-register-arg-offsets* rdi rsi rdx rcx r8 r9) #+win32 diff --git a/src/runtime/thread.c b/src/runtime/thread.c index c373c7f89..279408826 100644 --- a/src/runtime/thread.c +++ b/src/runtime/thread.c @@ -783,7 +783,7 @@ static void detach_os_thread(init_thread_data *scribble) } #if defined(LISP_FEATURE_X86_64) && !defined(LISP_FEATURE_WIN32) -extern void funcall_alien_callback(lispobj arg1, lispobj arg2, lispobj arg0, +extern void funcall_alien_callback(lispobj arg0, lispobj arg1, lispobj arg2, struct thread* thread) __attribute__((sysv_abi)); #endif @@ -814,7 +814,7 @@ callback_wrapper_trampoline(lispobj arg0, lispobj arg1, lispobj arg2) WITH_GC_AT_SAFEPOINTS_ONLY() { #if defined(LISP_FEATURE_X86_64) && !defined(LISP_FEATURE_WIN32) - funcall_alien_callback(arg1, arg2, arg0, th); + funcall_alien_callback(arg0, arg1, arg2, th); #else funcall3(StaticSymbolFunction(ENTER_ALIEN_CALLBACK), arg0,arg1,arg2); #endif diff --git a/src/runtime/x86-64-arch.c b/src/runtime/x86-64-arch.c index d24283d56..10cff9068 100644 --- a/src/runtime/x86-64-arch.c +++ b/src/runtime/x86-64-arch.c @@ -73,11 +73,11 @@ static void xgetbv(unsigned *eax, unsigned *edx) } #define VECTOR_FILL_T "VECTOR-FILL/T" -static const int vector_fill_offset_to_check = 0x59; -static const int vector_fill_offset_to_poke = 0x60; +static const int vector_fill_offset_to_check = 0x58; +static const int vector_fill_offset_to_poke = 0x5F; static const unsigned char vector_fill_expect_bytes[] = { 0x48, 0x81, 0xF9, 0xBC, 0x02, 0x00, 0x00, - 0xEB, 0x07 + 0xEB, 0x10 }; // Poke in a byte that changes an opcode to enable faster vector fill. diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 23e52424c..78b30a2ba 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -188,9 +188,9 @@ Lstack: cmp $1,%rcx je Lone jl Lzero - mov 16(%rbx),%rsi # arg2 -Ltwo: mov 8(%rbx),%rdi # arg1 -Lone: mov 0(%rbx),%rdx # arg0 + mov 16(%rbx),%rdx # arg2 +Ltwo: mov 8(%rbx),%rsi # arg1 +Lone: mov 0(%rbx),%rdi # arg0 Lzero: shl $(N_FIXNUM_TAG_BITS),%rcx # (fixnumize num-args) @@ -230,7 +230,7 @@ LsingleValue: /* FIXME Restore the NPX state. */ - mov %rdx,%rax # c-val + mov %rdi,%rax # c-val #ifdef SUPPORT_FOMIT_FRAME_POINTER mov %r15,%rbp # orig rbp pop %r15 # orig r15 @@ -247,9 +247,9 @@ LsingleValue: .align align_16byte,0x90 GNAME(funcall_alien_callback): /* Specialized call_into_lisp for callbacks - rdi arg1 - rsi arg2 - rdx arg0 + rdi arg0 + rsi arg1 + rdx arg2 rcx thread #+sb-thread */ @@ -308,8 +308,8 @@ GNAME(fun_end_breakpoint_guts): mov %rsp,%rbx # Setup ebx - the ofp. sub $8,%rsp # Allocate one stack slot for the return value mov $(1 << N_FIXNUM_TAG_BITS),%rcx # Setup ecx for one return value. - mov reg_NULL,%rdi # default second value - mov reg_NULL,%rsi # default third value + mov reg_NULL,%rsi # default second value + mov reg_NULL,%rdx # default third value multiple_value_return: .globl GNAME(fun_end_breakpoint_trap) diff --git a/tests/x86-64-codegen.impure.lisp b/tests/x86-64-codegen.impure.lisp index 2b24ce40a..693f1cb1c 100644 --- a/tests/x86-64-codegen.impure.lisp +++ b/tests/x86-64-codegen.impure.lisp @@ -589,7 +589,7 @@ (with-test (:name :char-code-is-single-shr) (assert-thereis-line '(lambda (x) (char-code (truly-the character x))) - "SHR EDX, 7")) + "SHR EDI, 7")) (import '(sb-x86-64-asm::get-gpr sb-x86-64-asm::machine-ea)) ;; to make this pass on different configurations we'd have to add -- 2.55.0.766.g2966f0265a-goog