Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
N
nettle
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Brian Smith
nettle
Commits
fb49f89f
Commit
fb49f89f
authored
13 years ago
by
Niels Möller
Browse files
Options
Downloads
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
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
x86_64/serpent-encrypt.asm
+421
-8
421 additions, 8 deletions
x86_64/serpent-encrypt.asm
with
421 additions
and
8 deletions
x86_64/serpent-encrypt.asm
+
421
−
8
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
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment