Changeset 10924


Ignore:
Timestamp:
Sep 30, 2008, 11:59:01 PM (11 years ago)
Author:
gb
Message:

When emitting NOPs (for alignment, etc.) on x8632, try to use
certain canonical instructions/sequences that have no side effects
and may execute more quickly than code-prefixed NOPs. (This is
what GAS does, and the part about executing more quickly may
even be true.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/X86/x86-lap.lisp

    r10506 r10924  
    13441344                    (:self (emit-long frag pos (x86-lap-expression-value arg)))))))))))))
    13451345
     1346(defstatic *x86-32-bit-lap-nops*
     1347  #(
     1348    #()
     1349    #(#x90)                             ; nop                 
     1350    #(#x89 #xf6)                        ; movl %esi,%esi       
     1351    #(#x8d #x76 #x00)                   ; leal 0(%esi),%esi   
     1352    #(#x8d #x74 #x26 #x00)              ; leal 0(%esi,1),%esi 
     1353    #(#x90 #x8d #x74 #x26 #x00)         ; nop ; leal 0(%esi,1),%esi 
     1354    #(#x8d #xb6 #x00 #x00 #x00 #x00)    ; leal 0L(%esi),%esi   
     1355    #(#x8d #xb4 #x26 #x00 #x00 #x00 #x00) ; leal 0L(%esi,1),%esi
     1356  )
     1357  "Allegedly, many implementations recognize these instructions and
     1358execute them very quickly.")
     1359
     1360(defstatic *x86-32-bit-lap-nops-8*
     1361  #(#x90 #x8d #xb4 #x26 #x00 #x00 #x00 #x00))
     1362
    13461363(defun frag-emit-nops (frag count)
    1347   (let* ((nnops (ash (+ count 3) -2))
    1348          (len (floor count nnops))
    1349          (remains (- count (* nnops len))))
    1350     (dotimes (i remains)
    1351       (dotimes (k len) (frag-push-byte frag #x66))
    1352       (frag-push-byte frag #x90))
    1353     (do* ((i remains (1+ i)))
    1354          ((= i nnops))
    1355       (dotimes (k (1- len)) (frag-push-byte frag #x66))
    1356       (frag-push-byte frag #x90))))
     1364  (target-word-size-case
     1365   (32
     1366    (do* ((c count (- c 8)))
     1367         ((< c 8)
     1368          (let* ((v (svref *x86-32-bit-lap-nops* c)))
     1369            (dotimes (i c)
     1370              (frag-push-byte frag (svref v i)))))
     1371      (dotimes (i 8)
     1372        (frag-push-byte frag (svref *x86-32-bit-lap-nops-8* i)))))
     1373   (64
     1374    (let* ((nnops (ash (+ count 3) -2))
     1375           (len (floor count nnops))
     1376           (remains (- count (* nnops len))))
     1377      (dotimes (i remains)
     1378        (dotimes (k len) (frag-push-byte frag #x66))
     1379        (frag-push-byte frag #x90))
     1380      (do* ((i remains (1+ i)))
     1381           ((= i nnops))
     1382        (dotimes (k (1- len)) (frag-push-byte frag #x66))
     1383        (frag-push-byte frag #x90))))))
    13571384 
    13581385(defun fill-for-alignment (frag-list)
Note: See TracChangeset for help on using the changeset viewer.