1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #include <asm/export.h>
57 .globl csum_ipv6_magic
58 .align 4
59 .ent csum_ipv6_magic
60 .frame $30,0,$26,0
61 csum_ipv6_magic:
62 .prologue 0
63
64 ldq_u $0,0($16) # L : Latency: 3
65 inslh $18,7,$4 # U : 0000000000AABBCC
66 ldq_u $1,8($16) # L : Latency: 3
67 sll $19,8,$7 # U : U L U L : 0x00000000 00aabb00
68
69 and $16,7,$6 # E : src misalignment
70 ldq_u $5,15($16) # L : Latency: 3
71 zapnot $20,15,$20 # U : zero extend incoming csum
72 ldq_u $2,0($17) # L : U L U L : Latency: 3
73
74 extql $0,$6,$0 # U :
75 extqh $1,$6,$22 # U :
76 ldq_u $3,8($17) # L : Latency: 3
77 sll $19,24,$19 # U : U U L U : 0x000000aa bb000000
78
79 cmoveq $6,$31,$22 # E : src aligned?
80 ldq_u $23,15($17) # L : Latency: 3
81 inswl $18,3,$18 # U : 000000CCDD000000
82 addl $19,$7,$19 # E : U L U L : <sign bits>bbaabb00
83
84 or $0,$22,$0 # E : 1st src word complete
85 extql $1,$6,$1 # U :
86 or $18,$4,$18 # E : 000000CCDDAABBCC
87 extqh $5,$6,$5 # U : L U L U
88
89 and $17,7,$6 # E : dst misalignment
90 extql $2,$6,$2 # U :
91 or $1,$5,$1 # E : 2nd src word complete
92 extqh $3,$6,$22 # U : L U L U :
93
94 cmoveq $6,$31,$22 # E : dst aligned?
95 extql $3,$6,$3 # U :
96 addq $20,$0,$20 # E : begin summing the words
97 extqh $23,$6,$23 # U : L U L U :
98
99 srl $18,16,$4 # U : 0000000000CCDDAA
100 or $2,$22,$2 # E : 1st dst word complete
101 zap $19,0x3,$19 # U : <sign bits>bbaa0000
102 or $3,$23,$3 # E : U L U L : 2nd dst word complete
103
104 cmpult $20,$0,$0 # E :
105 addq $20,$1,$20 # E :
106 zapnot $18,0xa,$18 # U : 00000000DD00BB00
107 zap $4,0xa,$4 # U : U U L L : 0000000000CC00AA
108
109 or $18,$4,$18 # E : 00000000DDCCBBAA
110 nop # E :
111 cmpult $20,$1,$1 # E :
112 addq $20,$2,$20 # E : U L U L
113
114 cmpult $20,$2,$2 # E :
115 addq $20,$3,$20 # E :
116 cmpult $20,$3,$3 # E : (1 cycle stall on $20)
117 addq $20,$18,$20 # E : U L U L (1 cycle stall on $20)
118
119 cmpult $20,$18,$18 # E :
120 addq $20,$19,$20 # E : (1 cycle stall on $20)
121 addq $0,$1,$0 # E : merge the carries back into the csum
122 addq $2,$3,$2 # E :
123
124 cmpult $20,$19,$19 # E :
125 addq $18,$19,$18 # E : (1 cycle stall on $19)
126 addq $0,$2,$0 # E :
127 addq $20,$18,$20 # E : U L U L :
128
129
130 addq $0,$20,$0 # E :
131 zapnot $0,15,$1 # U : Start folding output (1 cycle stall on $0)
132 nop # E :
133 srl $0,32,$0 # U : U L U L : (1 cycle stall on $0)
134
135 addq $1,$0,$1 # E : Finished generating ulong
136 extwl $1,2,$2 # U : ushort[1] (1 cycle stall on $1)
137 zapnot $1,3,$0 # U : ushort[0] (1 cycle stall on $1)
138 extwl $1,4,$1 # U : ushort[2] (1 cycle stall on $1)
139
140 addq $0,$2,$0 # E
141 addq $0,$1,$3 # E : Finished generating uint
142
143 extwl $3,2,$1 # U : ushort[1] (1 cycle stall on $3)
144 nop # E : L U L U
145
146 addq $1,$3,$0 # E : Final carry
147 not $0,$4 # E : complement (1 cycle stall on $0)
148 zapnot $4,3,$0 # U : clear upper garbage bits
149
150 ret # L0 : L U L U
151
152 .end csum_ipv6_magic
153 EXPORT_SYMBOL(csum_ipv6_magic)