diff options
author | Joel Stanley <joel@jms.id.au> | 2018-05-04 11:40:30 +0930 |
---|---|---|
committer | Stewart Smith <stewart@linux.ibm.com> | 2018-05-04 03:25:04 -0500 |
commit | 1fdca4a29c368a82ff8493af5558f7f09346d843 (patch) | |
tree | e5cb629b36b74c7432be5a193bc523993681ad83 /libflash/ecc.c | |
parent | 4640e703d3079f60b0230175a150fb9c391c0095 (diff) | |
download | skiboot-1fdca4a29c368a82ff8493af5558f7f09346d843.zip skiboot-1fdca4a29c368a82ff8493af5558f7f09346d843.tar.gz skiboot-1fdca4a29c368a82ff8493af5558f7f09346d843.tar.bz2 |
libflash/ecc: Remove hand rolled parity asm
We get the same code generation using the builtin:
GCC 7.3:
a3584: 7d 29 00 f4 popcntb r9,r9
a3588: 7d 29 01 74 prtyd r9,r9
GCC 6.3:
a0bfc: 7d 29 00 f4 popcntb r9,r9
a0c00: 7d 29 01 74 prtyd r9,r9
Clang 7 (and clang 6):
bd48c: 7c e7 03 f4 popcntd r7,r7
bd490: 54 e7 07 fe clrlwi r7,r7,31
(Not sure why the clang builtin generates different code)
Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'libflash/ecc.c')
-rw-r--r-- | libflash/ecc.c | 18 |
1 files changed, 1 insertions, 17 deletions
diff --git a/libflash/ecc.c b/libflash/ecc.c index cfb1a13..9ed9015 100644 --- a/libflash/ecc.c +++ b/libflash/ecc.c @@ -110,22 +110,6 @@ static enum eccbitfields syndromematrix[] = { UE, UE, UE, UE, 4, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, UE, }; -static uint8_t parity(uint64_t data) -{ -#ifdef __SKIBOOT__ - uint8_t p; - - asm volatile( - "popcntb %1,%0\n" - "prtyd %1,%1\n" - : "=r"(p) : "r"(data)); - - return p; -#else - return __builtin_parityll(data); -#endif -} - /** * Create the ECC field corresponding to a 8-byte data field * @@ -138,7 +122,7 @@ static uint8_t eccgenerate(uint64_t data) uint8_t result = 0; for (i = 0; i < 8; i++) - result |= parity(eccmatrix[i] & data) << i; + result |= __builtin_parityll(eccmatrix[i] & data) << i; return result; } |