aboutsummaryrefslogtreecommitdiff
path: root/libflash/ecc.c
diff options
context:
space:
mode:
authorJoel Stanley <joel@jms.id.au>2018-05-04 11:40:30 +0930
committerStewart Smith <stewart@linux.ibm.com>2018-05-04 03:25:04 -0500
commit1fdca4a29c368a82ff8493af5558f7f09346d843 (patch)
treee5cb629b36b74c7432be5a193bc523993681ad83 /libflash/ecc.c
parent4640e703d3079f60b0230175a150fb9c391c0095 (diff)
downloadskiboot-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.c18
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;
}