diff mbox series

[v2,02/20] include/fpu/softfloat: remove USE_SOFTFLOAT_STRUCT_TYPES

Message ID 20180109122252.17670-3-alex.bennee@linaro.org
State Superseded
Headers show
Series re-factor softfloat and add fp16 functions | expand

Commit Message

Alex Bennée Jan. 9, 2018, 12:22 p.m. UTC
It's not actively built and when enabled things fail to compile. I'm
not sure the type-checking is really helping here. Seeing as we "own"
our softfloat now lets remove the cruft.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
 include/fpu/softfloat.h | 27 ---------------------------
 1 file changed, 27 deletions(-)

-- 
2.15.1

Comments

Laurent Vivier Jan. 9, 2018, 12:27 p.m. UTC | #1
Le 09/01/2018 à 13:22, Alex Bennée a écrit :
> It's not actively built and when enabled things fail to compile. I'm

> not sure the type-checking is really helping here. Seeing as we "own"

> our softfloat now lets remove the cruft.


I think it would be better to fix the build break than to remove the
type-checking tool.

but that's only my opinion...

Thanks,
Laurent
Aurelien Jarno Jan. 9, 2018, 2:12 p.m. UTC | #2
On 2018-01-09 13:27, Laurent Vivier wrote:
> Le 09/01/2018 à 13:22, Alex Bennée a écrit :

> > It's not actively built and when enabled things fail to compile. I'm

> > not sure the type-checking is really helping here. Seeing as we "own"

> > our softfloat now lets remove the cruft.

> 

> I think it would be better to fix the build break than to remove the

> type-checking tool.

> 

> but that's only my opinion...


I agree with that. Those checks are useful for targets which call host
floating point functions for some instructions. This is ugly, but that's
what is still done for at least x86 for the trigonometrical functions.
The check prevents assigning a float or double value to a softfloat type
without calling the conversion function.

Now, when we make sure that those ugly things are removed, I think these
type-checking might be removed.

Aurelien

-- 
Aurelien Jarno                          GPG: 4096R/1DDD8C9B
aurelien@aurel32.net                 http://www.aurel32.net
Peter Maydell Jan. 9, 2018, 2:14 p.m. UTC | #3
On 9 January 2018 at 14:12, Aurelien Jarno <aurelien@aurel32.net> wrote:
> On 2018-01-09 13:27, Laurent Vivier wrote:

>> Le 09/01/2018 à 13:22, Alex Bennée a écrit :

>> > It's not actively built and when enabled things fail to compile. I'm

>> > not sure the type-checking is really helping here. Seeing as we "own"

>> > our softfloat now lets remove the cruft.

>>

>> I think it would be better to fix the build break than to remove the

>> type-checking tool.

>>

>> but that's only my opinion...

>

> I agree with that. Those checks are useful for targets which call host

> floating point functions for some instructions. This is ugly, but that's

> what is still done for at least x86 for the trigonometrical functions.

> The check prevents assigning a float or double value to a softfloat type

> without calling the conversion function.


Is gcc's codegen still bad enough that we have to default to not
using the type-checking versions? If so, maybe we could at least
enable the type-checking on an --enable-debug build, so it doesn't
bitrot all the time.

thanks
-- PMM
Laurent Vivier Jan. 9, 2018, 2:20 p.m. UTC | #4
Le 09/01/2018 à 15:14, Peter Maydell a écrit :
> On 9 January 2018 at 14:12, Aurelien Jarno <aurelien@aurel32.net> wrote:

>> On 2018-01-09 13:27, Laurent Vivier wrote:

>>> Le 09/01/2018 à 13:22, Alex Bennée a écrit :

>>>> It's not actively built and when enabled things fail to compile. I'm

>>>> not sure the type-checking is really helping here. Seeing as we "own"

>>>> our softfloat now lets remove the cruft.

>>>

>>> I think it would be better to fix the build break than to remove the

>>> type-checking tool.

>>>

>>> but that's only my opinion...

>>

>> I agree with that. Those checks are useful for targets which call host

>> floating point functions for some instructions. This is ugly, but that's

>> what is still done for at least x86 for the trigonometrical functions.

>> The check prevents assigning a float or double value to a softfloat type

>> without calling the conversion function.

> 

> Is gcc's codegen still bad enough that we have to default to not

> using the type-checking versions? If so, maybe we could at least

> enable the type-checking on an --enable-debug build, so it doesn't

> bitrot all the time.


What means "bad enough"? for some targets it works fine.

The problem with that is if it is not enabled all the time it becomes
broken really quick...

BTW, if it doesn't break Alex's work I'm volunteer to fix
USE_SOFTFLOAT_STRUCT_TYPES build.

Thanks,
Laurent
Peter Maydell Jan. 9, 2018, 2:43 p.m. UTC | #5
On 9 January 2018 at 14:20, Laurent Vivier <laurent@vivier.eu> wrote:
> Le 09/01/2018 à 15:14, Peter Maydell a écrit :

>> Is gcc's codegen still bad enough that we have to default to not

>> using the type-checking versions? If so, maybe we could at least

>> enable the type-checking on an --enable-debug build, so it doesn't

>> bitrot all the time.

>

> What means "bad enough"? for some targets it works fine.


I mean whatever the problem was that made us write the comment
   A sufficiently clever compiler and
   sane ABI should be able to see though these structs.  However
   x86/gcc 3.x seems to struggle a bit, so leave them disabled by default.

