Author: arichardson
Date: Fri Jun  5 13:54:13 2020
New Revision: 361833
URL: https://svnweb.freebsd.org/changeset/base/361833

Log:
  Allow assembling skein_block_asm.s with clang
  
  GNU as seems to allow macro arguments without the '\' but clang is more
  strict in that regard.
  This change makes the source code compatible with LLVM's but does not yet
  change the build system or rename it to .S.
  
  The new code assembles identically with GNU as 2.17.50.
  
  Reviewed By:  emaste
  Differential Revision: https://reviews.freebsd.org/D25143

Modified:
  head/sys/crypto/skein/amd64/skein_block_asm.s

Modified: head/sys/crypto/skein/amd64/skein_block_asm.s
==============================================================================
--- head/sys/crypto/skein/amd64/skein_block_asm.s       Fri Jun  5 09:58:59 
2020        (r361832)
+++ head/sys/crypto/skein/amd64/skein_block_asm.s       Fri Jun  5 13:54:13 
2020        (r361833)
@@ -10,7 +10,9 @@
 #
     .text
     .altmacro
+#ifndef __clang__
     .psize 0,128                            #list file has no page boundaries
+#endif
 #
 _MASK_ALL_  =  (256+512+1024)               #all three algorithm bits
 _MAX_FRAME_ =  240
@@ -240,9 +242,8 @@ RC_1024_7_7 = 20
 # Output: <reg> <<< RC_BlkSize_roundNum_mixNum, BlkSize=256/512/1024
 #
 .macro RotL64   reg,BLK_SIZE,ROUND_NUM,MIX_NUM
-_RCNT_ = RC_\BLK_SIZE&_\ROUND_NUM&_\MIX_NUM
-  .if _RCNT_  #is there anything to do?
-    rolq    $_RCNT_,%\reg
+  .if RC_\BLK_SIZE\()_\ROUND_NUM\()_\MIX_NUM  #is there anything to do?
+    rolq    $RC_\BLK_SIZE\()_\ROUND_NUM\()_\MIX_NUM,%\reg
   .endif
 .endm
 #
@@ -334,7 +335,7 @@ __STK_FRM_OFFS_\BLK_BITS = FRAME_OFFS
 #----------------------------------------------------------------
 #
 .macro Reset_Stack
-    addq    $LOCAL_SIZE,%rsp        #get rid of locals (wipe??)
+    addq    $LOCAL_SIZE,%rsp        #get rid of locals (wipe?)
   .irp _reg_,r15,r14,r13,r12,rbx,rbp
     popq    %\_reg_                 #restore caller's regs
 _PushCnt_ = _PushCnt_ - 1
@@ -724,22 +725,22 @@ C_label Skein_256_Unroll_Cnt
 .macro R_512_OneRound rn0,rn1,rn2,rn3,rn4,rn5,rn6,rn7,_Rn_,op1,op2,op3,op4
 #
     addReg      r\rn0, r\rn1
-    RotL64      r\rn1, 512,%((_Rn_) % 8),0
+    RotL64      r\rn1, 512,%((\_Rn_) % 8),0
     xorReg      r\rn1, r\rn0
-            op1
+            \op1
     addReg      r\rn2, r\rn3
-    RotL64      r\rn3, 512,%((_Rn_) % 8),1
+    RotL64      r\rn3, 512,%((\_Rn_) % 8),1
     xorReg      r\rn3, r\rn2
-            op2
+            \op2
     addReg      r\rn4, r\rn5
-    RotL64      r\rn5, 512,%((_Rn_) % 8),2
+    RotL64      r\rn5, 512,%((\_Rn_) % 8),2
     xorReg      r\rn5, r\rn4
-            op3
+            \op3
     addReg      r\rn6, r\rn7
-    RotL64      r\rn7, 512,%((_Rn_) % 8),3
+    RotL64      r\rn7, 512,%((\_Rn_) % 8),3
     xorReg      r\rn7, r\rn6
-            op4
-    Skein_Debug_Round 512,%(_Rn_+1),-4
+            \op4
+    Skein_Debug_Round 512,%(\_Rn_+1),-4
 #
 .endm #R_512_OneRound
 #
@@ -749,11 +750,11 @@ C_label Skein_256_Unroll_Cnt
 .macro R_512_FourRounds _RR_    #RR = base round number (0 % 8)
   .if (SKEIN_ASM_UNROLL && 512)
     # here for fully unrolled case.
