(no commit message)
[libreriscv.git] / openpower / sv / bitmanip.mdwn
1 # bit to byte permute
2
3 do j = 0 to 7
4 do k = 0 to 7
5 b = VSR[VRB+32].dword[i].byte[k].bit[j]
6 VSR[VRT+32].dword[i].byte[j].bit[k] = b
7
8 # vector bit deposit
9
10 vpdepd VRT,VRA,VRB
11
12 do while(m < 64)
13 if VSR[VRB+32].dword[i].bit[63-m]=1 then do
14 result = VSR[VRA+32].dword[i].bit[63-k]
15 VSR[VRT+32].dword[i].bit[63-m] = result
16 k = k + 1
17 m = m + 1
18
19 # vector bit extract
20
21 other way round
22
23 # single bit set
24
25 ```
26 uint_xlen_t sbset(uint_xlen_t rs1, uint_xlen_t rs2) { int shamt = rs2 & (XLEN - 1);
27 }
28 return rs1 | (uint_xlen_t(1) << shamt);
29 uint_xlen_t sbclr(uint_xlen_t rs1, uint_xlen_t rs2) { int shamt = rs2 & (XLEN - 1);
30 }
31 return rs1 & ~(uint_xlen_t(1) << shamt);
32 uint_xlen_t sbinv(uint_xlen_t rs1, uint_xlen_t rs2) { int shamt = rs2 & (XLEN - 1);
33 }
34 return rs1 ^ (uint_xlen_t(1) << shamt);
35 uint_xlen_t sbext(uint_xlen_t rs1, uint_xlen_t rs2) { int shamt = rs2 & (XLEN - 1);
36 }
37 return 1 & (rs1 >> shamt);
38 ```
39
40 # shuffle / unshuffle
41
42 ```
43 uint64_t shuffle64_stage(uint64_t src, uint64_t maskL, uint64_t maskR, int N) { uint64_t x = src & ~(maskL | maskR);
44 }
45 x |= ((src << N) & maskL) | ((src >> N) & maskR); return x;
46 uint64_t shfl64(uint64_t rs1, uint64_t rs2) { uint64_t x = rs1;
47 }
48 int shamt = rs2 & 31;
49 if (shamt & 16) x = shuffle64_stage(x, 0x0000ffff00000000LL,
50 0x00000000ffff0000LL, 16); if (shamt & 8) x = shuffle64_stage(x, 0x00ff000000ff0000LL,
51 0x0000ff000000ff00LL, 8); if (shamt & 4) x = shuffle64_stage(x, 0x0f000f000f000f00LL,
52 0x00f000f000f000f0LL, 4); if (shamt & 2) x = shuffle64_stage(x, 0x3030303030303030LL,
53 0x0c0c0c0c0c0c0c0cLL, 2); if (shamt & 1) x = shuffle64_stage(x, 0x4444444444444444LL,
54 return x;
55 0x2222222222222222LL, 1);
56 uint64_t unshfl64(uint64_t rs1, uint64_t rs2) { uint64_t x = rs1;
57 }
58 int shamt = rs2 & 31;
59 if (shamt & 1) x = shuffle64_stage(x, 0x4444444444444444LL,
60 0x2222222222222222LL, 1); if (shamt & 2) x = shuffle64_stage(x, 0x3030303030303030LL,
61 0x0c0c0c0c0c0c0c0cLL, 2); if (shamt & 4) x = shuffle64_stage(x, 0x0f000f000f000f00LL,
62 0x00f000f000f000f0LL, 4); if (shamt & 8) x = shuffle64_stage(x, 0x00ff000000ff0000LL,
63 0x0000ff000000ff00LL, 8); if (shamt & 16) x = shuffle64_stage(x, 0x0000ffff00000000LL,
64 return x;
65 0x00000000ffff0000LL, 16);
66 ```
67