]> sourceware.org Git - glibc.git/commitdiff
powerpc: Cleanup: use actual power8 assembly mnemonics
authorRaoni Fassina Firmino <raoni@linux.ibm.com>
Thu, 27 Jun 2019 18:44:17 +0000 (15:44 -0300)
committerGabriel F. T. Gomes <gabrielftg@linux.ibm.com>
Thu, 1 Aug 2019 18:57:50 +0000 (15:57 -0300)
Some implementations in sysdeps/powerpc/powerpc64/power8/*.S still had
pre power8 compatible binutils hardcoded macros and were not using
.machine power8.

This patch should not have semantic changes, in fact it should have the
same exact code generated.

Tested that generated stripped shared objects are identical when
using "strip --remove-section=.note.gnu.build-id".

Checked on:
- powerpc64le, power9, build-many-glibcs.py, gcc 6.4.1 20180104, binutils 2.26.2.20160726
- powerpc64le, power8, debian 9, gcc 6.3.0 20170516, binutils 2.28
- powerpc64le, power9, ubuntu 19.04, gcc 8.3.0, binutils 2.32
- powerpc64le, power9, opensuse tumbleweed, gcc 9.1.1 20190527, binutils 2.32
- powerpc64, power9, debian 10, gcc 8.3.0, binutils 2.31.1

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Gabriel F. T. Gomes <gabrielftg@linux.ibm.com>
12 files changed:
ChangeLog
sysdeps/powerpc/powerpc64/power8/memchr.S
sysdeps/powerpc/powerpc64/power8/memcmp.S
sysdeps/powerpc/powerpc64/power8/memrchr.S
sysdeps/powerpc/powerpc64/power8/memset.S
sysdeps/powerpc/powerpc64/power8/strchr.S
sysdeps/powerpc/powerpc64/power8/strlen.S
sysdeps/powerpc/powerpc64/power8/strncmp.S
sysdeps/powerpc/powerpc64/power8/strncpy.S
sysdeps/powerpc/powerpc64/power8/strnlen.S
sysdeps/powerpc/powerpc64/power8/strrchr.S
sysdeps/powerpc/powerpc64/power8/strspn.S

index a8a607873d5e139fd0e802ce5cad6c074752590a..d12147ea8c9f6cb2443b6a0101347785965edb60 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2019-08-01  Raoni Fassina Firmino  <raoni@linux.ibm.com>
+
+       * sysdeps/powerpc/powerpc64/power8/memchr.S: Update power8
+       mnemonics and set .machine power8.
+       * sysdeps/powerpc/powerpc64/power8/memcmp.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/memrchr.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/memset.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strchr.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strlen.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strncmp.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strncpy.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strnlen.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strrchr.S: Likewise.
+       * sysdeps/powerpc/powerpc64/power8/strspn.S: Likewise.
+
 2019-08-01  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
        * sysdeps/hppa/fpu/libm-test-ulps: Update.
index 422002f25690c3a689d95d541f1f35da3ef80ec5..c4a11278d621a941e43be2d08f619c21b8acc9d6 100644 (file)
 
 /* void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5])  */
 
-/* TODO: change these to the actual instructions when the minimum required
-   binutils allows it.  */
-#define MTVRD(v, r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r, v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t, a, b)  .long (0x1000054c \
-                               | ((t)<<(32-11)) \
-                               | ((a)<<(32-16)) \
-                               | ((b)<<(32-21)) )
-
 #ifndef MEMCHR
 # define MEMCHR __memchr
 #endif
-/* TODO: change this to .machine power8 when the minimum required binutils
-   allows it.  */
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (MEMCHR)
        CALL_MCOUNT 3
        dcbt    0, r3
@@ -97,7 +86,7 @@ L(align_qw):
        li      r0, 0
        lvsl    v11, r0, r0
        vslb    v10, v11, v10
-       MTVRD(v1, r4)
+       mtvrd   v1, r4
        vspltb  v1, v1, 7
        cmpldi  r5, 64
        ble     L(tail64)