-    _II_ = ((_RR_)/4) + 1       #key injection counter
-    R_512_OneRound  8, 9,10,11,12,13,14,15,%((_RR_)+0),<movq 
ksKey+8*(((_II_)+3) % 9)+F_O(%rbp),%rax>,,<movq ksKey+8*(((_II_)+4) % 
9)+F_O(%rbp),%rbx>
-    R_512_OneRound 10, 9,12,15,14,13, 8,11,%((_RR_)+1),<movq 
ksKey+8*(((_II_)+5) % 9)+F_O(%rbp),%rcx>,,<movq ksKey+8*(((_II_)+6) % 
9)+F_O(%rbp),%rdx>
-    R_512_OneRound 12, 9,14,11, 8,13,10,15,%((_RR_)+2),<movq 
ksKey+8*(((_II_)+7) % 9)+F_O(%rbp),%rsi>,,<addq ksTwk+8*(((_II_)+0) % 
3)+F_O(%rbp),%rcx>
-    R_512_OneRound 14, 9, 8,15,10,13,12,11,%((_RR_)+3),<addq 
ksTwk+8*(((_II_)+1) % 3)+F_O(%rbp),%rdx>,
+    _II_ = ((\_RR_)/4) + 1       #key injection counter
+    R_512_OneRound  8, 9,10,11,12,13,14,15,%((\_RR_)+0),<movq 
ksKey+8*(((_II_)+3) % 9)+F_O(%rbp),%rax>,,<movq ksKey+8*(((_II_)+4) % 
9)+F_O(%rbp),%rbx>
+    R_512_OneRound 10, 9,12,15,14,13, 8,11,%((\_RR_)+1),<movq 
ksKey+8*(((_II_)+5) % 9)+F_O(%rbp),%rcx>,,<movq ksKey+8*(((_II_)+6) % 
9)+F_O(%rbp),%rdx>
+    R_512_OneRound 12, 9,14,11, 8,13,10,15,%((\_RR_)+2),<movq 
ksKey+8*(((_II_)+7) % 9)+F_O(%rbp),%rsi>,,<addq ksTwk+8*(((_II_)+0) % 
3)+F_O(%rbp),%rcx>
+    R_512_OneRound 14, 9, 8,15,10,13,12,11,%((\_RR_)+3),<addq 
ksTwk+8*(((_II_)+1) % 3)+F_O(%rbp),%rdx>,
     # inject the key schedule
     addq    ksKey+8*(((_II_)+0)%9)+F_O(%rbp),%r8
     addReg   r11, rax
@@ -766,10 +767,10 @@ C_label Skein_256_Unroll_Cnt
   .else
     # here for looping case                                                    
#"rotate" key/tweak schedule (move up on stack)
     incq    %rdi                 #bump key injection counter
-    R_512_OneRound  8, 9,10,11,12,13,14,15,%((_RR_)+0),<movq 
ksKey+8*6+F_O(%rbp,%rdi,8),%rdx>,<movq      
ksTwk-8*1+F_O(%rbp,%rdi,8),%rax>,<movq      ksKey-8*1+F_O(%rbp,%rdi,8),%rsi>
-    R_512_OneRound 10, 9,12,15,14,13, 8,11,%((_RR_)+1),<movq 
ksKey+8*5+F_O(%rbp,%rdi,8),%rcx>,<movq %rax,ksTwk+8*2+F_O(%rbp,%rdi,8)     
>,<movq %rsi,ksKey+8*8+F_O(%rbp,%rdi,8)>
-    R_512_OneRound 12, 9,14,11, 8,13,10,15,%((_RR_)+2),<movq 
ksKey+8*4+F_O(%rbp,%rdi,8),%rbx>,<addq      
ksTwk+8*1+F_O(%rbp,%rdi,8),%rdx>,<movq      ksKey+8*7+F_O(%rbp,%rdi,8),%rsi>    
-    R_512_OneRound 14, 9, 8,15,10,13,12,11,%((_RR_)+3),<movq 
ksKey+8*3+F_O(%rbp,%rdi,8),%rax>,<addq      ksTwk+8*0+F_O(%rbp,%rdi,8),%rcx>
+    R_512_OneRound  8, 9,10,11,12,13,14,15,%((\_RR_)+0),<movq 
ksKey+8*6+F_O(%rbp,%rdi,8),%rdx>,<movq      
ksTwk-8*1+F_O(%rbp,%rdi,8),%rax>,<movq      ksKey-8*1+F_O(%rbp,%rdi,8),%rsi>
+    R_512_OneRound 10, 9,12,15,14,13, 8,11,%((\_RR_)+1),<movq 
ksKey+8*5+F_O(%rbp,%rdi,8),%rcx>,<movq %rax,ksTwk+8*2+F_O(%rbp,%rdi,8)     
>,<movq %rsi,ksKey+8*8+F_O(%rbp,%rdi,8)>
+    R_512_OneRound 12, 9,14,11, 8,13,10,15,%((\_RR_)+2),<movq 
ksKey+8*4+F_O(%rbp,%rdi,8),%rbx>,<addq      
ksTwk+8*1+F_O(%rbp,%rdi,8),%rdx>,<movq      ksKey+8*7+F_O(%rbp,%rdi,8),%rsi>
+    R_512_OneRound 14, 9, 8,15,10,13,12,11,%((\_RR_)+3),<movq 
ksKey+8*3+F_O(%rbp,%rdi,8),%rax>,<addq      ksTwk+8*0+F_O(%rbp,%rdi,8),%rcx>
     # inject the key schedule
     addq    ksKey+8*0+F_O(%rbp,%rdi,8),%r8
     addReg   r11, rax
