Optimise ccopy for POWER9
authorMatt Brown <matthew.brown.dev@gmail.com>
Wed, 14 Jun 2017 04:25:10 +0000 (14:25 +1000)
committerMatt Brown <matthew.brown.dev@gmail.com>
Wed, 14 Jun 2017 06:58:59 +0000 (16:58 +1000)
Use lxvd2x instruction instead of lxvw4x.
lxvd2x performs far better on the new POWER architecture than lxvw4x.

kernel/power/ccopy_microk_power8.c

index b2b1bead1276bf7de945a120b9f5dd9f4f3982fd..613c4d28691fc7201eb7d19cbb4d1a59468cf6a4 100644 (file)
@@ -39,25 +39,25 @@ static void ccopy_kernel_32 (long n, float *x, float *y)
 {
   __asm__
     (
-       "lxvw4x         32, 0, %2       \n\t"
-       "lxvw4x         33, %5, %2      \n\t"
-       "lxvw4x         34, %6, %2      \n\t"
-       "lxvw4x         35, %7, %2      \n\t"
-       "lxvw4x         36, %8, %2      \n\t"
-       "lxvw4x         37, %9, %2      \n\t"
-       "lxvw4x         38, %10, %2     \n\t"
-       "lxvw4x         39, %11, %2     \n\t"
+       "lxvd2x         32, 0, %2       \n\t"
+       "lxvd2x         33, %5, %2      \n\t"
+       "lxvd2x         34, %6, %2      \n\t"
+       "lxvd2x         35, %7, %2      \n\t"
+       "lxvd2x         36, %8, %2      \n\t"
+       "lxvd2x         37, %9, %2      \n\t"
+       "lxvd2x         38, %10, %2     \n\t"
+       "lxvd2x         39, %11, %2     \n\t"
 
        "addi           %2, %2, 128     \n\t"
 
-       "lxvw4x         40, 0, %2       \n\t"
-       "lxvw4x         41, %5, %2      \n\t"
-       "lxvw4x         42, %6, %2      \n\t"
-       "lxvw4x         43, %7, %2      \n\t"
-       "lxvw4x         44, %8, %2      \n\t"
-       "lxvw4x         45, %9, %2      \n\t"
-       "lxvw4x         46, %10, %2     \n\t"
-       "lxvw4x         47, %11, %2     \n\t"
+       "lxvd2x         40, 0, %2       \n\t"
+       "lxvd2x         41, %5, %2      \n\t"
+       "lxvd2x         42, %6, %2      \n\t"
+       "lxvd2x         43, %7, %2      \n\t"
+       "lxvd2x         44, %8, %2      \n\t"
+       "lxvd2x         45, %9, %2      \n\t"
+       "lxvd2x         46, %10, %2     \n\t"
+       "lxvd2x         47, %11, %2     \n\t"
 
        "addi           %2, %2, 128     \n\t"
 
@@ -67,42 +67,42 @@ static void ccopy_kernel_32 (long n, float *x, float *y)
        ".p2align       5               \n"
      "1:                               \n\t"
 
-       "stxvw4x                32, 0, %3       \n\t"
-       "stxvw4x                33, %5, %3      \n\t"
-       "lxvw4x         32, 0, %2       \n\t"
-       "lxvw4x         33, %5, %2      \n\t"
-       "stxvw4x                34, %6, %3      \n\t"
-       "stxvw4x                35, %7, %3      \n\t"
-       "lxvw4x         34, %6, %2      \n\t"
-       "lxvw4x         35, %7, %2      \n\t"
-       "stxvw4x                36, %8, %3      \n\t"
-       "stxvw4x                37, %9, %3      \n\t"
-       "lxvw4x         36, %8, %2      \n\t"
-       "lxvw4x         37, %9, %2      \n\t"
-       "stxvw4x                38, %10, %3     \n\t"
-       "stxvw4x                39, %11, %3     \n\t"
-       "lxvw4x         38, %10, %2     \n\t"
-       "lxvw4x         39, %11, %2     \n\t"
+       "stxvd2x                32, 0, %3       \n\t"
+       "stxvd2x                33, %5, %3      \n\t"
+       "lxvd2x         32, 0, %2       \n\t"
+       "lxvd2x         33, %5, %2      \n\t"
+       "stxvd2x                34, %6, %3      \n\t"
+       "stxvd2x                35, %7, %3      \n\t"
+       "lxvd2x         34, %6, %2      \n\t"
+       "lxvd2x         35, %7, %2      \n\t"
+       "stxvd2x                36, %8, %3      \n\t"
+       "stxvd2x                37, %9, %3      \n\t"
+       "lxvd2x         36, %8, %2      \n\t"
+       "lxvd2x         37, %9, %2      \n\t"
+       "stxvd2x                38, %10, %3     \n\t"
+       "stxvd2x                39, %11, %3     \n\t"
+       "lxvd2x         38, %10, %2     \n\t"
+       "lxvd2x         39, %11, %2     \n\t"
 
        "addi           %3, %3, 128     \n\t"
        "addi           %2, %2, 128     \n\t"
 
-       "stxvw4x                40, 0, %3       \n\t"
-       "stxvw4x                41, %5, %3      \n\t"
-       "lxvw4x         40, 0, %2       \n\t"
-       "lxvw4x         41, %5, %2      \n\t"
-       "stxvw4x                42, %6, %3      \n\t"
-       "stxvw4x                43, %7, %3      \n\t"
-       "lxvw4x         42, %6, %2      \n\t"
-       "lxvw4x         43, %7, %2      \n\t"
-       "stxvw4x                44, %8, %3      \n\t"
-       "stxvw4x                45, %9, %3      \n\t"
-       "lxvw4x         44, %8, %2      \n\t"
-       "lxvw4x         45, %9, %2      \n\t"
-       "stxvw4x                46, %10, %3     \n\t"
-       "stxvw4x                47, %11, %3     \n\t"
-       "lxvw4x         46, %10, %2     \n\t"
-       "lxvw4x         47, %11, %2     \n\t"
+       "stxvd2x                40, 0, %3       \n\t"
+       "stxvd2x                41, %5, %3      \n\t"
+       "lxvd2x         40, 0, %2       \n\t"
+       "lxvd2x         41, %5, %2      \n\t"
+       "stxvd2x                42, %6, %3      \n\t"
+       "stxvd2x                43, %7, %3      \n\t"
+       "lxvd2x         42, %6, %2      \n\t"
+       "lxvd2x         43, %7, %2      \n\t"
+       "stxvd2x                44, %8, %3      \n\t"
+       "stxvd2x                45, %9, %3      \n\t"
+       "lxvd2x         44, %8, %2      \n\t"
+       "lxvd2x         45, %9, %2      \n\t"
+       "stxvd2x                46, %10, %3     \n\t"
+       "stxvd2x                47, %11, %3     \n\t"
+       "lxvd2x         46, %10, %2     \n\t"
+       "lxvd2x         47, %11, %2     \n\t"
 
        "addi           %3, %3, 128     \n\t"
        "addi           %2, %2, 128     \n\t"
@@ -112,25 +112,25 @@ static void ccopy_kernel_32 (long n, float *x, float *y)
 
      "2:                               \n\t"
 
-       "stxvw4x                32, 0, %3       \n\t"
-       "stxvw4x                33, %5, %3      \n\t"
-       "stxvw4x                34, %6, %3      \n\t"
-       "stxvw4x                35, %7, %3      \n\t"
-       "stxvw4x                36, %8, %3      \n\t"
-       "stxvw4x                37, %9, %3      \n\t"
-       "stxvw4x                38, %10, %3     \n\t"
-       "stxvw4x                39, %11, %3     \n\t"
+       "stxvd2x                32, 0, %3       \n\t"
+       "stxvd2x                33, %5, %3      \n\t"
+       "stxvd2x                34, %6, %3      \n\t"
+       "stxvd2x                35, %7, %3      \n\t"
+       "stxvd2x                36, %8, %3      \n\t"
+       "stxvd2x                37, %9, %3      \n\t"
+       "stxvd2x                38, %10, %3     \n\t"
+       "stxvd2x                39, %11, %3     \n\t"
 
        "addi           %3, %3, 128     \n\t"
 
-       "stxvw4x                40, 0, %3       \n\t"
-       "stxvw4x                41, %5, %3      \n\t"
-       "stxvw4x                42, %6, %3      \n\t"
-       "stxvw4x                43, %7, %3      \n\t"
-       "stxvw4x                44, %8, %3      \n\t"
-       "stxvw4x                45, %9, %3      \n\t"
-       "stxvw4x                46, %10, %3     \n\t"
-       "stxvw4x                47, %11, %3     \n"
+       "stxvd2x                40, 0, %3       \n\t"
+       "stxvd2x                41, %5, %3      \n\t"
+       "stxvd2x                42, %6, %3      \n\t"
+       "stxvd2x                43, %7, %3      \n\t"
+       "stxvd2x                44, %8, %3      \n\t"
+       "stxvd2x                45, %9, %3      \n\t"
+       "stxvd2x                46, %10, %3     \n\t"
+       "stxvd2x                47, %11, %3     \n"
 
      "#n=%1 x=%4=%2 y=%0=%3 o16=%5 o32=%6 o48=%7 o64=%8 o80=%9 o96=%10 o112=%11"
      :