@@ -210,10 +199,10 @@ L(tail64):
        .align  4
 L(found):
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v6, v6, v10)
-       VBPERMQ(v7, v7, v10)
-       VBPERMQ(v8, v8, v10)
-       VBPERMQ(v9, v9, v10)
+       vbpermq v6, v6, v10
+       vbpermq v7, v7, v10
+       vbpermq v8, v8, v10
+       vbpermq v9, v9, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
        vsldoi  v7, v7, v7, 2
@@ -228,7 +217,7 @@ L(found):
        vor     v11, v6, v7
        vor     v4, v9, v8
        vor     v4, v11, v4
-       MFVRD(r5, v4)
+       mfvrd   r5, v4
 #ifdef __LITTLE_ENDIAN__
        addi    r6, r5, -1
        andc    r6, r6, r5
@@ -243,16 +232,16 @@ L(found):
        .align  4
 L(found_16B):
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v6, v6, v10)
+       vbpermq v6, v6, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
-       MFVRD(r7, v6)
+       mfvrd   r7, v6
        addi    r6, r7, -1
        andc    r6, r6, r7
        popcntd r6, r6
 #else
        vsldoi  v6, v6, v6, 6
-       MFVRD(r7, v6)
+       mfvrd   r7, v6
        cntlzd  r6, r7  /* Count leading zeros before the match.  */
 #endif
        add     r3, r8, r6      /* Compute final length.  */
index db824d649409eb4960048c973c174fbffe19a3fa..8617d5950b9c5533c2ee709b6a73702cc6e43671 100644 (file)
                    const char *s2 [r4],
                    size_t size [r5])  */
 
-/* TODO: change these to the actual instructions when the minimum required
-   binutils allows it.  */
-#define MFVRD(r,v)     .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
 #ifndef MEMCMP
 # define MEMCMP memcmp
 #endif
-       .machine power7
+       .machine  power8
 ENTRY_TOCLESS (MEMCMP, 4)
        CALL_MCOUNT 3
 
@@ -231,15 +228,15 @@ L(different2):
        vperm   v4, v4, v0, v9
        vperm   v5, v5, v0, v9
 #endif
-       MFVRD(r7, v4)
-       MFVRD(r9, v5)
+       mfvrd   r7, v4
+       mfvrd   r9, v5
        cmpld   cr6, r7, r9
        bne     cr6, L(ret_diff)
        /* Difference in second DW.  */
        vsldoi  v4, v4, v4, 8
        vsldoi  v5, v5, v5, 8
-       MFVRD(r7, v4)
-       MFVRD(r9, v5)
+       mfvrd   r7, v4
+       mfvrd   r9, v5
        cmpld   cr6, r7, r9
 L(ret_diff):
        li      rRTN, 1
@@ -256,15 +253,15 @@ L(different3):
        vperm   v6, v6, v0, v9
        vperm   v8, v8, v0, v9
 #endif
-       MFVRD(r7, v6)
-       MFVRD(r9, v8)
+       mfvrd   r7, v6
+       mfvrd   r9, v8
        cmpld   cr6, r7, r9
        bne     cr6, L(ret_diff)
        /* Difference in second DW.  */
        vsldoi  v6, v6, v6, 8
        vsldoi  v8, v8, v8, 8
-       MFVRD(r7, v6)
-       MFVRD(r9, v8)
+       mfvrd   r7, v6
+       mfvrd   r9, v8
        cmpld   cr6, r7, r9
        li      rRTN, 1
        bgtlr   cr6
index 51c6937c5f5e257847c4b15961c9befd0ab10209..77e5b4cc9dd1cf0bcb5c4198d262817185c4fd18 100644 (file)
 
 /* int [r3] memrchr (char *s [r3], int byte [r4], int size [r5])  */
 
-/* TODO: change these to the actual instructions when the minimum required
-   binutils allows it.  */
-#define MTVRD(v, r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r, v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t, a, b)  .long (0x1000054c \
-                               | ((t)<<(32-11)) \
-                               | ((a)<<(32-16)) \
-                               | ((b)<<(32-21)) )
 #ifndef MEMRCHR
 # define MEMRCHR __memrchr
 #endif
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (MEMRCHR)
        CALL_MCOUNT 3
        add     r7, r3, r5      /* Calculate the last acceptable address.  */
