X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fsaptran.lisp;h=19945d2b5e3e0df7501e0a4ed8fd5a60c8b2e830;hb=e981481e65e869a92420616163b2ba3ec68b25d7;hp=ea6b603f0391fe8f5ef668e656b0d8849bade295;hpb=f7e3e709f7c2207f1923375942f7fb1c092f92b0;p=sbcl.git diff --git a/src/compiler/saptran.lisp b/src/compiler/saptran.lisp index ea6b603..19945d2 100644 --- a/src/compiler/saptran.lisp +++ b/src/compiler/saptran.lisp @@ -108,9 +108,8 @@ '(lambda (sap offset1 offset2) (sap+ sap (+ offset1 offset2)))))) -(macrolet ((def (fun element-size &optional setp value-type) - (declare (ignorable value-type) - #!-x86 (ignore element-size)) +(macrolet ((def (fun &optional setp value-type) + (declare (ignorable value-type)) `(progn (deftransform ,fun ((sap offset ,@(when setp `(new-value))) * *) (splice-fun-args sap 'sap+ 2) @@ -137,34 +136,34 @@ (deftransform ,with-offset-fun ((sap offset disp ,@(when setp `(new-value))) * *) (fold-index-addressing ',with-offset-fun - ,element-size + 8 ; all sap-offsets are in bytes 0 ; lowtag 0 ; data offset offset disp ,setp)))))))) - (def sap-ref-8 8) - (def %set-sap-ref-8 8 t (unsigned-byte 8)) - (def signed-sap-ref-8 8) - (def %set-signed-sap-ref-8 8 t (signed-byte 8)) - (def sap-ref-16 16) - (def %set-sap-ref-16 16 t (unsigned-byte 16)) - (def signed-sap-ref-16 16) - (def %set-signed-sap-ref-16 16 t (signed-byte 16)) - (def sap-ref-32 32) - (def %set-sap-ref-32 32 t (unsigned-byte 32)) - (def signed-sap-ref-32 32) - (def %set-signed-sap-ref-32 32 t (signed-byte 32)) - (def sap-ref-64 64) - (def %set-sap-ref-64 64 t (unsigned-byte 64)) - (def signed-sap-ref-64 64) - (def %set-signed-sap-ref-64 64 t (signed-byte 64)) - (def sap-ref-sap sb!vm:n-word-bits) - (def %set-sap-ref-sap sb!vm:n-word-bits t system-area-pointer) - (def sap-ref-single 32) - (def %set-sap-ref-single 32 t single-float) - (def sap-ref-double 64) - (def %set-sap-ref-double 64 t double-float) - #!+long-float (def sap-ref-long 96) - #!+long-float (def %set-sap-ref-long 96 t 8)) + (def sap-ref-8) + (def %set-sap-ref-8 t (unsigned-byte 8)) + (def signed-sap-ref-8) + (def %set-signed-sap-ref-8 t (signed-byte 8)) + (def sap-ref-16) + (def %set-sap-ref-16 t (unsigned-byte 16)) + (def signed-sap-ref-16) + (def %set-signed-sap-ref-16 t (signed-byte 16)) + (def sap-ref-32) + (def %set-sap-ref-32 t (unsigned-byte 32)) + (def signed-sap-ref-32) + (def %set-signed-sap-ref-32 t (signed-byte 32)) + (def sap-ref-64) + (def %set-sap-ref-64 t (unsigned-byte 64)) + (def signed-sap-ref-64) + (def %set-signed-sap-ref-64 t (signed-byte 64)) + (def sap-ref-sap) + (def %set-sap-ref-sap t system-area-pointer) + (def sap-ref-single) + (def %set-sap-ref-single t single-float) + (def sap-ref-double) + (def %set-sap-ref-double t double-float) + #!+long-float (def sap-ref-long) + #!+long-float (def %set-sap-ref-long t long-float)) (macrolet ((def (fun args 32-bit 64-bit) `(deftransform ,fun (,args) @@ -177,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)