In theory the code generated should be no worse than without structs...

> The problem with that is if it is not enabled all the time it becomes

> broken really quick...


Yes, that's why I'd like it at least default-enabled for --enable-debug,
if we can't enable it always.

thanks
-- PMM
Alex Bennée Jan. 9, 2018, 3:25 p.m. UTC | #6
Laurent Vivier <laurent@vivier.eu> writes:

> Le 09/01/2018 à 15:14, Peter Maydell a écrit:

>> On 9 January 2018 at 14:12, Aurelien Jarno <aurelien@aurel32.net> wrote:

>>> On 2018-01-09 13:27, Laurent Vivier wrote:

>>>> Le 09/01/2018 à 13:22, Alex Bennée a écrit :

>>>>> It's not actively built and when enabled things fail to compile. I'm

>>>>> not sure the type-checking is really helping here. Seeing as we "own"

>>>>> our softfloat now lets remove the cruft.

>>>>

>>>> I think it would be better to fix the build break than to remove the

>>>> type-checking tool.

>>>>

>>>> but that's only my opinion...

>>>

>>> I agree with that. Those checks are useful for targets which call host

>>> floating point functions for some instructions. This is ugly, but that's

>>> what is still done for at least x86 for the trigonometrical functions.

>>> The check prevents assigning a float or double value to a softfloat type

>>> without calling the conversion function.

>>

>> Is gcc's codegen still bad enough that we have to default to not

>> using the type-checking versions? If so, maybe we could at least

>> enable the type-checking on an --enable-debug build, so it doesn't

>> bitrot all the time.

>

> What means "bad enough"? for some targets it works fine.

>

> The problem with that is if it is not enabled all the time it becomes

> broken really quick...

>

> BTW, if it doesn't break Alex's work I'm volunteer to fix

> USE_SOFTFLOAT_STRUCT_TYPES build.


Be my guest - I suspect getting that merged would be on a faster path
than the rest of the softfloat re-factoring patch series (unless the
relative silence means everyone is happy with it ;-).

By the way I mentioned in my header mail that the types are included
from bswap.h so it would be nice to move the softfloat types somewhere
where they could be more easily included to avoid triggering a re-build
every time softfloat.h is touched.

--
Alex Bennée
Richard Henderson Jan. 9, 2018, 4:45 p.m. UTC | #7
On 01/09/2018 06:43 AM, Peter Maydell wrote:
> On 9 January 2018 at 14:20, Laurent Vivier <laurent@vivier.eu> wrote:

>> Le 09/01/2018 à 15:14, Peter Maydell a écrit :

>>> Is gcc's codegen still bad enough that we have to default to not

>>> using the type-checking versions? If so, maybe we could at least

>>> enable the type-checking on an --enable-debug build, so it doesn't

>>> bitrot all the time.

>>

>> What means "bad enough"? for some targets it works fine.

> 

> I mean whatever the problem was that made us write the comment

>    A sufficiently clever compiler and

>    sane ABI should be able to see though these structs.  However

>    x86/gcc 3.x seems to struggle a bit, so leave them disabled by default.


E.g. the i386 ABI is *not* sane in this respect.  Nor is sparcv8plus.  I'd have
to check on the others.

If we enable USE_SOFTFLOAT_STRUCT_TYPES, then we *must* remove the markup for
f32 and f64 from include/exec/helper-head.h, because structures are passed
differently from integers as parameters and/or return values.

I personally do not think USE_SOFTFLOAT_STRUCT_TYPES is worth the headache.


r~
diff mbox series

Patch

diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
index d5e99667b6..52af1412de 100644
--- a/include/fpu/softfloat.h
+++ b/include/fpu/softfloat.h
@@ -103,32 +103,6 @@  enum {
 /*----------------------------------------------------------------------------
 | Software IEC/IEEE floating-point types.
 *----------------------------------------------------------------------------*/
-/* Use structures for soft-float types.  This prevents accidentally mixing
-   them with native int/float types.  A sufficiently clever compiler and
-   sane ABI should be able to see though these structs.  However
-   x86/gcc 3.x seems to struggle a bit, so leave them disabled by default.  */
-//#define USE_SOFTFLOAT_STRUCT_TYPES
-#ifdef USE_SOFTFLOAT_STRUCT_TYPES
-typedef struct {
-    uint16_t v;
-} float16;
-#define float16_val(x) (((float16)(x)).v)
-#define make_float16(x) __extension__ ({ float16 f16_val = {x}; f16_val; })
-#define const_float16(x) { x }
-typedef struct {
-    uint32_t v;
-} float32;
-/* The cast ensures an error if the wrong type is passed.  */
-#define float32_val(x) (((float32)(x)).v)
-#define make_float32(x) __extension__ ({ float32 f32_val = {x}; f32_val; })
-#define const_float32(x) { x }
-typedef struct {
-    uint64_t v;
-} float64;
-#define float64_val(x) (((float64)(x)).v)
-#define make_float64(x) __extension__ ({ float64 f64_val = {x}; f64_val; })
-#define const_float64(x) { x }
-#else
 typedef uint16_t float16;
 typedef uint32_t float32;
 typedef uint64_t float64;
@@ -141,7 +115,6 @@  typedef uint64_t float64;
 #define const_float16(x) (x)
 #define const_float32(x) (x)
 #define const_float64(x) (x)
-#endif
 typedef struct {
     uint64_t low;
     uint16_t high;