master: x86-64: unify all float immediates

stassats via Sbcl-commits <[email protected]> Sun, 28 Jun 2026 13:03:23 +0000
Newsgroups gmane.lisp.steel-bank.cvs
Message-ID <[email protected]>
The branch "master" has been updated in SBCL:
       via  5b6a30331b6c25d83cf70a414e57c37ac89dbb33 (commit)
      from  225e9c1f80f29930e1227cc66c832c3b9ae31474 (commit)

- Log -----------------------------------------------------------------
commit 5b6a30331b6c25d83cf70a414e57c37ac89dbb33
Author: Stas Boukarev <[email protected]>
Date:   Sat Jun 27 18:31:39 2026 +0300

    x86-64: unify all float immediates
---
 src/compiler/x86-64/array.lisp         |   8 +--
 src/compiler/x86-64/cell.lisp          |   6 +-
 src/compiler/x86-64/float.lisp         | 118 ++++++++++++++++-----------------
 src/compiler/x86-64/simd-pack-256.lisp |   9 +--
 src/compiler/x86-64/simd-pack.lisp     |  11 ++-
 src/compiler/x86-64/vm.lisp            |  58 +++++-----------
 6 files changed, 89 insertions(+), 121 deletions(-)

diff --git a/src/compiler/x86-64/array.lisp b/src/compiler/x86-64/array.lisp
index 6a6d45d25..6049d370f 100644
--- a/src/compiler/x86-64/array.lisp
+++ b/src/compiler/x86-64/array.lisp
@@ -783,7 +783,7 @@
 
 (define-vop (data-vector-set-with-offset/simple-array-single-float-c dvset)
   (:args (object :scs (descriptor-reg))
-         (value :scs (single-reg fp-single-immediate)))
+         (value :scs (single-reg fp-immediate)))
   (:info index addend)
   (:arg-types simple-array-single-float (:constant low-index)
               (:constant (constant-displacement other-pointer-lowtag
@@ -791,7 +791,7 @@
               single-float)
   (:generator 4
    (unpoison-element object (+ index addend))
-    (if (sc-is value fp-single-immediate)
+    (if (sc-is value fp-immediate)
         (inst mov :dword (float-ref-ea object index addend 4)
               (single-float-bits (tn-value value)))
         (inst movss (float-ref-ea object index addend 4) value))))
@@ -834,7 +834,7 @@
 
 (define-vop (data-vector-set-with-offset/simple-array-double-float-c dvset)
   (:args (object :scs (descriptor-reg))
-         (value :scs (double-reg (fp-double-immediate
+         (value :scs (double-reg (fp-immediate
                                   (eql (tn-value tn) 0d0)))))
   (:info index addend)
   (:arg-types simple-array-double-float (:constant low-index)
@@ -843,7 +843,7 @@
               double-float)
   (:generator 19
     (unpoison-element object (+ index addend))
-    (if (sc-is value fp-double-immediate)
+    (if (sc-is value fp-immediate)
         (inst mov :qword (float-ref-ea object index addend 8) 0)
         (inst movsd (float-ref-ea object index addend 8) value))))
 
diff --git a/src/compiler/x86-64/cell.lisp b/src/compiler/x86-64/cell.lisp
index 6f6f1d48f..576206163 100644
--- a/src/compiler/x86-64/cell.lisp
+++ b/src/compiler/x86-64/cell.lisp
@@ -685,11 +685,11 @@
                      (index :scs (any-reg immediate))
                      (value :scs (,result-sc ,@(case result-sc
                                                 (single-reg
-                                                 '(fp-single-immediate))
+                                                 '(fp-immediate))
                                                 (double-reg
-                                                 '((fp-double-immediate (eql (tn-value tn) 0d0))))
+                                                 '((fp-immediate (eql (tn-value tn) 0d0))))
                                                 (complex-single-reg
-                                                 '((fp-complex-single-immediate (eql (tn-value tn) #c(0f0 0f0)))))
+                                                 '((fp-immediate (eql (tn-value tn) #c(0f0 0f0)))))
                                                 ((unsigned-reg signed-reg)
                                                  '((immediate (plausible-signed-imm32-operand-p (tn-value tn)))))))))
               (:arg-types * tagged-num ,result-type)
diff --git a/src/compiler/x86-64/float.lisp b/src/compiler/x86-64/float.lisp
index 18c4a3a9d..b2b9396b8 100644
--- a/src/compiler/x86-64/float.lisp
+++ b/src/compiler/x86-64/float.lisp
@@ -74,10 +74,10 @@
 ;;; X is source, Y is destination.
 
 (define-move-fun (load-fp-immediate 1) (vop x y)
-  ((fp-single-immediate) (single-reg)
-   (fp-double-immediate) (double-reg)
-   (fp-complex-single-immediate) (complex-single-reg)
-   (fp-complex-double-immediate) (complex-double-reg))
+  ((fp-immediate) (single-reg)
+   (fp-immediate) (double-reg)
+   (fp-immediate) (complex-single-reg)
+   (fp-immediate) (complex-double-reg))
   (if (member (tn-value x) '(0f0 0d0 #c(0d0 0d0) #c(0f0 0f0)))
       (sc-case y
         ((single-reg complex-single-reg) (inst xorps y y))
@@ -352,14 +352,14 @@
                   (:arg-types ,ptype ,ptype)
                   (:result-types ,ptype)))))
   (frob single-float-op single-float-comm-op
-        single-reg fp-single-immediate single-float)
+        single-reg fp-immediate single-float)
   (frob double-float-op double-float-comm-op
-        double-reg fp-double-immediate double-float)
+        double-reg fp-immediate double-float)
   (frob complex-single-float-op complex-single-float-comm-op
-        complex-single-reg fp-complex-single-immediate
+        complex-single-reg fp-immediate
         complex-single-float)
   (frob complex-double-float-op complex-double-float-comm-op
-        complex-double-reg fp-complex-double-immediate
+        complex-double-reg fp-immediate
         complex-double-float))
 
 (defun note-float-location (op vop &rest args)
@@ -381,7 +381,7 @@
              `(flet ((get-constant (tn &optional maybe-aligned)
                        (declare (ignorable maybe-aligned))
                        (let ((value (tn-value tn)))
-                         ,(if (eq constant-sc 'fp-complex-single-immediate)
+                         ,(if (eq constant-sc 'fp-immediate)
                               `(if maybe-aligned
                                    (register-inline-constant
                                     :aligned value)
@@ -426,7 +426,7 @@
                   (:temporary (:sc single-reg) tmp)
                   (:vop-var vop)
                   (:generator ,scost
-                    (generate ,op ,sinst ,commutative fp-single-immediate movss)))
+                    (generate ,op ,sinst ,commutative fp-immediate movss)))
                 (define-vop (,dname ,(if commutative
                                          'double-float-comm-op
                                          'double-float-op))
@@ -434,7 +434,7 @@
                   (:temporary (:sc double-reg) tmp)
                   (:vop-var vop)
                   (:generator ,dcost
-                    (generate ,op ,dinst ,commutative fp-double-immediate movsd)))
+                    (generate ,op ,dinst ,commutative fp-immediate movsd)))
                 ,(when csinst
                    `(define-vop (,csname
                                  ,(if commutative
@@ -445,7 +445,7 @@
                       (:vop-var vop)
                       (:generator ,cscost
                         (generate ,op ,csinst ,commutative
-                                  fp-complex-single-immediate movq))))
+                                  fp-immediate movq))))
                 ,(when cdinst
                    `(define-vop (,cdname
                                  ,(if commutative
@@ -456,7 +456,7 @@
                       (:vop-var vop)
                       (:generator ,cdcost
                         (generate ,op ,cdinst ,commutative
-                                  fp-complex-double-immediate movapd)))))))
+                                  fp-immediate movapd)))))))
   (frob + addss +/single-float 2 addsd +/double-float 2 t
         addps +/complex-single-float 3 addpd +/complex-double-float 3)
   (frob - subss -/single-float 2 subsd -/double-float 2 nil
@@ -679,8 +679,8 @@
                                  (move dup real)
                                  (inst unpcklps dup dup)))
                         ,single-inst movss movq
