1 /// -*- mode: asm; asm-comment-char: ?/ -*-
3 /// Fancy SIMD implementation of Salsa20
5 /// (c) 2015 Straylight/Edgeware
8 ///----- Licensing notice ---------------------------------------------------
10 /// This file is part of Catacomb.
12 /// Catacomb is free software; you can redistribute it and/or modify
13 /// it under the terms of the GNU Library General Public License as
14 /// published by the Free Software Foundation; either version 2 of the
15 /// License, or (at your option) any later version.
17 /// Catacomb is distributed in the hope that it will be useful,
18 /// but WITHOUT ANY WARRANTY; without even the implied warranty of
19 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 /// GNU Library General Public License for more details.
22 /// You should have received a copy of the GNU Library General Public
23 /// License along with Catacomb; if not, write to the Free
24 /// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25 /// MA 02111-1307, USA.
27 ///--------------------------------------------------------------------------
28 /// General definitions.
30 // Announcing an external function.
34 .macro ENDFUNC; _ENDFUNC(name); .endm; \
39 // Marking the end of a function.
40 #define _ENDFUNC(name) \
45 ///--------------------------------------------------------------------------
46 /// ELF-specific hacking.
50 #if __PIC__ || __PIE__
54 #define TYPE_FUNC(name) .type name, STT_FUNC
56 #define SIZE_OBJ(name) .size name, . - name
60 ///--------------------------------------------------------------------------
61 /// Windows-specific hacking.
66 # define F(name) _##name
71 ///--------------------------------------------------------------------------
72 /// x86- and amd64-specific hacking.
74 /// It's (slightly) easier to deal with both of these in one go.
76 #if CPUFAM_X86 || CPUFAM_AMD64
78 // Set the function hooks.
79 #define FUNC_PREHOOK(_) .balign 16
81 // Don't use the wretched AT&T syntax. It's festooned with pointless
82 // punctuation, and all of the data movement is backwards. Ugh!
83 .intel_syntax noprefix
85 // Call external subroutine at ADDR, possibly via PLT.
94 // Do I need to arrange a spare GOT register?
95 #if WANT_PIC && CPUFAM_X86
98 #define GOTREG ebx // Not needed in AMD64 so don't care.
100 // Maybe load GOT address into GOT.
101 .macro ldgot got=GOTREG
102 #if WANT_PIC && CPUFAM_X86
103 call _where_am_i.\got
104 add \got, offset _GLOBAL_OFFSET_TABLE_
108 // Maybe build a helper subroutine for `ldgot GOT'.
109 .macro gotaux got=GOTREG
110 #if WANT_PIC && CPUFAM_X86
118 // Load address of external symbol ADDR into REG, maybe using GOT.
119 .macro leaext reg, addr, got=GOTREG
122 mov \reg, [\got + \addr@GOT]
125 mov \reg, \addr@GOTPCREL[rip]
129 mov \reg, offset \addr
137 // Address expression (possibly using a base register, and a displacement)
138 // referring to ADDR, which is within our module, maybe using GOT.
139 #define INTADDR(...) INTADDR__0(__VA_ARGS__, GOTREG, dummy)
140 #define INTADDR__0(addr, got, ...) INTADDR__1(addr, got)
142 # define INTADDR__1(addr, got) addr + rip
144 # define INTADDR__1(addr, got) got + addr@GOTOFF
146 # define INTADDR__1(addr, got) addr
151 ///--------------------------------------------------------------------------
154 // Default values for the various hooks.
156 # define FUNC_PREHOOK(name)
158 #ifndef FUNC_POSTHOOK
159 # define FUNC_POSTHOOK(name)
162 # define ENDFUNC_HOOK(name)
166 # define F(name) name
170 # define TYPE_FUNC(name)
174 # define SIZE_OBJ(name)
177 ///----- That's all, folks --------------------------------------------------