@@ -92,7 +84,7 @@ L(align_qw):
        li      r0, 0
        lvsl    v11, r0, r0
        vslb    v10, v11, v10
-       MTVRD(v1, r4)
+       mtvrd   v1, r4
        vspltb  v1, v1, 7
        cmpldi  r5, 64
        ble     L(tail64)
@@ -205,10 +197,10 @@ L(tail64):
        .align  4
 L(found):
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v6, v6, v10)
-       VBPERMQ(v7, v7, v10)
-       VBPERMQ(v8, v8, v10)
-       VBPERMQ(v9, v9, v10)
+       vbpermq v6, v6, v10
+       vbpermq v7, v7, v10
+       vbpermq v8, v8, v10
+       vbpermq v9, v9, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
        vsldoi  v7, v7, v7, 2
@@ -223,7 +215,7 @@ L(found):
        vor     v11, v6, v7
        vor     v4, v9, v8
        vor     v4, v11, v4
-       MFVRD(r5, v4)
+       mfvrd   r5, v4
 #ifdef __LITTLE_ENDIAN__
        cntlzd  r6, r5  /* Count leading zeros before the match.  */
 #else
@@ -245,7 +237,7 @@ L(found_16B):
        bge     L(last)
        /* Now discard bytes before starting address.  */
        sub     r9, r10, r8
-       MTVRD(v9, r9)
+       mtvrd   v9, r9
        vspltisb        v8, 3
        /* Mask unwanted bytes.  */
 #ifdef __LITTLE_ENDIAN__
@@ -263,14 +255,14 @@ L(found_16B):
 #endif
 L(last):
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v6, v6, v10)
+       vbpermq v6, v6, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
        vsldoi  v6, v6, v6, 6
-       MFVRD(r7, v6)
+       mfvrd   r7, v6
        cntlzd  r6, r7  /* Count leading zeros before the match.  */
 #else
-       MFVRD(r7, v6)
+       mfvrd   r7, v6
        addi    r6, r7, -1
        andc    r6, r6, r7
        popcntd r6, r6
index 436daf40bef47712b7e6e287101cff797b4c49de..3dba1f34d65e06f34e5765a5ec38cdf78e0fd5be 100644 (file)
 
 #include <sysdep.h>
 
-#define MTVSRD_V1_R4  .long 0x7c240166     /* mtvsrd  v1,r4  */
-
 /* void * [r3] memset (void *s [r3], int c [r4], size_t n [r5]));
    Returns 's'.  */
 
 #ifndef MEMSET
 # define MEMSET memset
 #endif
-
-       /* No need to use .machine power8 since mtvsrd is already
-          handled by the define.  It avoid breakage on binutils
-          that does not support this machine specifier.  */
-       .machine power7
+       .machine  power8
 ENTRY_TOCLESS (MEMSET, 5)
        CALL_MCOUNT 3
 
@@ -151,7 +145,7 @@ L(tail_bytes):
           vector instruction to achieve best throughput.  */
 L(huge_vector):
        /* Replicate set byte to quadword in VMX register.  */
-       MTVSRD_V1_R4
+       mtvsrd  v1,r4
        xxpermdi 32,v0,v1,0
        vspltb   v2,v0,15
 
index a81ecbbd31564f9f44c6b0e4cd9fa5626b8dc341..0e7754ebfb789cd7a529b12c07787cbf11dd2b8e 100644 (file)
 #endif  /* !USE_AS_STRCHRNUL  */
 
 /* int [r3] strchr (char *s [r3], int c [r4])  */
-/* TODO: change these to the actual instructions when the minimum required
-   binutils allows it.  */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t,a,b)  .long (0x1000054c \
-                       | ((t)<<(32-11)) \
-                       | ((a)<<(32-16)) \
-                       | ((b)<<(32-21)) )
-/* TODO: change this to .machine power8 when the minimum required binutils
-   allows it.  */
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (FUNC_NAME)
        CALL_MCOUNT 2
        dcbt    0,r3
@@ -178,7 +168,7 @@ L(vector):
        vspltisb        v10, 3
        lvsl    v11, r0, r0
        vslb    v10, v11, v10
