From: lkcl Date: Sun, 13 Mar 2022 22:22:07 +0000 (+0000) Subject: (no commit message) X-Git-Tag: opf_rfc_ls005_v1~3065 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0c4414cfa64b98cd297d525dab274950781e2a1f;p=libreriscv.git --- diff --git a/openpower/sv/bitmanip.mdwn b/openpower/sv/bitmanip.mdwn index ea0c3916e..a72b06114 100644 --- a/openpower/sv/bitmanip.mdwn +++ b/openpower/sv/bitmanip.mdwn @@ -140,10 +140,7 @@ double check that instructions didn't need 3 inputs. | NN | RA | RB | RC | 0 | 01 | 0110 110 |Rc| grevw | | NN | RA | RB | sh | 0 | 01 | 1110 110 |Rc| grevwi | | NN | RA | RB | RC | 1 | 01 | 1110 110 |Rc| bmatxor | -| NN | RA | RB | RC | 0 | 10 | 0010 110 |Rc| shfl | -| NN | RA | RB | sh | SH | 10 | 1010 110 |Rc| shfli | -| NN | RA | RB | RC | 0 | 10 | 0110 110 |Rc| shflw | -| NN | RA | RB | RC | | 10 | 1110 110 |Rc| rsvd | +| NN | RA | RB | RC | | 10 | --10 110 |Rc| rsvd | | NN | RA | RB | RC | 0 | 11 | 1110 110 |Rc| clmulr | | NN | RA | RB | RC | 1 | 11 | 1110 110 |Rc| clmulh | | NN | | | | | | --11 110 |Rc| setvl | @@ -436,72 +433,6 @@ uint64_t grev64(uint64_t RA, uint64_t RB) ``` -# shuffle / unshuffle - -based on RV bitmanip - -``` -uint32_t shfl32(uint32_t RA, uint32_t RB) -{ - uint32_t x = RA; - int shamt = RB & 15; - if (shamt & 8) x = shuffle32_stage(x, 0x00ff0000, 0x0000ff00, 8); - if (shamt & 4) x = shuffle32_stage(x, 0x0f000f00, 0x00f000f0, 4); - if (shamt & 2) x = shuffle32_stage(x, 0x30303030, 0x0c0c0c0c, 2); - if (shamt & 1) x = shuffle32_stage(x, 0x44444444, 0x22222222, 1); - return x; -} -uint32_t unshfl32(uint32_t RA, uint32_t RB) -{ - uint32_t x = RA; - int shamt = RB & 15; - if (shamt & 1) x = shuffle32_stage(x, 0x44444444, 0x22222222, 1); - if (shamt & 2) x = shuffle32_stage(x, 0x30303030, 0x0c0c0c0c, 2); - if (shamt & 4) x = shuffle32_stage(x, 0x0f000f00, 0x00f000f0, 4); - if (shamt & 8) x = shuffle32_stage(x, 0x00ff0000, 0x0000ff00, 8); - return x; -} - -uint64_t shuffle64_stage(uint64_t src, uint64_t maskL, uint64_t maskR, int N) -{ - uint64_t x = src & ~(maskL | maskR); - x |= ((src << N) & maskL) | ((src >> N) & maskR); - return x; -} -uint64_t shfl64(uint64_t RA, uint64_t RB) -{ - uint64_t x = RA; - int shamt = RB & 31; - if (shamt & 16) x = shuffle64_stage(x, 0x0000ffff00000000LL, - 0x00000000ffff0000LL, 16); - if (shamt & 8) x = shuffle64_stage(x, 0x00ff000000ff0000LL, - 0x0000ff000000ff00LL, 8); - if (shamt & 4) x = shuffle64_stage(x, 0x0f000f000f000f00LL, - 0x00f000f000f000f0LL, 4); - if (shamt & 2) x = shuffle64_stage(x, 0x3030303030303030LL, - 0x0c0c0c0c0c0c0c0cLL, 2); - if (shamt & 1) x = shuffle64_stage(x, 0x4444444444444444LL, - 0x2222222222222222LL, 1); - return x; -} -uint64_t unshfl64(uint64_t RA, uint64_t RB) -{ - uint64_t x = RA; - int shamt = RB & 31; - if (shamt & 1) x = shuffle64_stage(x, 0x4444444444444444LL, - 0x2222222222222222LL, 1); - if (shamt & 2) x = shuffle64_stage(x, 0x3030303030303030LL, - 0x0c0c0c0c0c0c0c0cLL, 2); - if (shamt & 4) x = shuffle64_stage(x, 0x0f000f000f000f00LL, - 0x00f000f000f000f0LL, 4); - if (shamt & 8) x = shuffle64_stage(x, 0x00ff000000ff0000LL, - 0x0000ff000000ff00LL, 8); - if (shamt & 16) x = shuffle64_stage(x, 0x0000ffff00000000LL, - 0x00000000ffff0000LL, 16); - return x; -} -``` - # xperm based on RV bitmanip.