Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * arch/alpha/lib/csum_ipv6_magic.S
0004  * Contributed by Richard Henderson <rth@tamu.edu>
0005  *
0006  * unsigned short csum_ipv6_magic(struct in6_addr *saddr,
0007  *                                struct in6_addr *daddr,
0008  *                                __u32 len,
0009  *                                unsigned short proto,
0010  *                                unsigned int csum);
0011  *
0012  * Misalignment handling (which costs 16 instructions / 8 cycles)
0013  * added by Ivan Kokshaysky <ink@jurassic.park.msu.ru>
0014  */
0015 
0016 #include <asm/export.h>
0017     .globl csum_ipv6_magic
0018     .align 4
0019     .ent csum_ipv6_magic
0020     .frame $30,0,$26,0
0021 csum_ipv6_magic:
0022     .prologue 0
0023 
0024     ldq_u   $0,0($16)   # e0    : load src & dst addr words
0025     zapnot  $20,15,$20  # .. e1 : zero extend incoming csum
0026     extqh   $18,1,$4    # e0    : byte swap len & proto while we wait
0027     ldq_u   $21,7($16)  # .. e1 : handle misalignment
0028 
0029     extbl   $18,1,$5    # e0    :
0030     ldq_u   $1,8($16)   # .. e1 :
0031     extbl   $18,2,$6    # e0    :
0032     ldq_u   $22,15($16) # .. e1 :
0033 
0034     extbl   $18,3,$18   # e0    :
0035     ldq_u   $2,0($17)   # .. e1 :
0036     sra $4,32,$4    # e0    :
0037     ldq_u   $23,7($17)  # .. e1 :
0038 
0039     extql   $0,$16,$0   # e0    :
0040     ldq_u   $3,8($17)   # .. e1 :
0041     extqh   $21,$16,$21 # e0    :
0042     ldq_u   $24,15($17) # .. e1 :
0043 
0044     sll $5,16,$5    # e0    :
0045     or  $0,$21,$0   # .. e1 : 1st src word complete
0046     extql   $1,$16,$1   # e0    :
0047     addq    $20,$0,$20  # .. e1 : begin summing the words
0048 
0049     extqh   $22,$16,$22 # e0    :
0050     cmpult  $20,$0,$0   # .. e1 :
0051     sll $6,8,$6     # e0    :
0052     or  $1,$22,$1   # .. e1 : 2nd src word complete
0053 
0054     extql   $2,$17,$2   # e0    :
0055     or  $4,$18,$18  # .. e1 :
0056     extqh   $23,$17,$23 # e0    :
0057     or  $5,$6,$5    # .. e1 :
0058 
0059     extql   $3,$17,$3   # e0    :
0060     or  $2,$23,$2   # .. e1 : 1st dst word complete
0061     extqh   $24,$17,$24 # e0    :
0062     or  $18,$5,$18  # .. e1 : len complete
0063 
0064     extwh   $19,7,$7    # e0    :
0065     or  $3,$24,$3   # .. e1 : 2nd dst word complete
0066     extbl   $19,1,$19   # e0    :
0067     addq    $20,$1,$20  # .. e1 :
0068 
0069     or  $19,$7,$19  # e0    :
0070     cmpult  $20,$1,$1   # .. e1 :
0071     sll $19,48,$19  # e0    :
0072     nop         # .. e0 :
0073 
0074     sra $19,32,$19  # e0    : proto complete
0075     addq    $20,$2,$20  # .. e1 :
0076     cmpult  $20,$2,$2   # e0    :
0077     addq    $20,$3,$20  # .. e1 :
0078 
0079     cmpult  $20,$3,$3   # e0    :
0080     addq    $20,$18,$20 # .. e1 :
0081     cmpult  $20,$18,$18 # e0    :
0082     addq    $20,$19,$20 # .. e1 :
0083 
0084     cmpult  $20,$19,$19 # e0    :
0085     addq    $0,$1,$0    # .. e1 : merge the carries back into the csum
0086     addq    $2,$3,$2    # e0    :
0087     addq    $18,$19,$18 # .. e1 :
0088 
0089     addq    $0,$2,$0    # e0    :
0090     addq    $20,$18,$20 # .. e1 :
0091     addq    $0,$20,$0   # e0    :
0092     unop            #       :
0093 
0094     extwl   $0,2,$2     # e0    : begin folding the 64-bit value
0095     zapnot  $0,3,$3     # .. e1 :
0096     extwl   $0,4,$1     # e0    :
0097     addq    $2,$3,$3    # .. e1 :
0098 
0099     extwl   $0,6,$0     # e0    :
0100     addq    $3,$1,$3    # .. e1 :
0101     addq    $0,$3,$0    # e0    :
0102     unop            #       :
0103 
0104     extwl   $0,2,$1     # e0    : fold 18-bit value
0105     zapnot  $0,3,$0     # .. e1 :
0106     addq    $0,$1,$0    # e0    :
0107     unop            #       :
0108 
0109     extwl   $0,2,$1     # e0    : fold 17-bit value
0110     zapnot  $0,3,$0     # .. e1 :
0111     addq    $0,$1,$0    # e0    :
0112     not $0,$0       # .. e1 : and complement.
0113 
0114     zapnot  $0,3,$0     # e0    :
0115     ret         # .. e1 :
0116 
0117     .end csum_ipv6_magic
0118     EXPORT_SYMBOL(csum_ipv6_magic)