-       MTVRD(v1,r4)
+       mtvrd   v1, r4
        li      r5, 16
        vspltb  v1, v1, 7
        /* Compare 32 bytes in each loop.  */
@@ -202,10 +192,10 @@ L(continue):
        blt     cr6, L(no_match)
 #endif
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v2, v2, v10)
-       VBPERMQ(v3, v3, v10)
-       VBPERMQ(v6, v6, v10)
-       VBPERMQ(v7, v7, v10)
+       vbpermq v2, v2, v10
+       vbpermq v3, v3, v10
+       vbpermq v6, v6, v10
+       vbpermq v7, v7, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
        vsldoi  v3, v3, v3, 2
@@ -221,7 +211,7 @@ L(continue):
         vor     v1, v3, v2
         vor     v2, v6, v7
         vor     v4, v1, v2
-       MFVRD(r5, v4)
+       mfvrd   r5, v4
 #ifdef __LITTLE_ENDIAN__
        addi    r6, r5, -1
        andc    r6, r6, r5
@@ -347,8 +337,8 @@ L(continue1):
        blt     cr6, L(continue1)
        addi    r3, r3, -32
 L(end1):
-       VBPERMQ(v2, v2, v10)
-       VBPERMQ(v3, v3, v10)
+       vbpermq v2, v2, v10
+       vbpermq v3, v3, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
        vsldoi  v3, v3, v3, 2
@@ -359,7 +349,7 @@ L(end1):
 
         /* Merge the results and move to a GPR.  */
         vor     v4, v3, v2
-       MFVRD(r5, v4)
+       mfvrd   r5, v4
 #ifdef __LITTLE_ENDIAN__
        addi    r6, r5, -1
        andc    r6, r6, r5
index 6436252f826907be2d9fb3639a88d0ff833f06e8..b73e01427223a784c75b92d22446e3ad8dced36f 100644 (file)
 
 #include <sysdep.h>
 
-/* TODO: change these to the actual instructions when the minimum required
-   binutils allows it.  */
-#define MFVRD(r,v)     .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t,a,b) .long (0x1000054c \
-                              | ((t)<<(32-11)) \
-                              | ((a)<<(32-16)) \
-                              | ((b)<<(32-21)) )
-
 /* int [r3] strlen (char *s [r3])  */
 
 #ifndef STRLEN
 # define STRLEN strlen
 #endif
-
-/* TODO: change this to .machine power8 when the minimum required binutils
-   allows it.  */
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (STRLEN, 4)
        CALL_MCOUNT 1
        dcbt    0,r3
@@ -250,10 +239,10 @@ L(vmx_zero):
        vslb      v10,v11,v10
 
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v1,v1,v10)
-       VBPERMQ(v2,v2,v10)
-       VBPERMQ(v3,v3,v10)
-       VBPERMQ(v4,v4,v10)
+       vbpermq v1,v1,v10
+       vbpermq v2,v2,v10
+       vbpermq v3,v3,v10
+       vbpermq v4,v4,v10
 
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
@@ -270,7 +259,7 @@ L(vmx_zero):
        vor     v1,v2,v1
        vor     v2,v3,v4
        vor     v4,v1,v2
-       MFVRD(r10,v4)
+       mfvrd   r10,v4
 
         /* Adjust address to the begninning of the current 64-byte block.  */
        addi    r4,r4,-64
index 40b5324a494a9bc7fea14918bcd8cdbe8a0cead9..4a76bc516b6a24dc1acb9c9dac0b2833d80b45c4 100644 (file)
@@ -31,7 +31,7 @@
    64K as default, the page cross handling assumes minimum page size of
    4k.  */
 
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (STRNCMP, 4)
        /* Check if size is 0.  */
        mr.     r10,r5
index 01e9f70250a7f87c2fd73031ad6dc4032587fb42..cb6b7c1a61bbe9967dfbe5d27263344a9cab6220 100644 (file)
@@ -60,7 +60,7 @@
    64K as default, the page cross handling assumes minimum page size of
    4k.  */
 
-       .machine  power7
+       .machine  power8
 #ifdef MEMSET_is_local
 ENTRY_TOCLESS (FUNC_NAME, 4)
 #else
