Correct integer-length on fixnums on x86-64 when n-fixnum-tag-bits > 1.
authorStas Boukarev <stassats@gmail.com>
Wed, 1 May 2013 10:15:45 +0000 (14:15 +0400)
committerStas Boukarev <stassats@gmail.com>
Thu, 2 May 2013 11:32:38 +0000 (15:32 +0400)
Use SAR, not SHR for untagging, to preserve the sign.
Thanks to Paul Khuong.

src/compiler/x86-64/arith.lisp

index 22d5bc1..1413f40 100644 (file)
@@ -1012,9 +1012,7 @@ constant shift greater than word length")))
   (:result-types unsigned-num)
   (:generator 28
     (move res arg)
-    (if (sc-is res unsigned-reg)
-        (inst test res res)
-        (inst cmp res 0))
+    (inst test res res)
     (inst jmp :ge POS)
     (inst not res)
     POS
@@ -1081,10 +1079,8 @@ constant shift greater than word length")))
   (:generator 25
     (move res arg)
     (when (> n-fixnum-tag-bits 1)
-      (inst shr res (1- n-fixnum-tag-bits)))
-    (if (sc-is res unsigned-reg)
-        (inst test res res)
-        (inst cmp res 0))
+      (inst sar res (1- n-fixnum-tag-bits)))
+    (inst test res res)
     (inst jmp :ge POS)
     (inst not res)
     POS