[PATCH] [compiler-rt, RISCV] Support builtins for RISC-V

Summary:
Support builtins for RISC-V, RV32 and RV64.

Reviewers: asb, apazos, mgrang

Differential Revision: https://reviews.llvm.org/D42958

llvm-svn: 326420
This commit is contained in:
Shiva Chen 2018-03-01 07:47:27 +00:00
parent e6e534ca22
commit 77f19a384c
9 changed files with 177 additions and 2 deletions

View File

@ -168,6 +168,7 @@ macro(detect_target_arch)
check_symbol_exists(__mips64__ "" __MIPS64) check_symbol_exists(__mips64__ "" __MIPS64)
check_symbol_exists(__powerpc64__ "" __PPC64) check_symbol_exists(__powerpc64__ "" __PPC64)
check_symbol_exists(__powerpc64le__ "" __PPC64LE) check_symbol_exists(__powerpc64le__ "" __PPC64LE)
check_symbol_exists(__riscv "" __RISCV)
check_symbol_exists(__s390x__ "" __S390X) check_symbol_exists(__s390x__ "" __S390X)
check_symbol_exists(__wasm32__ "" __WEBASSEMBLY32) check_symbol_exists(__wasm32__ "" __WEBASSEMBLY32)
check_symbol_exists(__wasm64__ "" __WEBASSEMBLY64) check_symbol_exists(__wasm64__ "" __WEBASSEMBLY64)
@ -187,6 +188,14 @@ macro(detect_target_arch)
add_default_target_arch(powerpc64) add_default_target_arch(powerpc64)
elseif(__PPC64LE) elseif(__PPC64LE)
add_default_target_arch(powerpc64le) add_default_target_arch(powerpc64le)
elseif(__RISCV)
if(CMAKE_SIZEOF_VOID_P EQUAL "4")
add_default_target_arch(riscv32)
elseif(CMAKE_SIZEOF_VOID_P EQUAL "8")
add_default_target_arch(riscv64)
else()
message(FATAL_ERROR "Unsupport XLEN for RISC-V")
endif()
elseif(__S390X) elseif(__S390X)
add_default_target_arch(s390x) add_default_target_arch(s390x)
elseif(__WEBASSEMBLY32) elseif(__WEBASSEMBLY32)

View File

@ -186,6 +186,10 @@ macro(test_targets)
test_target_arch(aarch32 "" "-march=armv8-a") test_target_arch(aarch32 "" "-march=armv8-a")
elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "aarch64") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "aarch64")
test_target_arch(aarch64 "" "-march=armv8-a") test_target_arch(aarch64 "" "-march=armv8-a")
elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv32")
test_target_arch(riscv32 "" "")
elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv64")
test_target_arch(riscv64 "" "")
elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm32") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm32")
test_target_arch(wasm32 "" "--target=wasm32-unknown-unknown") test_target_arch(wasm32 "" "--target=wasm32-unknown-unknown")
elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm64") elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm64")

View File

@ -30,6 +30,8 @@ set(X86_64 x86_64)
set(MIPS32 mips mipsel) set(MIPS32 mips mipsel)
set(MIPS64 mips64 mips64el) set(MIPS64 mips64 mips64el)
set(PPC64 powerpc64 powerpc64le) set(PPC64 powerpc64 powerpc64le)
set(RISCV32 riscv32)
set(RISCV64 riscv64)
set(WASM32 wasm32) set(WASM32 wasm32)
set(WASM64 wasm64) set(WASM64 wasm64)
@ -40,7 +42,7 @@ if(APPLE)
endif() endif()
set(ALL_BUILTIN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} set(ALL_BUILTIN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64}
${MIPS32} ${MIPS64} ${PPC64} ${WASM32} ${WASM64}) ${MIPS32} ${MIPS64} ${PPC64} ${RISCV32} ${RISCV64} ${WASM32} ${WASM64})
include(CompilerRTUtils) include(CompilerRTUtils)
include(CompilerRTDarwinUtils) include(CompilerRTDarwinUtils)

View File

@ -179,6 +179,8 @@ set(X86_64 x86_64)
set(MIPS32 mips mipsel) set(MIPS32 mips mipsel)
set(MIPS64 mips64 mips64el) set(MIPS64 mips64 mips64el)
set(PPC64 powerpc64 powerpc64le) set(PPC64 powerpc64 powerpc64le)
set(RISCV32 riscv32)
set(RISCV64 riscv64)
set(S390X s390x) set(S390X s390x)
set(WASM32 wasm32) set(WASM32 wasm32)
set(WASM64 wasm64) set(WASM64 wasm64)

View File

@ -480,6 +480,12 @@ set(powerpc64_SOURCES
${GENERIC_SOURCES}) ${GENERIC_SOURCES})
set(powerpc64le_SOURCES ${powerpc64_SOURCES}) set(powerpc64le_SOURCES ${powerpc64_SOURCES})
set(riscv_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
set(riscv32_SOURCES
riscv/mulsi3.S
${riscv_SOURCES})
set(riscv64_SOURCES ${riscv_SOURCES})
set(wasm32_SOURCES set(wasm32_SOURCES
${GENERIC_TF_SOURCES} ${GENERIC_TF_SOURCES}
${GENERIC_SOURCES}) ${GENERIC_SOURCES})

View File

@ -60,7 +60,7 @@ typedef union
}s; }s;
} udwords; } udwords;
#if (defined(__LP64__) || defined(__wasm__) || defined(__mips64)) #if (defined(__LP64__) || defined(__wasm__) || defined(__mips64)) || defined(__riscv)
#define CRT_HAS_128BIT #define CRT_HAS_128BIT
#endif #endif

