Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-22 Thread Laszlo Ersek
On 07/21/20 18:02, Alex Bennée wrote:
> 
> Philippe Mathieu-Daudé  writes:
> 
>> On 7/17/20 6:46 PM, Laszlo Ersek wrote:
>>> On 07/17/20 11:26, Laszlo Ersek wrote:
 On 07/16/20 17:09, Philippe Mathieu-Daudé wrote:
> On 7/16/20 4:42 PM, Laszlo Ersek wrote:
>> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
>> object that has static storage duration shall be constant expressions or
>> string literals".
>>
>> The compound literal produced by the make_floatx80() macro is not such a
>> constant expression, per 6.6p7-9. (An implementation may accept it,
>> according to 6.6p10, but is not required to.)
>>
>> Therefore using "floatx80_zero" and make_floatx80() for initializing
>> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
>> actually chokes on them:
>>
>>> target/i386/fpu_helper.c:871:5: error: initializer element is not 
>>> constant
>>>  { make_floatx80(0xbfff, 0x8000ULL),
>>>  ^
>
> This reminds me of:
>
> commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b
> Author: Kamil Rytarowski 
> Date:   Mon Sep 4 23:23:06 2017 +0200
>
> target/m68k: Switch fpu_rom from make_floatx80() to 
> make_floatx80_init()
>
> GCC 4.7.2 on SunOS reports that the values assigned to array members
> are not
> real constants:
>
> target/m68k/fpu_helper.c:32:5: error: initializer element is not
> constant
> target/m68k/fpu_helper.c:32:5: error: (near initialization for
> 'fpu_rom[0]')
> rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed
>
> Convert the array to make_floatx80_init() to fix it.
> Replace floatx80_pi-like constants with make_floatx80_init() as they 
> are
> defined as make_floatx80().
>
> Reviewed-by: Philippe Mathieu-Daudé 
>
>>
>> We've had the make_floatx80_init() macro for this purpose since commit
>> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
>> macro again.
>>
>> Fixes: eca30647fc07
>> Fixes: ff57bb7b6326
>> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
>> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
>> Cc: Alex Bennée 
>> Cc: Aurelien Jarno 
>> Cc: Eduardo Habkost 
>> Cc: Joseph Myers 
>> Cc: Paolo Bonzini 
>> Cc: Peter Maydell 
>> Cc: Richard Henderson 
>> Signed-off-by: Laszlo Ersek 
>> ---
>>
>> Notes:
>> I can see that there are test cases under "tests/tcg/i386", but I 
>> don't
>> know how to run them.
>
> Yeah it is not easy to figure...
>
> Try 'make run-tcg-tests-i386-softmmu'
> but you need docker :^)

 That worked, thanks! Even without Docker: I just had to add

   --cross-cc-i386=gcc

 to my ./configure flags.

>>>
>>> Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix;
>>> sorry about that.
>>
>> Alex, as Paolo is not available, can this go via your tree?
> 
> Ok queued to for-5.1/fixes-for-rc1-v2, thanks.

Many thanks!
Laszlo




Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-21 Thread Alex Bennée


Philippe Mathieu-Daudé  writes:

> On 7/17/20 6:46 PM, Laszlo Ersek wrote:
>> On 07/17/20 11:26, Laszlo Ersek wrote:
>>> On 07/16/20 17:09, Philippe Mathieu-Daudé wrote:
 On 7/16/20 4:42 PM, Laszlo Ersek wrote:
> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
> object that has static storage duration shall be constant expressions or
> string literals".
>
> The compound literal produced by the make_floatx80() macro is not such a
> constant expression, per 6.6p7-9. (An implementation may accept it,
> according to 6.6p10, but is not required to.)
>
> Therefore using "floatx80_zero" and make_floatx80() for initializing
> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
> actually chokes on them:
>
>> target/i386/fpu_helper.c:871:5: error: initializer element is not 
>> constant
>>  { make_floatx80(0xbfff, 0x8000ULL),
>>  ^

 This reminds me of:

 commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b
 Author: Kamil Rytarowski 
 Date:   Mon Sep 4 23:23:06 2017 +0200

 target/m68k: Switch fpu_rom from make_floatx80() to 
 make_floatx80_init()

 GCC 4.7.2 on SunOS reports that the values assigned to array members
 are not
 real constants:

 target/m68k/fpu_helper.c:32:5: error: initializer element is not
 constant
 target/m68k/fpu_helper.c:32:5: error: (near initialization for
 'fpu_rom[0]')
 rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed

 Convert the array to make_floatx80_init() to fix it.
 Replace floatx80_pi-like constants with make_floatx80_init() as they 
 are
 defined as make_floatx80().

 Reviewed-by: Philippe Mathieu-Daudé 

>
> We've had the make_floatx80_init() macro for this purpose since commit
> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
> macro again.
>
> Fixes: eca30647fc07
> Fixes: ff57bb7b6326
> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
> Cc: Alex Bennée 
> Cc: Aurelien Jarno 
> Cc: Eduardo Habkost 
> Cc: Joseph Myers 
> Cc: Paolo Bonzini 
> Cc: Peter Maydell 
> Cc: Richard Henderson 
> Signed-off-by: Laszlo Ersek 
> ---
>
> Notes:
> I can see that there are test cases under "tests/tcg/i386", but I 
> don't
> know how to run them.

 Yeah it is not easy to figure...

 Try 'make run-tcg-tests-i386-softmmu'
 but you need docker :^)
>>>
>>> That worked, thanks! Even without Docker: I just had to add
>>>
>>>   --cross-cc-i386=gcc
>>>
>>> to my ./configure flags.
>>>
>> 
>> Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix;
>> sorry about that.
>
> Alex, as Paolo is not available, can this go via your tree?

Ok queued to for-5.1/fixes-for-rc1-v2, thanks.

>
>> 
>> Laszlo
>> 


-- 
Alex Bennée



Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-17 Thread Philippe Mathieu-Daudé
On 7/17/20 6:46 PM, Laszlo Ersek wrote:
> On 07/17/20 11:26, Laszlo Ersek wrote:
>> On 07/16/20 17:09, Philippe Mathieu-Daudé wrote:
>>> On 7/16/20 4:42 PM, Laszlo Ersek wrote:
 Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
 object that has static storage duration shall be constant expressions or
 string literals".

 The compound literal produced by the make_floatx80() macro is not such a
 constant expression, per 6.6p7-9. (An implementation may accept it,
 according to 6.6p10, but is not required to.)

 Therefore using "floatx80_zero" and make_floatx80() for initializing
 "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
 actually chokes on them:

> target/i386/fpu_helper.c:871:5: error: initializer element is not constant
>  { make_floatx80(0xbfff, 0x8000ULL),
>  ^
>>>
>>> This reminds me of:
>>>
>>> commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b
>>> Author: Kamil Rytarowski 
>>> Date:   Mon Sep 4 23:23:06 2017 +0200
>>>
>>> target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init()
>>>
>>> GCC 4.7.2 on SunOS reports that the values assigned to array members
>>> are not
>>> real constants:
>>>
>>> target/m68k/fpu_helper.c:32:5: error: initializer element is not
>>> constant
>>> target/m68k/fpu_helper.c:32:5: error: (near initialization for
>>> 'fpu_rom[0]')
>>> rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed
>>>
>>> Convert the array to make_floatx80_init() to fix it.
>>> Replace floatx80_pi-like constants with make_floatx80_init() as they are
>>> defined as make_floatx80().
>>>
>>> Reviewed-by: Philippe Mathieu-Daudé 
>>>

 We've had the make_floatx80_init() macro for this purpose since commit
 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
 macro again.

 Fixes: eca30647fc07
 Fixes: ff57bb7b6326
 Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
 Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
 Cc: Alex Bennée 
 Cc: Aurelien Jarno 
 Cc: Eduardo Habkost 
 Cc: Joseph Myers 
 Cc: Paolo Bonzini 
 Cc: Peter Maydell 
 Cc: Richard Henderson 
 Signed-off-by: Laszlo Ersek 
 ---

 Notes:
 I can see that there are test cases under "tests/tcg/i386", but I don't
 know how to run them.
>>>
>>> Yeah it is not easy to figure...
>>>
>>> Try 'make run-tcg-tests-i386-softmmu'
>>> but you need docker :^)
>>
>> That worked, thanks! Even without Docker: I just had to add
>>
>>   --cross-cc-i386=gcc
>>
>> to my ./configure flags.
>>
> 
> Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix;
> sorry about that.

