From 8105eb908700dfc868cfc00d106981845d954594 Mon Sep 17 00:00:00 2001 From: Lutz Euler Date: Tue, 17 Apr 2012 18:26:48 +0200 Subject: [PATCH] Micro-optimize some type tests on x86-64 for code size. In SIGNED-BYTE-64-P and CHECK-SIGNED-BYTE-64, if possible, spare a REX prefix by using a 32-bit instead of a 64-bit register move instruction. In UNSIGNED-BYTE-64-P and CHECK-UNSIGNED-BYTE-64 use AL instead of RAX to test the lowtag. --- src/compiler/x86-64/type-vops.lisp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/compiler/x86-64/type-vops.lisp b/src/compiler/x86-64/type-vops.lisp index 47b18d3..12c09af 100644 --- a/src/compiler/x86-64/type-vops.lisp +++ b/src/compiler/x86-64/type-vops.lisp @@ -13,6 +13,14 @@ ;;;; test generation utilities +;;; Optimize the case of moving a 64-bit value into RAX when not caring +;;; about the upper 32 bits: often the REX prefix can be spared. +(defun move-qword-to-eax (value) + (if (and (sc-is value any-reg descriptor-reg) + (< (tn-offset value) r8-offset)) + (move eax-tn (make-dword-tn value)) + (move rax-tn value))) + (defun generate-fixnum-test (value) "zero flag set if VALUE is fixnum" (inst test @@ -72,10 +80,7 @@ (%test-headers value target not-p nil headers drop-through)) (defun %test-lowtag (value target not-p lowtag) - (if (and (sc-is value any-reg descriptor-reg) - (< (tn-offset value) r8-offset)) - (move eax-tn (make-dword-tn value)) ; shorter encoding (no REX prefix) - (move rax-tn value)) + (move-qword-to-eax value) (inst and al-tn lowtag-mask) (inst cmp al-tn lowtag) (inst jmp (if not-p :ne :e) target)) @@ -249,7 +254,7 @@ (values target not-target)) (generate-fixnum-test value) (inst jmp :e yep) - (move rax-tn value) + (move-qword-to-eax value) (inst and al-tn lowtag-mask) (inst cmp al-tn other-pointer-lowtag) (inst jmp :ne nope) @@ -265,7 +270,7 @@ value))) (generate-fixnum-test value) (inst jmp :e yep) - (move rax-tn value) + (move-qword-to-eax value) (inst and al-tn lowtag-mask) (inst cmp al-tn other-pointer-lowtag) (inst jmp :ne nope) @@ -294,8 +299,8 @@ (inst jmp :e fixnum) ;; If not, is it an other pointer? - (inst and rax-tn lowtag-mask) - (inst cmp rax-tn other-pointer-lowtag) + (inst and al-tn lowtag-mask) + (inst cmp al-tn other-pointer-lowtag) (inst jmp :ne nope) ;; Get the header. (loadw rax-tn value 0 other-pointer-lowtag) @@ -337,8 +342,8 @@ (inst jmp :e fixnum) ;; If not, is it an other pointer? - (inst and rax-tn lowtag-mask) - (inst cmp rax-tn other-pointer-lowtag) + (inst and al-tn lowtag-mask) + (inst cmp al-tn other-pointer-lowtag) (inst jmp :ne nope) ;; Get the header. (loadw rax-tn value 0 other-pointer-lowtag) -- 1.7.10.4