Changeset 7222


Ignore:
Timestamp:
Sep 14, 2007, 9:55:41 PM (12 years ago)
Author:
rme
Message:

Use :$self instead of :self; add some more vinsns.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp

    r7133 r7222  
    174174  (movsd (:%xmm val) (:@ (:apply + x8632::misc-dfloat-offset (:apply ash idx 3)) (:%l v))))
    175175
    176 ;;; XXX need to work out dealing with :self in vinsns
    177176(define-x8632-vinsn (call-known-symbol :call) (((result (:lisp x8632::arg_z)))
    178177                                               ()
     
    180179  (:talign x8632::fulltag-tra)
    181180  (call (:@ x8632::symbol.fcell (:% x8632::fname)))
    182   (movl (:self) (:%l x8632::fn)))
     181  (movl (:$self 0) (:%l x8632::fn)))
     182
     183(define-x8632-vinsn (jump-known-symbol :jumplr) (()
     184                                                 ())
     185
     186  (jmp (:@ x8632::symbol.fcell (:% x8632::fname))))
    183187
    184188(define-x8632-vinsn set-nargs (()
     
    600604  (andw (:$w (ash x8632::fulltagmask x8632::fixnumshift)) (:%w tag)))
    601605
    602 (define-x8632-vinsn extract-typecode (((tag :u32))
     606(define-x8632-vinsn extract-typecode (((tag :imm))
    603607                                      ((object :lisp)))
    604608  (movl (:%l object) (:%l tag))
    605   (andw (:$w x8632::tagmask) (:%w tag))
    606   (cmpw (:$w x8632::tag-misc) (:%w tag))
     609  ((:pred <= (:apply  %hard-regspec-value tag) x8632::ebx)
     610   (andb (:$b x8632::tagmask) (:%b tag))
     611   (cmpb (:$b x8632::tag-misc) (:%b tag)))
     612  ((:pred > (:apply  %hard-regspec-value tag) x8632::ebx)
     613   (andl (:$l x8632::tagmask) (:%l tag))
     614   (cmpl (:$l x8632::tag-misc) (:%l tag)))
    607615  (jne :have-tag)
    608616  ((:pred <= (:apply  %hard-regspec-value tag) x8632::ebx)
    609617   (movb (:@ x8632::misc-subtag-offset (:%l object)) (:%b tag)))
    610618  ((:pred > (:apply %hard-regspec-value tag) x8632::ebx)
    611    (movw (:@ x8632::misc-subtag-offset (:%l object)) (:%w tag)))
     619   (movl (:@ x8632::misc-subtag-offset (:%l object)) (:%l tag)))
    612620  :have-tag)
    613621
     
    664672(define-x8632-vinsn cons (((dest :lisp))
    665673                          ((car :lisp)
    666                            (cdr :lisp)))
     674                           (cdr :lisp))
     675                          ((allocptr (:lisp #.x8632::allocptr))))
    667676  (subl (:$b (- x8632::cons.size x8632::fulltag-cons)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
    668677  (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (:%l x8632::allocptr))
     
    829838  (:talign x8632::fulltag-tra)
    830839  (call (:@ spno))
    831   (movl (:self) (:% x8632::fn)))
     840  (movl (:$self 0) (:% x8632::fn)))
    832841
    833842(define-x8632-vinsn fixnum-subtract-from (((dest t)
     
    882891  (negl (:% val)))
    883892
     893;;; set-bigits-and-header-for-fixnum-overflow
     894
     895(define-x8632-vinsn %set-z-flag-if-s32-fits-in-fixnum (((dest :imm))
     896                                                       ((src :s32))
     897                                                       ((temp :s32)))
     898  (movl (:%l src) (:%l temp))
     899  (shll (:$ub x8632::fixnumshift) (:%l temp))
     900  (movl (:%l temp) (:%l dest))          ; tagged as a fixnum
     901  (sarl (:$ub x8632::fixnumshift) (:%l temp))
     902  (cmpl (:%l src) (:%l temp)))
     903
     904(define-x8632-vinsn %set-z-flag-if-u32-fits-in-fixnum (((dest :imm))
     905                                                       ((src :u32))
     906                                                       ((temp :u32)))
     907  (movl (:%l src) (:%l temp))
     908  (shll (:$ub (1+ x8632::fixnumshift)) (:%l temp))
     909  (movl (:%l temp) (:%l dest))          ; tagged as an even fixnum
     910  (shrl (:$ub (1+ x8632::fixnumshift)) (:%l temp))
     911  (shrl (:%l dest))
     912  (cmpl (:%l src) (:%l temp))
     913  :done)
     914
     915;;; setup-bignum-alloc-for-s32-overflow
     916;;; setup-bignum-alloc-for-u32-overflow
     917
     918;;; the uuo-alloc code looks at these exact registers
     919;;; header and size are actually args, not temporaries,
     920;;; but it appears that there's isn't a way to enforce
     921;;; register usage on vinsn args.
     922;; (define-x832-vinsn %allocate-uvector (((dest :lisp))
     923;;                                    ()
     924;;                                    ((header (:u32 #.x8632::eax))
     925;;                                     (size (:u32 #.x8632::edx))
     926;;                                     (freeptr (:lisp #.x8632::allocptr))))
     927;;   (subl (:%l size) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
     928;;   (movl (:@ (:%seg :rcontext) x8632::tcr.save-allocptr) (%l freeptr))
     929;;   (rcmpl (:%l freeptr) (:@ (:%seg :rcontext) x8632::tcr.save-allocbase))
     930;;   (jg :no-trap)
     931;;   (uuo-alloc)
     932;;   :no-trap
     933;;   (movl (:%l header) (:@ x8632::misc-header-offset (:%l freeptr)))
     934;;   (andb (:$b (lognot x8632::fulltagmask)) (:@ (:%seg :rcontext) x8632::tcr.save-allocptr))
     935;;   ((:not (:pred = freeptr
     936;;              (:apply %hard-regspec-value dest)))
     937;;    (movl (:%l freeptr) (%l dest))))
     938
     939(define-x8632-vinsn set-bigits-after-fixnum-overflow (()
     940                                                      ((bignum :lisp)))
     941  (movq (:%mmx x8664::mm0) (:@ x8632::misc-data-offset (:%l bignum))))
     942 
     943(define-x8632-vinsn box-fixnum (((dest :imm))
     944                                ((src :s32)))
     945  ;;(imull (:$b x8632::fixnumone) (:%l src) (:%l dest))
     946  (leal (:@ (:%l src) x8632::fixnumone) (:%l dest)))
     947
     948;;; fix-fixnum-overflow-ool
     949;;; fix-fixnum-overflow-ool-and-branch
     950
     951(define-x8632-vinsn (fix-fixnum-overflow-ool-and-branch :call)
     952    (((val :lisp))
     953     ((val :lisp)
     954      (lab :label))
     955     ((unboxed (:s32 #.x8664::imm1))
     956      (header (:u32 #.x8664::imm0))
     957      (entry (:label 1))))
     958  (jno.pt lab)
     959  ((:not (:pred = x8632::arg_z
     960                (:apply %hard-regspec-value val)))
     961   (movl (:%l val) (:%l x8632::arg_z)))
     962  (:talign 5)
     963  (call (:@ .SPfix-overflow))
     964  (movl (:$self 0) (:%l x8632::fn))
     965  ((:not (:pred = x8632::arg_z
     966                (:apply %hard-regspec-value val)))
     967   (movl (:%l x8632::arg_z) (:%l val)))
     968  (jmp lab))
     969
     970
     971(define-x8632-vinsn add-constant (((dest :imm))
     972                                  ((dest :imm)
     973                                   (const :s32const)))
     974  ((:and (:pred >= const -128) (:pred <= const 127))
     975   (addl (:$b const) (:%l dest)))
     976  ((:not (:and (:pred >= const -128) (:pred <= const 127)))
     977   (addl (:$l const) (:%l dest))))
     978
     979(define-x8632-vinsn add-constant3 (((dest :imm))
     980                                   ((src :imm)
     981                                    (const :s32const)))
     982  ((:pred = (:apply %hard-regspec-value dest)
     983          (:apply %hard-regspec-value src))
     984   ((:and (:pred >= const -128) (:pred <= const 127))
     985    (addl (:$b const) (:%l dest)))
     986   ((:not (:and (:pred >= const -128) (:pred <= const 127)))
     987    (addl (:$l const) (:%l dest))))
     988  ((:not (:pred = (:apply %hard-regspec-value dest)
     989                (:apply %hard-regspec-value src)))
     990   (leal (:@ const (:%l src)) (:%l dest))))
     991
     992(define-x8632-vinsn fixnum-add2  (((dest :imm))
     993                                  ((dest :imm)
     994                                   (other :imm)))
     995  (addl (:%l other) (:%l dest)))
     996
     997(define-x8632-vinsn fixnum-sub2  (((dest :imm))
     998                                  ((x :imm)
     999                                   (y :imm))
     1000                                  ((temp :imm)))
     1001  (movl (:%l x) (:%l temp))
     1002  (subl (:%l y) (:%l temp))
     1003  (movl (:%l temp) (:%l dest)))
     1004
     1005(define-x8632-vinsn fixnum-add3 (((dest :imm))
     1006                                 ((x :imm)
     1007                                  (y :imm)))
     1008 
     1009  ((:pred =
     1010          (:apply %hard-regspec-value x)
     1011          (:apply %hard-regspec-value dest))
     1012   (addl (:%l y) (:%l dest)))
     1013  ((:not (:pred =
     1014                (:apply %hard-regspec-value x)
     1015                (:apply %hard-regspec-value dest)))
     1016   ((:pred =
     1017           (:apply %hard-regspec-value y)
     1018           (:apply %hard-regspec-value dest))
     1019    (addl (:%l x) (:%l dest)))
     1020   ((:not (:pred =
     1021                 (:apply %hard-regspec-value y)
     1022                 (:apply %hard-regspec-value dest)))
     1023    (leal (:@ (:%l x) (:%l y)) (:%l dest)))))
     1024
     1025(define-x8632-vinsn copy-gpr (((dest t))
     1026                              ((src t)))
     1027  ((:not (:pred =
     1028                (:apply %hard-regspec-value dest)
     1029                (:apply %hard-regspec-value src)))
     1030   (movl (:%l src) (:%l dest))))
     1031
     1032(define-x8632-vinsn (vpop-register :pop :node :vsp)
     1033    (((dest :lisp))
     1034     ())
     1035  (popl (:%l dest)))
     1036
     1037(define-x8632-vinsn (push-argregs :push :node :vsp) (()
     1038                                                      ())
     1039  (rcmpw (:%w x8632::nargs) (:$w (* 1 x8632::node-size)))
     1040  (jb :done)
     1041  (je :one)
     1042  (pushl (:%l x8632::arg_y))
     1043  :one
     1044  (pushl (:%l x8632::arg_z))
     1045  :done)
     1046
     1047(define-x8632-vinsn (push-max-argregs :push :node :vsp) (()
     1048                                                         ((max :u32const)))
     1049  ((:pred >= max 2)
     1050   (rcmpw (:%w x8632::nargs) (:$w (* 1 x8632::node-size)))
     1051   (jb :done)
     1052   (je :one)
     1053   (pushl (:%l x8632::arg_y))
     1054   :one
     1055   (pushl (:%l x8632::arg_z))
     1056   :done)
     1057  ((:pred = max 1)
     1058   (testw (:%w x8632::nargs) (:%w x8632::nargs))
     1059   (je :done)
     1060   (pushl (:%l x8632::arg_z))
     1061   :done))
     1062
     1063(define-x8632-vinsn (call-label :call) (()
     1064                                        ((label :label))
     1065                                        ((entry (:label 1))))
     1066  (:talign 5)
     1067  (call label)
     1068  (movl (:$self 0) (:%l x8632::fn)))
     1069
     1070(define-x8632-vinsn double-float-compare (()
     1071                                          ((arg0 :double-float)
     1072                                           (arg1 :double-float)))
     1073  (comisd (:%xmm arg1) (:%xmm arg0)))
     1074
     1075(define-x8632-vinsn single-float-compare (()
     1076                                          ((arg0 :single-float)
     1077                                           (arg1 :single-float)))
     1078  (comiss (:%xmm arg1) (:%xmm arg0)))
     1079
     1080(define-x8632-vinsn double-float+-2 (((result :double-float))
     1081                                     ((x :double-float)
     1082                                      (y :double-float)))
     1083  ((:pred =
     1084          (:apply %hard-regspec-value result)
     1085          (:apply %hard-regspec-value x))
     1086   (addsd (:%xmm y) (:%xmm result)))
     1087  ((:and (:not (:pred =
     1088                      (:apply %hard-regspec-value result)
     1089                      (:apply %hard-regspec-value x)))
     1090         (:pred =
     1091                (:apply %hard-regspec-value result)
     1092                (:apply %hard-regspec-value y)))
     1093   (addsd (:%xmm x) (:%xmm result)))
     1094  ((:and (:not (:pred =
     1095                      (:apply %hard-regspec-value result)
     1096                      (:apply %hard-regspec-value x)))
     1097         (:not (:pred =
     1098                      (:apply %hard-regspec-value result)
     1099                      (:apply %hard-regspec-value y))))
     1100   (movsd (:%xmm x) (:%xmm result))
     1101   (addsd (:%xmm y) (:%xmm result))))
     1102
     1103;;; Caller guarantees (not (eq y result))
     1104(define-x8632-vinsn double-float--2 (((result :double-float))
     1105                                     ((x :double-float)
     1106                                      (y :double-float)))
     1107  ((:not (:pred = (:apply %hard-regspec-value result)
     1108                (:apply %hard-regspec-value x)))
     1109   (movsd (:%xmm x) (:%xmm result)))
     1110  (subsd (:%xmm y) (:%xmm result)))
     1111
     1112(define-x8632-vinsn double-float*-2 (((result :double-float))
     1113                                     ((x :double-float)
     1114                                      (y :double-float)))
     1115  ((:pred =
     1116          (:apply %hard-regspec-value result)
     1117          (:apply %hard-regspec-value x))
     1118   (mulsd (:%xmm y) (:%xmm result)))
     1119  ((:and (:not (:pred =
     1120                      (:apply %hard-regspec-value result)
     1121                      (:apply %hard-regspec-value x)))
     1122         (:pred =
     1123                (:apply %hard-regspec-value result)
     1124                (:apply %hard-regspec-value y)))
     1125   (mulsd (:%xmm x) (:%xmm result)))
     1126  ((:and (:not (:pred =
     1127                      (:apply %hard-regspec-value result)
     1128                      (:apply %hard-regspec-value x)))
     1129         (:not (:pred =
     1130                      (:apply %hard-regspec-value result)
     1131                      (:apply %hard-regspec-value y))))
     1132   (movsd (:%xmm x) (:%xmm result))
     1133   (mulsd (:%xmm y) (:%xmm result))))
     1134
     1135;;; Caller guarantees (not (eq y result))
     1136(define-x8632-vinsn double-float/-2 (((result :double-float))
     1137                                     ((x :double-float)
     1138                                      (y :double-float)))
     1139  ((:not (:pred = (:apply %hard-regspec-value result)
     1140                (:apply %hard-regspec-value x)))
     1141   (movsd (:%xmm x) (:%xmm result)))
     1142  (divsd (:%xmm y) (:%xmm result)))
     1143
     1144(define-x8632-vinsn single-float+-2 (((result :single-float))
     1145                                     ((x :single-float)
     1146                                      (y :single-float)))
     1147  ((:pred =
     1148          (:apply %hard-regspec-value result)
     1149          (:apply %hard-regspec-value x))
     1150   (addss (:%xmm y) (:%xmm result)))
     1151  ((:and (:not (:pred =
     1152                      (:apply %hard-regspec-value result)
     1153                      (:apply %hard-regspec-value x)))
     1154         (:pred =
     1155                (:apply %hard-regspec-value result)
     1156                (:apply %hard-regspec-value y)))
     1157   (addss (:%xmm x) (:%xmm result)))
     1158  ((:and (:not (:pred =
     1159                      (:apply %hard-regspec-value result)
     1160                      (:apply %hard-regspec-value x)))
     1161         (:not (:pred =
     1162                      (:apply %hard-regspec-value result)
     1163                      (:apply %hard-regspec-value y))))
     1164   (movss (:%xmm x) (:%xmm result))
     1165   (addss (:%xmm y) (:%xmm result))))
     1166
     1167;;; Caller guarantees (not (eq y result))
     1168(define-x8632-vinsn single-float--2 (((result :single-float))
     1169                                     ((x :single-float)
     1170                                      (y :single-float)))
     1171  ((:not (:pred = (:apply %hard-regspec-value result)
     1172                (:apply %hard-regspec-value x)))
     1173   (movss (:%xmm x) (:%xmm result)))
     1174  (subss (:%xmm y) (:%xmm result)))
     1175
     1176(define-x8632-vinsn single-float*-2 (((result :single-float))
     1177                                     ((x :single-float)
     1178                                      (y :single-float)))
     1179    ((:pred =
     1180          (:apply %hard-regspec-value result)
     1181          (:apply %hard-regspec-value x))
     1182   (mulss (:%xmm y) (:%xmm result)))
     1183  ((:and (:not (:pred =
     1184                      (:apply %hard-regspec-value result)
     1185                      (:apply %hard-regspec-value x)))
     1186         (:pred =
     1187                (:apply %hard-regspec-value result)
     1188                (:apply %hard-regspec-value y)))
     1189   (mulss (:%xmm x) (:%xmm result)))
     1190  ((:and (:not (:pred =
     1191                      (:apply %hard-regspec-value result)
     1192                      (:apply %hard-regspec-value x)))
     1193         (:not (:pred =
     1194                      (:apply %hard-regspec-value result)
     1195                      (:apply %hard-regspec-value y))))
     1196   (movss (:%xmm x) (:%xmm result))
     1197   (mulss (:%xmm y) (:%xmm result))))
     1198
     1199;;; Caller guarantees (not (eq y result))
     1200(define-x8632-vinsn single-float/-2 (((result :single-float))
     1201                                     ((x :single-float)
     1202                                      (y :single-float)))
     1203  ((:not (:pred = (:apply %hard-regspec-value result)
     1204                (:apply %hard-regspec-value x)))
     1205   (movss (:%xmm x) (:%xmm result)))
     1206  (divss (:%xmm y) (:%xmm result)))
     1207
     1208(define-x8632-vinsn get-single (((result :single-float))
     1209                                ((source :lisp)))
     1210  (movss (:@ x8632::single-float.value (:%l source)) (:%xmm result)))
     1211
     1212(define-x8632-vinsn get-double (((result :double-float))
     1213                                ((source :lisp)))
     1214  (movsd (:@ x8632::double-float.value (:%l source)) (:%xmm result)))
     1215
     1216;;; Extract a double-float value, typechecking in the process.
     1217;;; IWBNI we could simply call the "trap-unless-typecode=" vinsn here,
     1218;;; instead of replicating it ..
     1219;;; get-double?
     1220
     1221(define-x8632-vinsn copy-single-float (((dest :single-float))
     1222                                       ((src :single-float)))
     1223  (movss (:%xmm src) (:%xmm dest)))
     1224
     1225(define-x8632-vinsn copy-single-to-double (((dest :double-float))
     1226                                           ((src :single-float)))
     1227  (cvtss2sd (:%xmm src) (:%xmm dest)))
     1228
     1229(define-x8632-vinsn copy-double-to-single (((dest :single-float))
     1230                                           ((src :double-float)))
     1231  (cvtsd2ss (:%xmm src) (:%xmm dest)))
     1232
     1233(define-x8632-vinsn fitvals (()
     1234                             ((n :u16const))
     1235                             ((imm :u16)))
     1236  ((:pred = n 0)
     1237   (xorl (:%l imm) (:%l imm)))
     1238  ((:not (:pred = n 0))
     1239   (movw (:$w (:apply ash n x8632::fixnumshift)) (:%w imm)))
     1240  (subw (:%w x8632::nargs) (:%w imm))
     1241  (jae :push-more)
     1242  (movswl (:%w imm) (:%l imm))
     1243  (subl (:%l imm) (:%l x8632::esp))
     1244  (jmp :done)
     1245  :push-loop
     1246  (pushl (:$l x8632::nil-value))
     1247  (addw (:$b x8632::node-size) (:%w x8632::nargs))
     1248  (subw (:$b x8632::node-size) (:%w imm))
     1249  :push-more
     1250  (jne :push-loop)
     1251  :done)
     1252
     1253(define-x8632-vinsn (nvalret :jumpLR) (()
     1254                                       ())
     1255  (jmp (:@ .SPnvalret)))
     1256
     1257(define-x8632-vinsn lisp-word-ref (((dest t))
     1258                                   ((base t)
     1259                                    (offset t)))
     1260  (movl (:@ (:%l base) (:%l offset)) (:%l  dest)))
     1261
     1262(define-x8632-vinsn lisp-word-ref-c (((dest t))
     1263                                     ((base t)
     1264                                      (offset :s32const)))
     1265  ((:pred = offset 0)
     1266   (movl (:@ (:%l base)) (:%l dest)))
     1267  ((:not (:pred = offset 0))
     1268   (movl (:@ offset (:%l base)) (:%l dest))))
     1269
     1270;; start-mv-call
     1271
     1272;; ????
     1273(define-x8632-vinsn emit-aligned-label (()
     1274                                        ((label :label)))
     1275  (:align 3)
     1276  (:long (:^ label)))
     1277
     1278;; pass-multiple-values-symbol
     1279;; pass-multiple-values
     1280
     1281(define-x8632-vinsn reserve-outgoing-frame (()
     1282                                            ())
     1283  (pushl (:$b x8632::reserved-frame-marker))
     1284  (pushl (:$b x8632::reserved-frame-marker)))
     1285
     1286;; implicit temp0 arg
     1287(define-x8632-vinsn (call-known-function :call) (()
     1288                                                 ()
     1289                                                 ((entry (:label 1))))
     1290  (:talign 5)
     1291  (call (:%l x8632::temp0))
     1292  (movl (:$self 0) (:%l x8632::fn)))
     1293
     1294;; jump-known-function
     1295;; list
     1296;; make-tsp-cons
     1297;; make-fixed-stack-gvector
     1298
     1299(define-x8632-vinsn discard-temp-frame (()
     1300                                        ()
     1301                                        ((temp :imm)))
     1302  (movl (:@ (:%seg :rcontext) x8632::tcr.save-tsp) (:%l temp))
     1303  (movl (:@ (:%l temp)) (:%l temp))
     1304  (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.save-tsp))
     1305  (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.next-tsp))
     1306  )
     1307
     1308(define-x8632-vinsn discard-c-frame (()
     1309                                     ()
     1310                                     ((temp :imm)))
     1311  (movl (:@ (:%seg :rcontext) x8632::tcr.foreign-sp) (:%l temp))
     1312  (movl (:@ (:%l temp)) (:%l temp))
     1313  (movl (:%l temp) (:@ (:%seg :rcontext) x8632::tcr.foreign-sp)))
     1314
     1315 
     1316(define-x8632-vinsn vstack-discard (()
     1317                                    ((nwords :u32const)))
     1318  ((:not (:pred = nwords 0))
     1319   ((:pred < nwords 16)
     1320    (addl (:$b (:apply ash nwords x8632::word-shift)) (:%l x8632::esp)))
     1321   ((:not (:pred < nwords 16))
     1322    (addl (:$l (:apply ash nwords x8632::word-shift)) (:%l x8632::esp)))))
     1323
     1324(defmacro define-x8632-subprim-call-vinsn ((name &rest other-attrs) spno)
     1325  `(define-x8632-vinsn (,name :call :subprim-call ,@other-attrs) (() () ((entry (:label 1))))
     1326    (:talign 5)
     1327    (call (:@ ,spno))
     1328    :back
     1329    (movl (:$self 0) (:%l x8632::fn))))
     1330
     1331(defmacro define-x8632-subprim-jump-vinsn ((name &rest other-attrs) spno)
     1332  `(define-x8632-vinsn (,name :jump :jumpLR ,@other-attrs) (() ())
     1333    (jmp (:@ ,spno))))
     1334
     1335
     1336
     1337
     1338
     1339
     1340
     1341(define-x8632-subprim-call-vinsn (subtag-misc-ref) .SPsubtag-misc-ref)
     1342
     1343(define-x8632-subprim-call-vinsn (subtag-misc-set) .SPsubtag-misc-set)
     1344
     1345(define-x8632-vinsn mem-ref-c-absolute-u8 (((dest :u8))
     1346                                           ((addr :s32const)))
     1347  (movzbl (:@ addr) (:%l dest)))
     1348
     1349(define-x8632-vinsn mem-ref-c-absolute-s8 (((dest :s8))
     1350                                           ((addr :s32const)))
     1351  (movsbl (:@ addr) (:%l dest)))
     1352
     1353(define-x8632-vinsn mem-ref-c-absolute-u16 (((dest :u16))
     1354                                           ((addr :s32const)))
     1355  (movzwl (:@ addr) (:%l dest)))
     1356
     1357(define-x8632-vinsn mem-ref-c-absolute-s16 (((dest :s16))
     1358                                           ((addr :s32const)))
     1359  (movswl (:@ addr) (:%l dest)))
     1360
     1361(define-x8632-vinsn mem-ref-c-absolute-fullword (((dest :u32))
     1362                                                 ((addr :s32const)))
     1363  (movl (:@ addr) (:%l dest)))
     1364
     1365(define-x8632-vinsn mem-ref-c-absolute-signed-fullword (((dest :s32))
     1366                                                        ((addr :s32const)))
     1367  (movl (:@ addr) (:%l dest)))
     1368
     1369(define-x8632-vinsn mem-ref-c-absolute-natural (((dest :u32))
     1370                                                   ((addr :s32const)))
     1371  (movl (:@ addr) (:%l dest)))
     1372
     1373(define-x8632-vinsn event-poll (()
     1374                                ())
     1375  (btrl (:$ub 31) (:@ (:%seg :rcontext) x8632::tcr.interrupt-pending))
     1376  (jae :no-interrupt)
     1377  (ud2a)
     1378  (:byte 2)
     1379  :no-interrupt)
     1380
     1381;;; check-2d-bound
     1382;;; check-3d-bound
     1383;;; 2d-dim1
     1384;;; 3d-dims
     1385;;; 2d-unscaled-index
     1386
     1387;;; 3d-unscaled-index
     1388
    8841389(define-x8632-vinsn branch-unless-both-args-fixnums (()
    8851390                                                     ((a :lisp)
    8861391                                                      (b :lisp)
    8871392                                                      (dest :label))
    888                                                      ((tag :u16)))
    889   (movw (:%w a) (:%w tag))
    890   (orw (:%w b) (:%w tag))
    891   (testw (:$w x8632::fixnummask) (:%w tag))
     1393                                                     ((tag :u8)))
     1394  (movl (:%l a) (:%l tag))
     1395  (orl (:%l b) (:%l tag))
     1396  (testl (:$l x8632::fixnummask) (:%l tag))
    8921397  (jne dest))
    8931398
     
    8981403   (testb (:$b x8632::fixnummask) (:%b a)))
    8991404  ((:pred > (:apply %hard-regspec-value a) x8632::ebx)
    900    (testw (:$w x8632::fixnummask) (:%w a)))
     1405   (testl (:$l x8632::fixnummask) (:%l a)))
    9011406  (jne dest))
    9021407
     
    9221427(define-x8632-vinsn establish-fn (()
    9231428                                  ())
    924   (movl (:self) (:%l x8632::fn)))
     1429  (movl (:$self 0) (:%l x8632::fn)))
     1430
     1431
     1432(define-x8632-vinsn (call-subprim-2 :call :subprim-call) (((dest t))
     1433                                                          ((spno :s32const)
     1434                                                           (y t)
     1435                                                           (z t))
     1436                                                          ((entry (:label 1))))
     1437  (:talign 5)
     1438  (call (:@ spno))
     1439  (movl (:$self 0) (:%l x8632::fn)))
    9251440
    9261441(queue-fixup
Note: See TracChangeset for help on using the changeset viewer.