Alex, as Paolo is not available, can this go via your tree?

> 
> Laszlo
> 




Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-17 Thread Laszlo Ersek
On 07/17/20 11:26, Laszlo Ersek wrote:
> On 07/16/20 17:09, Philippe Mathieu-Daudé wrote:
>> On 7/16/20 4:42 PM, Laszlo Ersek wrote:
>>> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
>>> object that has static storage duration shall be constant expressions or
>>> string literals".
>>>
>>> The compound literal produced by the make_floatx80() macro is not such a
>>> constant expression, per 6.6p7-9. (An implementation may accept it,
>>> according to 6.6p10, but is not required to.)
>>>
>>> Therefore using "floatx80_zero" and make_floatx80() for initializing
>>> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
>>> actually chokes on them:
>>>
 target/i386/fpu_helper.c:871:5: error: initializer element is not constant
  { make_floatx80(0xbfff, 0x8000ULL),
  ^
>>
>> This reminds me of:
>>
>> commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b
>> Author: Kamil Rytarowski 
>> Date:   Mon Sep 4 23:23:06 2017 +0200
>>
>> target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init()
>>
>> GCC 4.7.2 on SunOS reports that the values assigned to array members
>> are not
>> real constants:
>>
>> target/m68k/fpu_helper.c:32:5: error: initializer element is not
>> constant
>> target/m68k/fpu_helper.c:32:5: error: (near initialization for
>> 'fpu_rom[0]')
>> rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed
>>
>> Convert the array to make_floatx80_init() to fix it.
>> Replace floatx80_pi-like constants with make_floatx80_init() as they are
>> defined as make_floatx80().
>>
>> Reviewed-by: Philippe Mathieu-Daudé 
>>
>>>
>>> We've had the make_floatx80_init() macro for this purpose since commit
>>> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
>>> macro again.
>>>
>>> Fixes: eca30647fc07
>>> Fixes: ff57bb7b6326
>>> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
>>> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
>>> Cc: Alex Bennée 
>>> Cc: Aurelien Jarno 
>>> Cc: Eduardo Habkost 
>>> Cc: Joseph Myers 
>>> Cc: Paolo Bonzini 
>>> Cc: Peter Maydell 
>>> Cc: Richard Henderson 
>>> Signed-off-by: Laszlo Ersek 
>>> ---
>>>
>>> Notes:
>>> I can see that there are test cases under "tests/tcg/i386", but I don't
>>> know how to run them.
>>
>> Yeah it is not easy to figure...
>>
>> Try 'make run-tcg-tests-i386-softmmu'
>> but you need docker :^)
> 
> That worked, thanks! Even without Docker: I just had to add
> 
>   --cross-cc-i386=gcc
> 
> to my ./configure flags.
> 

Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix;
sorry about that.

