From b483ce75070d73c7413fe413e879a10796ba8cd5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Sun, 21 Jan 2024 14:59:02 +0100
Subject: [PATCH] New macros GHASH_REDUCE.

---
 powerpc64/machine.m4          | 11 +++++++++++
 powerpc64/p8/ghash-update.asm | 18 +++---------------
 2 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/powerpc64/machine.m4 b/powerpc64/machine.m4
index 3a05e318..54d487f2 100644
--- a/powerpc64/machine.m4
+++ b/powerpc64/machine.m4
@@ -79,3 +79,14 @@ define(`OPN_XXXY',
 ifelse(eval($# > 3), 1,
 `OPN_XXXY($1, $2, shift(shift(shift($@))))dnl
 ')')
+
+C FIXME: If we allow clobber of F, no need for T register.
+C Polynomial reduction D = R + x^{-64} F mod P
+C where x^{-64} = x^{64} + P1 (mod P)
+C GHASH_REDUCE(D, R, F, P1, T)
+define(`GHASH_REDUCE', `
+    vpmsumd        $5,$3,$4
+    xxswapd        VSR($1),VSR($3)
+    vxor           $5, $5, $2
+    vxor           $1, $1, $5
+')
diff --git a/powerpc64/p8/ghash-update.asm b/powerpc64/p8/ghash-update.asm
index 6c750785..054f035d 100644
--- a/powerpc64/p8/ghash-update.asm
+++ b/powerpc64/p8/ghash-update.asm
@@ -170,11 +170,7 @@ IF_LE(`
     vxor           F,F,F3
     vxor           R,R,R3
 
-    C reduction
-    vpmsumd        T,F,POLY_L
-    xxswapd        VSR(D),VSR(F)
-    vxor           R,R,T
-    vxor           D,R,D
+    GHASH_REDUCE(D, R, F, POLY_L, T)
 
     addi           DATA,DATA,0x40
     bdnz           L4x_loop
@@ -228,11 +224,7 @@ IF_LE(`
     vxor           F,F,F2
     vxor           R,R,R2
 
-    C reduction
-    vpmsumd        T,F,POLY_L
-    xxswapd        VSR(D),VSR(F)
-    vxor           R,R,T
-    vxor           D,R,D
+    GHASH_REDUCE(D, R, F, POLY_L, T)
 
     addi           DATA,DATA,0x20
     clrldi         BLOCKS,BLOCKS,63              C 'set the high-order 63 bits to zeros'
@@ -261,11 +253,7 @@ IF_LE(`
     vpmsumd        F,H1L,C0
     vpmsumd        R,H1M,C0
 
-    C reduction
-    vpmsumd        T,F,POLY_L
-    xxswapd        VSR(D),VSR(F)
-    vxor           R,R,T
-    vxor           D,R,D
+    GHASH_REDUCE(D, R, F, POLY_L, T)
 
     addi           DATA,DATA,0x10
     clrldi         BLOCKS,BLOCKS,60              C 'set the high-order 60 bits to zeros'
-- 
GitLab