[Libre-soc-bugs] [Bug 550] binutils support needed for svp64

bugzilla-daemon at libre-soc.org bugzilla-daemon at libre-soc.org
Sun Jan 16 19:26:50 GMT 2022


https://bugs.libre-soc.org/show_bug.cgi?id=550

--- Comment #79 from Luke Kenneth Casson Leighton <lkcl at lkcl.net> ---
(In reply to dmitry.selyutin from comment #77)
> Added the array of entries itself, also pushed minor cleanup and fixup.
> Hopefully we can now proceed to merging entries as Luke described. One note,
> though: I was wrong, PPC tables are _not_ sorted by names, but instead are
> sorted by opcodes:

mmm that's a bit of a pig, then.

> include/opcode/ppc.h
> /* The table itself is sorted by major opcode number, and is otherwise
>    in the order in which the disassembler should consider
>    instructions.  */
> 
> Given that we have not that many entries, I think we might simply iterate
> over all SVP64 entries and lookup all PPC entries which match upon start

yeah, either that, or use the ppc64 lookup function *after* the hashtable
is created, and just go over the svp64 list in linear order.

> (e.g. when we meet "add" SVP64 entry, we'll try addo, add., addo. as well.
> Luke, does it look OK to you?

yyep, should work great.

(In reply to dmitry.selyutin from comment #78)
> You might use SILENCELOG=true python3 src/openpower/sv/sv_binutils.py
> ppc-opc-svp64.c to see the output. I'll think about "simply let 'em feed the
> goddamn directory path" approach as well, for now it's simpler to operate
> with explicit files.

> For now the output contains opcodes as well; I know we
> intend to drop these, but perhaps they might be good for some checks we do
> cross PPC opcodes.

extra effort. all mnemonics should be unique.  hey if it's in it's effort
to take it out.

now, about this:

struct svp64_entry {
    const char *name;
    struct svp64_opcode opcode;
    uint64_t in1 : 3;
    uint64_t in2 : 5;
    uint64_t in3 : 3;
    uint64_t out : 3;
    uint64_t out2 : 3;
    uint64_t cr_in : 4;
    uint64_t cr_out : 3;
    uint64_t sv_ptype : 2;
    uint64_t sv_etype : 2;
    uint64_t sv_in1 : 3;
    uint64_t sv_in2 : 3;
    uint64_t sv_in3 : 3;
    uint64_t sv_out : 3;
    uint64_t sv_out2 : 3;
    uint64_t sv_cr_in : 3;
    uint64_t sv_cr_out : 3;
    uint64_t : 15;
};

that's not going to work.  that's a massive... 1k entry where a 64-bit one will
do.

i was expecting this:

struct svp64_entry {
    const char *name;
    uint64_t svp64_info;
}

followed by some (perhaps auto-generated) macros:

#define SET_SV_IN1(val) ((val&0x3)<<5)
#define GET_SV_IN1(val) ((val&0x3)>>5)

where the settings in the c file comprise:

    svp64_info = SET_SV_IN1(someconst) | SET_SV_IN2(anotherconst) ....


something like that.

the code inside binutils would then use the GET_SV_XXXX macros to
obtain the required information.

using bit-fields in structs is non-portable and it won't make it
past review by the binutils developers.

also, the fact that there would be ten THOUSAND such 1k entries,
(because of 25 64-bit ints) that's far too much memory wasted.

whereas - as i said in several of the comments - a single uint64_t
is perfectly sufficient. adding up the total number of bits above
comes to 60 bits, which is less than 64.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the libre-soc-bugs mailing list