Laszlo




Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-17 Thread Laszlo Ersek
On 07/16/20 18:31, Alex Bennée wrote:
> 
> Laszlo Ersek  writes:
> 
>> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
>> object that has static storage duration shall be constant expressions or
>> string literals".
>>
>> The compound literal produced by the make_floatx80() macro is not such a
>> constant expression, per 6.6p7-9. (An implementation may accept it,
>> according to 6.6p10, but is not required to.)
>>
>> Therefore using "floatx80_zero" and make_floatx80() for initializing
>> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
>> actually chokes on them:
>>
>>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant
>>>  { make_floatx80(0xbfff, 0x8000ULL),
>>>  ^
>>
>> We've had the make_floatx80_init() macro for this purpose since commit
>> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
>> macro again.
>>
>> Fixes: eca30647fc07
>> Fixes: ff57bb7b6326
>> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
>> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
>> Cc: Alex Bennée 
>> Cc: Aurelien Jarno 
>> Cc: Eduardo Habkost 
>> Cc: Joseph Myers 
>> Cc: Paolo Bonzini 
>> Cc: Peter Maydell 
>> Cc: Richard Henderson 
>> Signed-off-by: Laszlo Ersek 
>> ---
>>
>> Notes:
>> I can see that there are test cases under "tests/tcg/i386", but I don't
>> know how to run them.
> 
> You can run the TCG tests with:
> 
>   make check-tcg
> 
> or more specifically:
> 
>   make run-tcg-tests-i386-linux-user
> 
> there is also a:
> 
>   make check-softfloat
> 
> although in this case nothing is affected.
> 
> softfloat bits:
> 
> Acked-by: Alex Bennée 

Thank you!
Laszlo




Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-17 Thread Laszlo Ersek
On 07/16/20 17:09, Philippe Mathieu-Daudé wrote:
> On 7/16/20 4:42 PM, Laszlo Ersek wrote:
>> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
>> object that has static storage duration shall be constant expressions or
>> string literals".
>>
>> The compound literal produced by the make_floatx80() macro is not such a
>> constant expression, per 6.6p7-9. (An implementation may accept it,
>> according to 6.6p10, but is not required to.)
>>
>> Therefore using "floatx80_zero" and make_floatx80() for initializing
>> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
>> actually chokes on them:
>>
>>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant
>>>  { make_floatx80(0xbfff, 0x8000ULL),
>>>  ^
> 
> This reminds me of:
> 
> commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b
> Author: Kamil Rytarowski 
> Date:   Mon Sep 4 23:23:06 2017 +0200
> 
> target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init()
> 
> GCC 4.7.2 on SunOS reports that the values assigned to array members
> are not
> real constants:
> 
> target/m68k/fpu_helper.c:32:5: error: initializer element is not
> constant
> target/m68k/fpu_helper.c:32:5: error: (near initialization for
> 'fpu_rom[0]')
> rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed
> 
> Convert the array to make_floatx80_init() to fix it.
> Replace floatx80_pi-like constants with make_floatx80_init() as they are
> defined as make_floatx80().
> 
> Reviewed-by: Philippe Mathieu-Daudé 
> 
>>
>> We've had the make_floatx80_init() macro for this purpose since commit
>> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
>> macro again.
>>
>> Fixes: eca30647fc07
>> Fixes: ff57bb7b6326
>> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
>> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
>> Cc: Alex Bennée 
>> Cc: Aurelien Jarno 
>> Cc: Eduardo Habkost 
>> Cc: Joseph Myers 
>> Cc: Paolo Bonzini 
>> Cc: Peter Maydell 
>> Cc: Richard Henderson 
>> Signed-off-by: Laszlo Ersek 
>> ---
>>
>> Notes:
>> I can see that there are test cases under "tests/tcg/i386", but I don't
>> know how to run them.
> 
> Yeah it is not easy to figure...
> 
> Try 'make run-tcg-tests-i386-softmmu'
> but you need docker :^)

That worked, thanks! Even without Docker: I just had to add

  --cross-cc-i386=gcc

to my ./configure flags.

Thanks,
Laszlo

> 
> (There is also 'make check-softfloat', listed in 'make check-help')
> 
>>
>>  include/fpu/softfloat.h  |   1 +
>>  target/i386/fpu_helper.c | 426 +++
>>  2 files changed, 214 insertions(+), 213 deletions(-)
>>
>> diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
>> index f1a19df066b7..659218b5c787 100644
>> --- a/include/fpu/softfloat.h
>> +++ b/include/fpu/softfloat.h
>> @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a)
>>  }
>>  
>>  #define floatx80_zero make_floatx80(0x, 0xLL)
>> +#define floatx80_zero_init make_floatx80_init(0x, 0xLL)
>>  #define floatx80_one make_floatx80(0x3fff, 0x8000LL)
>>  #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
>>  #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
>> diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c
>> index f5e6c4b88d4e..4ea73874d836 100644
>> --- a/target/i386/fpu_helper.c
>> +++ b/target/i386/fpu_helper.c
>> @@ -868,201 +868,201 @@ struct f2xm1_data {
>>  };
> ...
> 




Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-16 Thread Alex Bennée


