@@ -38,6 +38,10 @@ AM_CONDITIONAL([CPU_PPC64LE], [test "$CPU" = "ppc64le"])
38
38
AM_CONDITIONAL([ CPU_RISCV64] , [ test "$CPU" = "riscv64"] )
39
39
AM_CONDITIONAL([ CPU_UNDEFINED] , [ test "x$CPU" = "x"] )
40
40
AM_CONDITIONAL([ HAVE_RVV] , [ false] )
41
+ AM_CONDITIONAL([ HAVE_ZBC] , [ false] )
42
+ AM_CONDITIONAL([ HAVE_ZVBC] , [ false] )
43
+ AM_CONDITIONAL([ HAVE_ZVBB] , [ false] )
44
+ AM_CONDITIONAL([ HAVE_HWPROBE_H] , [ false] )
41
45
42
46
# Check for programs
43
47
AC_PROG_CC_STDC
@@ -57,7 +61,13 @@ case "${CPU}" in
57
61
58
62
riscv64)
59
63
60
- AC_MSG_CHECKING ( [ checking RVV support] )
64
+ AC_CHECK_HEADER ( [ asm/hwprobe.h] ,
65
+ [ AC_DEFINE ( [ HAVE_HWPROBE_H] , [ 1] , [ Define if asm/hwprobe.h exists] )
66
+ AM_CONDITIONAL([ HAVE_HWPROBE_H] , [ true] ) hwprobe_h=yes] ,
67
+ [ AC_DEFINE ( [ HAVE_HWPROBE_H] , [ 0] , [ Define if asm/hwprobe.h not exists] )
68
+ AM_CONDITIONAL([ HAVE_HWPROBE_H] , [ false] ) hwprobe_h=no]
69
+ )
70
+ AC_MSG_CHECKING ( [ RVV support] )
61
71
AC_COMPILE_IFELSE (
62
72
[ AC_LANG_PROGRAM ( [ ] , [
63
73
__asm__ volatile(
@@ -70,11 +80,70 @@ case "${CPU}" in
70
80
[ AC_DEFINE ( [ HAVE_RVV] , [ 0] , [ Disable RVV instructions] )
71
81
AM_CONDITIONAL([ HAVE_RVV] , [ false] ) rvv=no]
72
82
)
83
+ AC_MSG_RESULT ( [ $rvv] )
84
+ if test "x$hwprobe_h" = "xyes"; then
85
+ AC_MSG_CHECKING ( [ ZBC support] )
86
+ AC_COMPILE_IFELSE (
87
+ [ AC_LANG_PROGRAM ( [ #include <asm/hwprobe.h>] , [
88
+ int a = RISCV_HWPROBE_EXT_ZBC;
89
+ __asm__ volatile(
90
+ ".option arch, +zbc\n"
91
+ "clmul zero, zero, zero\n"
92
+ "clmulh zero, zero, zero\n"
93
+ );
94
+ ] ) ] ,
95
+ [ AC_DEFINE ( [ HAVE_ZBC] , [ 1] , [ Enable ZBC instructions] )
96
+ AM_CONDITIONAL([ HAVE_ZBC] , [ true] ) zbc=yes] ,
97
+ [ AC_DEFINE ( [ HAVE_ZBC] , [ 0] , [ Disable ZBC instructions] )
98
+ AM_CONDITIONAL([ HAVE_ZBC] , [ false] ) zbc=no]
99
+ )
100
+ AC_MSG_RESULT ( [ $zbc] )
101
+ AC_MSG_CHECKING ( [ ZVBC support] )
102
+ AC_COMPILE_IFELSE (
103
+ [ AC_LANG_PROGRAM ( [ #include <asm/hwprobe.h>] , [
104
+ int a = RISCV_HWPROBE_EXT_ZVBC;
105
+ __asm__ volatile(
106
+ ".option arch, +v, +zvbc\n"
107
+ "vsetivli zero, 2, e64, m1, ta, ma\n"
108
+ "vmv.s.x v0, zero\n"
109
+ "vclmul.vv v0, v0, v0\n"
110
+ "vclmulh.vv v0, v0, v0\n"
111
+ );
112
+ ] ) ] ,
113
+ [ AC_DEFINE ( [ HAVE_ZVBC] , [ 1] , [ Enable ZVBC instructions] )
114
+ AM_CONDITIONAL([ HAVE_ZVBC] , [ true] ) zvbc=yes] ,
115
+ [ AC_DEFINE ( [ HAVE_ZVBC] , [ 0] , [ Disable ZVBC instructions] )
116
+ AM_CONDITIONAL([ HAVE_ZVBC] , [ false] ) zvbc=no]
117
+ )
118
+ AC_MSG_RESULT ( [ $zvbc] )
119
+ AC_MSG_CHECKING ( [ ZVBB support] )
120
+ AC_COMPILE_IFELSE (
121
+ [ AC_LANG_PROGRAM ( [ #include <asm/hwprobe.h>] , [
122
+ int a = RISCV_HWPROBE_EXT_ZVBB;
123
+ __asm__ volatile(
124
+ ".option arch, +v, +zvbb\n"
125
+ "vsetivli zero, 2, e64, m1, ta, ma\n"
126
+ "vmv.s.x v0, zero\n"
127
+ "vrev8.v v0, v0\n"
128
+ );
129
+ ] ) ] ,
130
+ [ AC_DEFINE ( [ HAVE_ZVBB] , [ 1] , [ Enable ZVBB instructions] )
131
+ AM_CONDITIONAL([ HAVE_ZVBB] , [ true] ) zvbb=yes] ,
132
+ [ AC_DEFINE ( [ HAVE_ZVBB] , [ 0] , [ Disable ZVBB instructions] )
133
+ AM_CONDITIONAL([ HAVE_ZVBB] , [ false] ) zvbb=no]
134
+ )
135
+ AC_MSG_RESULT ( [ $zvbb] )
136
+ fi
73
137
if test "x$rvv" = "xyes"; then
74
- CFLAGS+=" -march=rv64gcv"
75
- CCASFLAGS+=" -march=rv64gcv"
138
+ rvv_arch="rv64gcv"
139
+ AS_IF ( [ test "x$hwprobe_h" = "xyes"] ,
140
+ [ AS_IF ( [ test "x$zbc" = "xyes" && test "x$zvbc" = "xyes" && test "x$zvbb" = "xyes"] ,
141
+ [ rvv_arch="rv64gcv_zbc_zvbc_zvbb"]
142
+ ) ]
143
+ )
144
+ CFLAGS+=" -march=$rvv_arch"
145
+ CCASFLAGS+=" -march=$rvv_arch"
76
146
fi
77
- AC_MSG_RESULT ( [ $rvv] )
78
147
;;
79
148
80
149
*)
@@ -239,4 +308,4 @@ AC_MSG_RESULT([
239
308
ldflags: ${LDFLAGS}
240
309
241
310
debug: ${enable_debug}
242
- ] )
311
+ ] )
0 commit comments