[U-Boot] [PATCH v6 03/23] Add abs() macro to return absolute value

Simon Glass sjg at chromium.org
Thu May 10 21:37:16 CEST 2012


Hi Albert,

On Fri, May 4, 2012 at 12:27 PM, Albert ARIBAUD
<albert.u.boot at aribaud.net>wrote:

> Hi Simon,
>
> Le 04/05/2012 20:25, Simon Glass a écrit :
>
>> This macro is generally useful to make it available in common.
>>
>> Signed-off-by: Simon Glass<sjg at chromium.org>
>> ---
>> Changes in v3:
>> - Add new patch to put abs() in common.h
>>
>> Changes in v6:
>> - Update x86emu and omap4 to use the abs() macro
>>
>>  arch/arm/cpu/armv7/omap4/**clocks.c       |    2 --
>>  drivers/bios_emulator/x86emu/**prim_ops.c |    5 -----
>>  include/common.h                        |   13 +++++++++++++
>>  3 files changed, 13 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm/cpu/armv7/omap4/**clocks.c
>> b/arch/arm/cpu/armv7/omap4/**clocks.c
>> index e2189f7..ce3f59c 100644
>> --- a/arch/arm/cpu/armv7/omap4/**clocks.c
>> +++ b/arch/arm/cpu/armv7/omap4/**clocks.c
>> @@ -46,8 +46,6 @@
>>  #define puts(s)
>>  #endif
>>
>> -#define abs(x) (((x)<  0) ? ((x)*-1) : (x))
>> -
>>  struct omap4_prcm_regs *const prcm = (struct omap4_prcm_regs
>> *)0x4A004100;
>>
>>  const u32 sys_clk_array[8] = {
>> diff --git a/drivers/bios_emulator/**x86emu/prim_ops.c
>> b/drivers/bios_emulator/**x86emu/prim_ops.c
>> index 7553087..5f6c795 100644
>> --- a/drivers/bios_emulator/**x86emu/prim_ops.c
>> +++ b/drivers/bios_emulator/**x86emu/prim_ops.c
>> @@ -118,11 +118,6 @@ static u32 x86emu_parity_tab[8] =
>>
>>  #define PARITY(x)   (((x86emu_parity_tab[(x) / 32]>>  ((x) % 32))&  1)
>> == 0)
>>  #define XOR2(x)           (((x) ^ ((x)>>1))&  0x1)
>>
>> -/*---------------------------**-- Implementation
>> ----------------------------*/
>> -int abs(int v)
>> -{
>> -       return (v>0)?v:-v;
>> -}
>>
>>  /*----------------------------**- Implementation
>> ----------------------------*/
>>
>> diff --git a/include/common.h b/include/common.h
>> index 74d9704..92eac2c 100644
>> --- a/include/common.h
>> +++ b/include/common.h
>> @@ -229,6 +229,19 @@ ulong timer_get_boot_us(void);
>>  #define MIN(x, y)  min(x, y)
>>  #define MAX(x, y)  max(x, y)
>>
>> +/*
>> + * Return the absolute value of a number. This handles unsigned ints,
>> shorts
>> + * and chars and returns a signed long.
>> + */
>>
>
> What is the rationale for forcing a signed long return type? Such macros
> as max, min, abs etc usually try to avoid any forced typing. Can't you get
> rid of the ret variable and use __x directly as the return value?


Sorry I am not sure about that, not my code... I will submit a patch with a
really simply implementation.



>
> +#define abs(x) ({                                      \
>
>> +               long ret;                               \
>> +               {                                       \
>> +                       typeof((x)) __x = (x);          \
>> +                       ret = (__x<  0) ? -__x : __x;   \
>> +               }                                       \
>> +               ret;                                    \
>> +       })
>> +
>>  #if defined(CONFIG_ENV_IS_**EMBEDDED)
>>  #define TOTAL_MALLOC_LEN      CONFIG_SYS_MALLOC_LEN
>>  #elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_**SIZE)<  CONFIG_SYS_MONITOR_BASE)
>> || \
>>
>
>
> Amicalement,
> --
> Albert.
>

Regards,
Simon


More information about the U-Boot mailing list