Laszlo Ersek  writes:

> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
> object that has static storage duration shall be constant expressions or
> string literals".
>
> The compound literal produced by the make_floatx80() macro is not such a
> constant expression, per 6.6p7-9. (An implementation may accept it,
> according to 6.6p10, but is not required to.)
>
> Therefore using "floatx80_zero" and make_floatx80() for initializing
> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
> actually chokes on them:
>
>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant
>>  { make_floatx80(0xbfff, 0x8000ULL),
>>  ^
>
> We've had the make_floatx80_init() macro for this purpose since commit
> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
> macro again.
>
> Fixes: eca30647fc07
> Fixes: ff57bb7b6326
> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
> Cc: Alex Bennée 
> Cc: Aurelien Jarno 
> Cc: Eduardo Habkost 
> Cc: Joseph Myers 
> Cc: Paolo Bonzini 
> Cc: Peter Maydell 
> Cc: Richard Henderson 
> Signed-off-by: Laszlo Ersek 
> ---
>
> Notes:
> I can see that there are test cases under "tests/tcg/i386", but I don't
> know how to run them.

You can run the TCG tests with:

  make check-tcg

or more specifically:

  make run-tcg-tests-i386-linux-user

there is also a:

  make check-softfloat

although in this case nothing is affected.

softfloat bits:

Acked-by: Alex Bennée 

>
>  include/fpu/softfloat.h  |   1 +
>  target/i386/fpu_helper.c | 426 +++
>  2 files changed, 214 insertions(+), 213 deletions(-)
>
> diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
> index f1a19df066b7..659218b5c787 100644
> --- a/include/fpu/softfloat.h
> +++ b/include/fpu/softfloat.h
> @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a)
>  }
>  
>  #define floatx80_zero make_floatx80(0x, 0xLL)
> +#define floatx80_zero_init make_floatx80_init(0x, 0xLL)
>  #define floatx80_one make_floatx80(0x3fff, 0x8000LL)
>  #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
>  #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
> diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c
> index f5e6c4b88d4e..4ea73874d836 100644
> --- a/target/i386/fpu_helper.c
> +++ b/target/i386/fpu_helper.c
> @@ -868,201 +868,201 @@ struct f2xm1_data {
>  };
>  
>  static const struct f2xm1_data f2xm1_table[65] = {
> -{ make_floatx80(0xbfff, 0x8000ULL),
> -  make_floatx80(0x3ffe, 0x8000ULL),
> -  make_floatx80(0xbffe, 0x8000ULL) },
> -{ make_floatx80(0xbffe, 0xf8002e7eULL),
> -  make_floatx80(0x3ffe, 0x82cd8698ac2b9160ULL),
> -  make_floatx80(0xbffd, 0xfa64f2cea7a8dd40ULL) },
> -{ make_floatx80(0xbffe, 0xefffe960ULL),
> -  make_floatx80(0x3ffe, 0x85aac367cc488345ULL),
> -  make_floatx80(0xbffd, 0xf4aa7930676ef976ULL) },
> -{ make_floatx80(0xbffe, 0xe8006f10ULL),
> -  make_floatx80(0x3ffe, 0x88980e8092da5c14ULL),
> -  make_floatx80(0xbffd, 0xeecfe2feda4b47d8ULL) },
> -{ make_floatx80(0xbffe, 0xe0008a45ULL),
> -  make_floatx80(0x3ffe, 0x8b95c1e3ea8ba2a5ULL),
> -  make_floatx80(0xbffd, 0xe8d47c382ae8bab6ULL) },
> -{ make_floatx80(0xbffe, 0xd7ff8a9eULL),
> -  make_floatx80(0x3ffe, 0x8ea4398b45cd8116ULL),
> -  make_floatx80(0xbffd, 0xe2b78ce97464fdd4ULL) },
> -{ make_floatx80(0xbffe, 0xd00019a0ULL),
> -  make_floatx80(0x3ffe, 0x91c3d373ab11b919ULL),
> -  make_floatx80(0xbffd, 0xdc785918a9dc8dceULL) },
> -{ make_floatx80(0xbffe, 0xc7ff14dfULL),
> -  make_floatx80(0x3ffe, 0x94f4efa8fef76836ULL),
> -  make_floatx80(0xbffd, 0xd61620ae02112f94ULL) },
> -{ make_floatx80(0xbffe, 0xc0006530ULL),
> -  make_floatx80(0x3ffe, 0x9837f0518db87fbbULL),
> -  make_floatx80(0xbffd, 0xcf901f5ce48f008aULL) },
> -{ make_floatx80(0xbffe, 0xb7ff1723ULL),
> -  make_floatx80(0x3ffe, 0x9b8d39b9d54eb74cULL),
> -  make_floatx80(0xbffd, 0xc8e58c8c55629168ULL) },
> -{ make_floatx80(0xbffe, 0xb000b5e1ULL),
> -  make_floatx80(0x3ffe, 0x9ef5326091a0c366ULL),
> -  make_floatx80(0xbffd, 0xc2159b3edcbe7934ULL) },
> -{ make_floatx80(0xbffe, 0xa8006f8aULL),
> -  make_floatx80(0x3ffe, 0xa27043030c49370aULL),
> -  make_floatx80(0xbffd, 0xbb1f79f9e76d91ecULL) },
> -{ make_floatx80(0xbffe, 0x9fff816aULL),
> -  make_floatx80(0x3ffe, 0xa5fed6a9b15171cfULL),
> -  make_floatx80(0xbffd, 0xb40252ac9d5d1c62ULL) },
> -{ make_floatx80(0xbffe, 0x97ffb621ULL),
> -  make_floatx80(0x3ffe, 0xa9a15ab4ea7c30e6ULL),
> -  make_floatx80(0xbffd, 0xacbd

Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-16 Thread Philippe Mathieu-Daudé
On 7/16/20 4:42 PM, Laszlo Ersek wrote:
> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
> object that has static storage duration shall be constant expressions or
> string literals".
> 
> The compound literal produced by the make_floatx80() macro is not such a
> constant expression, per 6.6p7-9. (An implementation may accept it,
> according to 6.6p10, but is not required to.)
> 
> Therefore using "floatx80_zero" and make_floatx80() for initializing
> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
> actually chokes on them:
> 
>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant
>>  { make_floatx80(0xbfff, 0x8000ULL),
>>  ^

This reminds me of:

commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b
Author: Kamil Rytarowski 
Date:   Mon Sep 4 23:23:06 2017 +0200

target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init()

GCC 4.7.2 on SunOS reports that the values assigned to array members
are not
real constants:

target/m68k/fpu_helper.c:32:5: error: initializer element is not
constant
target/m68k/fpu_helper.c:32:5: error: (near initialization for
'fpu_rom[0]')
rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed

Convert the array to make_floatx80_init() to fix it.
Replace floatx80_pi-like constants with make_floatx80_init() as they are
defined as make_floatx80().

Reviewed-by: Philippe Mathieu-Daudé 

> 
> We've had the make_floatx80_init() macro for this purpose since commit
> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
> macro again.
> 
> Fixes: eca30647fc07
> Fixes: ff57bb7b6326
> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
> Cc: Alex Bennée 
> Cc: Aurelien Jarno 
> Cc: Eduardo Habkost 
> Cc: Joseph Myers 
> Cc: Paolo Bonzini 
> Cc: Peter Maydell 
> Cc: Richard Henderson 
> Signed-off-by: Laszlo Ersek 
> ---
> 
> Notes:
> I can see that there are test cases under "tests/tcg/i386", but I don't
> know how to run them.

Yeah it is not easy to figure...

Try 'make run-tcg-tests-i386-softmmu'
but you need docker :^)

(There is also 'make check-softfloat', listed in 'make check-help')

> 
>  include/fpu/softfloat.h  |   1 +
>  target/i386/fpu_helper.c | 426 +++
>  2 files changed, 214 insertions(+), 213 deletions(-)
> 
> diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
> index f1a19df066b7..659218b5c787 100644
> --- a/include/fpu/softfloat.h
> +++ b/include/fpu/softfloat.h
> @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a)
>  }
>  
>  #define floatx80_zero make_floatx80(0x, 0xLL)
> +#define floatx80_zero_init make_floatx80_init(0x, 0xLL)
>  #define floatx80_one make_floatx80(0x3fff, 0x8000LL)
>  #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
>  #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
> diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c
> index f5e6c4b88d4e..4ea73874d836 100644
> --- a/target/i386/fpu_helper.c
> +++ b/target/i386/fpu_helper.c
> @@ -868,201 +868,201 @@ struct f2xm1_data {
>  };
...




[PATCH] target/i386: floatx80: avoid compound literals in static initializers

2020-07-16 Thread Laszlo Ersek
Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an
object that has static storage duration shall be constant expressions or
string literals".

The compound literal produced by the make_floatx80() macro is not such a
constant expression, per 6.6p7-9. (An implementation may accept it,
according to 6.6p10, but is not required to.)

Therefore using "floatx80_zero" and make_floatx80() for initializing
"f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6
actually chokes on them:

> target/i386/fpu_helper.c:871:5: error: initializer element is not constant
>  { make_floatx80(0xbfff, 0x8000ULL),
>  ^

We've had the make_floatx80_init() macro for this purpose since commit
3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that
macro again.

Fixes: eca30647fc07
Fixes: ff57bb7b6326
Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html
Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html
Cc: Alex Bennée 
Cc: Aurelien Jarno 
Cc: Eduardo Habkost 
Cc: Joseph Myers 
Cc: Paolo Bonzini 
Cc: Peter Maydell 
Cc: Richard Henderson 
Signed-off-by: Laszlo Ersek 
---

Notes:
I can see that there are test cases under "tests/tcg/i386", but I don't
know how to run them.

 include/fpu/softfloat.h  |   1 +
 target/i386/fpu_helper.c | 426 +++
 2 files changed, 214 insertions(+), 213 deletions(-)

diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
index f1a19df066b7..659218b5c787 100644
--- a/include/fpu/softfloat.h
+++ b/include/fpu/softfloat.h
@@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a)
 }
 
 #define floatx80_zero make_floatx80(0x, 0xLL)
