From b22eea4bad3a458034301e1643eecc60c1b6f9a2 Mon Sep 17 00:00:00 2001 From: Lutz Euler Date: Mon, 29 Apr 2013 23:18:27 +0200 Subject: [PATCH] Convert the MOVE macro on x86-64 into a function. This is possible as the macro is used just to simulate an inline function. Converting MOVE into a true function shrinks the core by 448 KiB and may even make the compiler run faster due to reduced instruction cache pressure. Some background: Only on x86-64 MOVE is used with float SCs sometimes. It therefore needs to select different machine instructions depending on the SC of its destination argument. This compiles to so much code that inlining it can't be justified, especially given that MOVE is used in several hundred VOPs. While at it, correct the comment at the top of the file for 64-bitness. --- src/compiler/x86-64/macros.lisp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/compiler/x86-64/macros.lisp b/src/compiler/x86-64/macros.lisp index a397573..e77d9c1 100644 --- a/src/compiler/x86-64/macros.lisp +++ b/src/compiler/x86-64/macros.lisp @@ -1,4 +1,4 @@ -;;;; a bunch of handy macros for the x86 +;;;; a bunch of handy macros for x86-64 ;;;; This software is part of the SBCL system. See the README file for ;;;; more information. @@ -13,21 +13,23 @@ ;;;; instruction-like macros -(defmacro move (dst src) +;;; This used to be a macro (and still is on the other platforms) but +;;; the support for SC-dependent move instructions needed here makes +;;; that expand into so large an expression that the resulting code +;;; bloat is not justifiable. +(defun move (dst src) #!+sb-doc "Move SRC into DST unless they are location=." - (once-only ((n-dst dst) - (n-src src)) - `(unless (location= ,n-dst ,n-src) - (sc-case ,n-dst - ((single-reg complex-single-reg) - (aver (xmm-register-p ,n-src)) - (inst movaps ,n-dst ,n-src)) - ((double-reg complex-double-reg) - (aver (xmm-register-p ,n-src)) - (inst movapd ,n-dst ,n-src)) - (t - (inst mov ,n-dst ,n-src)))))) + (unless (location= dst src) + (sc-case dst + ((single-reg complex-single-reg) + (aver (xmm-register-p src)) + (inst movaps dst src)) + ((double-reg complex-double-reg) + (aver (xmm-register-p src)) + (inst movapd dst src)) + (t + (inst mov dst src))))) (defmacro make-ea-for-object-slot (ptr slot lowtag) `(make-ea :qword :base ,ptr :disp (- (* ,slot n-word-bytes) ,lowtag))) -- 1.7.10.4