[Skiboot] [PATCH 1/5] simplify GET/SETFIELD() use, add MASK_TO_LSH()

Dan Streetman ddstreet at us.ibm.com
Wed Feb 18 09:33:11 AEDT 2015


On Tue, Feb 17, 2015 at 4:20 PM, Dan Streetman <ddstreet at us.ibm.com> wrote:
> On Tue, Feb 17, 2015 at 4:09 PM, Dan Streetman <ddstreet at us.ibm.com> wrote:
>> On Tue, Feb 17, 2015 at 3:44 PM, Benjamin Herrenschmidt
>> <benh at kernel.crashing.org> wrote:
>>> On Tue, 2015-02-17 at 15:38 -0500, Dan Streetman wrote:
>>>> Currently, the GETFIELD() and SETFIELD() macros require the user to define
>>>> both the _MASK and the _LSH of the field. However, the shift of the field
>>>> is trivially determinable and there is no reason it needs to be specified
>>>> by the user.
>>>>
>>>> Add MASK_TO_LSH() macro, which determines the shift of a given mask.
>>>>
>>>> Change GETFIELD() and SETFIELD() to use MASK_TO_LSH() to determine the
>>>> shift of the specified mask, instead of requiring it to be specified by
>>>> the user.
>>>
>>> This is quite nice, did you check gcc was resolving it properly at
>>> compile time ?
>>
>> Yep, gcc compiles it fine
>
> To clarify - I did not check the binary output for correctness, I only
> booted the resulting skiboot.lid, which worked as expected.

Re: gcc fully resolving the value, I tried to look at the ppc asm, but
my ppc asm isn't good enough to tell what gcc's doing.  Here is an
example though, in case you can tell (taken with objdump -S):

        ci = instance;
        cfg = SETFIELD(NX_P8_842_CFG_CI, cfg, ci << NX_P8_842_CFG_CI_LSHIFT);
 2c4:   78 a5 13 40     rldicl  r5,r5,2,13
 2c8:   78 a5 f0 02     rotldi  r5,r5,62
 2cc:   64 a5 f8 00     oris    r5,r5,63488
 2d0:   60 a5 00 01     ori     r5,r5,1

        /* Enable all functions */
        cfg = SETFIELD(NX_P8_842_CFG_FC_ENABLE, cfg, CFG_842_FC_ENABLE);

        cfg = SETFIELD(NX_P8_842_CFG_ENABLE, cfg, CFG_842_ENABLE);
 2d4:   7c a5 4b 78     or      r5,r5,r9
 2d8:   f8 a1 00 70     std     r5,112(r1)

        rc = xscom_write(gcid, xcfg, cfg);
 2dc:   48 00 00 01     bl      2dc <.nx_create_842_node+0x2dc>
 2e0:   60 00 00 00     nop
        if (rc)
 2e4:   7c 7b 1b 79     mr.     r27,r3
 2e8:   41 82 00 30     beq     318 <.nx_create_842_node+0x318>
                prerror("NX%d: ERROR: 842 CT %u CI %u config failure %d\n",
 2ec:   3c 82 00 00     addis   r4,r2,0
 2f0:   38 60 00 03     li      r3,3
 2f4:   38 84 00 00     addi    r4,r4,0
 2f8:   7f e5 fb 78     mr      r5,r31
 2fc:   38 c0 00 03     li      r6,3




>
>> and I booted the resulting skiboot.lid fine
>> also.  I'm pretty sure that all gcc versions implement
>> __builtin_ffsl()...probably any other compiler would too, although I
>> assume we really only plan on gcc.
>>
>>>
>>> We could get rid of a whole pile of our _LSH definitions all over the
>>> place...
>>
>> yep, next patch in the set does that, and removes a lot of the _MASK suffixes.
>>
>>>
>>>> Signed-off-by: Dan Streetman <ddstreet at ieee.org>
>>>> ---
>>>>  include/bitutils.h | 11 ++++++-----
>>>>  1 file changed, 6 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/include/bitutils.h b/include/bitutils.h
>>>> index 7e5b6eb..baa752b 100644
>>>> --- a/include/bitutils.h
>>>> +++ b/include/bitutils.h
>>>> @@ -36,15 +36,16 @@
>>>>   * PPC bitmask field manipulation
>>>>   */
>>>>
>>>> +/* Find left shift from first set bit in mask */
>>>> +#define MASK_TO_LSH(m)               (__builtin_ffsl(m) - 1)
>>>> +
>>>>  /* Extract field fname from val */
>>>> -#define GETFIELD(fname, val)                 \
>>>> -     (((val) & fname##_MASK) >> fname##_LSH)
>>>> +#define GETFIELD(m, v)               (((v) & (m)) >> MASK_TO_LSH(m))
>>>>
>>>>  /* Set field fname of oval to fval
>>>>   * NOTE: oval isn't modified, the combined result is returned
>>>>   */
>>>> -#define SETFIELD(fname, oval, fval)                  \
>>>> -     (((oval) & ~fname##_MASK) | \
>>>> -      ((((typeof(oval))(fval)) << fname##_LSH) & fname##_MASK))
>>>> +#define SETFIELD(m, v, val)                          \
>>>> +     (((v) & ~(m)) | ((((typeof(v))(val)) << MASK_TO_LSH(m)) & (m)))
>>>>
>>>>  #endif /* __BITUTILS_H */
>>>
>>>
>>> _______________________________________________
>>> Skiboot mailing list
>>> Skiboot at lists.ozlabs.org
>>> https://lists.ozlabs.org/listinfo/skiboot


More information about the Skiboot mailing list