View File

@ -0,0 +1,28 @@
//===--- mulsi3.S - Integer multiplication routines routines ---===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#if !defined(__riscv_mul) && __riscv_xlen == 32
.text
.align 2
.globl __mulsi3
.type __mulsi3, @function
__mulsi3:
mv a2, a0
mv a0, zero
.L1:
andi a3, a1, 1
beqz a3, .L2
add a0, a0, a2
.L2:
srli a1, a1, 1
slli a2, a2, 1
bnez a1, .L1
ret
#endif

View File

@ -26,6 +26,11 @@ foreach(arch ${BUILTIN_SUPPORTED_ARCH})
string(REPLACE ";" " " BUILTINS_TEST_TARGET_CFLAGS "${BUILTINS_TEST_TARGET_CFLAGS}") string(REPLACE ";" " " BUILTINS_TEST_TARGET_CFLAGS "${BUILTINS_TEST_TARGET_CFLAGS}")
endif() endif()
if (${arch} STREQUAL "riscv32")
list(APPEND BUILTINS_TEST_TARGET_CFLAGS -fforce-enable-int128)
string(REPLACE ";" " " BUILTINS_TEST_TARGET_CFLAGS "${BUILTINS_TEST_TARGET_CFLAGS}")
endif()
string(TOUPPER ${arch} ARCH_UPPER_CASE) string(TOUPPER ${arch} ARCH_UPPER_CASE)
set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config) set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config)
configure_lit_site_cfg( configure_lit_site_cfg(

View File

@ -0,0 +1,119 @@
// REQUIRES-ANY: riscv32-target-arch
// RUN: %clang_builtins %s %librt -o %t && %run %t
//===-- mulsi3_test.c - Test __mulsi3 -------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file tests __mulsi3 for the compiler_rt library.
//
//===----------------------------------------------------------------------===//
#include "int_lib.h"
#include <stdio.h>
#include <limits.h>
#if !defined(__riscv_mul) && __riscv_xlen == 32
// Based on mulsi3_test.c
COMPILER_RT_ABI si_int __mulsi3(si_int a, si_int b);
int test__mulsi3(si_int a, si_int b, si_int expected)
{
si_int x = __mulsi3(a, b);
if (x != expected)
printf("error in __mulsi3: %d * %d = %d, expected %d\n",
a, b, __mulsi3(a, b), expected);
return x != expected;
}
#endif
int main()
{
#if !defined(__riscv_mul) && __riscv_xlen == 32
if (test__mulsi3(0, 0, 0))
return 1;
if (test__mulsi3(0, 1, 0))
return 1;
if (test__mulsi3(1, 0, 0))
return 1;
if (test__mulsi3(0, 10, 0))
return 1;
if (test__mulsi3(10, 0, 0))
return 1;
if (test__mulsi3(0, INT_MAX, 0))
return 1;
if (test__mulsi3(INT_MAX, 0, 0))
return 1;
if (test__mulsi3(0, -1, 0))
return 1;
if (test__mulsi3(-1, 0, 0))
return 1;
if (test__mulsi3(0, -10, 0))
return 1;
if (test__mulsi3(-10, 0, 0))
return 1;
if (test__mulsi3(0, INT_MIN, 0))
return 1;
if (test__mulsi3(INT_MIN, 0, 0))
return 1;
if (test__mulsi3(1, 1, 1))
return 1;
if (test__mulsi3(1, 10, 10))
return 1;
if (test__mulsi3(10, 1, 10))
return 1;
if (test__mulsi3(1, INT_MAX, INT_MAX))
return 1;
if (test__mulsi3(INT_MAX, 1, INT_MAX))
return 1;
if (test__mulsi3(1, -1, -1))
return 1;
if (test__mulsi3(1, -10, -10))
return 1;
if (test__mulsi3(-10, 1, -10))
return 1;
if (test__mulsi3(1, INT_MIN, INT_MIN))
return 1;
if (test__mulsi3(INT_MIN, 1, INT_MIN))
return 1;
if (test__mulsi3(46340, 46340, 2147395600))
return 1;
if (test__mulsi3(-46340, 46340, -2147395600))
return 1;
if (test__mulsi3(46340, -46340, -2147395600))
return 1;
if (test__mulsi3(-46340, -46340, 2147395600))
return 1;
if (test__mulsi3(4194303, 8192, 34359730176))
return 1;
if (test__mulsi3(-4194303, 8192, -34359730176))
return 1;
if (test__mulsi3(4194303, -8192, -34359730176))
return 1;
if (test__mulsi3(-4194303, -8192, 34359730176))
return 1;
if (test__mulsi3(8192, 4194303, 34359730176))
return 1;
if (test__mulsi3(-8192, 4194303, -34359730176))
return 1;
if (test__mulsi3(8192, -4194303, -34359730176))
return 1;
if (test__mulsi3(-8192, -4194303, 34359730176))
return 1;
#else
printf("skipped\n");
#endif
return 0;
}