-                        single-reg fp-single-immediate single-float
-                        complex-single-reg fp-complex-single-immediate complex-single-float
+                        single-reg fp-immediate single-float
+                        complex-single-reg fp-immediate complex-single-float
                         ,single-real-complex-name ,single-complex-real-name)
                   (frob ,op ,double-cost ,commutativep
                         ,(and duplicatep
@@ -688,8 +688,8 @@
                                  (move dup real)
                                  (inst unpcklpd dup dup)))
                         ,double-inst movsd movapd
-                        double-reg fp-double-immediate double-float
-                        complex-double-reg fp-complex-double-immediate complex-double-float
+                        double-reg fp-immediate double-float
+                        complex-double-reg fp-immediate complex-double-float
                         ,double-real-complex-name ,double-complex-real-name))))
   (def-real-complex-op + t nil
     addps +/real-complex-single-float +/complex-real-single-float 3
@@ -706,13 +706,13 @@
 
 (define-vop (//complex-real-single-float float-op)
   (:translate /)
-  (:args (x :scs (complex-single-reg fp-complex-single-immediate)
+  (:args (x :scs (complex-single-reg fp-immediate)
             :to (:result 0)
             :target r
-            :load-if (not (sc-is x fp-complex-single-immediate)))
-         (y :scs (single-reg fp-single-immediate)
+            :load-if (not (sc-is x fp-immediate)))
+         (y :scs (single-reg fp-immediate)
             :target dup
-            :load-if (not (sc-is y fp-single-immediate))))
+            :load-if (not (sc-is y fp-immediate))))
   (:arg-types complex-single-float single-float)
   (:temporary (:sc complex-single-reg :from (:argument 1)) dup)
   (:results (r :scs (complex-single-reg)))
@@ -728,7 +728,7 @@
                                              (single-float-bits (realpart x)))))))
                  (register-inline-constant :oword (logior (ash word 64) word)))))
         (sc-case y
-          (fp-single-immediate
+          (fp-immediate
            (if (eql (tn-value y) 0f0)
                (inst xorps dup dup)
                (setf dup (duplicate (complex (setf second-value (tn-value y))
@@ -737,7 +737,7 @@
              (setf second-value y)
              (inst shufps dup dup #b00000000)))
         (sc-case x
-          (fp-complex-single-immediate
+          (fp-immediate
            (if (eql (tn-value x) #c(0f0 0f0))
                (inst xorps r r)
                (inst movaps r (duplicate (setf first-value (tn-value x))))))
@@ -919,13 +919,13 @@
                     (inst movmskps bits mask)
                     (inst cmp :byte bits #b1111)))))
   (define-float-eql eql/single-float 4
-    single-reg fp-single-immediate single-float)
+    single-reg fp-immediate single-float)
   (define-float-eql eql/double-float 4
-    double-reg fp-double-immediate double-float)
+    double-reg fp-immediate double-float)
   (define-float-eql eql/complex-single-float 5
-    complex-single-reg fp-complex-single-immediate complex-single-float)
+    complex-single-reg fp-immediate complex-single-float)
   (define-float-eql eql/complex-double-float 5
-    complex-double-reg fp-complex-double-immediate complex-double-float))
+    complex-double-reg fp-immediate complex-double-float))
 
 (define-vop (generic-eq/single-float/c float-compare)
   (:translate eq)
@@ -943,23 +943,23 @@
 
 (define-vop (single-float-compare float-compare)
   (:args (x :scs (single-reg))
-         (y :scs (single-reg single-stack fp-single-immediate)
-            :load-if (not (sc-is y single-stack fp-single-immediate))))
+         (y :scs (single-reg single-stack fp-immediate)
+            :load-if (not (sc-is y single-stack fp-immediate))))
   (:arg-types single-float single-float))
 (define-vop (double-float-compare float-compare)
   (:args (x :scs (double-reg))
-         (y :scs (double-reg double-stack descriptor-reg fp-double-immediate)
-            :load-if (not (sc-is y double-stack descriptor-reg fp-double-immediate))))
+         (y :scs (double-reg double-stack descriptor-reg fp-immediate)
+            :load-if (not (sc-is y double-stack descriptor-reg fp-immediate))))
   (:arg-types double-float double-float))
 
 (define-vop (=/single-float single-float-compare)
   (:translate =)
-  (:args (x :scs (single-reg single-stack fp-single-immediate)
+  (:args (x :scs (single-reg single-stack fp-immediate)
             :target xmm
-            :load-if (not (sc-is x single-stack fp-single-immediate)))
-         (y :scs (single-reg single-stack fp-single-immediate)
+            :load-if (not (sc-is x single-stack fp-immediate)))
+         (y :scs (single-reg single-stack fp-immediate)
             :target xmm
-            :load-if (not (sc-is y single-stack fp-single-immediate))))
+            :load-if (not (sc-is y single-stack fp-immediate))))
   (:temporary (:sc single-reg :from :eval) xmm)
   (:conditional not :p :ne)
   (:vop-var vop)
@@ -970,13 +970,13 @@
     (sc-case x
       (single-reg (setf xmm x))
       (single-stack (inst movss xmm (ea-for-sf-stack x)))
-      (fp-single-immediate
+      (fp-immediate
        (inst movss xmm (register-inline-constant (tn-value x)))))
     (note-float-location '= vop xmm y)
     (sc-case y
       (single-stack
        (setf y (ea-for-sf-stack y)))
-      (fp-single-immediate
+      (fp-immediate
        (setf y (register-inline-constant (tn-value y))))
       (t))
     (inst comiss xmm y)
@@ -986,12 +986,12 @@
 
 (define-vop (=/double-float double-float-compare)
   (:translate =)
-  (:args (x :scs (double-reg double-stack fp-double-immediate descriptor-reg)
+  (:args (x :scs (double-reg double-stack fp-immediate descriptor-reg)
             :target xmm
-            :load-if (not (sc-is x double-stack fp-double-immediate descriptor-reg)))
-         (y :scs (double-reg double-stack fp-double-immediate descriptor-reg)
+            :load-if (not (sc-is x double-stack fp-immediate descriptor-reg)))
+         (y :scs (double-reg double-stack fp-immediate descriptor-reg)
             :target xmm
-            :load-if (not (sc-is y double-stack fp-double-immediate descriptor-reg))))
+            :load-if (not (sc-is y double-stack fp-immediate descriptor-reg))))
   (:temporary (:sc double-reg :from :eval) xmm)
   (:conditional not :p :ne)
   (:vop-var vop)
@@ -1004,7 +1004,7 @@
        (setf xmm x))
       (double-stack
        (inst movsd xmm (ea-for-df-stack x)))
-      (fp-double-immediate
+      (fp-immediate
        (inst movsd xmm (register-inline-constant (tn-value x))))
       (descriptor-reg
        (inst movsd xmm (ea-for-df-desc x))))
@@ -1012,7 +1012,7 @@
     (sc-case y
       (double-stack
        (setf y (ea-for-df-stack y)))
-      (fp-double-immediate
+      (fp-immediate
        (setf y (register-inline-constant (tn-value y))))
       (descriptor-reg
        (setf y (ea-for-df-desc y)))
@@ -1073,12 +1073,12 @@
                               :load-if (not (sc-is y ,complex-constant-sc))))
                     (:arg-types ,real-type ,complex-type)))))
   (define-complex-float-= =/complex-single-float =/complex-real-single-float =/real-complex-single-float
-    single-reg fp-single-immediate single-float
-    complex-single-reg fp-complex-single-immediate complex-single-float
+    single-reg fp-immediate single-float
+    complex-single-reg fp-immediate complex-single-float
     movss movq cmpps movmskps #b1111)
   (define-complex-float-= =/complex-double-float =/complex-real-double-float =/real-complex-double-float
-    double-reg fp-double-immediate double-float
-    complex-double-reg fp-complex-double-immediate complex-double-float
+    double-reg fp-immediate double-float
+    complex-double-reg fp-immediate complex-double-float
     movsd movapd cmppd movmskpd #b11))
 
 (macrolet ((define (op single-name double-name flags &optional flip)
@@ -1095,7 +1095,7 @@
                        (setf y (ea-for-df-stack y)))
                       (descriptor-reg
                        (setf y (ea-for-df-desc y)))
-                      (fp-double-immediate
+                      (fp-immediate
                        (setf y (register-inline-constant (tn-value y))))
                       ,(if flip
                            `(t
@@ -1112,7 +1112,7 @@
                     (sc-case y
                       (single-stack
                        (setf y (ea-for-sf-stack y)))
-                      (fp-single-immediate
+                      (fp-immediate
                        (setf y (register-inline-constant (tn-value y))))
                       ,(if flip
                            `(t
@@ -1399,10 +1399,10 @@
 
 (define-vop (make-complex-single-float)
   (:translate complex)
-  (:args (real :scs (single-reg (fp-single-immediate
+  (:args (real :scs (single-reg (fp-immediate
                                  (eql (tn-value tn) 0f0)))
                :target r)
-         (imag :scs (single-reg (fp-single-immediate
+         (imag :scs (single-reg (fp-immediate
                                  (eql (tn-value tn) 0f0)))))
   (:arg-types single-float single-float)
   (:results (r :scs (complex-single-reg) :from (:argument 0)))
@@ -1410,24 +1410,24 @@
   (:note "inline complex single-float creation")
   (:policy :fast-safe)
   (:generator 5
-    (cond ((sc-is real fp-single-immediate)
+    (cond ((sc-is real fp-immediate)
            (inst xorps r r)
-           (unless (sc-is imag fp-single-immediate)
+           (unless (sc-is imag fp-immediate)
              (inst unpcklps r imag)))
           ((location= real imag)
            (move r real)
            (inst unpcklps r r))
           (t
            (move r real)
-           (unless (sc-is imag fp-single-immediate)
+           (unless (sc-is imag fp-immediate)
              (inst unpcklps r imag))))))
 
 (define-vop (make-complex-double-float)
   (:translate complex)
-  (:args (real :scs (double-reg (fp-double-immediate
+  (:args (real :scs (double-reg (fp-immediate
                                  (eql (tn-value tn) 0d0)))
                :target r)
-         (imag :scs (double-reg (fp-double-immediate
+         (imag :scs (double-reg (fp-immediate
                                  (eql (tn-value tn) 0d0)))))
   (:arg-types double-float double-float)
   (:results (r :scs (complex-double-reg) :from (:argument 0)))
@@ -1435,16 +1435,16 @@
   (:note "inline complex double-float creation")
   (:policy :fast-safe)
   (:generator 5
-    (cond ((sc-is real fp-double-immediate)
+    (cond ((sc-is real fp-immediate)
            (inst xorpd r r)
-           (unless (sc-is imag fp-double-immediate)
+           (unless (sc-is imag fp-immediate)
              (inst unpcklpd r imag)))
           ((location= real imag)
            (move r real)
            (inst unpcklpd r r))
           (t
            (move r real)
-           (unless (sc-is imag fp-double-immediate)
+           (unless (sc-is imag fp-immediate)
              (inst unpcklpd r imag))))))
 
 (define-vop (complex-float-value)
diff --git a/src/compiler/x86-64/simd-pack-256.lisp b/src/compiler/x86-64/simd-pack-256.lisp
index 5786fa604..e3ca62c76 100644
--- a/src/compiler/x86-64/simd-pack-256.lisp
+++ b/src/compiler/x86-64/simd-pack-256.lisp
@@ -15,10 +15,7 @@
   (ea (frame-byte-offset (+ (tn-offset tn) 3)) base))
 
 (defun float-avx2-p (tn)
-  (sc-is tn single-avx2-reg single-avx2-stack single-avx2-immediate
-            double-avx2-reg double-avx2-stack double-avx2-immediate))
-(defun int-avx2-p (tn)
-  (sc-is tn int-avx2-reg int-avx2-stack int-avx2-immediate))
+  (sc-is tn single-avx2-reg double-avx2-reg single-avx2-stack double-avx2-stack))
 
 #+sb-xc-host
 (progn ; the host compiler will complain about absence of these
@@ -28,7 +25,7 @@
   (defun %simd-pack-256-3 (x) (error "Called %SIMD-PACK-256-3 ~S" x)))
 
 (define-move-fun (load-int-avx2-immediate 1) (vop x y)
-                 ((int-avx2-immediate) (int-avx2-reg))
+                 ((fp-immediate) (int-avx2-reg))
   (let* ((x  (tn-value x))
          (p0 (%simd-pack-256-0 x))
          (p1 (%simd-pack-256-1 x))
@@ -43,7 +40,7 @@
            (inst vmovdqu y (register-inline-constant x))))))
 
 (define-move-fun (load-float-avx2-immediate 1) (vop x y)
-  ((single-avx2-immediate double-avx2-immediate)
+  ((fp-immediate)
    (single-avx2-reg double-avx2-reg))
   (let* ((x  (tn-value x))
          (p0 (%simd-pack-256-0 x))
diff --git a/src/compiler/x86-64/simd-pack.lisp b/src/compiler/x86-64/simd-pack.lisp
index 657c927c6..a9c3a734f 100644
--- a/src/compiler/x86-64/simd-pack.lisp
+++ b/src/compiler/x86-64/simd-pack.lisp
@@ -15,18 +15,15 @@
   (ea (frame-byte-offset (1+ (tn-offset tn))) base))
 
 (defun float-sse-p (tn)
-  (sc-is tn single-sse-reg single-sse-stack single-sse-immediate
-            double-sse-reg double-sse-stack double-sse-immediate))
-(defun int-sse-p (tn)
-  (sc-is tn int-sse-reg int-sse-stack int-sse-immediate))
+  (sc-is tn single-sse-reg single-sse-stack double-sse-reg double-sse-stack))
 
 #+sb-xc-host
 (progn ; the host compiler will complain about absence of these
   (defun %simd-pack-low (x) (error "Called %SIMD-PACK-LOW ~S" x))
   (defun %simd-pack-high (x) (error "Called %SIMD-PACK-HIGH ~S" x)))
 
-(define-move-fun (load-int-sse-immediate 1) (vop x y)
-  ((int-sse-immediate) (int-sse-reg))
+(define-move-fun (load-sse-immediate 1) (vop x y)
+  ((fp-immediate) (int-sse-reg))
   (let* ((x  (tn-value x))
          (lo (%simd-pack-low x))
          (hi (%simd-pack-high x)))
@@ -39,7 +36,7 @@
            (inst movdqa y (register-inline-constant x))))))
 
 (define-move-fun (load-float-sse-immediate 1) (vop x y)
-  ((single-sse-immediate double-sse-immediate)
+  ((fp-immediate)
    (single-sse-reg double-sse-reg))
   (let* ((x  (tn-value x))
          (lo (%simd-pack-low x))
diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp
index 951199d5d..d7ec0296c 100644
--- a/src/compiler/x86-64/vm.lisp
+++ b/src/compiler/x86-64/vm.lisp
@@ -218,17 +218,7 @@
   ;; non-immediate constants in the constant pool
   (constant constant)
 
-  (fp-single-immediate immediate-constant)
-  (fp-double-immediate immediate-constant)
-  (fp-complex-single-immediate immediate-constant)
-  (fp-complex-double-immediate immediate-constant)
-
-  #+sb-simd-pack (int-sse-immediate immediate-constant)
-  #+sb-simd-pack (double-sse-immediate immediate-constant)
-  #+sb-simd-pack (single-sse-immediate immediate-constant)
-  #+sb-simd-pack-256 (int-avx2-immediate immediate-constant)
-  #+sb-simd-pack-256 (double-avx2-immediate immediate-constant)
-  #+sb-simd-pack-256 (single-avx2-immediate immediate-constant)
+  (fp-immediate immediate-constant)
   (immediate immediate-constant)
 
   ;;
@@ -313,26 +303,26 @@
   ;; non-descriptor SINGLE-FLOATs
   (single-reg float-registers
               :locations #.*float-regs*
-              :constant-scs (fp-single-immediate)
+              :constant-scs (fp-immediate)
               :save-p t
               :alternate-scs (single-stack))
 
   ;; non-descriptor DOUBLE-FLOATs
   (double-reg float-registers
               :locations #.*float-regs*
-              :constant-scs (fp-double-immediate)
+              :constant-scs (fp-immediate)
               :save-p t
               :alternate-scs (double-stack))
 
   (complex-single-reg float-registers
                       :locations #.*float-regs*
-                      :constant-scs (fp-complex-single-immediate)
+                      :constant-scs (fp-immediate)
                       :save-p t
                       :alternate-scs (complex-single-stack))
 
   (complex-double-reg float-registers
                       :locations #.*float-regs*
-                      :constant-scs (fp-complex-double-immediate)
+                      :constant-scs (fp-immediate)
                       :save-p t
                       :alternate-scs (complex-double-stack))
 
@@ -344,19 +334,19 @@
   #+sb-simd-pack
   (int-sse-reg float-registers
                :locations #.*float-regs*
-               :constant-scs (int-sse-immediate)
+               :constant-scs (fp-immediate)
                :save-p t
                :alternate-scs (int-sse-stack))
   #+sb-simd-pack
   (double-sse-reg float-registers
                   :locations #.*float-regs*
-                  :constant-scs (double-sse-immediate)
+                  :constant-scs (fp-immediate)
                   :save-p t
                   :alternate-scs (double-sse-stack))
   #+sb-simd-pack
   (single-sse-reg float-registers
                   :locations #.*float-regs*
-                  :constant-scs (single-sse-immediate)
+                  :constant-scs (fp-immediate)
                   :save-p t
                   :alternate-scs (single-sse-stack))
   (ymm-reg float-registers :locations #.*float-regs*)
@@ -365,19 +355,19 @@
   #+sb-simd-pack-256
   (int-avx2-reg float-registers
                :locations #.*float-regs*
-               :constant-scs (int-avx2-immediate)
+               :constant-scs (fp-immediate)
                :save-p t
                :alternate-scs (int-avx2-stack))
   #+sb-simd-pack-256
   (double-avx2-reg float-registers
                   :locations #.*float-regs*
-                  :constant-scs (double-avx2-immediate)
+                  :constant-scs (fp-immediate)
                   :save-p t
                   :alternate-scs (double-avx2-stack))
   #+sb-simd-pack-256
   (single-avx2-reg float-registers
                   :locations #.*float-regs*
-                  :constant-scs (single-avx2-immediate)
+                  :constant-scs (fp-immediate)
                   :save-p t
                   :alternate-scs (single-avx2-stack))
 
@@ -494,14 +484,10 @@
                        (not (sb-c::producing-fasl-file)))))
        immediate-sc-number))
     #+compact-instance-header (layout immediate-sc-number)
-    (single-float
-     fp-single-immediate-sc-number)
-    (double-float
-     fp-double-immediate-sc-number)
-    ((complex single-float)
-     fp-complex-single-immediate-sc-number)
-    ((complex double-float)
-     fp-complex-double-immediate-sc-number)
+    ((or float (complex float)
+         #+(and sb-simd-pack (not sb-xc-host)) simd-pack
+         #+(and sb-simd-pack-256 (not sb-xc-host)) simd-pack-256)
+     fp-immediate-sc-number)
     ;; This case has to follow the numeric cases because proxy floating-point numbers
     ;; are host structs. Or we could implement and use something like SB-XC:TYPECASE
     (structure-object
@@ -514,19 +500,7 @@
                #-sb-xc-host (and (eq (heap-allocated-p value) :static)
                                  (< (get-lisp-obj-address value)
                                     (get-lisp-obj-address sb-lockless:+tail+))))
-       immediate-sc-number))
-    #+(and sb-simd-pack (not sb-xc-host))
-    (simd-pack
-     (typecase value
-       ((simd-pack double-float) double-sse-immediate-sc-number)
-       ((simd-pack single-float) single-sse-immediate-sc-number)
-       (t int-sse-immediate-sc-number)))
-    #+(and sb-simd-pack-256 (not sb-xc-host))
-    (simd-pack-256
-     (typecase value
-       ((simd-pack-256 double-float) double-avx2-immediate-sc-number)
-       ((simd-pack-256 single-float) single-avx2-immediate-sc-number)
-       (t int-avx2-immediate-sc-number)))))
+       immediate-sc-number))))
 
 (defun boxed-immediate-sc-p (sc)
   (eql sc immediate-sc-number))

-----------------------------------------------------------------------


hooks/post-receive
-- 
SBCL