index 0a5761bfe7423e9a4017356e0e07bfe9f4b2efd2..a85f56cb4e74787178270f18328f52bdd4998f89 100644 (file)
 /* Define default page size to 4KB.  */
 #define PAGE_SIZE 4096
 
-/* The following macros implement Power ISA v2.07 opcodes
-   that could not be used directly into this code to the keep
-   compatibility with older binutils versions.  */
-
-/* Move from vector register doubleword.  */
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-
-/* Move to vector register doubleword.  */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-
-/* Vector Bit Permute Quadword.  */
-#define VBPERMQ(t,a,b) .long (0x1000054c       \
-                              | ((t)<<(32-11)) \
-                              | ((a)<<(32-16)) \
-                              | ((b)<<(32-21)) )
-
-/* Vector Population Count Halfword.  */
-#define VPOPCNTH(t,b) .long (0x10000743 | ((t)<<(32-11)) | ((b)<<(32-21)))
-
-/* Vector Count Leading Zeros Halfword.  */
-#define VCLZH(t,b) .long (0x10000742 | ((t)<<(32-11)) | ((b)<<(32-21)))
-
 
 /* int [r3] strnlen (char *s [r3], size_t maxlen [r4])  */
-/* TODO: change to power8 when minimum required binutils allows it.  */
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (__strnlen)
        CALL_MCOUNT 2
        dcbt    0,r3
@@ -207,7 +184,7 @@ L(smaller):
        /* Place rounded up number of qw's to check into a vmx
           register, and use some vector tricks to minimize
           branching.  */
-        MTVRD(v7,r4)            /* Copy maxlen from GPR to vector register. */
+        mtvrd    v7,r4          /* copy maxlen from gpr to vector register. */
         vspltisb v5,1
         vspltisb v6,15
         vspltb   v2,v7,7
@@ -229,20 +206,20 @@ L(loop_16B):
        beq     cr6,L(loop_16B) /* If null bytes not found.  */
 
        vcmpequb  v1,v1,v0
-       VBPERMQ(v1,v1,v10)
+       vbpermq   v1,v1,v10
 #ifdef __LITTLE_ENDIAN__
        vsubuhm  v2,v1,v5       /* Form a mask of trailing zeros.  */
        vandc    v2,v2,v1
-       VPOPCNTH(v1,v2)         /* Count of trailing zeros, 16 if none.  */
+       vpopcnth v1,v2          /* count of trailing zeros, 16 if none.  */
 #else
-       VCLZH(v1,v1)            /* Count the leading zeros, 16 if none.  */
+       vclzh    v1,v1          /* count the leading zeros, 16 if none.  */
 #endif
        /* Truncate to maximum allowable offset.  */
        vcmpgtub v2,v1,v7       /* Compare and truncate for matches beyond
                                   maxlen.  */
        vsel     v1,v1,v7,v2    /* 0-16 is now in byte 7.  */
 
-       MFVRD(r0,v1)
+       mfvrd   r0,v1
        addi    r5,r5,-16       /* Undo speculative bump.  */
        extsb   r0,r0           /* Clear whatever gunk is in the high 56b.  */
        add     r5,r5,r0        /* Add the offset of whatever was found.  */
@@ -262,10 +239,10 @@ L(found_64B):
        vcmpequb  v4,v4,v0
 
        /* Permute the first bit of each byte into bits 48-63.  */
-       VBPERMQ(v1,v1,v10)
-       VBPERMQ(v2,v2,v10)
-       VBPERMQ(v3,v3,v10)
-       VBPERMQ(v4,v4,v10)
+       vbpermq v1,v1,v10
+       vbpermq v2,v2,v10
+       vbpermq v3,v3,v10
+       vbpermq v4,v4,v10
 
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
@@ -286,7 +263,7 @@ L(found_64B):
        /* Adjust address to the start of the current 64B block.  */
        addi    r5,r5,-64
 
-       MFVRD(r10,v4)
+       mfvrd   r10,v4
 #ifdef __LITTLE_ENDIAN__
        addi    r9,r10,-1       /* Form a mask from trailing zeros.  */
        andc    r9,r9,r10
