Sven Tennie pushed to branch wip/supersven/riscv-vectors at Glasgow Haskell Compiler / GHC

Commits:

5 changed files:

Changes:

  • configure.ac
    ... ... @@ -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", "", "")
    

  • libraries/unix
    1
    -Subproject commit 74ae1c0d9dd1518434f7d6cd3e63d7769599e0f9
    1
    +Subproject commit 47d5fc4a8f19207819030725e7de23c65fa61a04

  • m4/fp_riscv_march.m4
    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
    +])

  • rts/CheckVectorSupport.c
    ... ... @@ -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);
    

  • utils/ghc-toolchain/src/GHC/Toolchain/Tools/Cc.hs
    ... ... @@ -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