@@ -814,9 +815,9 @@ Skein_512_block_loop:
     movq    %rbx,ksTwk+ 8+F_O(%rbp)
     movq    %rcx,ksTwk+16+F_O(%rbp)
     .irp _Rn_,8,9,10,11,12,13,14,15
-      movq  X_VARS+8*(_Rn_-8)(%rdi),%r\_Rn_
+      movq  X_VARS+8*(\_Rn_-8)(%rdi),%r\_Rn_
       xorq  %r\_Rn_,%rdx              #compute overall parity
-      movq  %r\_Rn_,ksKey+8*(_Rn_-8)+F_O(%rbp)
+      movq  %r\_Rn_,ksKey+8*(\_Rn_-8)+F_O(%rbp)
     .endr                             #load state into %r8 ..%r15, compute 
parity
       movq  %rdx,ksKey+8*(8)+F_O(%rbp)#save key schedule parity
 
@@ -853,7 +854,7 @@ Skein_512_block_loop:
 
 .if _SKEIN_DEBUG
     .irp _Rn_,8,9,10,11,12,13,14,15   #save values on stack for debug output
-      movq  %r\_Rn_,X_stk+8*(_Rn_-8)(%rsp)
+      movq  %r\_Rn_,X_stk+8*(\_Rn_-8)(%rsp)
     .endr
 
     Skein_Debug_Block 512             #debug dump
@@ -891,12 +892,12 @@ _Rbase_ = _Rbase_+1
     #################
     # feedforward:   ctx->X[i] = X[i] ^ w[i], {i=0..7}
     .irp _Rn_,8,9,10,11,12,13,14,15
-  .if (_Rn_ == 8)
+  .if (\_Rn_ == 8)
     movq    $FIRST_MASK64,%rbx
   .endif
-      xorq  Wcopy+8*(_Rn_-8)+F_O(%rbp),%r\_Rn_  #feedforward XOR
-      movq  %r\_Rn_,X_VARS+8*(_Rn_-8)(%rdi)     #and store result
-  .if (_Rn_ == 14)
+      xorq  Wcopy+8*(\_Rn_-8)+F_O(%rbp),%r\_Rn_  #feedforward XOR
+      movq  %r\_Rn_,X_VARS+8*(\_Rn_-8)(%rdi)     #and store result
+  .if (\_Rn_ == 14)
     andq    TWEAK+ 8(%rdi),%rbx
   .endif
     .endr
@@ -917,7 +918,7 @@ Skein_Debug_Round_512:
     pushq   %rsi                     #save two regs for BLK_BITS-specific parms
     pushq   %rdi
   .irp _Rn_,8,9,10,11,12,13,14,15    #save X[] state on stack so debug 
routines can access it
-    movq    %r\_Rn_,X_stk+8*(_Rn_-8)+F_O(%rbp)
+    movq    %r\_Rn_,X_stk+8*(\_Rn_-8)+F_O(%rbp)
   .endr
     movq    ctxPtr+F_O(%rbp),%rsi    #ctx_hdr_ptr
     movq    $512,%rdi                #now <rdi,rsi,rdx> are set for the call