@@ -302,15 +279,15 @@ L(found_64B):
           as a preparation for the 64B loop.  */
        .p2align 4
 L(found_aligning64B):
-       VBPERMQ(v1,v1,v10)
+       vbpermq v1,v1,v10
 #ifdef __LITTLE_ENDIAN__
-       MFVRD(r10,v1)
+       mfvrd   r10,v1
        addi    r9,r10,-1       /* Form a mask from trailing zeros.  */
        andc    r9,r9,r10
        popcntd r0,r9           /* Count the bits in the mask.  */
 #else
        vsldoi  v1,v1,v1,6
-       MFVRD(r10,v1)
+       mfvrd   r10,v1
        cntlzd  r0,r10          /* Count leading zeros before the match.  */
 #endif
        addi    r5,r5,-16       /* Adjust address to offset of last 16 bytes
index 988602d8d0bfe2a92a7f319eb4e7d91f3a28457d..09d9f518ffc3757f259660304ada8a5287802147 100644 (file)
 #include <sysdep.h>
 
 /* char *[r3] strrchr (char *s [r3], int c [r4])  */
-/* TODO: change these to the actual instructions when the minimum required
-   binutils allows it.  */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define VBPERMQ(t,a,b)  .long (0x1000054c \
-                               | ((t)<<(32-11)) \
-                               | ((a)<<(32-16)) \
-                               | ((b)<<(32-21)) )
-#define VCLZD(r,v) .long (0x100007c2 | ((r)<<(32-11)) | ((v)<<(32-21)))
-#define VPOPCNTD(r,v) .long (0x100007c3 | ((r)<<(32-11)) | ((v)<<(32-21)))
-#define VADDUQM(t,a,b)  .long (0x10000100 \
-                               | ((t)<<(32-11)) \
-                               | ((a)<<(32-16)) \
-                               | ((b)<<(32-21)) )
+
 #ifdef __LITTLE_ENDIAN__
 /* Find the match position from v6 and place result in r6.  */
 # define CALCULATE_MATCH() \
-       VBPERMQ(v6, v6, v10); \
+       vbpermq v6, v6, v10; \
        vsldoi  v6, v6, v6, 6; \
-       MFVRD(r7, v6); \
+       mfvrd   r7, v6; \
        cntlzd  r6, r7; \
        subfic  r6, r6, 15;
 /*
@@ -48,9 +35,9 @@
  */
 # define FIND_NULL_POS(reg) \
        vspltisb        v11, -1; \
-       VADDUQM(v11, reg, v11); \
+       vadduqm v11, reg, v11; \
        vandc   v11, v11, reg; \
-       VPOPCNTD(v2, v11); \
+       vpopcntd        v2, v11; \
        vspltb  v11, v2, 15; \
        vcmpequb.       v11, v11, v9; \
        blt     cr6, 1f; \
        vsumsws v2, v2, v0;
 #else
 # define CALCULATE_MATCH() \
-       VBPERMQ(v6, v6, v10); \
-       MFVRD(r7, v6); \
+       vbpermq v6, v6, v10; \
+       mfvrd   r7, v6; \
        addi    r6, r7, -1; \
        andc    r6, r6, r7; \
        popcntd r6, r6; \
        subfic  r6, r6, 15;
 # define FIND_NULL_POS(reg) \
-       VCLZD(v2, reg); \
+       vclzd   v2, reg; \
        vspltb  v11, v2, 7; \
        vcmpequb.       v11, v11, v9; \
        blt     cr6, 1f; \
@@ -80,7 +67,7 @@
 #ifndef STRRCHR
 # define STRRCHR strrchr
 #endif
-       .machine  power7
+       .machine  power8
 ENTRY_TOCLESS (STRRCHR)
        CALL_MCOUNT 2
        dcbt    0,r3
@@ -243,7 +230,7 @@ L(vector):
        vspltisb        v10, 3
        lvsl    v11, r0, r0
        vslb    v10, v11, v10
-       MTVRD(v1, r4)
+       mtvrd   v1, r4
        li      r5, 16
        vspltb  v1, v1, 7
        /* Compare 32 bytes in each loop.  */
