X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fsaptran.lisp;h=ed407c8cc06292d2737aa335b27a9345c9da799a;hb=95591ed483dbb8c0846c129953acac1554f28809;hp=066572ea3ff1678e0fd8e56a16d55f2b065d1b8f;hpb=7d10bcf57926aa6709eeb2e09ca447af9e96f141;p=sbcl.git diff --git a/src/compiler/saptran.lisp b/src/compiler/saptran.lisp index 066572e..ed407c8 100644 --- a/src/compiler/saptran.lisp +++ b/src/compiler/saptran.lisp @@ -176,3 +176,48 @@ %set-sap-ref-32 %set-sap-ref-64) (def %set-signed-sap-ref-word (sap offset value) %set-signed-sap-ref-32 %set-signed-sap-ref-64)) + +;;; Transforms for 64-bit SAP accessors on 32-bit platforms. + +#!+#.(cl:if (cl:= 32 sb!vm:n-machine-word-bits) '(and) '(or)) +(progn +#!+#.(cl:if (cl:eq :little-endian sb!c:*backend-byte-order*) '(and) '(or)) +(progn + (deftransform sap-ref-64 ((sap offset) (* *)) + '(logior (sap-ref-32 sap offset) + (ash (sap-ref-32 sap (+ offset 4)) 32))) + + (deftransform signed-sap-ref-64 ((sap offset) (* *)) + '(logior (sap-ref-32 sap offset) + (ash (signed-sap-ref-32 sap (+ offset 4)) 32))) + + (deftransform %set-sap-ref-64 ((sap offset value) (* * *)) + '(progn + (%set-sap-ref-32 sap offset (logand value #xffffffff)) + (%set-sap-ref-32 sap (+ offset 4) (ash value -32)))) + + (deftransform %set-signed-sap-ref-64 ((sap offset value) (* * *)) + '(progn + (%set-sap-ref-32 sap offset (logand value #xffffffff)) + (%set-signed-sap-ref-32 sap (+ offset 4) (ash value -32))))) + +#!+#.(cl:if (cl:eq :big-endian sb!c:*backend-byte-order*) '(and) '(or)) +(progn + (deftransform sap-ref-64 ((sap offset) (* *)) + '(logior (ash (sap-ref-32 sap offset) 32) + (sap-ref-32 sap (+ offset 4)))) + + (deftransform signed-sap-ref-64 ((sap offset) (* *)) + '(logior (ash (signed-sap-ref-32 sap offset) 32) + (sap-ref-32 sap (+ 4 offset)))) + + (deftransform %set-sap-ref-64 ((sap offset value) (* * *)) + '(progn + (%set-sap-ref-32 sap offset (ash value -32)) + (%set-sap-ref-32 sap (+ offset 4) (logand value #xffffffff)))) + + (deftransform %set-signed-sap-ref-64 ((sap offset value) (* * *)) + '(progn + (%set-signed-sap-ref-32 sap offset (ash value -32)) + (%set-sap-ref-32 sap (+ 4 offset) (logand value #xffffffff))))) +) ; (= 32 SB!VM:N-MACHINE-WORD-BITS)