@@ -968,50 +969,50 @@ rIdx_offs = tmpStk_1024
 #
 .macro r1024_Mix w0,w1,reg0,reg1,_RN0_,_Rn1_,op1
     addReg      \reg0 , \reg1                      #perform the MIX
-    RotL64      \reg1 , 1024,%((_RN0_) % 8),_Rn1_
+    RotL64      \reg1 , 1024,%((\_RN0_) % 8),\_Rn1_
     xorReg      \reg1 , \reg0
-.if ((_RN0_) && 3) == 3         #time to do key injection?
+.if ((\_RN0_) && 3) == 3        #time to do key injection?
  .if _SKEIN_DEBUG
-    movq       %\reg0 , xDebug_1024+8*w0(%rsp)     #save intermediate values 
for Debug_Round
-    movq       %\reg1 , xDebug_1024+8*w1(%rsp)     # (before inline key 
injection)
+    movq       %\reg0 , xDebug_1024+8*\w0(%rsp)    #save intermediate values 
for Debug_Round
+    movq       %\reg1 , xDebug_1024+8*\w1(%rsp)    # (before inline key 
injection)
  .endif
-_II_ = ((_RN0_)/4)+1            #injection count
+_II_ = ((\_RN0_)/4)+1           #injection count
  .if SKEIN_ASM_UNROLL && 1024   #here to do fully unrolled key injection
-    addq        ksKey+ 8*((_II_+w0) % 17)(%rsp),%\reg0
-    addq        ksKey+ 8*((_II_+w1) % 17)(%rsp),%\reg1
-  .if     w1 == 13                                 #tweak injection
+    addq        ksKey+ 8*((_II_+\w0) % 17)(%rsp),%\reg0
+    addq        ksKey+ 8*((_II_+\w1) % 17)(%rsp),%\reg1
+  .if     \w1 == 13                                #tweak injection
     addq        ksTwk+ 8*((_II_+ 0) %  3)(%rsp),%\reg1
-  .elseif w0 == 14
+  .elseif \w0 == 14
     addq        ksTwk+ 8*((_II_+ 1) %  3)(%rsp),%\reg0
-  .elseif w1 == 15
+  .elseif \w1 == 15
     addq        $_II_, %\reg1                      #(injection counter)
   .endif
  .else                          #here to do looping  key injection
-  .if  (w0 == 0)
-    movq        %rdi, X_stk+8*w0(%rsp)             #if so, store N0 so we can 
use reg as index
+  .if  (\w0 == 0)
+    movq        %rdi, X_stk+8*\w0(%rsp)            #if so, store N0 so we can 
use reg as index
     movq         rIdx_offs(%rsp),%rdi              #get the injection counter 
index into rdi
   .else
-    addq         ksKey+8+8*w0(%rsp,%rdi,8),%\reg0  #even key injection
+    addq         ksKey+8+8*\w0(%rsp,%rdi,8),%\reg0 #even key injection
   .endif
-  .if     w1 == 13                                 #tweak injection
+  .if     \w1 == 13                                #tweak injection
     addq         ksTwk+8+8* 0(%rsp,%rdi,8),%\reg1  
-  .elseif w0 == 14
+  .elseif \w0 == 14
     addq         ksTwk+8+8* 1(%rsp,%rdi,8),%\reg0  
-  .elseif w1 == 15
+  .elseif \w1 == 15
     addReg      \reg1,rdi,,,1                      #(injection counter)
   .endif
-    addq         ksKey+8+8*w1(%rsp,%rdi,8),%\reg1  #odd key injection
+    addq         ksKey+8+8*\w1(%rsp,%rdi,8),%\reg1 #odd key injection
  .endif
 .endif
     # insert the op provided, .if any
-    op1
+    \op1
 .endm
 #################
 # MACRO: four rounds for 1024-bit blocks
 #
 .macro r1024_FourRounds _RR_    #RR = base round number (0 mod 4)
     # should be here with X4 set properly, X6 stored on stack
-_Rn_ = (_RR_) + 0
+_Rn_ = (\_RR_) + 0
         r1024_Mix  0, 1,rdi,rsi,_Rn_,0
         r1024_Mix  2, 3,rbp,rax,_Rn_,1
         r1024_Mix  4, 5,rcx,rbx,_Rn_,2,<movq %rcx,X_stk+8*4(%rsp)>       #save 