@@ -442,8 +429,8 @@ L(continue1):
        addi    r3, r3, 32
        blt     cr6, L(continue1)
        addi    r3, r3, -32
-       VBPERMQ(v2, v2, v10)
-       VBPERMQ(v3, v3, v10)
+       vbpermq v2, v2, v10
+       vbpermq v3, v3, v10
        /* Shift each component into its correct position for merging.  */
 #ifdef __LITTLE_ENDIAN__
        vsldoi  v3, v3, v3, 2
@@ -453,7 +440,7 @@ L(continue1):
 #endif
        /* Merge the results and move to a GPR.  */
        vor     v4, v3, v2
-       MFVRD(r5, v4)
+       mfvrd   r5, v4
 #ifdef __LITTLE_ENDIAN__
        addi    r6, r5, -1
        andc    r6, r6, r5
index 02bac4113eb9ffde8dd61d7250a81d0e61e853e8..632db2540b4da600e46856f644a6a76ac9b47f26 100644 (file)
 #define XXVR(insn, vrt, vra, vrb) \
        insn 32+vrt, 32+vra, 32+vrb
 
-/* ISA 2.07B instructions are not all defined for older binutils.
-   Macros are defined below for these newer instructions in order
-   to maintain compatibility.  */
-
-/* Note, TX/SX is always set as VMX regs are the high 32 VSX regs.  */
-#define MTVRD(v,r) .long (0x7c000167 | ((v)<<(32-11)) | ((r)<<(32-16)))
-#define MFVRD(r,v) .long (0x7c000067 | ((v)<<(32-11)) | ((r)<<(32-16)))
-
-#define VBPERMQ(t,a,b) .long (0x1000054c \
-                             | ((t)<<(32-11))  \
-                             | ((a)<<(32-16))  \
-                             | ((b)<<(32-21)) )
-
-       /* This can be updated to power8 once the minimum version of
-          binutils supports power8 and the above instructions.  */
-       .machine power7
+       .machine  power8
 ENTRY_TOCLESS (STRSPN, 4)
        CALL_MCOUNT 2
 
@@ -135,10 +120,10 @@ L(needle_gt128):
 L(start_cmp):
        /* Move and merge bitmap into 2 VRs.  bpermd is slower on P8.  */
        mr      r0, r3          /* Save r3 for final length computation.  */
-       MTVRD (v5, r5)
-       MTVRD (v6, r6)
-       MTVRD (v7, r7)
-       MTVRD (v8, r8)
+       mtvrd   v5, r5
+       mtvrd   v6, r6
+       mtvrd   v7, r7
+       mtvrd   v8, r8
 
        /* Continue interleaved mask generation.  */
 #ifdef __LITTLE_ENDIAN__
@@ -160,8 +145,8 @@ L(start_cmp):
        /* Compare the first 1-16B, while masking unwanted bytes.  */
        clrrdi  r3, r3, 4       /* Note,  counts from qw boundaries.  */
        vxor    v9, v0, v1      /* Swap high bit.  */
-       VBPERMQ (v8, v5, v0)
-       VBPERMQ (v7, v6, v9)
+       vbpermq v8, v5, v0
+       vbpermq v7, v6, v9
        vor     v7, v7, v8
        vor     v7, v7, v11     /* Ignore non-participating bytes.  */
        vcmpequh. v8, v7, v4
@@ -174,8 +159,8 @@ L(vec):
        lvx     v0, 0, r3
        addi    r3, r3, 16
        vxor    v9, v0, v1      /* Swap high bit.  */
-       VBPERMQ (v8, v5, v0)
-       VBPERMQ (v7, v6, v9)
+       vbpermq v8, v5, v0
+       vbpermq v7, v6, v9
        vor     v7, v7, v8
        vcmpequh. v8, v7, v4
        blt     cr6, L(vec)
@@ -183,7 +168,7 @@ L(vec):
        addi    r3, r3, -16
 L(done):
        subf    r3, r0, r3
-       MFVRD (r10, v7)
+       mfvrd   r10, v7
 
 #ifdef __LITTLE_ENDIAN__
        addi    r0,  r10, 1     /* Count the trailing 1's.  */
This page took 0.087089 seconds and 5 git commands to generate.