Sven Tennie pushed to branch wip/supersven/riscv-vectors at Glasgow Haskell Compiler / GHC
Commits:
-
2306dd0a
by Sven Tennie at 2025-07-02T18:06:29+02:00
-
80263d35
by Sven Tennie at 2025-07-02T18:10:13+02:00
5 changed files:
- configure.ac
- libraries/unix
- + m4/fp_riscv_march.m4
- rts/CheckVectorSupport.c
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cc.hs
Changes:
... | ... | @@ -450,6 +450,8 @@ FP_SET_CFLAGS_C99([CC_STAGE0],[CONF_CC_OPTS_STAGE0],[CONF_CPP_OPTS_STAGE0]) |
450 | 450 | FP_SET_CFLAGS_C99([CC],[CONF_CC_OPTS_STAGE1],[CONF_CPP_OPTS_STAGE1])
|
451 | 451 | FP_SET_CFLAGS_C99([CC],[CONF_CC_OPTS_STAGE2],[CONF_CPP_OPTS_STAGE2])
|
452 | 452 | |
453 | +FP_RISCV_MARCH([CONF_CC_OPTS_STAGE2])
|
|
454 | + |
|
453 | 455 | dnl ** Do we have a compatible emsdk version?
|
454 | 456 | dnl --------------------------------------------------------------
|
455 | 457 | EMSDK_VERSION("3.1.20", "", "")
|
1 | -Subproject commit 74ae1c0d9dd1518434f7d6cd3e63d7769599e0f9 |
|
1 | +Subproject commit 47d5fc4a8f19207819030725e7de23c65fa61a04 |
1 | +dnl --------------------------------------------------------------------------
|
|
2 | +dnl Set RISC-V architecture with vector extension (RVV)
|
|
3 | +dnl
|
|
4 | +dnl This macro checks if the target is RISC-V and if so, sets -march=rv64gcv /
|
|
5 | +dnl -march=rv32gcv (general, compressed, vector) to enable vector extension
|
|
6 | +dnl --------------------------------------------------------------------------
|
|
7 | + |
|
8 | +# FP_RISCV_MARCH(compiler_flags_var)
|
|
9 | +# ------------------------------------------
|
|
10 | +#
|
|
11 | +# Example usage:
|
|
12 | +# FP_RISCV_MARCH([CONF_CC_OPTS_STAGE2])
|
|
13 | +#
|
|
14 | +AC_DEFUN([FP_RISCV_MARCH],
|
|
15 | +[
|
|
16 | + AC_REQUIRE([AC_CANONICAL_TARGET])
|
|
17 | + |
|
18 | + # Check if target is RISC-V
|
|
19 | + case "$target" in
|
|
20 | + riscv64*-*-*)
|
|
21 | + AC_MSG_NOTICE([add -march=rv64gcv to $1])
|
|
22 | + |
|
23 | + # Add vector extension flag to the specified variable
|
|
24 | + $1="$$1 -march=rv64gcv"
|
|
25 | + ;;
|
|
26 | +
|
|
27 | + riscv32*-*-*)
|
|
28 | + AC_MSG_NOTICE([add -march=rv64gcv to $1])
|
|
29 | + |
|
30 | + # Add vector extension flag to the specified variable
|
|
31 | + $1="$$1 -march=rv32gcv"
|
|
32 | + ;;
|
|
33 | + esac
|
|
34 | +]) |
... | ... | @@ -14,7 +14,7 @@ static void sigill_handler(int); |
14 | 14 | static void sigill_handler(__attribute__((unused)) int sig) {
|
15 | 15 | // If we get here, the vector instruction caused an illegal instruction
|
16 | 16 | // exception. We just swallow it.
|
17 | - longjmp(jmpbuf, 1);
|
|
17 | + siglongjmp(jmpbuf, 1);
|
|
18 | 18 | }
|
19 | 19 | #endif
|
20 | 20 | |
... | ... | @@ -98,9 +98,9 @@ int checkVectorSupport(void) { |
98 | 98 | sigaction(SIGILL, &sa, &old_sa);
|
99 | 99 |
|
100 | 100 | unsigned vlenb = 0;
|
101 | - if (setjmp(jmpbuf) == 0) {
|
|
101 | + if (sigsetjmp(jmpbuf, 1) == 0) {
|
|
102 | 102 | // Try to execute a vector instruction
|
103 | - vlenb = __riscv_vlenb();
|
|
103 | + asm volatile("csrr %0, vlenb" : "=r" (vlenb) :: "memory");
|
|
104 | 104 | }
|
105 | 105 | // Restore original signal handler
|
106 | 106 | sigaction(SIGILL, &old_sa, NULL);
|
... | ... | @@ -176,6 +176,8 @@ addPlatformDepCcFlags archOs cc0 = do |
176 | 176 | -- On LoongArch64, we need `-mcmodel=medium` to tell gcc to generate big
|
177 | 177 | -- enough jump instruction.
|
178 | 178 | return $ cc1 & _ccFlags %++ "-mcmodel=medium"
|
179 | + ArchOS ArchRISCV64 _ ->
|
|
180 | + return $ cc1 & _ccFlags %++ "-march=rv64gcv"
|
|
179 | 181 | _ ->
|
180 | 182 | return cc1
|
181 | 183 |