+#define floatx80_zero_init make_floatx80_init(0x, 0xLL)
 #define floatx80_one make_floatx80(0x3fff, 0x8000LL)
 #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL)
 #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL)
diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c
index f5e6c4b88d4e..4ea73874d836 100644
--- a/target/i386/fpu_helper.c
+++ b/target/i386/fpu_helper.c
@@ -868,201 +868,201 @@ struct f2xm1_data {
 };
 
 static const struct f2xm1_data f2xm1_table[65] = {
-{ make_floatx80(0xbfff, 0x8000ULL),
-  make_floatx80(0x3ffe, 0x8000ULL),
-  make_floatx80(0xbffe, 0x8000ULL) },
-{ make_floatx80(0xbffe, 0xf8002e7eULL),
-  make_floatx80(0x3ffe, 0x82cd8698ac2b9160ULL),
-  make_floatx80(0xbffd, 0xfa64f2cea7a8dd40ULL) },
-{ make_floatx80(0xbffe, 0xefffe960ULL),
-  make_floatx80(0x3ffe, 0x85aac367cc488345ULL),
-  make_floatx80(0xbffd, 0xf4aa7930676ef976ULL) },
-{ make_floatx80(0xbffe, 0xe8006f10ULL),
-  make_floatx80(0x3ffe, 0x88980e8092da5c14ULL),
-  make_floatx80(0xbffd, 0xeecfe2feda4b47d8ULL) },
-{ make_floatx80(0xbffe, 0xe0008a45ULL),
-  make_floatx80(0x3ffe, 0x8b95c1e3ea8ba2a5ULL),
-  make_floatx80(0xbffd, 0xe8d47c382ae8bab6ULL) },
-{ make_floatx80(0xbffe, 0xd7ff8a9eULL),
-  make_floatx80(0x3ffe, 0x8ea4398b45cd8116ULL),
-  make_floatx80(0xbffd, 0xe2b78ce97464fdd4ULL) },
-{ make_floatx80(0xbffe, 0xd00019a0ULL),
-  make_floatx80(0x3ffe, 0x91c3d373ab11b919ULL),
-  make_floatx80(0xbffd, 0xdc785918a9dc8dceULL) },
-{ make_floatx80(0xbffe, 0xc7ff14dfULL),
-  make_floatx80(0x3ffe, 0x94f4efa8fef76836ULL),
-  make_floatx80(0xbffd, 0xd61620ae02112f94ULL) },
-{ make_floatx80(0xbffe, 0xc0006530ULL),
-  make_floatx80(0x3ffe, 0x9837f0518db87fbbULL),
-  make_floatx80(0xbffd, 0xcf901f5ce48f008aULL) },
-{ make_floatx80(0xbffe, 0xb7ff1723ULL),
-  make_floatx80(0x3ffe, 0x9b8d39b9d54eb74cULL),
-  make_floatx80(0xbffd, 0xc8e58c8c55629168ULL) },
-{ make_floatx80(0xbffe, 0xb000b5e1ULL),
-  make_floatx80(0x3ffe, 0x9ef5326091a0c366ULL),
-  make_floatx80(0xbffd, 0xc2159b3edcbe7934ULL) },
-{ make_floatx80(0xbffe, 0xa8006f8aULL),
-  make_floatx80(0x3ffe, 0xa27043030c49370aULL),
-  make_floatx80(0xbffd, 0xbb1f79f9e76d91ecULL) },
-{ make_floatx80(0xbffe, 0x9fff816aULL),
-  make_floatx80(0x3ffe, 0xa5fed6a9b15171cfULL),
-  make_floatx80(0xbffd, 0xb40252ac9d5d1c62ULL) },
-{ make_floatx80(0xbffe, 0x97ffb621ULL),
-  make_floatx80(0x3ffe, 0xa9a15ab4ea7c30e6ULL),
-  make_floatx80(0xbffd, 0xacbd4a962b079e34ULL) },
-{ make_floatx80(0xbffe, 0x8fff162bULL),
-  make_floatx80(0x3ffe, 0xad583eea42a1b886ULL),
-  make_floatx80(0xbffd, 0xa54f822b7abc8ef4ULL) },
-{ make_floatx80(0xbffe, 0x87ff4d34ULL),
-  make_floatx80(0x3ffe, 0xb123f581d2ac7b51ULL),
-  make_floatx80(0xbffd, 0x9db814fc5aa7095eULL) },
-{ make_floatx80(0xbffe, 0x8000227dULL),
-  make_floatx80(0x3ffe, 0xb504f333f9de539dULL),
-  make_fl