From dc8b80d67a9dc0eddeabd29415460ea86828b01c Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Sun, 3 Mar 2024 20:29:45 -0500 Subject: [PATCH] ppc64: enable #+salted-symbol-hash --- crossbuild-runner/backends/ppc64/features | 1 + src/code/cross-sxhash.lisp | 4 +- src/compiler/ppc64/cell.lisp | 30 +++++++- xfloat-math.lisp-expr | 8 ++ xperfecthash61.lisp-expr | 92 +++++++++++++++++++++++ 5 files changed, 131 insertions(+), 4 deletions(-) diff --git a/crossbuild-runner/backends/ppc64/features b/crossbuild-runner/backends/ppc64/features index 6742c14b0..5836013d5 100644 --- a/crossbuild-runner/backends/ppc64/features +++ b/crossbuild-runner/backends/ppc64/features @@ -3,3 +3,4 @@ :64-bit :untagged-fdefns :sb-thread :soft-card-marks :gencgc :compare-and-swap-vops :alien-callbacks +:salted-symbol-hash diff --git a/src/code/cross-sxhash.lisp b/src/code/cross-sxhash.lisp index 64f8708a2..7efa20fa0 100644 --- a/src/code/cross-sxhash.lisp +++ b/src/code/cross-sxhash.lisp @@ -68,8 +68,8 @@ (assert (= length (length string))) (cond #+64-bit ((string= string "NIL") ; :NIL must hash the same as NIL - #+x86-64 0 ; return the high 4 bytes in NIL's car slot - #-x86-64 + #+salted-symbol-hash 0 ; return the high 4 bytes in NIL's car slot + #-salted-symbol-hash ;; out-of-order with defconstant nil-value (ash (sb-vm::get-nil-taggedptr) (- sb-vm:n-fixnum-tag-bits))) (t diff --git a/src/compiler/ppc64/cell.lisp b/src/compiler/ppc64/cell.lisp index 835c3a6b2..a45399cbb 100644 --- a/src/compiler/ppc64/cell.lisp +++ b/src/compiler/ppc64/cell.lisp @@ -272,23 +272,49 @@ (inst b? (if not-p :eq :ne) target) OUT)) +;;; The lowtag arrangement for ppc64 does *NOT* permit accessing +;;; slots of NIL as a symbol. Therefore since it has to be special-cased +;;; there's no reason that NIL couldn't always have had a wired hash. +;;; It doesn't depend on 4 bytes of NIL's address being 0. (define-vop (symbol-hash) (:policy :fast-safe) (:translate symbol-hash) (:args (symbol :scs (descriptor-reg))) - (:results (res :scs (any-reg))) + (:results (res :scs (unsigned-reg))) (:result-types positive-fixnum) (:arg-refs args) (:generator 4 (when (not-nil-tn-ref-p args) (loadw res symbol symbol-hash-slot other-pointer-lowtag) + (inst srdi res res 24) ; shift out 3 bytes (return-from symbol-hash)) (inst cmpld symbol null-tn) (inst beq NULL) (loadw res symbol symbol-hash-slot other-pointer-lowtag) + (inst srdi res res 24) ; shift out 3 bytes (inst b DONE) NULL - (inst addi res null-tn (- (logand sb-vm:nil-value sb-vm:fixnum-tag-mask))) + (inst li res 0) ; the salt may as well have been zero + DONE)) +(define-vop (symbol-name-hash) + (:policy :fast-safe) + (:translate symbol-name-hash) + (:args (symbol :scs (descriptor-reg))) + (:results (res :scs (unsigned-reg))) + (:result-types positive-fixnum) + (:arg-refs args) + (:generator 4 + (when (not-nil-tn-ref-p args) + (loadw res symbol symbol-hash-slot other-pointer-lowtag) + (inst srdi res res 32) ; shift out 4 bytes + (return-from symbol-name-hash)) + (inst cmpld symbol null-tn) + (inst beq NULL) + (loadw res symbol symbol-hash-slot other-pointer-lowtag) + (inst srdi res res 32) ; shift out 4 bytes + (inst b DONE) + NULL + (inst li res 0) DONE)) ;;;; Fdefinition (fdefn) objects. diff --git a/xfloat-math.lisp-expr b/xfloat-math.lisp-expr index e830a4866..19b33a5c9 100644 --- a/xfloat-math.lisp-expr +++ b/xfloat-math.lisp-expr @@ -1016,6 +1016,7 @@ (< (0 #.(D #x401C0000 0)) T) (< (0 #.(D #x40200000 0)) T) (< (0 #.(D #x40400000 0)) T) +(< (0 #.(D #x4130FFFF 0)) T) (< (0 #.(D #x41BFFFFF #xFFFFFFFF)) T) (< (0 #.(D #x41CFFFFF #xFC000000)) T) (< (0 #.(D #x41D921FB #x537B1D3D)) T) @@ -3249,6 +3250,7 @@ (<= (0 #.(D #x40400000 0)) T) (<= (0 #.(D #x4083BA09 #xA84FBD00)) T) (<= (0 #.(D #x4083BA73 #x2107A1BA)) T) +(<= (0 #.(D #x4130FFFF 0)) T) (<= (0 #.(D #x41BFFFFF #xFF000000)) T) (<= (0 #.(D #x41BFFFFF #xFFFFFFFF)) T) (<= (0 #.(D #x41C00000 0)) T) @@ -3762,6 +3764,7 @@ (<= (1114063 #.(S #x7F7FFFFF)) T) (<= (1114063 #.(D #x7FEFFFFF #xFFFFFFFF)) T) (<= (1114111 #.(S #x7F7FFFFF)) T) +(<= (1114111 #.(D 0 0)) NIL) (<= (1114111 #.(D #x7FEFFFFF #xFFFFFFFF)) T) (<= (1114112 #.(S #x7F7FFFFF)) T) (<= (1114112 #.(D #x7FEFFFFF #xFFFFFFFF)) T) @@ -8359,6 +8362,7 @@ (<= (#.(D #x4130FFC8 0) #.(D #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(D #x4130FFCF 0) #.(D #x7FEFFFFF #xFFFFFFFF)) T) (<= (#.(D #x4130FFFE 0) #.(D #x7FEFFFFF #xFFFFFFFF)) T) +(<= (#.(D #x4130FFFF 0) 0) NIL) (<= (#.(D #x4130FFFF 0) #.(D 0 0)) NIL) (<= (#.(D #x4130FFFF 0) #.(D #x4130FFFF 0)) T) (<= (#.(D #x4130FFFF 0) #.(D #x7FEFFFFF #xFFFFFFFF)) T) @@ -10987,6 +10991,7 @@ (= (0 #.(D #x40080000 0)) NIL) (= (0 #.(D #x40180000 0)) NIL) (= (0 #.(D #x40380000 0)) NIL) +(= (0 #.(D #x4130FFFF 0)) NIL) (= (0 #.(D #x43C00000 0)) NIL) (= (0 #.(D #x43E00000 0)) NIL) (= (0 #.(D #x43F00000 0)) NIL) @@ -11133,6 +11138,7 @@ (= (16384 #.(D #x40D00000 0)) T) (= (65535 #.(D 0 0)) NIL) (= (65535 #.(D #x40EFFFE0 0)) T) +(= (1114111 #.(D 0 0)) NIL) (= (1114111 #.(D #x4130FFFF 0)) T) (= (1114112 #.(D #x41310000 0)) T) (= (16777216 #.(D #x-38100001 #xE0000000)) NIL) @@ -12973,6 +12979,7 @@ (> (8277 #.(D #x40C02A80 0)) NIL) (> (32767 #.(D #x-3F200000 0)) T) (> (65535 #.(D 0 0)) T) +(> (1114111 #.(D 0 0)) T) (> (16777216 #.(D #x-38100001 #xE0000000)) T) (> (536870906 #.(D #x3FF00000 0)) T) (> (536870907 #.(D #x3FF00000 0)) T) @@ -15049,6 +15056,7 @@ (> (#.(D #x412C0100 0) #.(D #x412C01FE 0)) NIL) (> (#.(D #x412C03E0 0) #.(D #x412C1FFE 0)) NIL) (> (#.(D #x412FFFFE 0) #.(D 0 0)) T) +(> (#.(D #x4130FFFF 0) 0) T) (> (#.(D #x4130FFFF 0) 1114111) NIL) (> (#.(D #x4130FFFF 0) #.(S #x4987FFF8)) NIL) (> (#.(D #x4130FFFF 0) #.(D 0 0)) T) diff --git a/xperfecthash61.lisp-expr b/xperfecthash61.lisp-expr index befee65af..6802351d1 100644 --- a/xperfecthash61.lisp-expr +++ b/xperfecthash61.lisp-expr @@ -1470,5 +1470,97 @@ (let ((b (& val #x7))) (let ((a (>> val 29))) (^ a (aref tab b))))))") +(#(0 7980B71D 7C678985 CD22F006) + "(NIL BASE-CHAR CHARACTER *)" + "( (& (+ val (>> val 6)) 3) )") +(#(0 10ACE44E 74748736 971A1DF1) + "(NIL FLOAT RATIONAL INTEGER)" + "( (& (>> val 5) 3) )") +(#(0 E022967D FB685091 FF5AE652) + "(NIL :HEAD :TAIL :BOTH)" + "( (& (>> val 14) 3) )") +(#(0 905F66AC 92586CF4 9D5025AF) + "(:SPECIAL-FORM :MACRO :FUNCTION NIL)" + "( (& (+ val (>> val 2)) 3) )") +(#(0 19627350 3932B57B C3C1E2DD) + "(NIL NOTINLINE MAYBE-INLINE INLINE)" + "( (& (>> val 8) 3) )") +(#(0 12D85B02 47ED28C7 568510D9 EC8EB822) + "(NIL :FORTHCOMING-DEFCLASS-TYPE :INSTANCE :DEFINED :PRIMITIVE)" + "( (& (^ (>> val 1) (>> val 8)) 7))") +(#(0 55E45869 62971997 8F406FFB) + "(:AUTO :IMMOBILE :DYNAMIC NIL)" + "( (& (>> val 3) 3) )") +(#(0 3C28E423 6610551C A1DFDD0E A55DBD6F) + "(:DELETED :INITIAL :COMPLEX-TOPLEVEL :TOPLEVEL NIL)" + "( (& (^ val (>> val 16)) 7))") +(#(0 8D87477C C8A25DB2 F987A176) + "(SB-C::INITIAL-UNUSED T SET NIL)" + "( (& (>> val 1) 3) )") +(#(0 83A45D5A 90B78E0C C8A25DB2) + "(:COMPUTE-ONLY :FORCE-TO-STACK NIL T)" + "( (& (>> val 3) 3) )") +(#(0 519DD3CE 55B0F9E6 70E7C178 92E00046) + "(:FIXED :KNOWN-RETURN :LOCAL-CALL :FULL-CALL NIL)" + "( (& (+ (>> val 1) (>> val 11)) 7))") +(#(0 10ACE44E 2CFE05E6 3539E037 372E43BC 652FED0C 7C31AE8F 7C678985 965CD62A A0FAB3A5 B64902BB B6EC8FEB C8A25DB2 CD22F006 + FF5C21D6) + "(T BASE-CHAR STANDARD-CHAR CHARACTER EXTENDED-CHAR BIT FIXNUM UNSIGNED-BYTE SIGNED-BYTE DOUBLE-FLOAT SINGLE-FLOAT MOD INTEGER COMPLEX NIL)" + "((let ((tab #a((8) (unsigned-byte 8) 13 2 0 5 12 0 5 14))) + (let ((b (& (>> val 19) #x7))) + (let ((a (>> (<< val 5) 29))) + (^ a (aref tab b))))))") +(#(0 70CB34EE A74C4D40 E29480A8 FF414202) + "(NIL LIST CONS VECTOR SIMPLE-VECTOR)" + "( (& (- (>> val 1) (>> val 6)) 7))") +(#(0 60574E06 7BC3707A 7F9752D2) + "(:UNSPECIFIC :WILD :NEWEST NIL)" + "( (& (>> val 22) 3) )") +(#(0 60574E06 7F9752D2 ED8B5226) + "(:UNC :WILD :UNSPECIFIC NIL)" + "( (& (+ val (>> val 24)) 3) )") +(#(0 47ED28C7 7980B71D A4323F41 AE780BE9 C8A25DB2) + "(T * INSTANCE FUNCALLABLE-INSTANCE EXTENDED-SEQUENCE NIL)" + "( (& (+ (>> val 1) (>> val 27)) 7))") +(#(0 7A03BEDF 8E8B60F0 9D81B113 D8C1EE02 FBADBE01) + "(:NAMED :PREDICATE :COPIER :CONSTRUCTOR :CONC-NAME NIL)" + "( (& (^ (>> val 1) (>> val 7)) 7))") +(#(0 42F9EC4F 52ECC4FA 53C6AF8C 546D436A D9F0FE17 E77DD8CF) + "(:NEW-VERSION :ERROR NIL :RENAME :RENAME-AND-DELETE :SUPERSEDE :APPEND)" + "( (& (^ (>> val 4) (>> val 13)) 7))") +(#(0 3E421619 42F9EC4F 52ECC4FA 53C6AF8C 546D436A D9F0FE17 E77DD8CF) + "(NIL :SUPERSEDE :APPEND :OVERWRITE :RENAME-AND-DELETE :RENAME :NEW-VERSION :ERROR)" + "( (& (- (>> val 2) (>> val 18)) 7))") +(#(0 12D65FF7 15802369 2F5FD56F 63E7A20E 6FC25D49 804A5D47 9B65AE2D A31AF97E B21914BD CD29540C D278DEA5 E6794721 E67AD41E + E9E52992 EBF9DC24 EFFEC71A FEA15FC4) + "#(:BO-DNZF :BO-DNZFP :BO-DZF :BO-DZFP :BO-F :BO-FP NIL NIL :BO-DNZT :BO-DNZTP :BO-DZT :BO-DZTP :BO-T :BO-TP NIL NIL :BO-DNZ :BO-DNZP :BO-DZ :BO-DZP :BO-U NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)" + "((let ((tab #a((16) (unsigned-byte 8) 0 1 7 0 13 0 0 0 0 13 31 0 8 12 0 18))) + (let ((b (& val #xf))) + (let ((a (>> val 28))) + (^ a (aref tab b))))))") +(#(0 3A909AC4 598548A9 75138050 BCDBA900 F4C5E7A1) + "(:LOAD-NARGS :COMP-LRA :FROB-NFP :SAVE-FP :LOAD-FP NIL)" + "( (& (+ (>> val 4) (>> val 31)) 7))") +(#(0 385ABA4 3A909AC4 67175F5F 75138050) + "(:LOAD-NARGS :LOAD-OLD-FP :LOAD-RETURN-PC :FROB-NFP NIL)" + "( (& (^ (>> val 3) (>> val 20)) 7))") +(#(0 B414EE0 3B3832EC A256D8C6 E3479BD2) + "(:KEY-OR-VALUE :KEY-AND-VALUE :VALUE :KEY NIL)" + "( (& (+ (>> val 1) (>> val 26)) 7))") +(#(0 50EDFBF1 6C16ABD3 AC25889A E8DC3557) + "(EQ EQL EQUAL EQUALP NIL)" + "( (& (^ (>> val 2) (>> val 13)) 7))") +(#(0 C07E71ED E022967D E41ED3F1) + "(NIL :STRINGS :BOTH :SYMBOLS)" + "( (& (>> val 3) 3) )") +(#(0 90EDB7B 1FDE90F6 25164A63 50F5AB12 B800E558 C3EABF48) + "(NIL :HOST :DEVICE :DIRECTORY :NAME :TYPE :VERSION)" + "( (& (>> val 12) 7))") +(#(0 3D6EC19 326CF299 3A1DA026 8CD5B89F 92586CF4 A048B3D2 B7DA6CE4 EB29C836 F987A176) + "(EVAL FUNCTION SB-WALKER::TEST SB-WALKER::EFFECT RETURN QUOTE NIL SET LAMBDA SB-WALKER::CALL)" + "((let ((tab #a((8) (unsigned-byte 8) 8 5 4 0 2 0 0 13))) + (let ((b (& val #x7))) + (let ((a (>> (<< val 5) 29))) + (^ a (aref tab b))))))") ) ;; EOF