Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Nettle
nettle
Commits
fb49f89f
Commit
fb49f89f
authored
Jun 20, 2011
by
Niels Möller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added an SSE2 loop, doing four blocks at a time in parallel.
Rev: nettle/x86_64/serpent-encrypt.asm:1.3
parent
0134b52f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
421 additions
and
8 deletions
+421
-8
x86_64/serpent-encrypt.asm
x86_64/serpent-encrypt.asm
+421
-8
No files found.
x86_64/serpent-encrypt.asm
View file @
fb49f89f
...
...
@@ -41,6 +41,12 @@ define(<Y1>, <%xmm5>)
define
(
<
Y2
>
,
<%
xmm6
>
)
define
(
<
Y3
>
,
<%
xmm7
>
)
define
(
<
MINUS1
>
,
<%
xmm8
>
)
define
(
<
T0
>
,
<%
xmm9
>
)
define
(
<
T1
>
,
<%
xmm10
>
)
define
(
<
T2
>
,
<%
xmm11
>
)
define
(
<
T3
>
,
<%
xmm12
>
)
C
Arguments
define
(
<
CTX
>
,
<%
rdi
>
)
define
(
<
N
>
,
<%
rsi
>
)
...
...
@@ -48,9 +54,9 @@ define(<DST>, <%rdx>)
define
(
<
SRC
>
,
<%
rcx
>
)
define
(
<
CNT
>
,
<%
r13
>
)
define
(
<
TMP
>
,
<%
r14d
>
)
C
32
-
bit
temporary
define
(
<
TMP
32
>
,
<%
r14d
>
)
C
S
box
macros.
Inputs
$
1
-
$
4
(
destroyed
),
outputs
$
5
-
$
8
C
S
BOX
macros.
Inputs
$
1
-
$
4
(
destroyed
),
outputs
$
5
-
$
8
define
(
<
SBOX0
>
,
<
mov
$
2
,
$
8
C
y3
=
x1
^
x2
...
...
@@ -160,6 +166,7 @@ define(<SBOX3>, <
mov
$
1
,
$
5
xor
$
2
,
$
5
>)
define
(
<
SBOX4
>
,
<
mov
$
1
,
$
8
or
$
2
,
$
8
...
...
@@ -272,22 +279,351 @@ define(<LT>, <
rol
<
$
>
3
,
$
3
xor
$
1
,
$
2
xor
$
3
,
$
2
mov
$
1
,
TMP
shl
<
$
>
3
,
TMP
mov
$
1
,
TMP
32
shl
<
$
>
3
,
TMP
32
xor
$
3
,
$
4
xor
TMP
,
$
4
xor
TMP
32
,
$
4
rol
$
2
rol
<
$
>
7
,
$
4
xor
$
2
,
$
1
xor
$
4
,
$
1
mov
$
2
,
TMP
shl
<
$
>
7
,
TMP
mov
$
2
,
TMP
32
shl
<
$
>
7
,
TMP
32
xor
$
4
,
$
3
xor
TMP
,
$
3
xor
TMP
32
,
$
3
rol
<
$
>
5
,
$
1
rol
<
$
>
22
,
$
3
>)
C
Parallel
operation
on
four
bl
ocks
at
a
time.
C
pnot
instruction
is
missing.
For
lack
of
a
sp
are
register
,
XOR
with
C
constant
in
memory.
define
(
<
PNOT
>
,
<
pxor
MINUS1
,
$
1
>)
define
(
<
WSBOX0
>
,
<
movdqa
$
2
,
$
8
C
y3
=
x1
^
x2
pxor
$
3
,
$
8
movdqa
$
1
,
$
5
C
y0
=
x0
|
x3
por
$
4
,
$
5
movdqa
$
1
,
$
6
C
y1
=
x0
^
x1
pxor
$
2
,
$
6
pxor
$
5
,
$
8
C
y3
^
=
y0
movdqa
$
3
,
$
7
C
y2
=
x2
|
y3
por
$
8
,
$
7
pxor
$
4
,
$
1
C
x0
^
=
x3
pand
$
4
,
$
7
C
y2
&
=
x3
pxor
$
3
,
$
4
C
x3
^
=
x2
por
$
2
,
$
3
C
x2
|
=
x1
movdqa
$
6
,
$
5
C
y0
=
y1
&
x2
pand
$
3
,
$
5
pxor
$
5
,
$
7
C
y2
^
=
y0
pand
$
7
,
$
5
C
y0
&
=
y2
pxor
$
3
,
$
5
C
y0
^
=
x2
pand
$
1
,
$
2
C
x1
&
=
x0
pxor
$
1
,
$
5
C
y0
^
=
x0
PNOT
(
$
5
)
C
y0
=
~
y0
movdqa
$
5
,
$
6
C
y1
=
y0
^
x1
pxor
$
2
,
$
6
pxor
$
4
,
$
6
C
y1
^
=
x3
>)
define
(
<
WSBOX1
>
,
<
movdqa
$
1
,
$
6
C
y1
=
x0
|
x3
por
$
4
,
$
6
movdqa
$
3
,
$
7
C
y2
=
x2
^
x3
pxor
$
4
,
$
7
movdqa
$
2
,
$
5
C
y0
=
~
x1
PNOT
(
$
5
)
movdqa
$
1
,
$
8
C
y3
=
x0
^
x2
pxor
$
3
,
$
8
por
$
1
,
$
5
C
y0
|
=
x0
pand
$
4
,
$
8
C
y3
&
=
x3
movdqa
$
6
,
$
1
C
x0
=
y1
&
y2
pand
$
7
,
$
1
por
$
2
,
$
8
C
y3
|
=
x1
pxor
$
5
,
$
7
C
y2
^
=
y0
pxor
$
1
,
$
8
C
y3
^
=
x0
movdqa
$
6
,
$
1
C
x0
=
y1
^
y3
pxor
$
8
,
$
1
pxor
$
7
,
$
1
C
x0
^
=
y2
movdqa
$
2
,
$
6
C
y1
=
x1
&
x3
pand
$
4
,
$
6
pxor
$
1
,
$
6
C
y1
^
=
x0
movdqa
$
6
,
$
4
C
x3
=
y1
|
y3
por
$
8
,
$
4
PNOT
(
$
8
)
C
y3
=
~
y3
pand
$
4
,
$
5
C
y0
&
=
x3
pxor
$
3
,
$
5
C
y0
^
=
x2
>)
define
(
<
WSBOX2
>
,
<
movdqa
$
1
,
$
7
C
y2
=
x1
|
x2
por
$
3
,
$
7
movdqa
$
1
,
$
6
pxor
$
2
,
$
6
movdqa
$
4
,
$
8
pxor
$
7
,
$
8
movdqa
$
6
,
$
5
pxor
$
8
,
$
5
por
$
1
,
$
4
pxor
$
5
,
$
3
movdqa
$
2
,
$
1
pxor
$
3
,
$
1
por
$
2
,
$
3
pand
$
7
,
$
1
pxor
$
3
,
$
8
por
$
8
,
$
6
pxor
$
1
,
$
6
movdqa
$
8
,
$
7
pxor
$
6
,
$
7
pxor
$
2
,
$
7
PNOT
(
$
8
)
pxor
$
4
,
$
7
>)
define
(
<
WSBOX3
>
,
<
movdqa
$
1
,
$
6
pxor
$
3
,
$
6
movdqa
$
1
,
$
5
por
$
4
,
$
5
movdqa
$
1
,
$
8
pand
$
4
,
$
8
pand
$
5
,
$
6
por
$
2
,
$
8
movdqa
$
1
,
$
7
pand
$
2
,
$
7
por
$
3
,
$
7
movdqa
$
4
,
$
3
pxor
$
6
,
$
3
pxor
$
8
,
$
6
por
$
3
,
$
1
pxor
$
2
,
$
3
pand
$
4
,
$
8
pxor
$
8
,
$
5
movdqa
$
7
,
$
8
pxor
$
3
,
$
8
pxor
$
5
,
$
7
por
$
8
,
$
4
pand
$
4
,
$
2
movdqa
$
1
,
$
5
pxor
$
2
,
$
5
>)
define
(
<
WSBOX4
>
,
<
movdqa
$
1
,
$
8
por
$
2
,
$
8
movdqa
$
2
,
$
7
por
$
3
,
$
7
pxor
$
1
,
$
7
pand
$
4
,
$
8
movdqa
$
2
,
$
5
pxor
$
4
,
$
5
por
$
7
,
$
4
pand
$
4
,
$
1
pand
$
3
,
$
2
pxor
$
8
,
$
3
pxor
$
7
,
$
8
por
$
2
,
$
7
movdqa
$
8
,
$
6
pand
$
5
,
$
6
pxor
$
6
,
$
7
pxor
$
5
,
$
6
por
$
2
,
$
6
pxor
$
1
,
$
6
pand
$
4
,
$
5
pxor
$
3
,
$
5
PNOT
(
$
5
)
>)
define
(
<
WSBOX5
>
,
<
movdqa
$
2
,
$
5
por
$
4
,
$
5
pxor
$
3
,
$
5
movdqa
$
2
,
$
3
pxor
$
4
,
$
3
movdqa
$
1
,
$
7
pxor
$
3
,
$
7
pand
$
3
,
$
1
pxor
$
1
,
$
5
movdqa
$
2
,
$
8
por
$
7
,
$
8
por
$
5
,
$
2
PNOT
(
$
5
)
por
$
5
,
$
1
pxor
$
3
,
$
8
pxor
$
1
,
$
8
movdqa
$
4
,
$
6
por
$
5
,
$
6
pxor
$
6
,
$
4
pxor
$
7
,
$
6
por
$
4
,
$
7
pxor
$
2
,
$
7
>)
define
(
<
WSBOX6
>
,
<
movdqa
$
1
,
$
5
pxor
$
4
,
$
5
movdqa
$
1
,
$
6
pand
$
4
,
$
6
movdqa
$
1
,
$
7
por
$
3
,
$
7
por
$
2
,
$
4
pxor
$
3
,
$
4
pxor
$
2
,
$
1
movdqa
$
2
,
$
8
por
$
3
,
$
8
pxor
$
2
,
$
3
pand
$
5
,
$
8
pxor
$
3
,
$
6
PNOT
(
$
6
)
pand
$
6
,
$
5
pand
$
6
,
$
2
pxor
$
8
,
$
2
pxor
$
4
,
$
8
pxor
$
2
,
$
7
PNOT
(
$
7
)
pxor
$
7
,
$
5
pxor
$
1
,
$
5
>)
define
(
<
WSBOX7
>
,
<
movdqa
$
1
,
$
5
pand
$
3
,
$
5
movdqa
$
2
,
$
8
por
$
5
,
$
8
C
t04
pxor
$
3
,
$
8
movdqa
$
4
,
$
6
pandn
$
1
,
$
6
C
t02
implicit
pxor
$
6
,
$
8
movdqa
$
3
,
$
6
por
$
8
,
$
6
pxor
$
1
,
$
6
movdqa
$
1
,
$
7
pand
$
2
,
$
7
pxor
$
7
,
$
3
por
$
4
,
$
7
pxor
$
7
,
$
6
movdqa
$
2
,
$
7
por
$
5
,
$
7
C
t04
pand
$
8
,
$
7
pxor
$
6
,
$
2
por
$
2
,
$
7
pxor
$
1
,
$
7
pxor
$
6
,
$
5
PNOT
(
$
4
)
C
t02
por
$
4
,
$
5
pxor
$
3
,
$
5
>)
C
WROL
(
count
,
w
)
define
(
<
WROL
>
,
<
movdqa
$
2
,
T0
pslld
<
$
>
$
1
,
$
2
psrld
<
$
>
eval
(
32
-
$
1
),
T0
por
T0
,
$
2
>)
C
WLT
(
x0
,
x1
,
x2
,
x3
)
define
(
<
WLT
>
,
<
WROL
(
13
,
$
1
)
WROL
(
3
,
$
3
)
pxor
$
1
,
$
2
pxor
$
3
,
$
2
movdqa
$
1
,
T0
pslld
<
$
>
3
,
T0
pxor
$
3
,
$
4
pxor
T0
,
$
4
WROL
(
1
,
$
2
)
WROL
(
7
,
$
4
)
pxor
$
2
,
$
1
pxor
$
4
,
$
1
movdqa
$
2
,
T0
pslld
<
$
>
7
,
T0
pxor
$
4
,
$
3
pxor
T0
,
$
3
WROL
(
5
,
$
1
)
WROL
(
22
,
$
3
)
>)
C
Note
:
Di
agrams
use
little
-
endian
representation
,
with
least
C
si
gnificant
word
to
the
left.
C
Transpose
values
from
:
C
+----+----+----+----+
C
x0
:
|
a0
|
a1
|
a2
|
a3
|
C
x1
:
|
b0
|
b1
|
b2
|
b3
|
C
x2
:
|
c0
|
c1
|
c2
|
c3
|
C
x3
:
|
d0
|
d1
|
d2
|
d3
|
C
+----+----+----+----+
C
To
:
C
+----+----+----+----+
C
x0
:
|
a0
|
b0
|
c0
|
d0
|
C
x1
:
|
a1
|
b1
|
c1
|
d1
|
C
x2
:
|
a2
|
b2
|
c2
|
d2
|
C
x3
:
|
a3
|
b3
|
c3
|
d3
|
C
+----+----+----+----+
define
(
<
WTRANSPOSE
>
,
<
movdqa
$
1
,
T0
punpcklqdq
$
3
,
T0
C
|
a0
a1
c0
c1
|
punpckhqdq
$
3
,
$
1
C
|
a2
a3
c2
c3
|
pshufd
<
$
>
0xd8
,
T0
,
T0
C
|
a0
c0
a1
c1
|
pshufd
<
$
>
0xd8
,
$
1
,
T1
C
|
a2
c2
a3
c3
|
movdqa
$
2
,
T2
punpcklqdq
$
4
,
T2
C
|
b0
b1
d0
11
|
punpckhqdq
$
4
,
$
2
C
|
b2
b3
d2
d3
|
pshufd
<
$
>
0xd8
,
T2
,
T2
C
|
b0
d0
b1
d1
|
pshufd
<
$
>
0xd8
,
$
2
,
T3
C
|
b2
d2
b3
d3
|
movdqa
T0
,
$
1
punpckldq
T2
,
$
1
C
|
a0
b0
c0
d0
|
movdqa
T0
,
$
2
punpckhdq
T2
,
$
2
C
|
a1
b1
c1
d1
|
movdqa
T1
,
$
3
punpckldq
T3
,
$
3
C
|
a2
b2
c2
d2
|
movdqa
T1
,
$
4
punpckhdq
T3
,
$
4
C
|
a3
b3
c3
d3
|
>)
C
Copy
subkeys
,
from
:
C
C
+----+----+----+----+
C
k0
:
|
s3
|
s2
|
s1
|
s0
|
C
+----+----+----+----+
C
To
:
C
+----+----+----+----+
C
k0
:
|
s0
|
s0
|
s0
|
s0
|
C
k1
:
|
s1
|
s1
|
s1
|
s1
|
C
k2
:
|
s2
|
s2
|
s2
|
s2
|
C
k3
:
|
s3
|
s3
|
s3
|
s3
|
C
+----+----+----+----+
dnl
define
(
<
WCOPY
>
,
<
dnl
pshufd
$
55
,
$
1
,
$
2
dnl
pshufd
$
aa
,
$
1
,
$
3
dnl
pshufd
$
ff
,
$
1
,
$
4
dnl
pshufd
$
00
,
$
1
,
$
1
dnl
>
)
C
FIXME
:
Arrange
16
-
byte
al
ignment
,
so
we
can
use
movaps?
define
(
<
WKEYXOR
>
,
<
movups
$
1
(
CTX
,
CNT
),
T0
pshufd
<
$
>
0x55
,
T0
,
T1
pshufd
<
$
>
0xaa
,
T0
,
T2
pxor
T1
,
$
3
pxor
T2
,
$
4
pshufd
<
$
>
0xff
,
T0
,
T1
pshufd
<
$
>
0x00
,
T0
,
T0
pxor
T1
,
$
5
pxor
T0
,
$
2
>)
.file
"
aes
-
serpent
-
encrypt.asm
"
C
serpent_encrypt
(
struct
serpent_context
*
ctx
,
...
...
@@ -311,9 +647,86 @@ PROLOGUE(nettle_serpent_encrypt)
C
Point
at
the
final
subkey.
lea
512
(
CTX
),
CTX
cmp
$
-
64
,
N
ja
.Lwide_end
pcmpeqd
MINUS1
,
MINUS1
.Lwblock_loop:
movups
(
SRC
,
N
),
X0
movups
16
(
SRC
,
N
),
X1
movups
32
(
SRC
,
N
),
X2
movups
48
(
SRC
,
N
),
X3
WTRANSPOSE
(
X0
,
X1
,
X2
,
X3
)
mov
$
-
512
,
CNT
jmp
.Lwround_start
ALIGN
(
4
)
.Lwround_loop:
WLT
(
X0
,
X1
,
X2
,
X3
)
.Lwround_start:
WKEYXOR
(,
X0
,
X1
,
X2
,
X3
)
WSBOX0
(
X0
,
X1
,
X2
,
X3
,
Y0
,
Y1
,
Y2
,
Y3
)
WLT
(
Y0
,
Y1
,
Y2
,
Y3
)
WKEYXOR
(
16
,
Y0
,
Y1
,
Y2
,
Y3
)
WSBOX1
(
Y0
,
Y1
,
Y2
,
Y3
,
X0
,
X1
,
X2
,
X3
)
WLT
(
X0
,
X1
,
X2
,
X3
)
WKEYXOR
(
32
,
X0
,
X1
,
X2
,
X3
)
WSBOX2
(
X0
,
X1
,
X2
,
X3
,
Y0
,
Y1
,
Y2
,
Y3
)
WLT
(
Y0
,
Y1
,
Y2
,
Y3
)
WKEYXOR
(
48
,
Y0
,
Y1
,
Y2
,
Y3
)
WSBOX3
(
Y0
,
Y1
,
Y2
,
Y3
,
X0
,
X1
,
X2
,
X3
)
WLT
(
X0
,
X1
,
X2
,
X3
)
WKEYXOR
(
64
,
X0
,
X1
,
X2
,
X3
)
WSBOX4
(
X0
,
X1
,
X2
,
X3
,
Y0
,
Y1
,
Y2
,
Y3
)
WLT
(
Y0
,
Y1
,
Y2
,
Y3
)
WKEYXOR
(
80
,
Y0
,
Y1
,
Y2
,
Y3
)
WSBOX5
(
Y0
,
Y1
,
Y2
,
Y3
,
X0
,
X1
,
X2
,
X3
)
WLT
(
X0
,
X1
,
X2
,
X3
)
WKEYXOR
(
96
,
X0
,
X1
,
X2
,
X3
)
WSBOX6
(
X0
,
X1
,
X2
,
X3
,
Y0
,
Y1
,
Y2
,
Y3
)
WLT
(
Y0
,
Y1
,
Y2
,
Y3
)
WKEYXOR
(
112
,
Y0
,
Y1
,
Y2
,
Y3
)
WSBOX7
(
Y0
,
Y1
,
Y2
,
Y3
,
X0
,
X1
,
X2
,
X3
)
add
$
128
,
CNT
jnz
.Lwround_loop
C
FIXME
CNT
known
to
be
zero
,
no
index
register
needed
WKEYXOR
(,
X0
,
X1
,
X2
,
X3
)
WTRANSPOSE
(
X0
,
X1
,
X2
,
X3
)
movups
X0
,
(
DS
T
,
N
)
movups
X1
,
16
(
DS
T
,
N
)
movups
X2
,
32
(
DS
T
,
N
)
movups
X3
,
48
(
DS
T
,
N
)
C
FIXME
:
Adjust
N
,
so
we
can
use
just
jnc
without
an
extra
cmp.
add
$
64
,
N
jz
.Lend
cmp
$
-
64
,
N
jbe
.Lwblock_loop
.Lwide_end:
C
The
si
ngle
-
bl
ock
loop
here
is
slightly
slower
than
the
double
-
bl
ock
C
loop
in
serpent
-
encrypt.c.
C
FIXME
:
Should
use
non
-
ss
e2
code
only
if
we
have
a
sngle
bl
ock
left.
C
With
two
or
three
bl
ocks
,
it
should
be
better
to
do
them
in
C
parallell.
.Lblock_loop:
movl
(
SRC
,
N
),
x0
movl
4
(
SRC
,
N
),
x1
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment