I'm porting RISC-V for compiler-rt recently, and I've got a problem
when adding soft float routine for rv32, RISC-V ABI required 128 bits
bits for long double, but it's implemented by int128_t, however rv32
don't support __int128_t.
Of cause, it not hard thing to support __int128_t by overriding
TargetInfo::hasInt128Type for LLVM, but its will cause some ABI
incompatible with GCC, because GCC don't support __int128_t for 32
So I guess I've few option here:
1. Implement 128 bits soft-float with int64_t.
2. Add an option to force enable int128_t support during building
compiler-rt for rv32.
Any other suggestion?
As a point of information, it would be useful to know if there are any
major drawbacks or challenges to adding __int128_t support to GCC for
RV32. Looking at Clang, it seems (by my reading) that Wasm32 is the
only 32-bit target supporting __int128_t (though x86-64 with 32-bit
ABI and Mips64 with 32-bit ABI also support it). Given that `long
double` is 128 bits on both RV32 and RV64, __int128_t wouldn't be the
only 128-bit type.
As a point of information, it would be useful to know if there are any major drawbacks or challenges to adding __int128_t support to GCC for RV32.
Short summary is it seems possible to support that on rv32-gcc, but
need take some time and discuss to other RISC-V gcc maintainer and
Provide some result from my experimentation with gcc last few days.:
For code gen part:
Need some code to enable __int128_t support on this target, and update
related opcode expansion method on backend.
so the code gen part seems not too hard.
For libgcc part:
Lacks of 128 bits integer support for 32 bits target, we need
implement int128_t functions manually (or doing some hack to make
libgcc generate those functions).
Function list, it's extract from rv64's libgcc :