build: support arch-specific compiling for Neoverse N1 04/26804/3
authorLijian.Zhang <Lijian.Zhang@arm.com>
Tue, 18 Feb 2020 11:58:19 +0000 (19:58 +0800)
committerDamjan Marion <dmarion@me.com>
Thu, 30 Apr 2020 10:18:39 +0000 (10:18 +0000)
Enable arch-specific compiling and dynamic optimal function selection
for Arm Neoverse-N1.

Support for -march=armv8.2-a+crc+crypto -mtune=neoverse-n1 for
Neoverse-N1 is added starting from gcc-9.2.0

                    without change  with change improvement
[L2 - 1x flows]     11.00 Mpps      11.46 Mpps  4%
[L2 - 10Kx flows]   6.83 Mpps       7.17 Mpps   5%
[L3 - 1x flows]     10.39 Mpps      10.78 Mpps  3.7%
[L3 - 10Kx flows]   6.67 Mpps       7.19 Mpps   7.8%

Type: feature

Change-Id: I5d24d17820b3dd6909b913202e8c31fc7d48650f
Signed-off-by: Lijian Zhang <Lijian.Zhang@arm.com>
Reviewed-by: Jieqiang Wang <Jieqiang.Wang@arm.com>
Reviewed-by: Govindarajan Mohandoss <Govindarajan.Mohandoss@arm.com>
src/cmake/cpu.cmake
src/vppinfra/cpu.h

index 916fe0d..0ce8bea 100644 (file)
@@ -107,6 +107,10 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)")
   if(compiler_flag_march_cortexa72)
     list(APPEND MARCH_VARIANTS "cortexa72\;-march=armv8-a+crc+crypto -mtune=cortex-a72 -DCLIB_N_PREFETCHES=6")
   endif()
+  check_c_compiler_flag("-march=armv8.2-a+crc+crypto -mtune=neoverse-n1" compiler_flag_march_neoversen1)
+  if(compiler_flag_march_neoversen1)
+    list(APPEND MARCH_VARIANTS "neoversen1\;-march=armv8.2-a+crc+crypto -mtune=neoverse-n1 -DCLIB_N_PREFETCHES=6")
+  endif()
 endif()
 
 macro(vpp_library_set_multiarch_sources lib)
index 48c68a1..7bd5dfe 100644 (file)
@@ -322,6 +322,8 @@ clib_cpu_part ()
 #define AARCH64_CPU_PART_QDF24XX            0xc00
 #define AARCH64_CPU_IMPLEMENTER_CORTEXA72   0x41
 #define AARCH64_CPU_PART_CORTEXA72          0xd08
+#define AARCH64_CPU_IMPLEMENTER_NEOVERSEN1  0x41
+#define AARCH64_CPU_PART_NEOVERSEN1         0xd0c
 
 static inline int
 clib_cpu_march_priority_thunderx2t99 ()
@@ -350,6 +352,15 @@ clib_cpu_march_priority_cortexa72 ()
   return -1;
 }
 
+static inline int
+clib_cpu_march_priority_neoversen1 ()
+{
+  if ((AARCH64_CPU_IMPLEMENTER_NEOVERSEN1 == clib_cpu_implementer ()) &&
+      (AARCH64_CPU_PART_NEOVERSEN1 == clib_cpu_part ()))
+    return 10;
+  return -1;
+}
+
 #ifdef CLIB_MARCH_VARIANT
 #define CLIB_MARCH_FN_PRIORITY() CLIB_MARCH_SFX(clib_cpu_march_priority)()
 #else