hotspot/src/os_cpu/linux_x86/vm/copy_linux_x86.inline.hpp
changeset 5883 8dc4bdc132d5
parent 5547 f4b087cbb361
child 7397 5b173b4ca846
equal deleted inserted replaced
5882:6b2aecc4f7d8 5883:8dc4bdc132d5
    24 
    24 
    25 static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
    25 static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
    26 #ifdef AMD64
    26 #ifdef AMD64
    27   (void)memmove(to, from, count * HeapWordSize);
    27   (void)memmove(to, from, count * HeapWordSize);
    28 #else
    28 #else
    29   // Same as pd_aligned_conjoint_words, except includes a zero-count check.
    29   // Includes a zero-count check.
    30   intx temp;
    30   intx temp;
    31   __asm__ volatile("        testl   %6,%6         ;"
    31   __asm__ volatile("        testl   %6,%6         ;"
    32                    "        jz      7f            ;"
    32                    "        jz      7f            ;"
    33                    "        cmpl    %4,%5         ;"
    33                    "        cmpl    %4,%5         ;"
    34                    "        leal    -4(%4,%6,4),%3;"
    34                    "        leal    -4(%4,%6,4),%3;"
    82   default:
    82   default:
    83     (void)memcpy(to, from, count * HeapWordSize);
    83     (void)memcpy(to, from, count * HeapWordSize);
    84     break;
    84     break;
    85   }
    85   }
    86 #else
    86 #else
    87   // Same as pd_aligned_disjoint_words, except includes a zero-count check.
    87   // Includes a zero-count check.
    88   intx temp;
    88   intx temp;
    89   __asm__ volatile("        testl   %6,%6       ;"
    89   __asm__ volatile("        testl   %6,%6       ;"
    90                    "        jz      3f          ;"
    90                    "        jz      3f          ;"
    91                    "        cmpl    $32,%6      ;"
    91                    "        cmpl    $32,%6      ;"
    92                    "        ja      2f          ;"
    92                    "        ja      2f          ;"
   128   pd_disjoint_words(from, to, count);
   128   pd_disjoint_words(from, to, count);
   129 #endif // AMD64
   129 #endif // AMD64
   130 }
   130 }
   131 
   131 
   132 static void pd_aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
   132 static void pd_aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
   133 #ifdef AMD64
   133   pd_conjoint_words(from, to, count);
   134   (void)memmove(to, from, count * HeapWordSize);
       
   135 #else
       
   136   // Same as pd_conjoint_words, except no zero-count check.
       
   137   intx temp;
       
   138   __asm__ volatile("        cmpl    %4,%5         ;"
       
   139                    "        leal    -4(%4,%6,4),%3;"
       
   140                    "        jbe     1f            ;"
       
   141                    "        cmpl    %7,%5         ;"
       
   142                    "        jbe     4f            ;"
       
   143                    "1:      cmpl    $32,%6        ;"
       
   144                    "        ja      3f            ;"
       
   145                    "        subl    %4,%1         ;"
       
   146                    "2:      movl    (%4),%3       ;"
       
   147                    "        movl    %7,(%5,%4,1)  ;"
       
   148                    "        addl    $4,%0         ;"
       
   149                    "        subl    $1,%2          ;"
       
   150                    "        jnz     2b            ;"
       
   151                    "        jmp     7f            ;"
       
   152                    "3:      rep;    smovl         ;"
       
   153                    "        jmp     7f            ;"
       
   154                    "4:      cmpl    $32,%2        ;"
       
   155                    "        movl    %7,%0         ;"
       
   156                    "        leal    -4(%5,%6,4),%1;"
       
   157                    "        ja      6f            ;"
       
   158                    "        subl    %4,%1         ;"
       
   159                    "5:      movl    (%4),%3       ;"
       
   160                    "        movl    %7,(%5,%4,1)  ;"
       
   161                    "        subl    $4,%0         ;"
       
   162                    "        subl    $1,%2          ;"
       
   163                    "        jnz     5b            ;"
       
   164                    "        jmp     7f            ;"
       
   165                    "6:      std                   ;"
       
   166                    "        rep;    smovl         ;"
       
   167                    "        cld                   ;"
       
   168                    "7:      nop                    "
       
   169                    : "=S" (from), "=D" (to), "=c" (count), "=r" (temp)
       
   170                    : "0"  (from), "1"  (to), "2"  (count), "3"  (temp)
       
   171                    : "memory", "flags");
       
   172 #endif // AMD64
       
   173 }
   134 }
   174 
   135 
   175 static void pd_aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) {
   136 static void pd_aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) {
   176 #ifdef AMD64
       
   177   pd_disjoint_words(from, to, count);
   137   pd_disjoint_words(from, to, count);
   178 #else
       
   179   // Same as pd_disjoint_words, except no zero-count check.
       
   180   intx temp;
       
   181   __asm__ volatile("        cmpl    $32,%6      ;"
       
   182                    "        ja      2f          ;"
       
   183                    "        subl    %4,%1       ;"
       
   184                    "1:      movl    (%4),%3     ;"
       
   185                    "        movl    %7,(%5,%4,1);"
       
   186                    "        addl    $4,%0       ;"
       
   187                    "        subl    $1,%2        ;"
       
   188                    "        jnz     1b          ;"
       
   189                    "        jmp     3f          ;"
       
   190                    "2:      rep;    smovl       ;"
       
   191                    "3:      nop                  "
       
   192                    : "=S" (from), "=D" (to), "=c" (count), "=r" (temp)
       
   193                    : "0"  (from), "1"  (to), "2"  (count), "3"  (temp)
       
   194                    : "memory", "cc");
       
   195 #endif // AMD64
       
   196 }
   138 }
   197 
   139 
   198 static void pd_conjoint_bytes(void* from, void* to, size_t count) {
   140 static void pd_conjoint_bytes(void* from, void* to, size_t count) {
   199 #ifdef AMD64
   141 #ifdef AMD64
   200   (void)memmove(to, from, count);
   142   (void)memmove(to, from, count);
   201 #else
   143 #else
       
   144   // Includes a zero-count check.
   202   intx temp;
   145   intx temp;
   203   __asm__ volatile("        testl   %6,%6          ;"
   146   __asm__ volatile("        testl   %6,%6          ;"
   204                    "        jz      13f            ;"
   147                    "        jz      13f            ;"
   205                    "        cmpl    %4,%5          ;"
   148                    "        cmpl    %4,%5          ;"
   206                    "        leal    -1(%4,%6),%3   ;"
   149                    "        leal    -1(%4,%6),%3   ;"