X4  on  stack (x4/x6 alternate)
@@ -1023,7 +1024,7 @@ _Rn_ = (_RR_) + 0
     .if _SKEIN_DEBUG
       Skein_Debug_Round 1024,%(_Rn_+1)
     .endif
-_Rn_ = (_RR_) + 1
+_Rn_ = (\_RR_) + 1
         r1024_Mix  0, 9,rdi,r9 ,_Rn_,0
         r1024_Mix  2,13,rbp,r13,_Rn_,1
         r1024_Mix  6,11,rcx,r11,_Rn_,2,<movq %rcx,X_stk+8*6(%rsp)>       #save 
X6  on  stack (x4/x6 alternate)
@@ -1035,7 +1036,7 @@ _Rn_ = (_RR_) + 1
     .if _SKEIN_DEBUG
       Skein_Debug_Round 1024,%(_Rn_+1)
     .endif
-_Rn_ = (_RR_) + 2
+_Rn_ = (\_RR_) + 2
         r1024_Mix  0, 7,rdi,rdx,_Rn_,0
         r1024_Mix  2, 5,rbp,rbx,_Rn_,1
         r1024_Mix  4, 3,rcx,rax,_Rn_,2,<movq %rcx,X_stk+8*4(%rsp)>       #save 
X4  on  stack (x4/x6 alternate)
@@ -1047,7 +1048,7 @@ _Rn_ = (_RR_) + 2
     .if _SKEIN_DEBUG
       Skein_Debug_Round 1024,%(_Rn_+1)
     .endif
-_Rn_ = (_RR_) + 3
+_Rn_ = (\_RR_) + 3
         r1024_Mix  0,15,rdi,r15,_Rn_,0
         r1024_Mix  2,11,rbp,r11,_Rn_,1
         r1024_Mix  6,13,rcx,r13,_Rn_,2,<movq %rcx,X_stk+8*6(%rsp)>       #save 
X6  on  stack (x4/x6 alternate)
@@ -1116,13 +1117,13 @@ Skein1024_block_loop:
 
     # the logic here assumes the set {rdi,rsi,rbp,rax} = X[0,1,2,3]
     .irp _rN_,0,1,2,3,4,6                  #process the "initial" words, using 
r14/r15 as temps
-      movq       X_VARS+8*_rN_(%rdi),%r14  #get state word
-      movq              8*_rN_(%rsi),%r15  #get msg   word
+      movq       X_VARS+8*\_rN_(%rdi),%r14 #get state word
+      movq              8*\_rN_(%rsi),%r15 #get msg   word
       xorq  %r14,%rax                      #update key schedule overall parity
-      movq  %r14,ksKey +8*_rN_+F_O(%rbp)   #save key schedule word on stack
-      movq  %r15,Wcopy +8*_rN_+F_O(%rbp)   #save local msg Wcopy 
+      movq  %r14,ksKey +8*\_rN_+F_O(%rbp)  #save key schedule word on stack
+      movq  %r15,Wcopy +8*\_rN_+F_O(%rbp)  #save local msg Wcopy
       addq  %r15,%r14                      #do the initial key injection
-      movq  %r14,X_stk +8*_rN_    (%rsp)   #save initial state var on stack
+      movq  %r14,X_stk +8*\_rN_    (%rsp)  #save initial state var on stack
     .endr
     # now process the rest, using the "real" registers 
     #     (MUST do it in reverse order to inject tweaks r8/r9 first)
@@ -1135,9 +1136,9 @@ _oo_ = o1K_\_rr_                           #offset ass
       movq  %rcx,Wcopy+8*_oo_+F_O(%rbp)    #save copy of msg word for 
feedforward
       addq  %rcx,%\_rr_                    #do the initial  key  injection
       .if    _oo_ == 13                    #do the initial tweak injection
-        addReg _rr_,r8                     #          (only in words 13/14)
+        addReg \_rr_,r8                    #          (only in words 13/14)
       .elseif _oo_ == 14
-        addReg _rr_,r9 
+        addReg \_rr_,r9
       .endif
     .endr
     movq    %rax,ksKey+8*WCNT+F_O(%rbp)    #save key schedule parity
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to