Changeset 15156


Ignore:
Timestamp:
Dec 26, 2011, 6:54:15 AM (8 years ago)
Author:
gb
Message:

Define MOVDQU; AFAICT, neither it nor MOVDQA require a 64-bit CPU.

In X862-%NATURAL-LOGAND, if one argument is a fixnum constant the
result will fit in a fixnum if it needs to.

%COPY-PTR-TO-IVECTOR: copy at least 32 (possibly 128) bits at a
time in some (possibly common) cases.

Location:
trunk/source
Files:
3 edited

Legend:

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

    r14852 r15156  
    18531853
    18541854   ;; movdqa
    1855    (def-x86-opcode (movdqa :cpu64)  ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     1855   (def-x86-opcode movdqa  ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
    18561856     #x0f7f #o300 #x0 #x66)
    1857    (def-x86-opcode (movdqa :cpu64) ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     1857   (def-x86-opcode movdqa ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
    18581858     #x0f6f #o000 #x0 #x66)
    18591859   
    1860 
     1860   (def-x86-opcode movdqu  ((:regxmm :insert-xmm-reg) (:anymem :insert-memory))
     1861     #x0f7f #o300 #x0 #xf3)
     1862   (def-x86-opcode movdqu ((:anymem :insert-memory) (:regxmm :insert-xmm-reg))
     1863     #x0f6f #o000 #x0 #xf3)
     1864   
     1865
     1866   ;; sign-extending mov
     1867   (def-x86-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
     1868     #x0fbe #o300 0)
    18611869   ;; sign-extending mov
    18621870   (def-x86-opcode movsbl ((:reg8 :insert-modrm-rm) (:reg32 :insert-modrm-reg))
  • trunk/source/compiler/X86/x862.lisp

    r15149 r15156  
    1059710597                (x862-one-targeted-reg-form seg other other-reg)
    1059810598                (! %natural-logand-c  other-reg constant)
    10599                 (<- other-reg))))
     10599                (if (and (typep constant *nx-target-fixnum-type*)
     10600                         (node-reg-p vreg))
     10601                  (! box-fixnum vreg other-reg)
     10602                  (<- other-reg)))))
    1060010603          (^))))))
    1060110604
  • trunk/source/level-0/X86/X8632/x8632-misc.lisp

    r14711 r15156  
    2121;;; a byte at a time.
    2222;;; Does no arg checking of any kind.  Really.
     23(defun %copy-ptr-to-ivector (src src-byte-offset dest dest-byte-offset nbytes)
     24  (declare (fixnum src-byte-offset dest-byte-offset nbytes)
     25           (optimize (speed 3) (safety 0)))
     26  (let* ((ptr-align (logand 7 (%ptr-to-int src))))
     27    (declare (type (mod 8) ptr-align))
     28    (if (and (= 0 (logand nbytes 3))
     29             (= 0 (logand dest-byte-offset 3))
     30             (= 0 (logand (the fixnum (+ ptr-align src-byte-offset)) 3)))
     31      (%copy-ptr-to-ivector-32bit src src-byte-offset dest dest-byte-offset nbytes)
     32      (%copy-ptr-to-ivector-8bit src src-byte-offset dest dest-byte-offset nbytes))
     33    dest))
     34
     35;;; We can exploit the fact that SRC-BYTE-OFFSET and DEST-BYTE-OFFSET
     36;;; are both multiples of 4 (and therefore still fixnums when unboxed).
     37(defx8632lapfunction %copy-ptr-to-ivector-32bit ((psrc 12)
     38                                                 (psrc-byte-offset 8)
     39                                                 (pdest 4)
     40                                                 #|(ra 0)|#
     41                                                 (dest-byte-offset arg_y)
     42                                                 (nbytes arg_z))
     43
     44  (let ((foreign-ptr imm0)              ;raw foreign pointer
     45        (ivector temp1))                ;destination ivector
     46    (movl (@ psrc (% esp)) (% temp1))
     47    (movl (@ psrc-byte-offset (% esp)) (% foreign-ptr))
     48    (sarl ($ x8632::word-shift)(% foreign-ptr))
     49    (addl (@ x8632::macptr.address (% temp1)) (% foreign-ptr))
     50    (movl (@ pdest (% esp)) (% ivector))
     51    (sarl ($ x8632::word-shift) (% dest-byte-offset))
     52    (jmp @test16)
     53    @loop16
     54    (movdqu (@ (% foreign-ptr)) (% xmm0))
     55    (movdqu (% xmm0) (@ x8632::misc-data-offset (% ivector) (% dest-byte-offset)))
     56    (addl ($ 16) (% foreign-ptr))
     57    (addl ($ 16) (% dest-byte-offset))
     58    (subl ($ '16) (% nbytes))
     59    @test16
     60    (cmpl ($ '16) (% nbytes))
     61    (jge @loop16)
     62    (testl (% nbytes) (% nbytes))
     63    (je @done)
     64    @loop4
     65    (movd (@ (% foreign-ptr)) (% mm0))
     66    (movd (% mm0) (@ x8632::misc-data-offset (% ivector) (% dest-byte-offset)))
     67    (addl ($ 4) (% foreign-ptr))
     68    (addl ($ 4) (% dest-byte-offset))
     69    (subl ($ '4) (% nbytes))
     70    (jne @loop4)
     71    @done
     72    (movl (% ivector) (% arg_z))
     73    (single-value-return 5)))
    2374
    2475;;; I went ahead and used the INC and DEC instructions here, since
     
    2980;;; might be worth a try.
    3081
    31 (defx8632lapfunction %copy-ptr-to-ivector ((src 12)
    32                                            (src-byte-offset 8)
    33                                            (dest 4)
    34                                            #|(ra 0)|#
    35                                            (dest-byte-offset arg_y)
    36                                            (nbytes arg_z))
     82(defx8632lapfunction %copy-ptr-to-ivector-8bit ((src 12)
     83                                                (src-byte-offset 8)
     84                                                (dest 4)
     85                                                #|(ra 0)|#
     86                                                (dest-byte-offset arg_y)
     87                                                (nbytes arg_z))
    3788  (mark-as-imm temp0)
    3889  (mark-as-imm arg_y)
Note: See TracChangeset for help on using the changeset viewer.