Changeset 13955


Ignore:
Timestamp:
Jul 12, 2010, 12:49:43 PM (9 years ago)
Author:
gb
Message:

arm-misc.lisp: Need xchgl for ARM (used in futex-based locking.)
l0-misc.lisp: ROOM and aux functions: no tsp on ARM
vinsn.lisp: rename :conditional attribute to :predicatable.
arm-vinsns.lisp, arm2.lisp: replace COPY-FPR with all 4 single/double
variants. Use :predicatable attribute to avoid some conditional branches.
arm-asm.lisp, arm-disassemble.lisp: add, fix some instruction definitions.

Location:
branches/arm
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/arm/compiler/ARM/arm-vinsns.lisp

    r13921 r13955  
    3232;;; Index "scaling" and constant-offset misc-ref vinsns.
    3333
    34 (define-arm-vinsn scale-node-misc-index (((dest :u32))
    35                                          ((idx :imm) ; A fixnum
    36                                           )
    37                                          ())
     34(define-arm-vinsn (scale-node-misc-index :predicatable)
     35    (((dest :u32))
     36     ((idx :imm) ; A fixnum
     37      )
     38     ())
    3839  (add dest idx (:$ arm::misc-data-offset)))
    3940
    40 (define-arm-vinsn scale-32bit-misc-index (((dest :u32))
    41                                           ((idx :imm) ; A fixnum
    42                                            )
    43                                           ())
     41(define-arm-vinsn (scale-32bit-misc-index :predicatable)
     42    (((dest :u32))
     43     ((idx :imm)                        ; A fixnum
     44      )
     45     ())
    4446  (add dest idx (:$ arm::misc-data-offset)))
    4547
    46 (define-arm-vinsn scale-16bit-misc-index (((dest :u32))
    47                                           ((idx :imm) ; A fixnum
    48                                            )
    49                                           ())
     48(define-arm-vinsn (scale-16bit-misc-index :predicatable)
     49    (((dest :u32))
     50     ((idx :imm)                        ; A fixnum
     51      )
     52     ())
    5053  (mov  dest (:lsr idx (:$ 1)))
    5154  (add dest dest (:$ arm::misc-data-offset)))
    5255
    53 (define-arm-vinsn scale-8bit-misc-index (((dest :u32))
    54                                          ((idx :imm) ; A fixnum
    55                                           )
    56                                          ())
     56(define-arm-vinsn (scale-8bit-misc-index :predicatable)
     57    (((dest :u32))
     58     ((idx :imm)                        ; A fixnum
     59      )
     60     ())
    5761  (mov dest (:lsr idx (:$ 2)))
    5862  (add dest dest (:$ arm::misc-data-offset)))
    5963
    60 (define-arm-vinsn scale-64bit-misc-index (((dest :u32))
    61                                           ((idx :imm) ; A fixnum
    62                                            )
    63                                           ())
     64(define-arm-vinsn (scale-64bit-misc-index :predicatable)
     65    (((dest :u32))
     66     ((idx :imm)                        ; A fixnum
     67      )
     68     ())
    6469  (add dest idx idx)
    6570  (add dest dest (:$ arm::misc-dfloat-offset)))
    6671
    6772
    68 (define-arm-vinsn scale-1bit-misc-index (((word-index :u32)
    69                                           (bitnum :u8)) ; (unsigned-byte 5)
    70                                          ((idx :imm) ; A fixnum
    71                                           )
    72                                          )
     73(define-arm-vinsn (scale-1bit-misc-index :predicatable)
     74    (((word-index :u32)
     75      (bitnum :u8))                     ; (unsigned-byte 5)
     76     ((idx :imm)                        ; A fixnum
     77      )
     78     )
    7379  (mov word-index (:lsr idx (:$ arm::fixnumshift)))
    7480  (and bitnum word-index (:$ 31))
     
    7985
    8086
    81 (define-arm-vinsn misc-ref-u32  (((dest :u32))
    82                                  ((v :lisp)
    83                                   (scaled-idx :u32))
    84                                  ())
     87(define-arm-vinsn (misc-ref-u32 :predicatable)
     88    (((dest :u32))
     89     ((v :lisp)
     90      (scaled-idx :u32))
     91     ())
    8592  (ldr dest (:+@ v scaled-idx)))
    8693
    8794
    88 (define-arm-vinsn misc-ref-c-u32  (((dest :u32))
    89                                    ((v :lisp)
    90                                     (idx :u32const))
    91                                    ())
     95(define-arm-vinsn (misc-ref-c-u32 :predicatable)
     96    (((dest :u32))
     97     ((v :lisp)
     98      (idx :u32const))
     99     ())
    92100  (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
    93101
    94 (define-arm-vinsn misc-ref-s32 (((dest :s32))
    95                                 ((v :lisp)
    96                                  (scaled-idx :u32))
    97                                 ())
     102(define-arm-vinsn (misc-ref-s32 :predicatable)
     103    (((dest :s32))
     104     ((v :lisp)
     105      (scaled-idx :u32))
     106     ())
    98107  (ldr dest (:+@ v  scaled-idx)))
    99108
    100 (define-arm-vinsn misc-ref-c-s32  (((dest :s32))
    101                                    ((v :lisp)
    102                                     (idx :u32const))
    103                                    ())
     109(define-arm-vinsn (misc-ref-c-s32 :predicatable)
     110    (((dest :s32))
     111     ((v :lisp)
     112      (idx :u32const))
     113     ())
    104114  (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
    105115
    106116
    107 (define-arm-vinsn misc-set-c-u32 (()
    108                                   ((val :u32)
    109                                    (v :lisp)
    110                                    (idx :u32const)))
     117(define-arm-vinsn (misc-set-c-u32 :predicatable)
     118    (()
     119     ((val :u32)
     120      (v :lisp)
     121      (idx :u32const)))
    111122  (str val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
    112123
    113 (define-arm-vinsn misc-set-c-s32 (()
    114                                   ((val :s32)
    115                                    (v :lisp)
    116                                    (idx :u32const)))
     124(define-arm-vinsn (misc-set-c-s32 :predicatable)
     125    (()
     126     ((val :s32)
     127      (v :lisp)
     128      (idx :u32const)))
    117129  (str val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
    118130
    119 (define-arm-vinsn misc-set-u32 (()
    120                                 ((val :u32)
    121                                  (v :lisp)
    122                                  (scaled-idx :u32)))
     131(define-arm-vinsn (misc-set-u32 :predicatable)
     132    (()
     133     ((val :u32)
     134      (v :lisp)
     135      (scaled-idx :u32)))
    123136  (str val (:+@ v scaled-idx)))
    124137
    125 (define-arm-vinsn misc-set-s32 (()
    126                                 ((val :s32)
    127                                  (v :lisp)
    128                                  (scaled-idx :u32)))
     138(define-arm-vinsn (misc-set-s32 :predicatable)
     139    (()
     140     ((val :s32)
     141      (v :lisp)
     142      (scaled-idx :u32)))
    129143  (str val (:+@ v scaled-idx)))
    130144
    131145                             
    132 (define-arm-vinsn misc-ref-single-float  (((dest :single-float))
    133                                           ((v :lisp)
    134                                            (scaled-idx :u32))
    135                                           ((temp :u32)))
     146(define-arm-vinsn (misc-ref-single-float :predicatable)
     147    (((dest :single-float))
     148     ((v :lisp)
     149      (scaled-idx :u32))
     150     ((temp :u32)))
    136151  (ldr temp (:@ v scaled-idx))
    137152  (fmsr dest temp))
    138153
    139 (define-arm-vinsn misc-ref-c-single-float  (((dest :single-float))
    140                                             ((v :lisp)
    141                                              (idx :u32const))
    142                                             ((temp :u32)))
     154(define-arm-vinsn (misc-ref-c-single-float :predicatable)
     155    (((dest :single-float))
     156     ((v :lisp)
     157      (idx :u32const))
     158     ((temp :u32)))
    143159  (ldr temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2)))))
    144160  (fmsr dest temp))
    145161
    146 (define-arm-vinsn misc-ref-double-float  (((dest :double-float))
    147                                           ((v :lisp)
    148                                            (scaled-idx :u32))
    149                                           ((low (:u32 #.arm::imm0))
    150                                            (high (:u32 #.arm::imm1))))
     162(define-arm-vinsn (misc-ref-double-float :predicatable)
     163    (((dest :double-float))
     164     ((v :lisp)
     165      (scaled-idx :u32))
     166     ((low (:u32 #.arm::imm0))
     167      (high (:u32 #.arm::imm1))))
    151168  (ldrd low (:@ v scaled-idx))
    152169  (fmdrr dest low high))
    153170
    154171
    155 (define-arm-vinsn misc-ref-c-double-float  (((dest :double-float))
    156                                             ((v :lisp)
    157                                              (idx :u32const))
    158                                             ((low (:u32 #.arm::imm0))
    159                                              (high (:u32 #.arm::imm1))))
     172(define-arm-vinsn (misc-ref-c-double-float :predicatable)
     173    (((dest :double-float))
     174     ((v :lisp)
     175      (idx :u32const))
     176     ((low (:u32 #.arm::imm0))
     177      (high (:u32 #.arm::imm1))))
    160178  (ldrd low (:@ v (:$ idx)))
    161179  (fmdrr dest low high))
    162180
    163 (define-arm-vinsn misc-set-c-double-float (((val :double-float))
    164                                            ((v :lisp)
    165                                             (idx :u32const))
    166                                            ((low (:u32 #.arm::imm0))
    167                                             (high (:u32 #.arm::imm1))))
     181(define-arm-vinsn (misc-set-c-double-float :predicatable)
     182    (((val :double-float))
     183     ((v :lisp)
     184      (idx :u32const))
     185     ((low (:u32 #.arm::imm0))
     186      (high (:u32 #.arm::imm1))))
    168187  (fmrrd low high val)
    169188  (strd low (:@ v (:$ (:apply + arm::misc-dfloat-offset (:apply ash idx 3))))))
    170189
    171 (define-arm-vinsn misc-set-double-float (()
    172                                          ((val :double-float)
    173                                           (v :lisp)
    174                                           (scaled-idx :u32))
    175                                          ((low (:u32 #.arm::imm0))
    176                                           (high (:u32 #.arm::imm1))))
     190(define-arm-vinsn (misc-set-double-float :predicatable)
     191    (()
     192     ((val :double-float)
     193      (v :lisp)
     194      (scaled-idx :u32))
     195     ((low (:u32 #.arm::imm0))
     196      (high (:u32 #.arm::imm1))))
    177197  (fmrrd low high val)
    178198  (strd low (:@ v scaled-idx)))
    179199
    180 (define-arm-vinsn misc-set-c-single-float (()
    181                                            ((val :single-float)
    182                                             (v :lisp)
    183                                             (idx :u32const))
    184                                            ((temp :u32)))
     200(define-arm-vinsn (misc-set-c-single-float :predicatable)
     201    (()
     202     ((val :single-float)
     203      (v :lisp)
     204      (idx :u32const))
     205     ((temp :u32)))
    185206  (fmrs temp val)
    186207  (str temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
     
    188209
    189210
    190 (define-arm-vinsn misc-set-single-float (()
    191                                          ((val :single-float)
    192                                           (v :lisp)
    193                                           (scaled-idx :u32))
    194                                          ((temp :u32)))
     211(define-arm-vinsn (misc-set-single-float :predicatable)
     212    (()
     213     ((val :single-float)
     214      (v :lisp)
     215      (scaled-idx :u32))
     216     ((temp :u32)))
    195217  (fmrs temp val)
    196218  (str temp (:@ v scaled-idx)))
    197219
    198220
    199 (define-arm-vinsn misc-ref-u16  (((dest :u16))
    200                                  ((v :lisp)
    201                                   (scaled-idx :u32))
    202                                  ())
     221(define-arm-vinsn (misc-ref-u16 :predicatable)
     222    (((dest :u16))
     223     ((v :lisp)
     224      (scaled-idx :u32))
     225     ())
    203226  (ldrh dest (:+@ v scaled-idx)))
    204227
    205 (define-arm-vinsn misc-ref-c-u16  (((dest :u16))
    206                                    ((v :lisp)
    207                                     (idx :u32const))
    208                                    ())
     228(define-arm-vinsn (misc-ref-c-u16 :predicatable)
     229    (((dest :u16))
     230     ((v :lisp)
     231      (idx :u32const))
     232     ())
    209233  (ldrh dest (:+@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1))))))
    210234
    211 (define-arm-vinsn misc-set-c-u16  (((val :u16))
    212                                    ((v :lisp)
    213                                     (idx :u32const))
    214                                    ())
     235(define-arm-vinsn (misc-set-c-u16 :predicatable)
     236    (((val :u16))
     237     ((v :lisp)
     238      (idx :u32const))
     239     ())
    215240  (strh val (:+@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1))))))
    216241
    217 (define-arm-vinsn misc-set-u16 (((val :u16))
    218                                 ((v :lisp)
    219                                  (scaled-idx :s32)))
     242(define-arm-vinsn (misc-set-u16 :predicatable)
     243    (((val :u16))
     244     ((v :lisp)
     245      (scaled-idx :s32)))
    220246  (strh val (:+@ v scaled-idx)))
    221247
     
    226252  (ldrsh dest (:@ v scaled-idx)))
    227253
    228 (define-arm-vinsn misc-ref-c-s16  (((dest :s16))
    229                                    ((v :lisp)
    230                                     (idx :u32const))
    231                                    ())
     254(define-arm-vinsn (misc-ref-c-s16 :predicatable)
     255    (((dest :s16))
     256     ((v :lisp)
     257      (idx :u32const))
     258     ())
    232259  (ldrsh dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1))))))
    233260
    234261
    235 (define-arm-vinsn misc-set-c-s16  (((val :s16))
    236                                    ((v :lisp)
    237                                     (idx :u32const))
    238                                    ())
     262(define-arm-vinsn (misc-set-c-s16 :predicatable)
     263    (((val :s16))
     264     ((v :lisp)
     265      (idx :u32const))
     266     ())
    239267  (strh val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 1))))))
    240268
    241 (define-arm-vinsn misc-set-s16 (((val :s16))
    242                                 ((v :lisp)
    243                                  (scaled-idx :s32)))
     269(define-arm-vinsn (misc-set-s16 :predicatable)
     270    (((val :s16))
     271     ((v :lisp)
     272      (scaled-idx :s32)))
    244273  (strh val (:@ v scaled-idx)))
    245274
    246 (define-arm-vinsn misc-ref-u8  (((dest :u8))
    247                                 ((v :lisp)
    248                                  (scaled-idx :u32))
    249                                 ())
     275(define-arm-vinsn (misc-ref-u8 :predicatable)
     276    (((dest :u8))
     277     ((v :lisp)
     278      (scaled-idx :u32))
     279     ())
    250280  (ldrb dest (:@ v scaled-idx)))
    251281
    252 (define-arm-vinsn misc-ref-c-u8  (((dest :u8))
    253                                   ((v :lisp)
    254                                    (idx :u32const))
    255                                   ())
     282(define-arm-vinsn (misc-ref-c-u8 :predicatable)
     283    (((dest :u8))
     284     ((v :lisp)
     285      (idx :u32const))
     286     ())
    256287  (ldrb dest (:@ v (:$ (:apply + arm::misc-data-offset idx)))))
    257288
    258 (define-arm-vinsn misc-set-c-u8  (((val :u8))
    259                                   ((v :lisp)
    260                                    (idx :u32const))
    261                                   ())
     289(define-arm-vinsn (misc-set-c-u8 :predicatable)
     290    (((val :u8))
     291     ((v :lisp)
     292      (idx :u32const))
     293     ())
    262294  (strb val (:@ v (:$ (:apply + arm::misc-data-offset idx)))))
    263295
    264 (define-arm-vinsn misc-set-u8  (((val :u8))
    265                                 ((v :lisp)
    266                                  (scaled-idx :u32))
    267                                 ())
     296(define-arm-vinsn (misc-set-u8 :predicatable)
     297    (((val :u8))
     298     ((v :lisp)
     299      (scaled-idx :u32))
     300     ())
    268301  (strb val (:@ v scaled-idx)))
    269302
    270 (define-arm-vinsn misc-ref-s8  (((dest :s8))
    271                                 ((v :lisp)
    272                                  (scaled-idx :u32))
    273                                 ())
     303(define-arm-vinsn (misc-ref-s8 :predicatable)
     304    (((dest :s8))
     305     ((v :lisp)
     306      (scaled-idx :u32))
     307     ())
    274308  (ldrsb dest (:@ v scaled-idx)))
    275309
    276 (define-arm-vinsn misc-ref-c-s8  (((dest :s8))
    277                                   ((v :lisp)
    278                                    (idx :u32const))
    279                                   ())
     310(define-arm-vinsn (misc-ref-c-s8 :predicatable)
     311    (((dest :s8))
     312     ((v :lisp)
     313      (idx :u32const))
     314     ())
    280315  (ldrsb dest (:@ v (:$ (:apply + arm::misc-data-offset idx)))))
    281316
    282 (define-arm-vinsn misc-set-c-s8  (((val :s8))
    283                                   ((v :lisp)
    284                                    (idx :u32const))
    285                                   ())
     317(define-arm-vinsn (misc-set-c-s8 :predicatable)
     318    (((val :s8))
     319     ((v :lisp)
     320      (idx :u32const))
     321     ())
    286322  (strb val (:@ v (:$ (:apply + arm::misc-data-offset idx)))))
    287323
    288 (define-arm-vinsn misc-set-s8  (((val :s8))
    289                                 ((v :lisp)
    290                                  (scaled-idx :u32))
    291                                 ())
     324(define-arm-vinsn (misc-set-s8 :predicatable)
     325    (((val :s8))
     326     ((v :lisp)
     327      (scaled-idx :u32))
     328     ())
    292329  (strb val (:@ v scaled-idx)))
    293330
    294 #+notyet
    295 (define-arm-vinsn misc-ref-c-bit (((dest :u8))
    296                                   ((v :lisp)
    297                                    (idx :u32const))
    298                                   ())
    299   (lwz dest (:apply + arm::misc-data-offset (:apply ash idx -5)) v)
    300   (rlwinm dest dest (:apply 1+ (:apply logand idx #x1f)) 31 31))
    301 
    302 #+notyet
    303 (define-arm-vinsn misc-ref-c-bit-fixnum (((dest :imm))
    304                                          ((v :lisp)
    305                                           (idx :u32const))
    306                                          ((temp :u32)))
    307   (lwz temp (:apply + arm::misc-data-offset (:apply ash idx -5)) v)
    308   (rlwinm dest
    309           temp
    310           (:apply + 1 arm::fixnumshift (:apply logand idx #x1f))
    311           (- arm::least-significant-bit arm::fixnumshift)
    312           (- arm::least-significant-bit arm::fixnumshift)))
    313 
    314 
    315 (define-arm-vinsn misc-ref-node  (((dest :lisp))
    316                                   ((v :lisp)
    317                                    (scaled-idx :s32))
    318                                   ())
     331
     332(define-arm-vinsn (misc-ref-c-bit :predicatable)
     333    (((dest :u8))
     334     ((v :lisp)
     335      (idx :u32const))
     336     ())
     337  (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx -5)))))
     338  (mov dest (:lsr dest (:$ (:apply logand idx #x1f))))
     339  (and dest dest (:$ 1)))
     340
     341(define-arm-vinsn (misc-ref-c-bit-fixnum :predicatable)
     342    (((dest :imm))
     343     ((v :lisp)
     344      (idx :u32const))
     345     ((temp :u32)))
     346  (ldr temp (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx -5)))))
     347  (mov temp (:ror temp (:$ (:apply logand #x1f (:apply - (:apply logand idx #x1f) arm::fixnumshift)))))
     348  (and dest temp (:$ arm::fixnumone)))
     349
     350
     351(define-arm-vinsn (misc-ref-node :predicatable)
     352    (((dest :lisp))
     353     ((v :lisp)
     354      (scaled-idx :s32))
     355     ())
    319356  (ldr dest (:@ v scaled-idx)))
    320357
    321358
    322 
    323 
    324 (define-arm-vinsn misc-ref-c-node (((dest :lisp))
    325                                    ((v :lisp)
    326                                     (idx :s16const))
    327                                    ())
     359(define-arm-vinsn (misc-ref-c-node :predicatable)
     360    (((dest :lisp))
     361     ((v :lisp)
     362      (idx :s16const))
     363     ())
    328364  (ldr dest (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
    329365
    330 (define-arm-vinsn misc-set-node (()
    331                                  ((val :lisp)
    332                                   (v :lisp)
    333                                   (scaled-idx :u32)))
     366(define-arm-vinsn (misc-set-node :predicatable)
     367    (()
     368     ((val :lisp)
     369      (v :lisp)
     370      (scaled-idx :u32)))
    334371  (str val (:@ v scaled-idx)))
    335372
    336373;;; This should only be used for initialization (when the value being
    337374;;; stored is known to be older than the vector V.)
    338 (define-arm-vinsn misc-set-c-node (()
    339                                    ((val :lisp)
    340                                     (v :lisp)
    341                                     (idx :s16const))
    342                                    ())
     375(define-arm-vinsn (misc-set-c-node :predicatable)
     376    (()
     377     ((val :lisp)
     378      (v :lisp)
     379      (idx :s16const))
     380     ())
    343381  (str val (:@ v (:$ (:apply + arm::misc-data-offset (:apply ash idx 2))))))
    344382
    345383
    346 (define-arm-vinsn misc-element-count-fixnum (((dest :imm))
    347                                              ((v :lisp))
    348                                              ((temp :u32)))
     384(define-arm-vinsn (misc-element-count-fixnum :predicatable)
     385    (((dest :imm))
     386     ((v :lisp))
     387     ((temp :u32)))
    349388  (ldr temp (:@ v (:$ arm::misc-header-offset)))
    350389  (bic temp temp (:$ arm::subtag-mask))
     
    360399  (uuo-error-vector-bounds (:? hs) idx v))
    361400
    362 (define-arm-vinsn 2d-unscaled-index (((dest :imm)
    363                                       (dim1 :u32))
    364                                      ((dim1 :u32)
    365                                       (i :imm)
    366                                       (j :imm)))
     401(define-arm-vinsn (2d-unscaled-index :predicatable)
     402    (((dest :imm)
     403      (dim1 :u32))
     404     ((dim1 :u32)
     405      (i :imm)
     406      (j :imm)))
    367407  (mul dim1 i dim1)
    368408  (add dest dim1 j))
     
    370410;; dest <- (+ (* i dim1 dim2) (* j dim2) k)
    371411
    372 (define-arm-vinsn 3d-unscaled-index (((dest :imm)
    373                                       (dim1 :u32)
    374                                       (dim2 :u32))
    375                                      ((dim1 :u32)
    376                                       (dim2 :u32)
    377                                       (i :imm)
    378                                       (j :imm)
    379                                       (k :imm)))
     412(define-arm-vinsn (3d-unscaled-index :predicatable)
     413    (((dest :imm)
     414      (dim1 :u32)
     415      (dim2 :u32))
     416     ((dim1 :u32)
     417      (dim2 :u32)
     418      (i :imm)
     419      (j :imm)
     420      (k :imm)))
    380421  (mul dim1 dim1 dim2)
    381422  (mul dim2 j dim2)
     
    385426
    386427
    387 (define-arm-vinsn 2d-dim1 (((dest :u32))
    388                            ((header :lisp)))
     428(define-arm-vinsn (2d-dim1 :predicatable)
     429    (((dest :u32))
     430     ((header :lisp)))
    389431  (ldr dest (:@ header (:$ (+ arm::misc-data-offset (* 4 (1+ arm::arrayH.dim0-cell))))))
    390432  (mov dest (:asr dest (:$ arm::fixnumshift))))
     
    392434
    393435
    394 (define-arm-vinsn 3d-dims (((dim1 :u32)
    395                             (dim2 :u32))
    396                            ((header :lisp)))
     436(define-arm-vinsn (3d-dims :predicatable)
     437    (((dim1 :u32)
     438      (dim2 :u32))
     439     ((header :lisp)))
    397440  (ldr dim1 (:@ header (:$ (+ arm::misc-data-offset (* 4 (1+ arm::arrayH.dim0-cell))))))
    398441  (ldr dim2 (:@ header (:$ (+ arm::misc-data-offset (* 4 (+ 2 arm::arrayH.dim0-cell))))))
     
    431474  (mov dim2 (:asr dim2 (:$ arm::fixnumshift))))
    432475
    433 (define-arm-vinsn array-data-vector-ref (((dest :lisp))
    434                                          ((header :lisp)))
     476(define-arm-vinsn (array-data-vector-ref :predicatable)
     477    (((dest :lisp))
     478     ((header :lisp)))
    435479  (ldr dest (:@ header (:$ arm::arrayH.data-vector))))
    436480 
     
    460504
    461505 
    462 (define-arm-vinsn node-slot-ref  (((dest :lisp))
    463                                   ((node :lisp)
    464                                    (cellno :u32const)))
     506(define-arm-vinsn (node-slot-ref :predicatable)
     507    (((dest :lisp))
     508     ((node :lisp)
     509      (cellno :u32const)))
    465510  (ldr dest (:@ node (:$ (:apply + arm::misc-data-offset (:apply ash cellno 2))))))
    466511
     
    479524;;; Untagged memory reference & assignment.
    480525
    481 (define-arm-vinsn mem-ref-c-fullword (((dest :u32))
    482                                       ((src :address)
    483                                        (index :s16const)))
     526(define-arm-vinsn (mem-ref-c-fullword :predicatable)
     527    (((dest :u32))
     528     ((src :address)
     529      (index :s16const)))
    484530  (ldr dest (:@ src (:$ index))))
    485531
    486532
    487 (define-arm-vinsn mem-ref-c-signed-fullword (((dest :s32))
    488                                              ((src :address)
    489                                               (index :s16const)))
     533(define-arm-vinsn (mem-ref-c-signed-fullword :predicatable)
     534    (((dest :s32))
     535     ((src :address)
     536      (index :s16const)))
    490537  (ldr dest (:@ src (:$ index))))
    491538
    492 (define-arm-vinsn mem-ref-c-natural (((dest :u32))
    493                                      ((src :address)
    494                                       (index :s16const)))
     539
     540(define-arm-vinsn (mem-ref-c-natural :predicatable)
     541    (((dest :u32))
     542     ((src :address)
     543      (index :s16const)))
    495544  (ldr dest (:@ src (:$ index))))
    496545 
    497546
    498 (define-arm-vinsn mem-ref-fullword (((dest :u32))
    499                                     ((src :address)
    500                                      (index :s32)))
     547(define-arm-vinsn (mem-ref-fullword :predicatable)
     548    (((dest :u32))
     549     ((src :address)
     550      (index :s32)))
    501551  (ldr dest (:@ src index)))
    502552
    503 (define-arm-vinsn mem-ref-signed-fullword (((dest :u32))
    504                                            ((src :address)
    505                                             (index :s32)))
     553(define-arm-vinsn (mem-ref-signed-fullword :predicatable)
     554    (((dest :u32))
     555     ((src :address)
     556      (index :s32)))
    506557  (ldr dest (:@ src index)))
    507558
    508 (define-arm-vinsn mem-ref-natural (((dest :u32))
    509                                    ((src :address)
    510                                     (index :s32)))
     559(define-arm-vinsn (mem-ref-natural :predicatable)
     560    (((dest :u32))
     561     ((src :address)
     562      (index :s32)))
    511563  (ldr dest (:@ src index)))
    512564
    513565
    514 (define-arm-vinsn mem-ref-c-u16 (((dest :u16))
    515                                  ((src :address)
    516                                   (index :s16const)))
     566(define-arm-vinsn (mem-ref-c-u16 :predicatable)
     567    (((dest :u16))
     568     ((src :address)
     569      (index :s16const)))
    517570  (ldrh dest (:@ src (:$ index))))
    518571
    519572
    520 (define-arm-vinsn mem-ref-u16 (((dest :u16))
    521                                ((src :address)
    522                                 (index :s32)))
     573(define-arm-vinsn (mem-ref-u16 :predicatable)
     574    (((dest :u16))
     575     ((src :address)
     576      (index :s32)))
    523577  (ldrh dest (:@ src index)))
    524578
    525579
    526580
    527 (define-arm-vinsn mem-ref-c-s16 (((dest :s16))
    528                                  ((src :address)
    529                                   (index :s16const)))
     581(define-arm-vinsn (mem-ref-c-s16 :predicatable)
     582    (((dest :s16))
     583     ((src :address)
     584      (index :s16const)))
    530585  (ldrsh dest (:@ src (:$ index))))
    531586
    532 (define-arm-vinsn mem-ref-s16 (((dest :s16))
    533                                ((src :address)
    534                                 (index :s32)))
     587(define-arm-vinsn (mem-ref-s16 :predicatable)
     588    (((dest :s16))
     589     ((src :address)
     590      (index :s32)))
    535591  (ldrsh dest (:@ src index)))
    536592
    537 (define-arm-vinsn mem-ref-c-u8 (((dest :u8))
    538                                 ((src :address)
    539                                  (index :s16const)))
     593(define-arm-vinsn (mem-ref-c-u8 :predicatable)
     594    (((dest :u8))
     595     ((src :address)
     596      (index :s16const)))
    540597  (ldrb dest (:@ src (:$ index))))
    541598
    542 (define-arm-vinsn mem-ref-u8 (((dest :u8))
    543                               ((src :address)
    544                                (index :s32)))
     599(define-arm-vinsn (mem-ref-u8 :predicatable)
     600    (((dest :u8))
     601     ((src :address)
     602      (index :s32)))
    545603  (ldrb dest (:@ src index)))
    546604
    547 (define-arm-vinsn mem-ref-c-s8 (((dest :s8))
    548                                 ((src :address)
    549                                  (index :s16const)))
     605(define-arm-vinsn (mem-ref-c-s8 :predicatable)
     606    (((dest :s8))
     607     ((src :address)
     608      (index :s16const)))
    550609  (ldrsb dest (:@ src (:$ index))))
    551610
    552 (define-arm-vinsn mem-ref-s8 (((dest :s8))
    553                               ((src :address)
    554                                (index :s32)))
     611(define-arm-vinsn (mem-ref-s8 :predicatable)
     612    (((dest :s8))
     613     ((src :address)
     614      (index :s32)))
    555615  (ldrsb dest (:@ src index)))
    556616
    557 #+notyet
    558 (define-arm-vinsn mem-ref-c-bit (((dest :u8))
    559                                  ((src :address)
    560                                   (byte-index :s16const)
    561                                   (bit-shift :u8const)))
    562   (lbz dest byte-index src)
    563   (rlwinm dest dest bit-shift 31 31))
    564 
    565 
    566 #+notyet
    567 (define-arm-vinsn mem-ref-c-bit-fixnum (((dest :lisp))
    568                                         ((src :address)
    569                                          (byte-index :s16const)
    570                                          (bit-shift :u8const))
    571                                         ((byteval :u8)))
    572   (lbz byteval byte-index src)
    573   (rlwinm dest byteval bit-shift 29 29))
    574 
    575 (define-arm-vinsn mem-ref-bit (((dest :u8))
    576                                ((src :address)
    577                                 (bit-index :lisp))
    578                                ((byte-index :s16)
    579                                 (bit-shift :u8)))
     617(define-arm-vinsn (mem-ref-c-bit :predicatable)
     618    (((dest :u8))
     619     ((src :address)
     620      (byte-index :s16const)
     621      (bit-shift :u8const)))
     622  (ldrb dest (:@ src (:$ byte-index)))
     623  (mov dest (:lsr dest (:$ bit-shift)))
     624  (and dest dest (:$ 1)))
     625
     626
     627(define-arm-vinsn (mem-ref-c-bit-fixnum :predicatable)
     628    (((dest :lisp))
     629     ((src :address)
     630      (byte-index :s16const)
     631      (bit-shift :u8const))
     632     ((byteval :u8)))
     633  (ldrb byteval (:@ src (:$ byte-index)))
     634  (mov byteval (:lsr byteval (:$ bit-shift)))
     635  (and byteval byteval (:$ 1))
     636  (mov dest (:lsr byteval (:$ arm::fixnumshift))))
     637
     638(define-arm-vinsn (mem-ref-bit :predicatable)
     639    (((dest :u8))
     640     ((src :address)
     641      (bit-index :lisp))
     642     ((byte-index :s16)
     643      (bit-shift :u8)))
    580644
    581645  (mov byte-index (:lsr bit-index (:$ arm::fixnumshift)))
     
    586650
    587651
    588 (define-arm-vinsn mem-ref-bit-fixnum (((dest :lisp))
    589                                       ((src :address)
    590                                        (bit-index :lisp))
    591                                       ((byte-index :s16)
    592                                        (bit-shift :u8)))
     652(define-arm-vinsn (mem-ref-bit-fixnum :predicatable)
     653    (((dest :lisp))
     654     ((src :address)
     655      (bit-index :lisp))
     656     ((byte-index :s16)
     657      (bit-shift :u8)))
    593658  (mov byte-index (:lsr bit-index (:$ arm::fixnumshift)))
    594659  (and bit-shift byte-index (:$ 7))
     
    598663  (and dest dest (:lsl byte-index (:$ arm::fixnumshift))))
    599664
    600 (define-arm-vinsn mem-ref-c-double-float (((dest :double-float))
    601                                           ((src :address)
    602                                            (index :s16const))
    603                                           ((low (:u32 #.arm::imm0))
    604                                            (high (:u32 #.arm::imm1))))
     665(define-arm-vinsn (mem-ref-c-double-float :predicatable)
     666    (((dest :double-float))
     667     ((src :address)
     668      (index :s16const))
     669     ((low (:u32 #.arm::imm0))
     670      (high (:u32 #.arm::imm1))))
    605671  (ldrd low (:@ src (:$ index)))
    606672  (fmdrr dest low high))
    607673
    608 (define-arm-vinsn mem-ref-double-float (((dest :double-float))
    609                                         ((src :address)
    610                                          (index :s32))
    611                                         ((low (:u32 #.arm::imm0))
    612                                          (high (:u32 #.arm::imm1))))
     674(define-arm-vinsn (mem-ref-double-float :predicatable)
     675    (((dest :double-float))
     676     ((src :address)
     677      (index :s32))
     678     ((low (:u32 #.arm::imm0))
     679      (high (:u32 #.arm::imm1))))
    613680  (ldrd low (:@ src  index))
    614681  (fmdrr dest low high))
    615682
    616 (define-arm-vinsn mem-set-c-double-float (()
    617                                           ((val :double-float)
    618                                            (src :address)
    619                                            (index :s16const))
    620                                           ((low (:u32 #.arm::imm0))
    621                                            (high (:u32 #.arm::imm1))))
     683(define-arm-vinsn (mem-set-c-double-float :predicatable)
     684    (()
     685     ((val :double-float)
     686      (src :address)
     687      (index :s16const))
     688     ((low (:u32 #.arm::imm0))
     689      (high (:u32 #.arm::imm1))))
    622690  (fmrrd low high src)
    623691  (strd low (:@ src (:$ index))))
    624692
    625 (define-arm-vinsn mem-set-double-float (()
    626                                         ((val :double-float)
    627                                          (src :address)
    628                                          (index :s32)) ; imm2, I presume
    629                                         ((low (:u32 #.arm::imm0))
    630                                          (high (:u32 #.arm::imm1))))
     693(define-arm-vinsn (mem-set-double-float :predicatable)
     694    (()
     695     ((val :double-float)
     696      (src :address)
     697      (index :s32))                     ; imm2, I presume
     698     ((low (:u32 #.arm::imm0))
     699      (high (:u32 #.arm::imm1))))
    631700  (fmrrd low high src)
    632701  (strd low (:@ src index)))
    633702
    634 (define-arm-vinsn mem-ref-c-single-float (((dest :single-float))
    635                                           ((src :address)
    636                                            (index :s16const))
    637                                           ((temp :u32)))
     703(define-arm-vinsn (mem-ref-c-single-float :predicatable)
     704    (((dest :single-float))
     705     ((src :address)
     706      (index :s16const))
     707     ((temp :u32)))
    638708  (ldr temp (:@ src (:$ index)))
    639709  (fmsr dest temp))
    640710
    641 (define-arm-vinsn mem-ref-single-float (((dest :single-float))
    642                                         ((src :address)
    643                                          (index :s32))
    644                                         ((temp :u32)))
     711(define-arm-vinsn (mem-ref-single-float :predicatable)
     712    (((dest :single-float))
     713     ((src :address)
     714      (index :s32))
     715     ((temp :u32)))
    645716  (ldr temp (:@ src index))
    646717  (fmsr dest temp))
    647718
    648 (define-arm-vinsn mem-set-c-single-float (()
    649                                           ((val :single-float)
    650                                            (src :address)
    651                                            (index :s16const))
    652                                           ((temp :u32)))
     719(define-arm-vinsn (mem-set-c-single-float :predicatable)
     720    (()
     721     ((val :single-float)
     722      (src :address)
     723      (index :s16const))
     724     ((temp :u32)))
    653725  (fmrs temp src)
    654726  (str temp (:@ src (:$ index))))
    655727
    656 (define-arm-vinsn mem-set-single-float (()
    657                                         ((val :single-float)
    658                                          (src :address)
    659                                          (index :s32))
    660                                         ((temp :u32)))
     728(define-arm-vinsn (mem-set-single-float :predicatable)
     729    (()
     730     ((val :single-float)
     731      (src :address)
     732      (index :s32))
     733     ((temp :u32)))
    661734  (fmrs temp src)
    662735  (str temp (:@ src (:$ index))))
    663736
    664737
    665 (define-arm-vinsn mem-set-c-address (()
    666                                      ((val :address)
    667                                       (src :address)
    668                                       (index :s16const)))
     738(define-arm-vinsn (mem-set-c-address :predicatable)
     739    (()
     740     ((val :address)
     741      (src :address)
     742      (index :s16const)))
    669743  (str val (:@ src (:$ index))))
    670744
    671 (define-arm-vinsn mem-set-address (()
    672                                    ((val :address)
    673                                     (src :address)
    674                                     (index :s32)))
     745(define-arm-vinsn (mem-set-address :predicatable)
     746    (()
     747     ((val :address)
     748      (src :address)
     749      (index :s32)))
    675750  (str val (:@ src index)))
    676751
    677 (define-arm-vinsn mem-set-c-fullword (()
    678                                       ((val :u32)
    679                                        (src :address)
    680                                        (index :s16const)))
     752(define-arm-vinsn (mem-set-c-fullword :predicatable)
     753    (()
     754     ((val :u32)
     755      (src :address)
     756      (index :s16const)))
    681757  (str val (:@ src (:$ index))))
    682758
    683 (define-arm-vinsn mem-set-fullword (()
    684                                     ((val :u32)
    685                                      (src :address)
    686                                      (index :s32)))
     759(define-arm-vinsn (mem-set-fullword :predicatable)
     760    (()
     761     ((val :u32)
     762      (src :address)
     763      (index :s32)))
    687764  (str val (:@ src index)))
    688765
    689 (define-arm-vinsn mem-set-c-halfword (()
    690                                       ((val :u16)
    691                                        (src :address)
    692                                        (index :s16const)))
     766(define-arm-vinsn (mem-set-c-halfword :predicatable)
     767    (()
     768     ((val :u16)
     769      (src :address)
     770      (index :s16const)))
    693771  (strh val (:@ src (:$ index))))
    694772
    695 (define-arm-vinsn mem-set-halfword (()
    696                                     ((val :u16)
    697                                      (src :address)
    698                                      (index :s32)))
     773(define-arm-vinsn (mem-set-halfword :predicatable)
     774    (()
     775     ((val :u16)
     776      (src :address)
     777      (index :s32)))
    699778  (strh val (:@ src index)))
    700779
    701 (define-arm-vinsn mem-set-c-byte (()
    702                                   ((val :u16)
    703                                    (src :address)
    704                                    (index :s16const)))
     780(define-arm-vinsn (mem-set-c-byte :predicatable)
     781    (()
     782     ((val :u16)
     783      (src :address)
     784      (index :s16const)))
    705785  (strb val (:@ src (:$ index))))
    706786
    707 (define-arm-vinsn mem-set-byte (()
    708                                 ((val :u8)
    709                                  (src :address)
    710                                  (index :s32)))
     787(define-arm-vinsn (mem-set-byte :predicatable)
     788    (()
     789     ((val :u8)
     790      (src :address)
     791      (index :s32)))
    711792  (strb val (:@ src index)))
    712793
    713 (define-arm-vinsn mem-set-c-bit-0 (()
    714                                    ((src :address)
    715                                     (byte-index :s16const)
    716                                     (mask :u8const))
    717                                    ((val :u8)))
     794(define-arm-vinsn (mem-set-c-bit-0 :predicatable)
     795    (()
     796     ((src :address)
     797      (byte-index :s16const)
     798      (mask :u8const))
     799     ((val :u8)))
    718800  (ldrb val (:@ src (:$ byte-index)))
    719801  (bic val val (:$ mask))
     
    721803
    722804
    723 (define-arm-vinsn mem-set-c-bit-1 (()
    724                                    ((src :address)
    725                                     (byte-index :s16const)
    726                                     (mask :u8const))
    727                                    ((val :u8)))
     805(define-arm-vinsn (mem-set-c-bit-1 :predicatable)
     806    (()
     807     ((src :address)
     808      (byte-index :s16const)
     809      (mask :u8const))
     810     ((val :u8)))
    728811  (ldrb val (:@ src (:$ byte-index)))
    729812  (orr val val (:$ mask))
     
    768851;;; Tag and subtag extraction, comparison, checking, trapping ...
    769852
    770 (define-arm-vinsn extract-tag (((tag :u8))
    771                                ((object :lisp))
    772                                ())
     853(define-arm-vinsn (extract-tag :predicatable)
     854    (((tag :u8))
     855     ((object :lisp))
     856     ())
    773857  (and tag object (:$ arm::tagmask)))
    774858
    775 (define-arm-vinsn extract-tag-fixnum (((tag :imm))
    776                                       ((object :lisp)))
     859(define-arm-vinsn (extract-tag-fixnum :predicatable)
     860    (((tag :imm))
     861     ((object :lisp)))
    777862  (mov tag (:lsl object (:$ arm::fixnumshift)))
    778863  (and tag object (:$ (ash arm::tagmask arm::fixnumshift))))
    779864
    780 (define-arm-vinsn extract-fulltag (((tag :u8))
    781                                    ((object :lisp))
    782                                    ())
     865(define-arm-vinsn (extract-fulltag :predicatable)
     866    (((tag :u8))
     867     ((object :lisp))
     868     ())
    783869  (and tag object (:$ arm::fulltagmask)))
    784870
    785871
    786 (define-arm-vinsn extract-fulltag-fixnum (((tag :imm))
    787                                           ((object :lisp)))
     872(define-arm-vinsn (extract-fulltag-fixnum :predicatable)
     873    (((tag :imm))
     874     ((object :lisp)))
    788875  (mov tag (:lsl object (:$ arm::fixnumshift)))
    789876  (and tag tag (:$ (ash arm::fulltagmask arm::fixnumshift))))
     
    10261113
    10271114
    1028 (define-arm-vinsn box-fixnum (((dest :imm))
    1029                               ((src :s32)))
     1115(define-arm-vinsn (box-fixnum :predicatable)
     1116    (((dest :imm))
     1117     ((src :s32)))
    10301118  (mov dest (:lsl src (:$ arm::fixnumshift))))
    10311119
    1032 (define-arm-vinsn fixnum->signed-natural (((dest :s32))
    1033                                           ((src :imm)))
     1120(define-arm-vinsn (fixnum->signed-natural :predicatable)
     1121    (((dest :s32))
     1122     ((src :imm)))
    10341123  (mov dest (:asr src (:$ arm::fixnumshift))))
    10351124
    1036 (define-arm-vinsn fixnum->unsigned-natural (((dest :u32))
    1037                                             ((src :imm)))
     1125(define-arm-vinsn (fixnum->unsigned-natural :predicatable)
     1126    (((dest :u32))
     1127     ((src :imm)))
    10381128  (mov dest (:lsr src (:$ arm::fixnumshift))))
    10391129
     
    11151205  (uuo-error-reg-not-xtype (:? ne) src (:$ arm::xtype-u8)))
    11161206
    1117 (define-arm-vinsn %unbox-u8 (((dest :u8))
    1118                              ((src :lisp)))
     1207(define-arm-vinsn (%unbox-u8 :predicatable)
     1208    (((dest :u8))
     1209     ((src :lisp)))
    11191210  (mov dest (:$ #xff))
    11201211  (and dest dest (:lsr src (:$ arm::fixnumshift))))
     
    11431234
    11441235
    1145 (define-arm-vinsn fixnum->double (((dest :double-float))
    1146                                   ((src :lisp))
    1147                                   ((imm :s32)
    1148                                    (temp :single-float)))
     1236(define-arm-vinsn (fixnum->double :predicatable)
     1237    (((dest :double-float))
     1238     ((src :lisp))
     1239     ((imm :s32)
     1240      (temp :single-float)))
    11491241  (mov imm (:asr src (:$ arm::fixnumshift)))
    11501242  (fmsr temp imm)
    11511243  (fsitod dest temp))
    11521244
    1153 (define-arm-vinsn fixnum->single (((dest :single-float))
    1154                                   ((src :lisp))
    1155                                   ((imm :s32)))
     1245(define-arm-vinsn (fixnum->single :predicatable)
     1246    (((dest :single-float))
     1247     ((src :lisp))
     1248     ((imm :s32)))
    11561249  (mov imm (:asr src (:$ arm::fixnumshift)))
    11571250  (fmsr dest imm)
     
    11591252
    11601253
    1161 (define-arm-vinsn shift-left-variable-word (((dest :u32))
    1162                                             ((src :u32)
    1163                                              (sh :u32)))
     1254(define-arm-vinsn (shift-left-variable-word :predicatable)
     1255    (((dest :u32))
     1256     ((src :u32)
     1257      (sh :u32)))
    11641258  (mov dest (:lsl src sh)))
    11651259
    1166 (define-arm-vinsn u32logandc2 (((dest :u32))
    1167                                ((x :u32)
    1168                                 (y :u32)))
     1260(define-arm-vinsn (u32logandc2 :predicatable)
     1261    (((dest :u32))
     1262     ((x :u32)
     1263      (y :u32)))
    11691264  (bic dest x y))
    11701265
    1171 (define-arm-vinsn u32logior (((dest :u32))
    1172                              ((x :u32)
    1173                               (y :u32)))
     1266(define-arm-vinsn (u32logior :predicatable)
     1267    (((dest :u32))
     1268     ((x :u32)
     1269      (y :u32)))
    11741270  (orr dest x y))
    11751271
     
    11811277  (orreq dest src mask))
    11821278
    1183 (define-arm-vinsn complement-shift-count (((dest :u32))
    1184                                           ((src :u32)))
     1279(define-arm-vinsn (complement-shift-count :predicatable)
     1280    (((dest :u32))
     1281     ((src :u32)))
    11851282  (rsb dest src (:$ 32)))
    11861283
    1187 (define-arm-vinsn extract-lowbyte (((dest :u32))
    1188                                    ((src :lisp)))
     1284(define-arm-vinsn (extract-lowbyte :predicatable)
     1285    (((dest :u32))
     1286     ((src :lisp)))
    11891287  (and dest src (:$ arm::subtag-mask)))
    11901288
     
    12761374  (uuo-error-reg-not-xtype (:? ne) object (:$ tagval)))
    12771375 
    1278 (define-arm-vinsn subtract-constant (((dest :imm))
    1279                                      ((src :imm)
    1280                                       (const :s16const)))
     1376(define-arm-vinsn (subtract-constant :predicatable)
     1377    (((dest :imm))
     1378     ((src :imm)
     1379      (const :s16const)))
    12811380  (sub dest src (:$ const)))
    12821381
     
    13041403
    13051404
    1306 (define-arm-vinsn extract-variable-bit-fixnum (((dest :lisp))
    1307                                                ((src :u32)
    1308                                                 (bitnum :u8))
    1309                                                ((temp :u32)))
     1405(define-arm-vinsn (extract-variable-bit-fixnum :predicatable)
     1406    (((dest :lisp))
     1407     ((src :u32)
     1408      (bitnum :u8))
     1409     ((temp :u32)))
    13101410  (mov temp (:lsr src bitnum))
    13111411  (mov dest (:$ arm::fixnumone))
     
    14291529  (orrne dest src (:$ (:apply ash 1 bitnum))))
    14301530
    1431 (define-arm-vinsn set-constant-arm-bit-to-1 (((dest :u32))
    1432                                              ((src :u32)
    1433                                               (bitnum :u8const)))
     1531(define-arm-vinsn (set-constant-arm-bit-to-1 :predicatable)
     1532    (((dest :u32))
     1533     ((src :u32)
     1534      (bitnum :u8const)))
    14341535  (orr dest src (:$ (:apply ash 1 bitnum))))
    14351536
    14361537
    1437 (define-arm-vinsn set-constant-arm-bit-to-0 (((dest :u32))
    1438                                              ((src :u32)
    1439                                               (bitnum :u8const)))
     1538(define-arm-vinsn (set-constant-arm-bit-to-0 :predicatable)
     1539    (((dest :u32))
     1540     ((src :u32)
     1541      (bitnum :u8const)))
    14401542  (bic dest src (:$ (:apply ash 1 bitnum))))
    14411543
     
    14651567;;; Operations on lists and cons cells
    14661568
    1467 (define-arm-vinsn %cdr (((dest :lisp))
    1468                         ((src :lisp)))
     1569(define-arm-vinsn (%cdr :predicatable)
     1570    (((dest :lisp))
     1571     ((src :lisp)))
    14691572  (ldr dest (:@ src (:$ arm::cons.cdr))))
    14701573
    1471 (define-arm-vinsn %car (((dest :lisp))
    1472                         ((src :lisp)))
     1574(define-arm-vinsn (%car :predicatable)
     1575    (((dest :lisp))
     1576     ((src :lisp)))
    14731577  (ldr dest (:@ src (:$ arm::cons.car))))
    14741578
    1475 (define-arm-vinsn %set-car (()
    1476                             ((cell :lisp)
    1477                              (new :lisp)))
     1579(define-arm-vinsn (%set-car :predicatable)
     1580    (()
     1581     ((cell :lisp)
     1582      (new :lisp)))
    14781583  (str cell (:@ new (:$ arm::cons.car))))
    14791584
    1480 (define-arm-vinsn %set-cdr (()
    1481                             ((cell :lisp)
    1482                              (new :lisp)))
     1585(define-arm-vinsn (%set-cdr :predicatable)
     1586    (()
     1587     ((cell :lisp)
     1588      (new :lisp)))
    14831589  (str cell (:@ new (:$ arm::cons.cdr))))
    14841590
    14851591
    1486 (define-arm-vinsn load-adl (()
    1487                             ((n :u32const)))
     1592(define-arm-vinsn (load-adl :predicatable)
     1593    (()
     1594     ((n :u32const)))
    14881595  (mov nargs (:$ (:apply logand #x00ff0000 n)))
    14891596  ((:not (:pred = 0 (:apply logand #xff000000 n)))
     
    14941601   (orr nargs nargs (:$ (:apply logand #x000000ff n)))))
    14951602                           
    1496 (define-arm-vinsn set-nargs (()
    1497                              ((n :s16const)))
     1603(define-arm-vinsn (set-nargs :predicatable)
     1604    (()
     1605     ((n :s16const)))
    14981606  (mov nargs (:$ (:apply ash n arm::word-shift))))
    14991607
    1500 (define-arm-vinsn scale-nargs (()
    1501                                ((nfixed :s16const)))
     1608(define-arm-vinsn (scale-nargs :predicatable)
     1609    (()
     1610     ((nfixed :s16const)))
    15021611  ((:pred > nfixed 0)
    15031612   (add nargs nargs (:$ (:apply - (:apply ash nfixed arm::word-shift))))))
     
    15051614
    15061615
    1507 (define-arm-vinsn (vpush-register :push :node :vsp)
     1616(define-arm-vinsn (vpush-register :push :node :vsp :predicatable)
     1617   
    15081618    (()
    15091619     ((reg :lisp)))
    15101620  (str reg (:@! vsp (:$ (- arm::node-size)))))
    15111621
    1512 (define-arm-vinsn (vpush-register-arg :push :node :vsp :outgoing-argument)
     1622(define-arm-vinsn (vpush-register-arg :push :node :vsp :outgoing-argument :predicatable)
     1623   
    15131624    (()
    15141625     ((reg :lisp)))
    15151626  (str reg (:@! vsp (:$ (- arm::node-size)))))
    15161627
    1517 (define-arm-vinsn (vpush-xyz :push :node :vsp) (() ())
     1628(define-arm-vinsn (vpush-xyz :push :node :vsp :predicatable)
     1629    (() ())
    15181630  (stmdb (:! vsp) (arg_z arg_y arg_x)))
    15191631
    1520 (define-arm-vinsn (vpush-yz :push :node :vsp) (() ())
     1632(define-arm-vinsn (vpush-yz :push :node :vsp :predicatable)
     1633    (() ())
    15211634  (stmdb (:! vsp) (arg_z arg_y)))
    15221635
     
    15401653
    15411654
    1542 (define-arm-vinsn (vpop-register :pop :node :vsp)
     1655(define-arm-vinsn (vpop-register :pop :node :vsp :predicatable)
     1656   
    15431657    (((dest :lisp))
    15441658     ())
     
    15571671
    15581672
    1559 (define-arm-vinsn copy-node-gpr (((dest :lisp))
    1560                                  ((src :lisp)))
     1673(define-arm-vinsn (copy-node-gpr :predicatable)
     1674    (((dest :lisp))
     1675     ((src :lisp)))
    15611676  ((:not (:pred =
    15621677                (:apply %hard-regspec-value dest)
     
    15641679   (mov dest src)))
    15651680
    1566 (define-arm-vinsn copy-gpr (((dest t))
    1567                             ((src t)))
     1681(define-arm-vinsn (copy-gpr :predicatable)
     1682    (((dest t))
     1683     ((src t)))
    15681684  ((:not (:pred =
    15691685                (:apply %hard-regspec-value dest)
     
    15721688
    15731689
    1574 (define-arm-vinsn copy-fpr (((dest :double-float))
    1575                             ((src :double-float)))
     1690(define-arm-vinsn (double-to-double :predicatable)
     1691    (((dest :double-float))
     1692     ((src :double-float)))
    15761693  ((:not (:pred =
    15771694                (:apply %hard-regspec-value dest)
     
    15791696   (fcpyd dest src)))
    15801697
    1581 (define-arm-vinsn vcell-ref (((dest :lisp))
    1582                              ((vcell :lisp)))
     1698(define-arm-vinsn (single-to-single :predicatable)
     1699    (((dest :single-float))
     1700     ((src :single-float)))
     1701  ((:not (:pred =
     1702                (:apply %hard-regspec-value dest)
     1703                (:apply %hard-regspec-value src)))
     1704   (fcpys dest src)))
     1705
     1706(define-arm-vinsn (vcell-ref :predicatable)
     1707    (((dest :lisp))
     1708     ((vcell :lisp)))
    15831709  (ldr dest (:@ vcell (:$ arm::misc-data-offset))))
    15841710
     
    15981724  (str closed (:@ dest (:$ arm::value-cell.value))))
    15991725
    1600 (define-arm-vinsn make-stack-vcell (((dest :lisp))
    1601                                     ((closed :lisp))
    1602                                     ((header :u32)))
     1726(define-arm-vinsn (make-stack-vcell :predicatable)
     1727    (((dest :lisp))
     1728     ((closed :lisp))
     1729     ((header :u32)))
    16031730  (mov header (:$ arm::subtag-value-cell))
    16041731  (orr header header (:$ (ash arm::value-cell.element-count arm::num-subtag-bits)))
     
    16061733  (add dest sp (:$ arm::fulltag-misc)))
    16071734
    1608 (define-arm-vinsn make-stack-cons (((dest :lisp))
    1609                                    ((car :lisp) (cdr :lisp))
    1610                                    ((header (:u32 #.arm::imm0))
    1611                                     (zero (:u32 #.arm::imm1))))
     1735(define-arm-vinsn (make-stack-cons :predicatable)
     1736    (((dest :lisp))
     1737     ((car :lisp) (cdr :lisp))
     1738     ((header (:u32 #.arm::imm0))
     1739      (zero (:u32 #.arm::imm1))))
    16121740  (mov header (:$ arm::subtag-simple-vector))
    16131741  (mov zero (:$ 0))
     
    16261754
    16271755
    1628 (define-arm-vinsn %closure-code% (((dest :lisp))
    1629                                   ())
     1756(define-arm-vinsn (%closure-code% :predicatable)
     1757    (((dest :lisp))
     1758     ())
    16301759  (mov dest (:$ arm::nil-value))
    16311760  (ldr dest (:@ dest (:$ (:apply + arm::symbol.vcell (arm::nrs-offset %closure-code%))))))
    16321761
    16331762
    1634 (define-arm-vinsn single-float-bits (((dest :u32))
    1635                                      ((src :lisp)))
     1763(define-arm-vinsn (single-float-bits :predicatable)
     1764    (((dest :u32))
     1765     ((src :lisp)))
    16361766  (ldr dest (:@ src (:$ arm::single-float.value))))
    16371767
     
    16701800
    16711801
    1672 (define-arm-vinsn ref-interrupt-level (((dest :imm))
    1673                                        ()
    1674                                        ((temp :u32)))
     1802(define-arm-vinsn (ref-interrupt-level :predicatable)
     1803    (((dest :imm))
     1804     ()
     1805     ((temp :u32)))
    16751806  (ldr temp (:@ rcontext (:$ arm::tcr.tlb-pointer)))
    16761807  (ldr dest (:@ temp (:$ arm::INTERRUPT-LEVEL-BINDING-INDEX))))
     
    16781809                         
    16791810;;; Unconditional (pc-relative) branch
    1680 (define-arm-vinsn (jump :jump) (()
    1681                                 ((label :label)))
     1811(define-arm-vinsn (jump :jump :predicatable)
     1812    (()
     1813     ((label :label)))
    16821814  (b label))
    16831815
     
    17121844
    17131845
    1714 (define-arm-vinsn lisp-word-ref (((dest t))
    1715                                  ((base t)
    1716                                   (offset t)))
     1846(define-arm-vinsn (lisp-word-ref :predicatable)
     1847    (((dest t))
     1848     ((base t)
     1849      (offset t)))
    17171850  (ldr dest (:@ base offset)))
    17181851
    1719 (define-arm-vinsn lisp-word-ref-c (((dest t))
    1720                                    ((base t)
    1721                                     (offset :s16const)))
     1852(define-arm-vinsn (lisp-word-ref-c :predicatable)
     1853    (((dest t))
     1854     ((base t)
     1855      (offset :s16const)))
    17221856  (ldr dest (:@ base (:$ offset))))
    17231857
     
    17251859
    17261860;; Load an unsigned, 32-bit constant into a destination register.
    1727 (define-arm-vinsn (lri :constant-ref) (((dest :imm))
    1728                                        ((intval :u32const))
    1729                                        ())
     1861(define-arm-vinsn (lri :constant-ref :predicatable)
     1862    (((dest :imm))
     1863     ((intval :u32const))
     1864     ())
    17301865  ((:pred arm::encode-arm-immediate intval)
    17311866   (mov dest (:$ intval)))
     
    17511886
    17521887
    1753 (define-arm-vinsn alloc-eabi-c-frame (()
    1754                                       ((n-c-args :u16const))
    1755                                       ((header :u32)
    1756                                        (size :imm)
    1757                                        (prevsp :imm)))
     1888(define-arm-vinsn (alloc-eabi-c-frame :predicatable)
     1889    (()
     1890     ((n-c-args :u16const))
     1891     ((header :u32)
     1892      (size :imm)
     1893      (prevsp :imm)))
    17581894  (mov header (:$ (:apply ash (:apply + 1 (:apply logandc2 (:apply + 4 4 1 n-c-args) 1)) arm::num-subtag-bits)))
    17591895  (mov size (:lsr header (:$ (- arm::num-subtag-bits arm::word-shift))))
     
    17641900  (str prevsp (:@ sp (:$ 4))))
    17651901
    1766 (define-arm-vinsn alloc-variable-c-frame (()
    1767                                           ((n-c-args :lisp))
    1768                                           ((header :u32)
    1769                                            (size :imm)
    1770                                            (prevsp :imm)))
     1902(define-arm-vinsn (alloc-variable-c-frame :predicatable)
     1903    (()
     1904     ((n-c-args :lisp))
     1905     ((header :u32)
     1906      (size :imm)
     1907      (prevsp :imm)))
    17711908  (add size n-c-args (:$ (ash (+ 4 1) arm::word-shift)))
    17721909  (bic size size (:$ arm::fixnumone))
     
    17851922;;; might as well exploit the fact that we stored the previous sp at
    17861923;;; offset 4 in the C frame.
    1787 (define-arm-vinsn (discard-c-frame :csp :pop :discard) (()
    1788                                                         ())
     1924(define-arm-vinsn (discard-c-frame :csp :pop :discard :predicatable)
     1925    (()
     1926     ())
    17891927  (ldr sp (:@ sp (:$ 4))))
    17901928
    17911929
    1792 (define-arm-vinsn gpr-to-single-float (((dest :single-float))
    1793                                        ((src :u32)))
     1930(define-arm-vinsn (gpr-to-single-float :predicatable)
     1931    (((dest :single-float))
     1932     ((src :u32)))
    17941933  (fmsr dest src))
    17951934
    1796 (define-arm-vinsn gpr-pair-to-double-float (((dest :double-float))
    1797                                             ((low :u32)
    1798                                              (high :u32)))
     1935(define-arm-vinsn (gpr-pair-to-double-float :predicatable)
     1936    (((dest :double-float))
     1937     ((low :u32)
     1938      (high :u32)))
    17991939  (fmdrr dest low high))
    18001940
    18011941
    1802 (define-arm-vinsn set-eabi-c-arg (()
    1803                              ((argval :u32)
    1804                               (argnum :u16const)))
     1942(define-arm-vinsn (set-eabi-c-arg :predicatable)
     1943    (()
     1944     ((argval :u32)
     1945      (argnum :u16const)))
    18051946  (str argval (:@ sp (:$ (:apply + arm::dnode-size (:apply ash argnum arm::word-shift))))))
    18061947
    18071948
    1808 (define-arm-vinsn set-single-eabi-c-arg (()
    1809                                     ((argval :single-float)
    1810                                      (argnum :u16const)))
     1949(define-arm-vinsn (set-single-eabi-c-arg :predicatable)
     1950    (()
     1951     ((argval :single-float)
     1952      (argnum :u16const)))
    18111953  (fsts argval (:@ sp (:$ (:apply + arm::dnode-size (:apply ash argnum arm::word-shift))))))
    18121954
    1813 (define-arm-vinsn set-double-eabi-c-arg (()
    1814                                          ((argval :double-float)
    1815                                           (argnum :u16const)))
     1955(define-arm-vinsn (set-double-eabi-c-arg :predicatable)
     1956    (()
     1957     ((argval :double-float)
     1958      (argnum :u16const)))
    18161959  (fstd argval (:@ sp (:$ (:apply + arm::dnode-size (:apply ash argnum arm::word-shift))))))
    18171960
    18181961
    18191962
    1820 (define-arm-vinsn (load-nil :constant-ref) (((dest t))
    1821                                             ())
     1963(define-arm-vinsn (load-nil :constant-ref :predicatable)
     1964    (((dest t))
     1965     ())
    18221966  (mov dest (:$ arm::nil-value)))
    18231967
    1824 (define-arm-vinsn (load-t :constant-ref) (((dest t))
    1825                                           ())
     1968(define-arm-vinsn (load-t :constant-ref :predicatable)
     1969    (((dest t))
     1970     ())
    18261971  (mov dest (:$ arm::nil-value))
    18271972  (add dest dest (:$ arm::t-offset)))
     
    18291974
    18301975
    1831 (define-arm-vinsn (ref-constant :constant-ref) (((dest :lisp))
    1832                                                 ((src :s16const)))
     1976(define-arm-vinsn (ref-constant :constant-ref :predicatable)
     1977    (((dest :lisp))
     1978     ((src :s16const)))
    18331979  (ldr dest (:@ fn (:$ (:apply + arm::misc-data-offset (:apply ash (:apply + src 2) 2))))))
    18341980
    1835 (define-arm-vinsn ref-indexed-constant (((dest :lisp))
    1836                                         ((idxreg :s32)))
     1981(define-arm-vinsn (ref-indexed-constant :predicatable)
     1982    (((dest :lisp))
     1983     ((idxreg :s32)))
    18371984  (ldr dest (:@ arm::fn idxreg)))
    18381985
     
    19152062  (bic allocptr allocptr (:$ arm::fulltagmask)))
    19162063
    1917 (define-arm-vinsn (vstack-discard :vsp :pop :discard) (()
    1918                                                        ((nwords :u32const)))
     2064(define-arm-vinsn (vstack-discard :vsp :pop :discard :predicatable)
     2065    (()
     2066     ((nwords :u32const)))
    19192067  ((:not (:pred = nwords 0))
    19202068   (add vsp vsp (:$ (:apply ash nwords arm::word-shift)))))
    19212069
    19222070
    1923 (define-arm-vinsn lcell-load (((dest :lisp))
    1924                               ((cell :lcell)
    1925                                (top :lcell)))
     2071(define-arm-vinsn (lcell-load :predicatable)
     2072    (((dest :lisp))
     2073     ((cell :lcell)
     2074      (top :lcell)))
    19262075  (ldr dest (:@ vsp (:$ (:apply -
    1927                     (:apply - (:apply calc-lcell-depth top) 4)
    1928                     (:apply calc-lcell-offset cell))))))
    1929 
    1930 (define-arm-vinsn vframe-load (((dest :lisp))
    1931                                ((frame-offset :u16const)
    1932                                 (cur-vsp :u16const)))
     2076                                (:apply - (:apply calc-lcell-depth top) 4)
     2077                                (:apply calc-lcell-offset cell))))))
     2078
     2079(define-arm-vinsn (vframe-load :predicatable)
     2080    (((dest :lisp))
     2081     ((frame-offset :u16const)
     2082      (cur-vsp :u16const)))
    19332083  (ldr dest (:@ vsp (:$ (:apply - (:apply - cur-vsp 4) frame-offset)))))
    19342084
    1935 (define-arm-vinsn lcell-store (()
    1936                                ((src :lisp)
    1937                                 (cell :lcell)
    1938                                 (top :lcell)))
     2085(define-arm-vinsn (lcell-store :predicatable)
     2086    (()
     2087     ((src :lisp)
     2088      (cell :lcell)
     2089      (top :lcell)))
    19392090  (str src (:@ vsp (:$ (:apply -
    1940                    (:apply - (:apply calc-lcell-depth top) 4)
    1941                    (:apply calc-lcell-offset cell))))))
    1942 
    1943 (define-arm-vinsn vframe-store (()
    1944                                 ((src :lisp)
    1945                                  (frame-offset :u16const)
    1946                                  (cur-vsp :u16const)))
     2091                               (:apply - (:apply calc-lcell-depth top) 4)
     2092                               (:apply calc-lcell-offset cell))))))
     2093
     2094(define-arm-vinsn (vframe-store :predicatable)
     2095    (()
     2096     ((src :lisp)
     2097      (frame-offset :u16const)
     2098      (cur-vsp :u16const)))
    19472099  (str src (:@ vsp (:$ (:apply - (:apply - cur-vsp 4) frame-offset)))))
    19482100
    1949 (define-arm-vinsn load-vframe-address (((dest :imm))
    1950                                        ((offset :s16const)))
     2101(define-arm-vinsn (load-vframe-address :predicatable)
     2102    (((dest :imm))
     2103     ((offset :s16const)))
    19512104  (add dest vsp (:$ offset)))
    19522105
    1953 (define-arm-vinsn copy-lexpr-argument (()
    1954                                        ()
    1955                                        ((temp :lisp)))
     2106(define-arm-vinsn (copy-lexpr-argument :predicatable)
     2107    (()
     2108     ()
     2109     ((temp :lisp)))
    19562110  (ldr temp (:@ vsp nargs))
    19572111  (str temp (:@! vsp (:$ (- arm::node-size)))))
     
    19602114
    19612115;;; Treat the low 8 bits of VAL as an unsigned integer; set RESULT to the equivalent fixnum.
    1962 (define-arm-vinsn u8->fixnum (((result :imm))
    1963                               ((val :u8))
    1964                               ())
     2116(define-arm-vinsn (u8->fixnum :predicatable)
     2117    (((result :imm))
     2118     ((val :u8))
     2119     ())
    19652120  (mov result (:lsl val (:$ 24)))
    19662121  (mov result (:lsr result (:$ (- 24 arm::fixnumshift)))))
    19672122
    19682123;;; Treat the low 8 bits of VAL as a signed integer; set RESULT to the equivalent fixnum.
    1969 (define-arm-vinsn s8->fixnum (((result :imm))
    1970                               ((val :s8))
    1971                               ())
     2124(define-arm-vinsn (s8->fixnum :predicatable)
     2125    (((result :imm))
     2126     ((val :s8))
     2127     ())
    19722128  (mov result (:lsr val (:$ 24)))
    19732129  (mov result (:asr val (:$ (- 24 arm::fixnumshift)))))
     
    19752131
    19762132;;; Treat the low 16 bits of VAL as an unsigned integer; set RESULT to the equivalent fixnum.
    1977 (define-arm-vinsn u16->fixnum (((result :imm))
    1978                                ((val :u16))
    1979                                ())
     2133(define-arm-vinsn (u16->fixnum :predicatable)
     2134    (((result :imm))
     2135     ((val :u16))
     2136     ())
    19802137  (mov result (:lsl val (:$ 16)))
    19812138  (mov result (:lsr result (:$ (- 16 arm::fixnumshift)))))
    19822139
    19832140;;; Treat the low 16 bits of VAL as a signed integer; set RESULT to the equivalent fixnum.
    1984 (define-arm-vinsn s16->fixnum (((result :imm))
    1985                                ((val :s16))
    1986                                ())
     2141(define-arm-vinsn (s16->fixnum :predicatable)
     2142    (((result :imm))
     2143     ((val :s16))
     2144     ())
    19872145  (mov result (:lsl val (:$ 16)))
    19882146  (mov result (:asr result (:$ (- 16 arm::fixnumshift)))))
    19892147
    1990 (define-arm-vinsn fixnum->s16 (((result :s16))
    1991                                ((src :imm)))
     2148(define-arm-vinsn (fixnum->s16 :predicatable)
     2149    (((result :s16))
     2150     ((src :imm)))
    19922151  (mov result (:asr src (:$ arm::fixnumshift))))
    19932152
     
    20382197  :done)
    20392198
    2040 (define-arm-vinsn u16->u32 (((dest :u32))
    2041                             ((src :u16)))
     2199(define-arm-vinsn (u16->u32 :predicatable)
     2200    (((dest :u32))
     2201     ((src :u16)))
    20422202  (mov dest (:$ #xff))
    20432203  (orr dest dest (:$ #xff00))
    20442204  (and dest dest src))
    20452205
    2046 (define-arm-vinsn u8->u32 (((dest :u32))
    2047                            ((src :u8)))
     2206(define-arm-vinsn (u8->u32 :predicatable)
     2207    (((dest :u32))
     2208     ((src :u8)))
    20482209  (and dest src (:$ #xff)))
    20492210
    20502211
    2051 (define-arm-vinsn s16->s32 (((dest :s32))
    2052                             ((src :s16)))
     2212(define-arm-vinsn (s16->s32 :predicatable)
     2213    (((dest :s32))
     2214     ((src :s16)))
    20532215  (mov dest (:lsl src (:$ 16)))
    20542216  (mov dest (:asr src (:$ 16))))
    20552217
    2056 (define-arm-vinsn s8->s32 (((dest :s32))
    2057                            ((src :s8)))
     2218(define-arm-vinsn (s8->s32 :predicatable)
     2219    (((dest :s32))
     2220     ((src :s8)))
    20582221  (mov dest (:lsl src (:$ 24)))
    20592222  (mov dest (:asr src (:$ 24))))
     
    21032266
    21042267;;; "dest" is preallocated, presumably on a stack somewhere.
    2105 (define-arm-vinsn store-double (()
    2106                                 ((dest :lisp)
    2107                                  (source :double-float))
    2108                                 ((low (:u32 #.arm::imm0))
    2109                                  (high (:u32 #.arm::imm1))))
     2268(define-arm-vinsn (store-double :predicatable)
     2269    (()
     2270     ((dest :lisp)
     2271      (source :double-float))
     2272     ((low (:u32 #.arm::imm0))
     2273      (high (:u32 #.arm::imm1))))
    21102274  (fmrrd low high source)
    21112275  (str low (:@ dest (:$ arm::double-float.value))))
    21122276
    2113 (define-arm-vinsn get-double (((target :double-float))
    2114                               ((source :lisp))
    2115                               ((low (:u32 #.arm::imm0))
    2116                                (high (:u32 #.arm::imm1))))
     2277(define-arm-vinsn (get-double :predicatable)
     2278    (((target :double-float))
     2279     ((source :lisp))
     2280     ((low (:u32 #.arm::imm0))
     2281      (high (:u32 #.arm::imm1))))
    21172282  (ldrd low (:@ source (:$ arm::double-float.value)))
    21182283  (fmdrr target low high))
     
    21392304  (fcvtsd result arg))
    21402305
    2141 (define-arm-vinsn store-single (()
    2142                                 ((dest :lisp)
    2143                                  (source :single-float))
    2144                                 ((temp :u32)))
     2306(define-arm-vinsn double-to-single (((result :double-float))
     2307                                    ((arg :single-float)))
     2308  (fcvtds result arg))
     2309
     2310(define-arm-vinsn (store-single :predicatable)
     2311    (()
     2312     ((dest :lisp)
     2313      (source :single-float))
     2314     ((temp :u32)))
    21452315  (fmrs temp source)
    21462316  (str temp (:@ dest (:$ arm::single-float.value))))
    21472317
    2148 (define-arm-vinsn get-single (((target :single-float))
    2149                               ((source :lisp))
    2150                               ((temp :u32)))
     2318(define-arm-vinsn (get-single :predicatable)
     2319    (((target :single-float))
     2320     ((source :lisp))
     2321     ((temp :u32)))
    21512322  (ldr temp (:@ source (:$ arm::single-float.value)))
    21522323  (fmsr target temp))
     
    21552326
    21562327
    2157 (define-arm-vinsn character->fixnum (((dest :lisp))
    2158                                      ((src :lisp))
    2159                                      ())
     2328(define-arm-vinsn (character->fixnum :predicatable)
     2329    (((dest :lisp))
     2330     ((src :lisp))
     2331     ())
    21602332  (bic dest src (:$ arm::subtag-mask))
    21612333  (mov dest (:lsr dest (:$ (- arm::charcode-shift arm::fixnumshift)))))
    21622334
    2163 (define-arm-vinsn character->code (((dest :u32))
    2164                                    ((src :lisp)))
     2335(define-arm-vinsn (character->code :predicatable)
     2336    (((dest :u32))
     2337     ((src :lisp)))
    21652338  (mov dest (:lsr src (:$ arm::charcode-shift))))
    21662339
     
    21832356
    21842357;;; src is known to be a code for which CODE-CHAR returns non-nil.
    2185 (define-arm-vinsn code-char->char (((dest :lisp))
    2186                                    ((src :imm))
    2187                                    ())
     2358(define-arm-vinsn (code-char->char :predicatable)
     2359    (((dest :lisp))
     2360     ((src :imm))
     2361     ())
    21882362  (mov dest (:lsl src (:$ (- arm::charcode-shift arm::fixnum-shift))))
    21892363  (orr dest dest (:$ arm::subtag-character)))
    21902364
    2191 (define-arm-vinsn u32->char (((dest :lisp))
    2192                              ((src :u32))
    2193                              ())
     2365(define-arm-vinsn (u32->char :predicatable)
     2366    (((dest :lisp))
     2367     ((src :u32))
     2368     ())
    21942369  (mov dest (:lsl src (:$ arm::charcode-shift)))
    21952370  (orr dest dest (:$ arm::subtag-character)))
     
    21972372;; ... Macptrs ...
    21982373
    2199 (define-arm-vinsn deref-macptr (((addr :address))
    2200                                 ((src :lisp))
    2201                                 ())
     2374(define-arm-vinsn (deref-macptr :predicatable)
     2375    (((addr :address))
     2376     ((src :lisp))
     2377     ())
    22022378  (ldr addr (:@ src (:$ arm::macptr.address))))
    22032379
    2204 (define-arm-vinsn set-macptr-address (()
    2205                                       ((addr :address)
    2206                                        (src :lisp))
    2207                                       ())
     2380(define-arm-vinsn (set-macptr-address :predicatable)
     2381    (()
     2382     ((addr :address)
     2383      (src :lisp))
     2384     ())
    22082385  (str addr (:@ src (:$ arm::macptr.address))))
    22092386
     
    22252402  (str address (:@ dest (:$ arm::macptr.address))))
    22262403
    2227 (define-arm-vinsn macptr->stack (((dest :lisp))
    2228                                  ((address :address))
    2229                                  ((header :u32)))
     2404(define-arm-vinsn (macptr->stack :predicatable)
     2405    (((dest :lisp))
     2406     ((address :address))
     2407     ((header :u32)))
    22302408  (mov header (:$ arm::subtag-macptr))
    22312409  (orr header header (:$ (ash arm::macptr.element-count arm::num-subtag-bits)))
     
    22392417
    22402418 
    2241 (define-arm-vinsn adjust-stack-register (()
    2242                                          ((reg t)
    2243                                           (amount :s16const)))
     2419(define-arm-vinsn (adjust-stack-register :predicatable)
     2420    (()
     2421     ((reg t)
     2422      (amount :s16const)))
    22442423  (add reg reg (:$ amount)))
    22452424
    2246 (define-arm-vinsn adjust-vsp (()
    2247                               ((amount :s16const)))
     2425(define-arm-vinsn (adjust-vsp :predicatable)
     2426    (()
     2427     ((amount :s16const)))
    22482428  (add vsp vsp (:$ amount)))
    22492429
    2250 (define-arm-vinsn adjust-sp (()
    2251                              ((amount :s16const)))
     2430(define-arm-vinsn (adjust-sp :predicatable)
     2431    (()
     2432     ((amount :s16const)))
    22522433  (add sp sp (:$ amount)))
    22532434
    22542435;; Arithmetic on fixnums & unboxed numbers
    22552436
    2256 (define-arm-vinsn u32-lognot (((dest :u32))
    2257                               ((src :u32))
    2258                               ())
     2437(define-arm-vinsn (u32-lognot :predicatable)
     2438    (((dest :u32))
     2439     ((src :u32))
     2440     ())
    22592441  (mvn dest src))
    22602442
    2261 (define-arm-vinsn fixnum-lognot (((dest :imm))
    2262                                  ((src :imm))
    2263                                  ((temp :u32)))
     2443(define-arm-vinsn (fixnum-lognot :predicatable)
     2444    (((dest :imm))
     2445     ((src :imm))
     2446     ((temp :u32)))
    22642447  (mvn temp src)
    22652448  (bic dest temp (:$ arm::fixnummask)))
     
    22942477                                                 
    22952478                                       
    2296 (define-arm-vinsn negate-fixnum-no-ovf (((dest :lisp))
    2297                                         ((src :imm)))
     2479(define-arm-vinsn (negate-fixnum-no-ovf :predicatable)
     2480    (((dest :lisp))
     2481     ((src :imm)))
    22982482 
    22992483  (rsb dest src (:$ 0)))
    23002484 
    23012485
    2302 (define-arm-vinsn logior-immediate (((dest :imm))
    2303                                ((src :imm)
    2304                                 (imm :u32const)))
     2486(define-arm-vinsn (logior-immediate :predicatable)
     2487    (((dest :imm))
     2488     ((src :imm)
     2489      (imm :u32const)))
    23052490  (orr dest src (:$ imm)))
    23062491
    23072492                           
    23082493                           
    2309 (define-arm-vinsn %logior2 (((dest :imm))
    2310                             ((x :imm)
    2311                              (y :imm))
    2312                             ())
     2494(define-arm-vinsn (%logior2 :predicatable)
     2495    (((dest :imm))
     2496     ((x :imm)
     2497      (y :imm))
     2498     ())
    23132499  (orr dest x y))
    23142500
    2315 (define-arm-vinsn logand-immediate (((dest :imm))
    2316                                ((src :imm)
    2317                                 (imm :u32const)))
     2501(define-arm-vinsn (logand-immediate :predicatable)
     2502    (((dest :imm))
     2503     ((src :imm)
     2504      (imm :u32const)))
    23182505  (and dest src (:$ imm)))
    23192506
    23202507
    2321 (define-arm-vinsn %logand2 (((dest :imm))
    2322                             ((x :imm)
    2323                              (y :imm))
    2324                             ())
     2508(define-arm-vinsn (%logand2 :predicatable)
     2509    (((dest :imm))
     2510     ((x :imm)
     2511      (y :imm))
     2512     ())
    23252513  (and dest x y))
    23262514
    2327 (define-arm-vinsn logxor-immediate (((dest :imm))
    2328                                     ((src :imm)
    2329                                      (imm :u32const)))
     2515(define-arm-vinsn (logxor-immediate :predicatable)
     2516    (((dest :imm))
     2517     ((src :imm)
     2518      (imm :u32const)))
    23302519  (eor dest src (:$ imm)))
    23312520                                   
     
    23332522                               
    23342523
    2335 (define-arm-vinsn %logxor2 (((dest :imm))
    2336                             ((x :imm)
    2337                              (y :imm))
    2338                             ())
     2524(define-arm-vinsn (%logxor2 :predicatable)
     2525    (((dest :imm))
     2526     ((x :imm)
     2527      (y :imm))
     2528     ())
    23392529  (eor dest x y))
    23402530
    23412531;;; ARM register shifts shift by the low byte of RS.
    2342 (define-arm-vinsn %ilsl (((dest :imm))
    2343                          ((count :imm)
    2344                           (src :imm))
    2345                          ((temp :u32)))
     2532(define-arm-vinsn (%ilsl :predicatable)
     2533    (((dest :imm))
     2534     ((count :imm)
     2535      (src :imm))
     2536     ((temp :u32)))
    23462537  (mov temp (:asr count (:$ arm::fixnumshift)))
    23472538  (mov dest (:lsl src temp)))
    23482539
    23492540;;; Shift by a constant = -> shift by 32.  Don't do that.
    2350 (define-arm-vinsn %ilsl-c (((dest :imm))
    2351                            ((count :u8const)
    2352                             (src :imm)))
     2541(define-arm-vinsn (%ilsl-c :predicatable)
     2542    (((dest :imm))
     2543     ((count :u8const)
     2544      (src :imm)))
    23532545  ((:pred = count 0)
    23542546   (mov dest src))
     
    23572549
    23582550
    2359 (define-arm-vinsn %ilsr-c (((dest :imm))
    2360                            ((count :u8const)
    2361                             (src :imm))
    2362                            ((temp :s32)))
     2551(define-arm-vinsn (%ilsr-c :predicatable)
     2552    (((dest :imm))
     2553     ((count :u8const)
     2554      (src :imm))
     2555     ((temp :s32)))
    23632556  (mov temp (:lsr src (:$ count)))
    23642557  (bic dest temp (:$ arm::fixnummask)))
    23652558
    23662559
    2367 (define-arm-vinsn %iasr (((dest :imm))
    2368                          ((count :imm)
    2369                           (src :imm))
    2370                          ((temp :s32)))
     2560(define-arm-vinsn (%iasr :predicatable)
     2561    (((dest :imm))
     2562     ((count :imm)
     2563      (src :imm))
     2564     ((temp :s32)))
    23712565  (mov temp (:asr count (:$ arm::fixnumshift)))
    23722566  (mov temp (:asr src temp))
     
    23832577   (bic dest temp (:$ arm::fixnummask))))
    23842578
    2385 (define-arm-vinsn %ilsr (((dest :imm))
    2386                          ((count :imm)
    2387                           (src :imm))
    2388                          ((temp :s32)))
     2579(define-arm-vinsn (%ilsr :predicatable)
     2580    (((dest :imm))
     2581     ((count :imm)
     2582      (src :imm))
     2583     ((temp :s32)))
    23892584  (mov temp (:asr count (:$ arm::fixnumshift)))
    23902585  (mov temp (:lsr src temp))
     
    23922587
    23932588
    2394 (define-arm-vinsn %ilsr-c (((dest :imm))
    2395                            ((count :u8const)
    2396                             (src :imm))
    2397                            ((temp :s32)))
     2589(define-arm-vinsn (%ilsr-c :predicatable)
     2590    (((dest :imm))
     2591     ((count :u8const)
     2592      (src :imm))
     2593     ((temp :s32)))
    23982594  ((:pred = count 0)
    23992595   (mov dest src))
     
    24022598   (bic dest temp (:$ arm::fixnummask))))
    24032599
    2404 (define-arm-vinsn natural-shift-left (((dest :u32))
    2405                                       ((src :u32)
    2406                                        (count :u8const)))
     2600(define-arm-vinsn (natural-shift-left :predicatable)
     2601    (((dest :u32))
     2602     ((src :u32)
     2603      (count :u8const)))
    24072604  ((:pred = count 0)
    24082605   (mov dest src))
     
    24102607   (mov dest (:lsl src (:$ count)))))
    24112608
    2412 (define-arm-vinsn natural-shift-right (((dest :u32))
    2413                                        ((src :u32)
    2414                                         (count :u8const)))
     2609(define-arm-vinsn (natural-shift-right :predicatable)
     2610    (((dest :u32))
     2611     ((src :u32)
     2612      (count :u8const)))
    24152613  ((:pred = count 0)
    24162614   (mov dest src))
     
    24642662 
    24652663 
    2466 (define-arm-vinsn sign-extend-halfword (((dest :imm))
    2467                                         ((src :imm)))
     2664(define-arm-vinsn (sign-extend-halfword :predicatable)
     2665    (((dest :imm))
     2666     ((src :imm)))
    24682667  (mov dest (:lsl src (:$ (- 16 arm::fixnumshift))))
    24692668  (mov dest (:asr dest (:$ (- 16 arm::fixnumshift)))))
     
    24722671                           
    24732672
    2474 (define-arm-vinsn fixnum-add (((dest t))
    2475                               ((x t)
    2476                                (y t)))
     2673(define-arm-vinsn (fixnum-add :predicatable)
     2674    (((dest t))
     2675     ((x t)
     2676      (y t)))
    24772677  (add dest x y))
    24782678
     
    25322732
    25332733;;;  (setq dest (- x y))
    2534 (define-arm-vinsn fixnum-sub (((dest t))
    2535                               ((x t)
    2536                                (y t)))
     2734(define-arm-vinsn (fixnum-sub :predicatable)
     2735    (((dest t))
     2736     ((x t)
     2737      (y t)))
    25372738  (sub dest x y))
    25382739
    2539 (define-arm-vinsn fixnum-sub-from-constant (((dest :imm))
    2540                                             ((x :s16const)
    2541                                              (y :imm)))
     2740(define-arm-vinsn (fixnum-sub-from-constant :predicatable)
     2741    (((dest :imm))
     2742     ((x :s16const)
     2743      (y :imm)))
    25422744  (rsb dest y (:$ (:apply ash x arm::fixnumshift))))
    25432745
     
    25962798
    25972799;;; This is, of course, also "subtract-immediate."
    2598 (define-arm-vinsn add-immediate (((dest t))
    2599                                  ((src t)
    2600                                   (imm :s32const)))
     2800(define-arm-vinsn (add-immediate :predicatable)
     2801    (((dest t))
     2802     ((src t)
     2803      (imm :s32const)))
    26012804  (add dest src (:$ imm)))
    26022805
    2603 (define-arm-vinsn multiply-fixnums (((dest :imm))
    2604                                     ((a :imm)
    2605                                      (b :imm))
    2606                                     ((unboxed :s32)))
     2806(define-arm-vinsn (multiply-fixnums :predicatable)
     2807    (((dest :imm))
     2808     ((a :imm)
     2809      (b :imm))
     2810     ((unboxed :s32)))
    26072811  (mov unboxed (:asr b (:$ arm::fixnumshift)))
    26082812  (mul dest a unboxed))
     
    26122816;;; Mask out the code field of a base character; the result
    26132817;;; should be EXACTLY = to subtag-base-char
    2614 (define-arm-vinsn mask-base-char (((dest :u32))
    2615                                   ((src :imm)))
     2818(define-arm-vinsn (mask-base-char :predicatable)
     2819    (((dest :u32))
     2820     ((src :imm)))
    26162821  (and dest src (:$ arm::subtag-mask)))
    26172822
     
    26872892  (uuo-error-udf (:? ne) sym))
    26882893
    2689 (define-arm-vinsn (temp-push-unboxed-word :push :word :sp)
     2894(define-arm-vinsn (temp-push-unboxed-word :push :word :sp :predicatable)
     2895   
    26902896    (()
    26912897     ((w :u32))
     
    26962902  (str w (:@ sp (:$ 4))))
    26972903
    2698 (define-arm-vinsn (temp-pop-unboxed-word :pop :word :sp)
     2904(define-arm-vinsn (temp-pop-unboxed-word :pop :word :sp :predicatable)
     2905   
    26992906    (((w :u32))
    27002907     ())
     
    27022909  (add sp sp (:$ arm::dnode-size)))
    27032910
    2704 (define-arm-vinsn (temp-push-double-float :push :doubleword :sp)
     2911(define-arm-vinsn (temp-push-double-float :push :doubleword :sp :predicatable)
     2912   
    27052913    (()
    27062914     ((d :double-float))
     
    27112919  (fstd d (:@ sp (:$ 8))))
    27122920
    2713 (define-arm-vinsn (temp-pop-double-float :pop :doubleword :sp)
     2921(define-arm-vinsn (temp-pop-double-float :pop :doubleword :sp :predicatable)
     2922   
    27142923    (()
    27152924     ((d :double-float)))
     
    27182927
    27192928
    2720 (define-arm-vinsn (temp-push-single-float :push :word :tsp)
     2929(define-arm-vinsn (temp-push-single-float :push :word :tsp :predicatable)
     2930   
    27212931    (()
    27222932     ((s :single-float))
     
    27282938
    27292939
    2730 (define-arm-vinsn (temp-pop-single-float :pop :word :sp)
     2940(define-arm-vinsn (temp-pop-single-float :pop :word :sp :predicatable)
     2941   
    27312942    (()
    27322943     ((s :single-float)))
     
    27362947
    27372948
    2738 (define-arm-vinsn %current-frame-ptr (((dest :imm))
    2739                                       ())
     2949(define-arm-vinsn (%current-frame-ptr :predicatable)
     2950    (((dest :imm))
     2951     ())
    27402952  (mov dest arm::sp))
    27412953
    2742 (define-arm-vinsn %current-tcr (((dest :imm))
    2743                                 ())
     2954(define-arm-vinsn (%current-tcr :predicatable)
     2955    (((dest :imm))
     2956     ())
    27442957  (mov dest rcontext))
    27452958
     
    27532966   (bl .SPunbind)))
    27542967
    2755 (define-arm-vinsn zero-double-float-register (((dest :double-float))
    2756                                               ()
    2757                                               ((low (:u32 #.arm::imm0))))
     2968(define-arm-vinsn (zero-double-float-register :predicatable)
     2969    (((dest :double-float))
     2970     ()
     2971     ((low (:u32 #.arm::imm0))))
    27582972  (mov low (:$ 0))
    27592973  (fmdrr dest low low))
    27602974
    2761 (define-arm-vinsn zero-single-float-register (((dest :single-float))
    2762                                               ()
    2763                                               ((temp :imm)))
     2975(define-arm-vinsn (zero-single-float-register :predicatable)
     2976    (((dest :single-float))
     2977     ()
     2978     ((temp :imm)))
    27642979  (mov temp (:$ 0))
    27652980  (fmsr dest temp))
    27662981
    2767 (define-arm-vinsn load-double-float-constant (((dest :double-float))
    2768                                               ((high :u32)
    2769                                                (low :u32)))
     2982(define-arm-vinsn (load-double-float-constant :predicatable)
     2983    (((dest :double-float))
     2984     ((high :u32)
     2985      (low :u32)))
    27702986  (fmdrr dest low high))
    27712987
    2772 (define-arm-vinsn load-single-float-constant    (((dest :single-float))
    2773                                                  ((src t)))
     2988(define-arm-vinsn (load-single-float-constant :predicatable)
     2989    (((dest :single-float))
     2990     ((src t)))
    27742991  (fmsr dest src))
    27752992
    2776 (define-arm-vinsn load-indexed-node (((node :lisp))
    2777                                      ((base :lisp)
    2778                                       (offset :s16const)))
     2993(define-arm-vinsn (load-indexed-node :predicatable)
     2994    (((node :lisp))
     2995     ((base :lisp)
     2996      (offset :s16const)))
    27792997  (ldr node (:@ base (:$ offset))))
    27802998
     
    29153133
    29163134
    2917 (define-arm-vinsn (jump-return-pc :jumpLR)
     3135(define-arm-vinsn (jump-return-pc :jumpLR :predicatable)
    29183136    (()
    29193137     ())
    29203138  (bx lr))
    29213139
    2922 (define-arm-vinsn (restore-full-lisp-context :lispcontext :pop :csp :lrRestore)
     3140(define-arm-vinsn (restore-full-lisp-context :lispcontext :pop :csp :lrRestore :predicatable)
    29233141    (()
    29243142     ())
     
    29293147
    29303148
    2931 (define-arm-vinsn (popj :lispcontext :pop :csp :lrRestore :jumpLR)
     3149(define-arm-vinsn (popj :lispcontext :pop :csp :lrRestore :jumpLR :predicatable)
    29323150    (()
    29333151     ())
     
    30483266  (ldr pc (:@ nfn (:$ arm::function.entrypoint))))
    30493267
    3050 (define-arm-vinsn %schar8 (((char :imm))
    3051                            ((str :lisp)
    3052                             (idx :imm))
    3053                            ((imm :u32)))
     3268(define-arm-vinsn (%schar8 :predicatable)
     3269    (((char :imm))
     3270     ((str :lisp)
     3271      (idx :imm))
     3272     ((imm :u32)))
    30543273  (mov imm (:lsr idx (:$ arm::fixnumshift)))
    30553274  (add imm imm (:$ arm::misc-data-offset))
     
    30583277  (orr char imm (:$ arm::subtag-character)))
    30593278
    3060 (define-arm-vinsn %schar32 (((char :imm))
    3061                             ((str :lisp)
    3062                              (idx :imm))
    3063                             ((imm :u32)))
     3279(define-arm-vinsn (%schar32 :predicatable)
     3280    (((char :imm))
     3281     ((str :lisp)
     3282      (idx :imm))
     3283     ((imm :u32)))
    30643284  (add imm idx (:$ arm::misc-data-offset))
    30653285  (ldr imm (:@ str imm))
     
    30683288
    30693289
    3070 (define-arm-vinsn %set-schar8 (()
    3071                                ((str :lisp)
    3072                                 (idx :imm)
    3073                                 (char :imm))
    3074                                ((imm :u32)
    3075                                 (imm1 :u32)))
     3290(define-arm-vinsn (%set-schar8 :predicatable)
     3291    (()
     3292     ((str :lisp)
     3293      (idx :imm)
     3294      (char :imm))
     3295     ((imm :u32)
     3296      (imm1 :u32)))
    30763297  (mov imm (:lsr idx (:$ arm::fixnumshift)))
    30773298  (add imm imm (:$ arm::misc-data-offset))
     
    30793300  (strb imm1 (:@ str imm)))
    30803301
    3081 (define-arm-vinsn %set-schar32 (()
    3082                                 ((str :lisp)
    3083                                  (idx :imm)
    3084                                  (char :imm))
    3085                                 ((imm :u32)
    3086                                  (imm1 :u32)))
     3302(define-arm-vinsn (%set-schar32 :predicatable)
     3303    (()
     3304     ((str :lisp)
     3305      (idx :imm)
     3306      (char :imm))
     3307     ((imm :u32)
     3308      (imm1 :u32)))
    30873309  (add imm idx (:$ arm::misc-data-offset))
    30883310  (mov imm1 (:lsr char (:$ arm::charcode-shift)))
    30893311  (str imm1 (:@ str imm)))
    30903312
    3091 (define-arm-vinsn %set-scharcode8 (()
    3092                                    ((str :lisp)
    3093                                     (idx :imm)
    3094                                     (code :imm))
    3095                                    ((imm :u32)
    3096                                     (imm1 :u32)))
     3313(define-arm-vinsn (%set-scharcode8 :predicatable)
     3314    (()
     3315     ((str :lisp)
     3316      (idx :imm)
     3317      (code :imm))
     3318     ((imm :u32)
     3319      (imm1 :u32)))
    30973320  (mov imm (:lsr idx (:$ arm::fixnumshift)))
    30983321  (add imm imm (:$ arm::misc-data-offset))
     
    31013324
    31023325
    3103 (define-arm-vinsn %set-scharcode32 (()
    3104                                     ((str :lisp)
    3105                                      (idx :imm)
    3106                                      (code :imm))
    3107                                     ((imm :u32)
    3108                                      (imm1 :u32)))
     3326(define-arm-vinsn (%set-scharcode32 :predicatable)
     3327    (()
     3328     ((str :lisp)
     3329      (idx :imm)
     3330      (code :imm))
     3331     ((imm :u32)
     3332      (imm1 :u32)))
    31093333  (add imm idx (:$ arm::misc-data-offset))
    31103334  (mov imm1 (:lsr code (:$ arm::fixnumshift)))
    31113335  (str imm1 (:@ str imm)))
    31123336
    3113 (define-arm-vinsn %scharcode8 (((code :imm))
    3114                                ((str :lisp)
    3115                                 (idx :imm))
    3116                                ((imm :u32)))
     3337(define-arm-vinsn (%scharcode8 :predicatable)
     3338    (((code :imm))
     3339     ((str :lisp)
     3340      (idx :imm))
     3341     ((imm :u32)))
    31173342  (mov imm (:lsr idx (:$ arm::fixnumshift)))
    31183343  (add imm imm (:$ arm::misc-data-offset))
     
    31203345  (mov code (:lsl imm (:$ arm::fixnumshift))))
    31213346
    3122 (define-arm-vinsn %scharcode32 (((code :imm))
    3123                                 ((str :lisp)
    3124                                  (idx :imm))
    3125                                 ((imm :u32)))
     3347(define-arm-vinsn (%scharcode32 :predicatable)
     3348    (((code :imm))
     3349     ((str :lisp)
     3350      (idx :imm))
     3351     ((imm :u32)))
    31263352  (add imm idx (:$ arm::misc-data-offset))
    31273353  (ldr imm (:@ str imm))
     
    31403366  (uuo-eep-unresolved (:? eq) dest src))
    31413367                 
    3142 (define-arm-vinsn %natural+ (((dest :u32))
    3143                              ((x :u32) (y :u32)))
     3368(define-arm-vinsn (%natural+ :predicatable)
     3369    (((dest :u32))
     3370     ((x :u32) (y :u32)))
    31443371  (add dest x y))
    31453372
    3146 (define-arm-vinsn %natural+-c (((dest :u32))
    3147                                ((x :u32) (y :u16const)))
     3373(define-arm-vinsn (%natural+-c :predicatable)
     3374    (((dest :u32))
     3375     ((x :u32) (y :u16const)))
    31483376  (add dest x (:$ y)))
    31493377
    3150 (define-arm-vinsn %natural- (((dest :u32))
    3151                              ((x :u32) (y :u32)))
     3378(define-arm-vinsn (%natural- :predicatable)
     3379    (((dest :u32))
     3380     ((x :u32) (y :u32)))
    31523381  (sub dest x y))
    31533382
    3154 (define-arm-vinsn %natural--c (((dest :u32))
    3155                                ((x :u32) (y :u16const)))
     3383(define-arm-vinsn (%natural--c :predicatable)
     3384    (((dest :u32))
     3385     ((x :u32) (y :u16const)))
    31563386  (sub dest x (:$ y)))
    31573387
    3158 (define-arm-vinsn %natural-logior (((dest :u32))
    3159                                    ((x :u32) (y :u32)))
     3388(define-arm-vinsn (%natural-logior :predicatable)
     3389    (((dest :u32))
     3390     ((x :u32) (y :u32)))
    31603391  (orr dest x y))
    31613392
    3162 (define-arm-vinsn %natural-logior-c (((dest :u32))
    3163                                      ((x :u32) (c :u32const)))
     3393(define-arm-vinsn (%natural-logior-c :predicatable)
     3394    (((dest :u32))
     3395     ((x :u32) (c :u32const)))
    31643396  (orr dest x (:$ c)))
    31653397
    3166 (define-arm-vinsn %natural-logxor (((dest :u32))
    3167                                    ((x :u32) (y :u32)))
     3398(define-arm-vinsn (%natural-logxor :predicatable)
     3399    (((dest :u32))
     3400     ((x :u32) (y :u32)))
    31683401  (eor dest x y))
    31693402
    3170 (define-arm-vinsn %natural-logxor-c (((dest :u32))
    3171                                      ((x :u32) (c :u32const)))
     3403(define-arm-vinsn (%natural-logxor-c :predicatable)
     3404    (((dest :u32))
     3405     ((x :u32) (c :u32const)))
    31723406  (eor dest x (:$ c)))
    31733407
    3174 (define-arm-vinsn %natural-logand (((dest :u32))
    3175                                    ((x :u32) (y :u32)))
     3408(define-arm-vinsn (%natural-logand :predicatable)
     3409    (((dest :u32))
     3410     ((x :u32) (y :u32)))
    31763411  (and dest x y))
    31773412
     
    31993434
    32003435
    3201 (define-arm-vinsn disable-interrupts (((dest :lisp))
    3202                                       ()
    3203                                       ((temp :imm)
    3204                                        (temp2 :imm)))
     3436(define-arm-vinsn (disable-interrupts :predicatable)
     3437    (((dest :lisp))
     3438     ()
     3439     ((temp :imm)
     3440      (temp2 :imm)))
    32053441  (ldr temp2 (:@ rcontext (:$ arm::tcr.tlb-pointer)))
    32063442  (mov temp (:$ -4))
     
    32083444  (str temp (:@ temp2 (:$ arm::interrupt-level-binding-index))))
    32093445
    3210 (define-arm-vinsn load-character-constant (((dest :lisp))
    3211                                            ((code :u32const)))
     3446(define-arm-vinsn (load-character-constant :predicatable)
     3447    (((dest :lisp))
     3448     ((code :u32const)))
    32123449  (mov dest (:$ arm::subtag-character))
    32133450  ((:pred logtest #xff code)
     
    32743511(define-arm-subprim-jump-vinsn (tail-funcall-slide) .SPtfuncallslide)
    32753512
    3276 (define-arm-vinsn (tail-funcall-vsp :jumpLR) (() ())
     3513(define-arm-vinsn (tail-funcall-vsp :jumpLR :predicatable) (() ())
    32773514  (ldmia (:! sp) (imm0 vsp fn lr))
    32783515  (ba .SPfuncall))
     
    34873724  (uuo-interrupt-now (:? ne))
    34883725  :done)
     3726
     3727(define-arm-vinsn test-fixnum  (((dest :crf))
     3728                                ((src :lisp)))
     3729  (tst src (:$ arm::fixnummask)))
     3730                 
    34893731 
    34903732
  • branches/arm/compiler/ARM/arm2.lisp

    r13897 r13955  
    3535(defparameter *arm2-half-fixnum-type* '(signed-byte 29))
    3636(defparameter *arm2-target-half-fixnum-type* nil)
     37(defparameter *arm2-operator-supports-u8-target* ())
     38
    3739
    3840
     
    4951     ,@body))
    5052
     53
     54(defun arm2-emit-vinsn (vlist name vinsn-table &rest vregs)
     55  (arm2-update-regmap (apply #'%emit-vinsn vlist name vinsn-table vregs)))
    5156
    5257(defmacro with-arm-local-vinsn-macros ((segvar &optional vreg-var xfer-var) &body body)
     
    6267                    (unless ,template-temp
    6368                      (warn "VINSN \"~A\" not defined" ,template-name-var))
    64                     `(arm2-update-regmap (%emit-vinsn ,',segvar ',,template-name-var (backend-p2-vinsn-templates *target-backend*) ,@,args-var)))))
     69                    `(arm2-emit-vinsn ,',segvar ',,template-name-var (backend-p2-vinsn-templates *target-backend*) ,@,args-var))))
    6570       (macrolet ((<- (,retvreg-var)
    6671                    `(arm2-copy-register ,',segvar ,',vreg-var ,,retvreg-var))
     
    513518
    514519(defun arm2-update-regmap (vinsn)
    515   (if (vinsn-attribute-p vinsn :call :jump)
     520  (if (vinsn-attribute-p vinsn :call)
    516521    (arm2-invalidate-regmap)
    517522    (setq *arm2-gpr-locations-valid-mask* (logandc2 *arm2-gpr-locations-valid-mask* (vinsn-gprs-set vinsn))))
     
    560565              (setq mask (logandc2 mask (ash 1 i)))))))))))
    561566
     567(defun arm2-copy-regmap (mask from to)
     568  (dotimes (i 16)
     569    (when (logbitp i mask)
     570      (setf (svref to i) (copy-list (svref from i))))))
     571
     572(defmacro with-arm2-saved-regmap ((mask map) &body body)
     573  `(let* ((,mask *arm2-gpr-locations-valid-mask*)
     574          (,map (make-array 16 :initial-element nil)))
     575    (declare (dynamic-extent ,map))
     576    (arm2-copy-regmap ,mask *arm2-gpr-locations* ,map)
     577    ,@body))
    562578
    563579(defun arm2-generate-pc-source-map (debug-info)
     
    27462762                (let* ((copy (if (eq (hard-regspec-class pushed-reg)
    27472763                                     hard-reg-class-fpr)
    2748                                (! copy-fpr popped-reg pushed-reg)
     2764                               (if (eql (get-regspec-mode pushed-reg)
     2765                                        hard-reg-class-fpr-mode-single)
     2766                                 (! single-to-single popped-reg pushed-reg)
     2767                                 (! double-to-double popped-reg pushed-reg))
    27492768                               (! copy-gpr popped-reg pushed-reg))))
    27502769                  (remove-dll-node copy)
     
    30903109            arm::slot-unbound-marker))))))
    30913110
     3111(defun arm2-acode-operator-supports-u8 (form)
     3112  (setq form (acode-unwrapped-form-value form))
     3113  (when (acode-p form)
     3114    (let* ((operator (acode-operator form)))
     3115      (if (member operator *arm2-operator-supports-u8-target*)
     3116        (values operator (acode-operand 1 form))))))
     3117
     3118(defun arm2-compare-u8 (seg vreg xfer form u8constant cr-bit true-p u8-operator)
     3119  (with-arm-local-vinsn-macros (seg vreg xfer)
     3120    (with-imm-target () (u8 :u8)
     3121      (with-crf-target () crf
     3122        (if (and (eql u8-operator (%nx1-operator lisptag))
     3123                 (eql 0 u8constant)
     3124                 (eql cr-bit arm::arm-cond-eq))
     3125          (let* ((formreg (arm2-one-untargeted-reg-form seg form arm::arg_z)))
     3126            (! test-fixnum crf formreg))
     3127          (progn
     3128           (arm2-use-operator u8-operator seg u8 nil form)
     3129           (! compare-immediate crf u8 u8constant))))
     3130      ;; Flags set.  Branch or return a boolean value ?
     3131      (regspec-crf-gpr-case
     3132       (vreg dest)
     3133       (^ cr-bit true-p)
     3134       (progn
     3135         (ensuring-node-target (target dest)
     3136           (if (not true-p)
     3137             (setq cr-bit (logxor 1 cr-bit)))
     3138           (! cond->boolean target cr-bit))
     3139         (^))))))
    30923140
    30933141;;; There are other cases involving constants that are worth exploiting.
    30943142(defun arm2-compare (seg vreg xfer i j cr-bit true-p)
    30953143  (with-arm-local-vinsn-macros (seg vreg xfer)
    3096     (let* ((jconst (arm2-constant-for-compare-p j))
     3144    (let* ((iu8 (let* ((i-fixnum (acode-fixnum-form-p i)))
     3145                  (if (typep i-fixnum '(unsigned-byte 8))
     3146                    i-fixnum)))
     3147           (ju8 (let* ((j-fixnum (acode-fixnum-form-p j)))
     3148                  (if (typep j-fixnum '(unsigned-byte 8))
     3149                    j-fixnum)))
     3150           (u8 (or iu8 ju8))
     3151           (other-u8 (if iu8 j (if ju8 i)))
     3152           (jconst (arm2-constant-for-compare-p j))
    30973153           (iconst (arm2-constant-for-compare-p i))
    30983154           (boolean (backend-crf-p vreg)))
    3099       (if (and boolean (or iconst jconst))
    3100         (let* ((reg (arm2-one-untargeted-reg-form seg (if jconst i j) arm::arg_z)))
    3101           (! compare-immediate vreg reg (or jconst iconst))
    3102           (unless (or jconst (eq cr-bit arm::arm-cond-eq))
    3103             (setq cr-bit (arm2-cr-bit-for-reversed-comparison cr-bit)))
    3104           (^ cr-bit true-p))
    3105         (if (and (eq cr-bit arm::arm-cond-eq)
    3106                  (or jconst iconst))
    3107           (arm2-test-reg-%izerop
    3108            seg
    3109            vreg
    3110            xfer
    3111            (arm2-one-untargeted-reg-form
    3112             seg
    3113             (if jconst i j)
    3114             arm::arg_z)
    3115            cr-bit
    3116            true-p
    3117            (or jconst iconst))
    3118           (multiple-value-bind (ireg jreg) (arm2-two-untargeted-reg-forms seg i arm::arg_y j arm::arg_z)
    3119             (arm2-compare-registers seg vreg xfer ireg jreg cr-bit true-p)))))))
     3155      (multiple-value-bind (u8-operator u8-operand) (if other-u8 (arm2-acode-operator-supports-u8 other-u8))
     3156        (if u8-operator
     3157          (arm2-compare-u8 seg vreg xfer u8-operand u8 (if (and iu8 (not (eq cr-bit arm::arm-cond-eq))) (logxor 1 cr-bit) cr-bit) true-p u8-operator)
     3158          (if (and boolean (or iconst jconst))
     3159            (let* ((reg (arm2-one-untargeted-reg-form seg (if jconst i j) arm::arg_z)))
     3160              (! compare-immediate vreg reg (or jconst iconst))
     3161              (unless (or jconst (eq cr-bit arm::arm-cond-eq))
     3162                (setq cr-bit (arm2-cr-bit-for-reversed-comparison cr-bit)))
     3163              (^ cr-bit true-p))
     3164            (if (and (eq cr-bit arm::arm-cond-eq)
     3165                     (or jconst iconst))
     3166              (arm2-test-reg-%izerop
     3167               seg
     3168               vreg
     3169               xfer
     3170               (arm2-one-untargeted-reg-form
     3171                seg
     3172                (if jconst i j)
     3173                arm::arg_z)
     3174               cr-bit
     3175               true-p
     3176               (or jconst iconst))
     3177              (multiple-value-bind (ireg jreg) (arm2-two-untargeted-reg-forms seg i arm::arg_y j arm::arg_z)
     3178                (arm2-compare-registers seg vreg xfer ireg jreg cr-bit true-p)))))))))
    31203179
    31213180
     
    33923451                  (if (and src-fpr dest-fpr)
    33933452                    (unless (eql dest-fpr src-fpr)
    3394                       (! copy-fpr dest src))))))))))))
     3453                      (case src-mode
     3454                        (#.hard-reg-class-fpr-mode-single
     3455                         (case dest-mode
     3456                           (#.hard-reg-class-fpr-mode-single
     3457                            (! single-to-single dest src))
     3458                           (#.hard-reg-class-fpr-mode-double
     3459                            (! single-to-double dest src))))
     3460                        (#.hard-reg-class-fpr-mode-double
     3461                         (case dest-mode
     3462                           (#.hard-reg-class-fpr-mode-single
     3463                            (! double-to-single dest src))
     3464                           (#.hard-reg-class-fpr-mode-double
     3465                            (! double-to-double dest src))))))))))))))))
    33953466 
    33963467(defun arm2-unreachable-store (&optional vreg)
     
    47864857         (vp (vinsn-variable-parts vinsn))
    47874858         (nvp (vinsn-template-nvp template))
     4859         (predicate (vinsn-annotation vinsn))
    47884860         (unique-labels ())
    47894861         (operand-insert-functions arm::*arm-vinsn-insert-functions*))
     
    48264898                         (operands (cdr f)))
    48274899                    (setf (arm::lap-instruction-opcode insn) (car f))
     4900                    (when predicate
     4901                      (funcall (svref operand-insert-functions
     4902                                      (arm::encode-vinsn-field-type :cond))
     4903                               insn
     4904                               predicate))
    48284905                    (dolist (op operands (append-dll-node insn current))
    48294906                      (let* ((insert-function (svref operand-insert-functions (car op))))
     
    53965473        (arm2-test-reg-%izerop seg vreg xfer target cr-bit true-p 0)))))
    53975474
    5398 
     5475(pushnew (%nx1-operator lisptag) *arm2-operator-supports-u8-target*)
    53995476(defarm2 arm2-lisptag lisptag (seg vreg xfer node)
    54005477  (if (null vreg)
    54015478    (arm2-form seg vreg xfer node)
    5402     (progn
    5403       (ensuring-node-target (target vreg)
    5404         (! extract-tag-fixnum target (arm2-one-untargeted-reg-form seg node arm::arg_z)))
     5479    (let* ((reg (arm2-one-untargeted-reg-form seg node arm::arg_z)))
     5480      (unboxed-other-case (vreg :u8)
     5481        (! extract-tag vreg reg)
     5482        (ensuring-node-target (target vreg)
     5483          (! extract-tag-fixnum target reg)))
    54055484      (^))))
    54065485
     5486(pushnew (%nx1-operator fulltag) *arm2-operator-supports-u8-target*)
    54075487(defarm2 arm2-fulltag fulltag (seg vreg xfer node)
    54085488  (if (null vreg)
    54095489    (arm2-form seg vreg xfer node)
    5410     (progn
     5490    (let* ((reg (arm2-one-untargeted-reg-form seg node arm::arg_z)))
     5491      (unboxed-other-case (vreg :u8)
     5492       (! extract-fulltag vreg reg)
    54115493      (ensuring-node-target (target vreg)
    5412         (! extract-fulltag-fixnum target (arm2-one-untargeted-reg-form seg node arm::arg_z)))
     5494        (! extract-fulltag-fixnum target reg)))
    54135495      (^))))
    54145496
     5497
     5498(pushnew (%nx1-operator typecode) *arm2-operator-supports-u8-target*)
    54155499(defarm2 arm2-typecode typecode (seg vreg xfer node)
    54165500  (if (null vreg)
    54175501    (arm2-form seg vreg xfer node)
    5418     (let* ((reg (arm2-one-untargeted-reg-form seg node (if (eq (hard-regspec-value vreg) arm::arg_z)
    5419                                                          arm::arg_y arm::arg_z))))
     5502    (let* ((reg (arm2-one-untargeted-reg-form seg node arm::arg_z)))
     5503      (unboxed-other-case (vreg :u8)
     5504      (! extract-typecode vreg reg)                         
    54205505      (ensuring-node-target (target vreg)
    5421         (! extract-typecode-fixnum target reg ))
     5506        (! extract-typecode-fixnum target reg )))
    54225507      (^))))
    54235508
     
    58145899        (<- arm::arg_z)
    58155900        (^)))))
    5816      
     5901
     5902;;; If exactly one vinsn references LAB and that vinsn is a conditional
     5903;;; branch, it's a forward branch.  If every vinsn between the branch
     5904;;; and label can be predicated, do so and remove both the branch and
     5905;;; the label.
     5906;;; "predicate" is being used as a verb here - "to make predicated".
     5907(defun arm2-predicate-block (labelnum)
     5908  (let* ((lab (aref *backend-labels* labelnum))
     5909         (refs (vinsn-label-refs lab))
     5910         (branch (car refs)))
     5911    (if (and (vinsn-attribute-p branch :branch)
     5912             (null (cdr refs)))
     5913      (when (do* ((next (dll-node-succ branch) (dll-node-succ next))
     5914                  (vinsn-p nil))
     5915                 ((eq next lab) (return vinsn-p))
     5916              (if (typep next 'vinsn-label)
     5917                (unless (typep (vinsn-label-id next) 'vinsn-note)
     5918                  (return))
     5919                (progn
     5920                  (unless (and (typep next 'vinsn)
     5921                               (null (vinsn-annotation next))
     5922                               (vinsn-attribute-p next :predicatable)
     5923                               (or (eq lab (dll-node-succ next))
     5924                                   (not (vinsn-attribute-p next :jump :call :subprim-call :jumpLR))))
     5925                    (return))
     5926                  (setq vinsn-p t))))
     5927        (multiple-value-bind (branch-true-p branch-condition cond-operand-index)
     5928            (let* ((branch-instr (car (vinsn-template-body (vinsn-template branch))))
     5929                   (values (vinsn-variable-parts branch))
     5930                   (operands (cdr branch-instr)))
     5931              (dolist (op operands (values nil nil nil))
     5932                (cond ((eql (car op) (arm::encode-vinsn-field-type :cond))
     5933                       (return (values t (svref values (cadr op)) (cadr op))))
     5934                      ((eql (car op) (arm::encode-vinsn-field-type :negated-cond))
     5935                       (return (values nil (svref values (cadr op)) (cadr op)))))))
     5936          (when branch-condition
     5937            (let* ((condition (if branch-true-p (logxor 1 branch-condition) branch-condition)))
     5938              (do* ((next (dll-node-succ branch) (dll-node-succ next)))
     5939                   ((eq next lab)
     5940                    (remove-dll-node branch)
     5941                    (remove-dll-node lab)
     5942                    t)
     5943                (cond ((typep next 'vinsn-label))
     5944                      ((vinsn-attribute-p next :jump)
     5945                       (setf (vinsn-template next)
     5946                             (need-vinsn-template 'cbranch-true
     5947                                                  (backend-p2-vinsn-templates
     5948                                                   *target-backend*))
     5949                             (svref (vinsn-variable-parts next) cond-operand-index)
     5950                             condition))
     5951                      (t (setf (vinsn-annotation next) condition)))))))))))
     5952
    58175953
    58185954(defarm2 arm2-if if (seg vreg xfer testform true false &aux test-val)
     
    58375973                                    need-else
    58385974                                    (arm2-single-valued-form-p true)
    5839                                     (arm2-single-valued-form-p false))))
     5975                                    (arm2-single-valued-form-p false)))
     5976           (saved-reg-mask 0)
     5977           (saved-reg-map (make-array 16 :initial-element nil)))
     5978      (declare (dynamic-extent saved-reg-map))
    58405979      (if (eq 0 xfer)
    58415980        (setq xfer nil))
     
    58445983          (let ((merge-else-branch-label (if (nx-null false) (arm2-find-nilret-label))))
    58455984            (arm2-conditional-form seg (arm2-make-compound-cd 0 falselabel) testform)
     5985            (arm2-copy-regmap (setq saved-reg-mask *arm2-gpr-locations-valid-mask*)
     5986                              *arm2-gpr-locations*
     5987                              saved-reg-map)
    58465988            (arm2-form seg result endlabel true)
    58475989            (if (and merge-else-branch-label (neq -1 (aref *backend-labels* merge-else-branch-label)))
     
    58495991              (progn
    58505992                (@ falselabel)
     5993                (arm2-predicate-block falselabel)
    58515994                (if (nx-null false) (@ (arm2-record-nilret-label)))
    5852                 (arm2-form seg result nil false)))
     5995                (let* ((*arm2-gpr-locations-valid-mask* saved-reg-mask)
     5996                       (*arm2-gpr-locations* saved-reg-map))
     5997                  (arm2-form seg result nil false))))
    58535998            (@ endlabel)
     5999            (arm2-predicate-block endlabel)
    58546000            (<- result)
    58556001            (^)))
     
    58656011                  (if true-is-goto 0 falselabel)
    58666012                  (if true-is-goto xfer (arm2-cd-merge xfer falselabel)))))
    5867            testform) 
     6013           testform)
     6014          (arm2-copy-regmap (setq saved-reg-mask *arm2-gpr-locations-valid-mask*)
     6015                            *arm2-gpr-locations*
     6016                            saved-reg-map)
    58686017          (if true-is-goto
    58696018            (arm2-unreachable-store)
     
    58836032              (progn
    58846033                (@ falselabel)
     6034                (arm2-predicate-block falselabel)
    58856035                (when need-else
    58866036                  (if true-cleanup-label
    58876037                    (arm2-mvpass seg false)
    5888                     (arm2-form seg vreg xfer false))
     6038                    (let* ((*arm2-gpr-locations-valid-mask* saved-reg-mask)
     6039                           (*arm2-gpr-locations* saved-reg-map))
     6040                      (arm2-form seg vreg xfer false)))
    58896041                  (setq false-stack (arm2-encode-stack))))))
    58906042          (when true-cleanup-label
     
    59046056            (multiple-value-setq (*arm2-undo-count* *arm2-cstack* *arm2-vstack* *arm2-top-vstack-lcell*)
    59056057              (arm2-decode-stack entry-stack)))
    5906           (@ endlabel))))))
     6058          (@ endlabel)
     6059          (arm2-predicate-block endlabel))))))
    59076060
    59086061(defarm2 arm2-or or (seg vreg xfer forms)
  • branches/arm/compiler/vinsn.lisp

    r13740 r13955  
    264264    :discard                            ; adjusts a stack pointer
    265265    :sp
    266     :unconditional                      ; all instructions are implicitly unconditional
     266    :predicatable                       ; all instructions can be predicated, no instructions set or test condition codes.
    267267    ))
    268268
  • branches/arm/level-0/ARM/arm-misc.lisp

    r13927 r13955  
    846846);#+later
    847847
    848 
     848(defarmlapfunction xchgl ((newval arg_y) (ptr arg_z))
     849  (unbox-fixnum imm0 newval)
     850  @again
     851  (macptr-ptr imm2 ptr)
     852  (ldrex imm1 (:@ imm2))
     853  (strex imm2 imm0 (:@ imm2))
     854  (cmp imm2 (:$ 0))
     855  (bne @again)
     856  (box-fixnum arg_z imm1)
     857  (bx lr))
     858                         
    849859
    850860; end of arm-misc.lisp
  • branches/arm/level-0/l0-misc.lisp

    r13927 r13955  
    219219
    220220
    221 ;;; Returns six values.
     221;;; Returns six values on most platforms, 4 on ARM.
    222222;;;   sp free
    223223;;;   sp used
    224224;;;   vsp free
    225225;;;   vsp used
    226 ;;;   tsp free
    227 ;;;   tsp used
     226;;;   tsp free  (not on ARM)
     227;;;   tsp used  (not on ARM)
    228228(defun %thread-stack-space (&optional (thread *current-lisp-thread*))
    229229  (when (eq thread *current-lisp-thread*)
     
    347347          (let* ((processes (all-processes)))
    348348            (dolist (thread-info stack-used-by-thread)
    349               (destructuring-bind (thread sp-free sp-used vsp-free vsp-used tsp-free tsp-used)
     349              (destructuring-bind (thread sp-free sp-used vsp-free vsp-used #-arm-target tsp-free #-arm-target tsp-used)
    350350                  thread-info
    351351                (let* ((process (dolist (p processes)
     
    355355                    (let ((sp-total (+ sp-used sp-free))
    356356                          (vsp-total (+ vsp-used vsp-free))
     357                          #-arm-target
    357358                          (tsp-total (+ tsp-used tsp-free)))
    358359                      (format t "~%~a(~d)~%  cstack:~12T~10D (~DK)  ~33T~10D (~DK)  ~54T~10D (~DK)~
    359                                ~%  vstack:~12T~10D (~DK)  ~33T~10D (~DK)  ~54T~10D (~DK)~
    360                                ~%  tstack:~12T~10D (~DK)  ~33T~10D (~DK)  ~54T~10D (~DK)"
     360                               ~%  vstack:~12T~10D (~DK)  ~33T~10D (~DK)  ~54T~10D (~DK)"
    361361                              (process-name process)
    362362                              (process-serial-number process)
    363363                              sp-total (k sp-total) sp-free (k sp-free) sp-used (k sp-used)
    364                               vsp-total (k vsp-total) vsp-free (k vsp-free) vsp-used (k vsp-used)
     364                              vsp-total (k vsp-total) vsp-free (k vsp-free) vsp-used  (k vsp-used))
     365                      #-arm-target
     366                      (format t
     367                               "~%  tstack:~12T~10D (~DK)  ~33T~10D (~DK)  ~54T~10D (~DK)"
     368
    365369                              tsp-total (k tsp-total) tsp-free (k tsp-free) tsp-used (k tsp-used)))))))))))))
    366370
Note: See TracChangeset for help on using the changeset viewer.