root/arch/alpha/lib/csum_ipv6_magic.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * arch/alpha/lib/csum_ipv6_magic.S
   4  * Contributed by Richard Henderson <rth@tamu.edu>
   5  *
   6  * unsigned short csum_ipv6_magic(struct in6_addr *saddr,
   7  *                                struct in6_addr *daddr,
   8  *                                __u32 len,
   9  *                                unsigned short proto,
  10  *                                unsigned int csum);
  11  *
  12  * Misalignment handling (which costs 16 instructions / 8 cycles)
  13  * added by Ivan Kokshaysky <ink@jurassic.park.msu.ru>
  14  */
  15 
  16 #include <asm/export.h>
  17         .globl csum_ipv6_magic
  18         .align 4
  19         .ent csum_ipv6_magic
  20         .frame $30,0,$26,0
  21 csum_ipv6_magic:
  22         .prologue 0
  23 
  24         ldq_u   $0,0($16)       # e0    : load src & dst addr words
  25         zapnot  $20,15,$20      # .. e1 : zero extend incoming csum
  26         extqh   $18,1,$4        # e0    : byte swap len & proto while we wait
  27         ldq_u   $21,7($16)      # .. e1 : handle misalignment
  28 
  29         extbl   $18,1,$5        # e0    :
  30         ldq_u   $1,8($16)       # .. e1 :
  31         extbl   $18,2,$6        # e0    :
  32         ldq_u   $22,15($16)     # .. e1 :
  33 
  34         extbl   $18,3,$18       # e0    :
  35         ldq_u   $2,0($17)       # .. e1 :
  36         sra     $4,32,$4        # e0    :
  37         ldq_u   $23,7($17)      # .. e1 :
  38 
  39         extql   $0,$16,$0       # e0    :
  40         ldq_u   $3,8($17)       # .. e1 :
  41         extqh   $21,$16,$21     # e0    :
  42         ldq_u   $24,15($17)     # .. e1 :
  43 
  44         sll     $5,16,$5        # e0    :
  45         or      $0,$21,$0       # .. e1 : 1st src word complete
  46         extql   $1,$16,$1       # e0    :
  47         addq    $20,$0,$20      # .. e1 : begin summing the words
  48 
  49         extqh   $22,$16,$22     # e0    :
  50         cmpult  $20,$0,$0       # .. e1 :
  51         sll     $6,8,$6         # e0    :
  52         or      $1,$22,$1       # .. e1 : 2nd src word complete
  53 
  54         extql   $2,$17,$2       # e0    :
  55         or      $4,$18,$18      # .. e1 :
  56         extqh   $23,$17,$23     # e0    :
  57         or      $5,$6,$5        # .. e1 :
  58 
  59         extql   $3,$17,$3       # e0    :
  60         or      $2,$23,$2       # .. e1 : 1st dst word complete
  61         extqh   $24,$17,$24     # e0    :
  62         or      $18,$5,$18      # .. e1 : len complete
  63 
  64         extwh   $19,7,$7        # e0    :
  65         or      $3,$24,$3       # .. e1 : 2nd dst word complete
  66         extbl   $19,1,$19       # e0    :
  67         addq    $20,$1,$20      # .. e1 :
  68 
  69         or      $19,$7,$19      # e0    :
  70         cmpult  $20,$1,$1       # .. e1 :
  71         sll     $19,48,$19      # e0    :
  72         nop                     # .. e0 :
  73 
  74         sra     $19,32,$19      # e0    : proto complete
  75         addq    $20,$2,$20      # .. e1 :
  76         cmpult  $20,$2,$2       # e0    :
  77         addq    $20,$3,$20      # .. e1 :
  78 
  79         cmpult  $20,$3,$3       # e0    :
  80         addq    $20,$18,$20     # .. e1 :
  81         cmpult  $20,$18,$18     # e0    :
  82         addq    $20,$19,$20     # .. e1 :
  83 
  84         cmpult  $20,$19,$19     # e0    :
  85         addq    $0,$1,$0        # .. e1 : merge the carries back into the csum
  86         addq    $2,$3,$2        # e0    :
  87         addq    $18,$19,$18     # .. e1 :
  88 
  89         addq    $0,$2,$0        # e0    :
  90         addq    $20,$18,$20     # .. e1 :
  91         addq    $0,$20,$0       # e0    :
  92         unop                    #       :
  93 
  94         extwl   $0,2,$2         # e0    : begin folding the 64-bit value
  95         zapnot  $0,3,$3         # .. e1 :
  96         extwl   $0,4,$1         # e0    :
  97         addq    $2,$3,$3        # .. e1 :
  98 
  99         extwl   $0,6,$0         # e0    :
 100         addq    $3,$1,$3        # .. e1 :
 101         addq    $0,$3,$0        # e0    :
 102         unop                    #       :
 103 
 104         extwl   $0,2,$1         # e0    : fold 18-bit value
 105         zapnot  $0,3,$0         # .. e1 :
 106         addq    $0,$1,$0        # e0    :
 107         unop                    #       :
 108 
 109         extwl   $0,2,$1         # e0    : fold 17-bit value
 110         zapnot  $0,3,$0         # .. e1 :
 111         addq    $0,$1,$0        # e0    :
 112         not     $0,$0           # .. e1 : and complement.
 113 
 114         zapnot  $0,3,$0         # e0    :
 115         ret                     # .. e1 :
 116 
 117         .end csum_ipv6_magic
 118         EXPORT_SYMBOL(csum_ipv6_magic)

/* [<][>][^][v][top][bottom][index][help] */