@@ -38,6 +38,9 @@ AM_CONDITIONAL([CPU_PPC64LE], [test "$CPU" = "ppc64le"])
3838AM_CONDITIONAL([ CPU_RISCV64] , [ test "$CPU" = "riscv64"] )
3939AM_CONDITIONAL([ CPU_UNDEFINED] , [ test "x$CPU" = "x"] )
4040AM_CONDITIONAL([ HAVE_RVV] , [ false] )
41+ AM_CONDITIONAL([ HAVE_ZBC] , [ false] )
42+ AM_CONDITIONAL([ HAVE_ZVBC] , [ false] )
43+ AM_CONDITIONAL([ HAVE_HWPROBE_H] , [ false] )
4144
4245# Check for programs
4346AC_PROG_CC_STDC
@@ -57,24 +60,78 @@ case "${CPU}" in
5760
5861 riscv64)
5962
60- AC_MSG_CHECKING ( [ checking RVV support] )
61- AC_COMPILE_IFELSE (
62- [ AC_LANG_PROGRAM ( [ ] , [
63- __asm__ volatile(
64- ".option arch, +v\n"
65- "vsetivli zero, 0, e8, m1, ta, ma\n"
66- );
67- ] ) ] ,
68- [ AC_DEFINE ( [ HAVE_RVV] , [ 1] , [ Enable RVV instructions] )
69- AM_CONDITIONAL([ HAVE_RVV] , [ true] ) rvv=yes] ,
70- [ AC_DEFINE ( [ HAVE_RVV] , [ 0] , [ Disable RVV instructions] )
71- AM_CONDITIONAL([ HAVE_RVV] , [ false] ) rvv=no]
63+ AC_CHECK_HEADER ( [ asm/hwprobe.h] ,
64+ [ AC_DEFINE ( [ HAVE_HWPROBE_H] , [ 1] , [ Define if asm/hwprobe.h exists] )
65+ AM_CONDITIONAL([ HAVE_HWPROBE_H] , [ true] ) hwprobe_h=yes] ,
66+ [ AC_DEFINE ( [ HAVE_HWPROBE_H] , [ 0] , [ Define if asm/hwprobe.h not exists] )
67+ AM_CONDITIONAL([ HAVE_HWPROBE_H] , [ false] ) hwprobe_h=no]
7268 )
73- if test "x$rvv" = "xyes"; then
74- CFLAGS+=" -march=rv64gcv"
75- CCASFLAGS+=" -march=rv64gcv"
69+ if test "x$hwprobe_h" = "xyes"; then
70+ AC_MSG_CHECKING ( [ ZBC support] )
71+ AC_COMPILE_IFELSE (
72+ [ AC_LANG_PROGRAM ( [ #include <asm/hwprobe.h>] , [
73+ int a = RISCV_HWPROBE_EXT_ZBC;
74+ __asm__ volatile(
75+ ".option arch, +zbc\n"
76+ "clmul zero, zero, zero\n"
77+ "clmulh zero, zero, zero\n"
78+ );
79+ ] ) ] ,
80+ [ AC_DEFINE ( [ HAVE_ZBC] , [ 1] , [ Enable ZBC instructions] )
81+ AM_CONDITIONAL([ HAVE_ZBC] , [ true] ) zbc=yes] ,
82+ [ AC_DEFINE ( [ HAVE_ZBC] , [ 0] , [ Disable ZBC instructions] )
83+ AM_CONDITIONAL([ HAVE_ZBC] , [ false] ) zbc=no]
84+ )
85+ AC_MSG_RESULT ( [ $zbc] )
86+ AC_MSG_CHECKING ( [ ZVBC support] )
87+ AC_COMPILE_IFELSE (
88+ [ AC_LANG_PROGRAM ( [ #include <asm/hwprobe.h>] , [
89+ int a = RISCV_HWPROBE_EXT_ZVBC;
90+ __asm__ volatile(
91+ ".option arch, +v, +zvbc\n"
92+ "vsetivli zero, 2, e64, m1, ta, ma\n"
93+ "vclmul.vv v0, v0, v0\n"
94+ "vclmulh.vv v0, v0, v0\n"
95+ );
96+ ] ) ] ,
97+ [ AC_DEFINE ( [ HAVE_ZVBC] , [ 1] , [ Enable ZVBC instructions] )
98+ AM_CONDITIONAL([ HAVE_ZVBC] , [ true] ) zvbc=yes] ,
99+ [ AC_DEFINE ( [ HAVE_ZVBC] , [ 0] , [ Disable ZVBC instructions] )
100+ AM_CONDITIONAL([ HAVE_ZVBC] , [ false] ) zvbc=no]
101+ )
102+ AC_MSG_RESULT ( [ $zvbc] )
76103 fi
104+ AC_MSG_CHECKING ( [ RVV support] )
105+ AS_IF ( [ test "x$zvbc" = "xno"] ,
106+ [
107+ AC_COMPILE_IFELSE (
108+ [ AC_LANG_PROGRAM ( [ ] , [
109+ __asm__ volatile(
110+ ".option arch, +v\n"
111+ "vsetivli zero, 0, e8, m1, ta, ma\n"
112+ );
113+ ] ) ] ,
114+ [ AC_DEFINE ( [ HAVE_RVV] , [ 1] , [ Enable RVV instructions] )
115+ AM_CONDITIONAL([ HAVE_RVV] , [ true] ) rvv=yes] ,
116+ [ AC_DEFINE ( [ HAVE_RVV] , [ 0] , [ Disable RVV instructions] )
117+ AM_CONDITIONAL([ HAVE_RVV] , [ false] ) rvv=no]
118+ )
119+ ] ,
120+ [ AC_DEFINE ( [ HAVE_RVV] , [ 1] , [ Enable RVV instructions] )
121+ AM_CONDITIONAL([ HAVE_RVV] , [ true] ) rvv=yes]
122+ )
77123 AC_MSG_RESULT ( [ $rvv] )
124+ AS_IF ( [ test "x$zvbc" = "xyes" && test "x$zbc" = "xyes"] ,
125+ [
126+ CFLAGS="$CFLAGS -march=rv64gcv_zbc_zvbc"
127+ CCASFLAGS="$CCASFLAGS -march=rv64gcv_zbc_zvbc"
128+ ] ,
129+ [ test "x$rvv" = "xyes"] ,
130+ [
131+ CFLAGS="$CFLAGS -march=rv64gcv"
132+ CCASFLAGS="$CCASFLAGS -march=rv64gcv"
133+ ]
134+ )
78135 ;;
79136
80137 *)
@@ -239,4 +296,4 @@ AC_MSG_RESULT([
239296 ldflags: ${LDFLAGS}
240297
241298 debug: ${enable_debug}
242- ] )
299+ ] )
0 commit comments