From: Maciej W. Rozycki <ma...@wdc.com> Fix assembly errors:
.../libphobos/src/std/math.d: Assembler messages:.../libphobos/src/std/math.d:4773: Error: unrecognized opcode `frflags a0' .../libphobos/src/std/math.d:4856: Error: unrecognized opcode `fsflags a5' .../libphobos/src/std/math.d:4856: Error: unrecognized opcode `fsflags a5' .../libphobos/src/std/math.d:4773: Error: unrecognized opcode `frflags a0' .../libphobos/src/std/math.d:5549: Error: unrecognized opcode `fscsr a5' .../libphobos/src/std/math.d:5456: Error: unrecognized opcode `frcsr a5' .../libphobos/src/std/math.d:5456: Error: unrecognized opcode `frcsr a5' .../libphobos/src/std/math.d:5549: Error: unrecognized opcode `fscsr a5' .../libphobos/src/std/math.d:5456: Error: unrecognized opcode `frcsr a5' .../libphobos/src/std/math.d:5549: Error: unrecognized opcode `fscsr a0' .../libphobos/src/std/math.d:5456: Error: unrecognized opcode `frcsr a0' .../libphobos/src/std/math.d:5456: Error: unrecognized opcode `frcsr a0' .../libphobos/src/std/math.d:5549: Error: unrecognized opcode `fscsr s2' make[8]: *** [Makefile:1119: std/math.lo] Error 1 triggered with the RISC-V lp64 multilib in a GCC build configured with `--enable-multilib --enable-languages=all --target=riscv64-linux-gnu'. This is due to unconditional explicit use of F extension instructions within inline assembly, to access IEEE exception flags. The use of these instructions is not allowed when building for a soft-float ABI. Correct the problem by wrapping said inline assembly into a conditional such that if `D_SoftFloat' is true, then reads from IEEE exception flags return 0 and writes are ignored instead, complementing r270522 ("libphobos: Add D support for RISC-V Linux"), which is an updated version of <https://gcc.gnu.org/ml/gcc-patches/2019-04/msg00325.html>, where the problematic code has originated from. libphobos/ * std/math.d (IeeeFlags.getIeeeFlags): Handle RISC-V soft-float ABI. (IeeeFlags.resetIeeeFlags): Likewise. (FloatingPointControl.getControlState): Likewise. (FloatingPointControl.setControlState): Likewise. --- Hi, I believe this change is obviously correct, and I also verified generated code using `objdump -d'. I have no way to regression-test it right now. Please confirm if I correctly referred to identifiers in the ChangeLog entry though, as my experience WRT the D programming language and its syntax in particular is nil. My understanding is changes to `libphobos' are supposed to go upstream first, but r270522 is a local change anyway AFAICT, and technically a `--enable-languages=all' build regression, so we better fix it ASAP. Finally my WDC copyright assignment with FSF is still in the works, but I believe this change can be considered legally insignificant for copyright purposes, i.e. having at most 15 lines or so, unless adding white space for indentation counts against that limit as well (which I doubt). With all of the above in mind, OK to apply to trunk and to GCC 9? Maciej --- libphobos/src/std/math.d | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) gcc-riscv-libphobos-soft-float.diff Index: gcc/libphobos/src/std/math.d =================================================================== --- gcc.orig/libphobos/src/std/math.d +++ gcc/libphobos/src/std/math.d @@ -4767,12 +4767,17 @@ struct IeeeFlags } else version (RISCV_Any) { - uint result = void; - asm pure nothrow @nogc + version (D_SoftFloat) + return 0; + else { - "frflags %0" : "=r" result; + uint result = void; + asm pure nothrow @nogc + { + "frflags %0" : "=r" result; + } + return result; } - return result; } else assert(0, "Not yet supported"); @@ -4850,10 +4855,15 @@ struct IeeeFlags } else version (RISCV_Any) { - uint newValues = 0x0; - asm pure nothrow @nogc + version (D_SoftFloat) + return; + else { - "fsflags %0" : : "r" newValues; + uint newValues = 0x0; + asm pure nothrow @nogc + { + "fsflags %0" : : "r" newValues; + } } } else @@ -5450,12 +5460,17 @@ struct FloatingPointControl } else version (RISCV_Any) { - ControlState cont; - asm pure nothrow @nogc + version (D_SoftFloat) + return 0; + else { - "frcsr %0" : "=r" cont; + ControlState cont; + asm pure nothrow @nogc + { + "frcsr %0" : "=r" cont; + } + return cont; } - return cont; } else assert(0, "Not yet supported"); @@ -5544,9 +5559,14 @@ struct FloatingPointControl } else version (RISCV_Any) { - asm pure nothrow @nogc + version (D_SoftFloat) + return; + else { - "fscsr %0" : : "r" (newState); + asm pure nothrow @nogc + { + "fscsr %0" : : "r" (newState); + } } } else