X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bitmap_parallelism_extension.mdwn;h=8593a82b0d42e0ff27355ac1d1b51887c1708668;hb=819751f461d50346468f729bc47ce745080a02e4;hp=8880d4b327ba122cb132f0e4acc3d1a0f0ddcfdf;hpb=2b70697a2cf9ce1a870bf5bf965b5cd3325d3f33;p=libreriscv.git diff --git a/bitmap_parallelism_extension.mdwn b/bitmap_parallelism_extension.mdwn index 8880d4b32..8593a82b0 100644 --- a/bitmap_parallelism_extension.mdwn +++ b/bitmap_parallelism_extension.mdwn @@ -37,7 +37,14 @@ example: X2 <- 0b1011 X3 <- 0b00010 + > Anyways my point was, for me it would have been more intuitive + > and easier to grasp if it showed: + > X1 -> b011111 (meaning x4,x3,x2,x1,x0) + > X2 -> b001011 (meaning x3,x1,x0) + > X3 -> b000010 (meaning x1) + then + rd1s = [x1, x2, x3, x4, x5] rs1s = [x0, x2, x3, x0, x2] rs2s = [x3, x3, x3, x3, x3] @@ -62,3 +69,52 @@ is the "read legal" of the CSR. Moreover popc would tell you how many operations are scheduled in parallel so you know how often you have to repeat a sequential loop. +Notes: + +> > Thinking about it more, a bitset for X0 seems a bad idea, or equivalently X0 +> > should be +> > the immutable  bitset {x0}. That suggests FX0, ... FX31 _is_ a good idea. + +>  what would it mean, to do ops with x0?  it would mean "always add 0" +> and so on.  it sounds kinda useful.  like MV being add r1, r2, x0.  +> it would completely pointless to *have* anything other than "all 1s" +> in it though i think :) + +# pseudocode for decoding ops + + uint32 XB[32]; // global, assume RV32 for now: CSRs for bitmapping + uint32 regs[32]; // global, actual (integer) register file + + // gets current ACTUAL register to be used + // XB had better not be empty... + int regdecode(int rn, int *offs) + { + int bmap = XB[rn]; + int _offs = *offs; + while (1) + { + int _newoffs = (_offs + 1) & 0x1f; // 32 regs, modulo + if (bmap & (1<<_offs)) + { + *offs = _newoffs; + return _offs; + } + _offs = _newoffs; + } + } + +example usage (pseudo-implementation of add): + + op_add(int rd, int rs1, int rs2) + { + int id=0, irs1=0, irs2=0; + int VL = pcnt(XB[rd]; + for (int i = 0; i < VL; i++) + { + int actualrd = regdecode(rd , &id); + int actualrs1 = regdecode(rs1, &irs1); + int actualrs2 = regdecode(rs2, &irs2); + regs[actualrd] = regs[actualrs1] + regs[actualrs2]; + } + } +