Botan 1.10.17

asm_x86_32.h
Go to the documentation of this file.
1 /*
2 * Assembly Macros for 32-bit x86
3 * (C) 1999-2008 Jack Lloyd
4 *
5 * Distributed under the terms of the Botan license
6 */
7
8 #ifndef BOTAN_ASM_MACROS_X86_32_H__
9 #define BOTAN_ASM_MACROS_X86_32_H__
10
11 /*
12 * General/Global Macros
13 */
14 #define ALIGN .p2align 4,,15
15
16 #define START_LISTING(FILENAME) \
17 .file #FILENAME; \
18 .text; \
19 ALIGN;
20
21 #if defined(__ELF__)
22 .section .note.GNU-stack,"",%progbits
23 #endif
24
25 /*
26 * Function Definitions
27 */
28 #define START_FUNCTION(func_name) \
29 ALIGN; \
30 .global func_name; \
31 .type func_name,@function; \
32 func_name:
33
34 #define END_FUNCTION(func_name) \
35 ret
36
37 /*
38 * Loop Control
39 */
40 #define START_LOOP(LABEL) \
41 ALIGN; \
42 LABEL##_LOOP:
43
44 #define LOOP_UNTIL_EQ(REG, NUM, LABEL) \
45 cmpl IMM(NUM), REG; \
46 jne LABEL##_LOOP
47
48 #define LOOP_UNTIL_LT(REG, NUM, LABEL) \
49 cmpl IMM(NUM), REG; \
50 jge LABEL##_LOOP
51
52 /*
53 Conditional Jumps
54 */
55 #define JUMP_IF_ZERO(REG, LABEL) \
56 cmpl IMM(0), REG; \
57 jz LABEL
58
59 #define JUMP_IF_LT(REG, NUM, LABEL) \
60 cmpl IMM(NUM), REG; \
61 jl LABEL
62
63 /*
64 * Register Names
65 */
66 #define EAX %eax
67 #define EBX %ebx
68 #define ECX %ecx
69 #define EDX %edx
70 #define EBP %ebp
71 #define EDI %edi
72 #define ESI %esi
73 #define ESP %esp
74
75 /*
76 * Memory Access Operations
77 */
78 #define ARRAY1(REG, NUM) (NUM)(REG)
79 #define ARRAY4(REG, NUM) 4*(NUM)(REG)
80 #define ARRAY4_INDIRECT(BASE, OFFSET, NUM) 4*(NUM)(BASE,OFFSET,4)
81 #define ARG(NUM) 4*(PUSHED) + ARRAY4(ESP, NUM)
82
83 #define ASSIGN(TO, FROM) movl FROM, TO
84 #define ASSIGN_BYTE(TO, FROM) movzbl FROM, TO
85
86 #define PUSH(REG) pushl REG
87 #define POP(REG) popl REG
88
89 #define SPILL_REGS() \
90 PUSH(EBP) ; \
91 PUSH(EDI) ; \
92 PUSH(ESI) ; \
93 PUSH(EBX)
94
95 #define RESTORE_REGS() \
96 POP(EBX) ; \
97 POP(ESI) ; \
98 POP(EDI) ; \
99 POP(EBP)
100
101 /*
102 * ALU Operations
103 */
104 #define IMM(VAL) $VAL
105
106 #define ADD(TO, FROM) addl FROM, TO
107 #define ADD_IMM(TO, NUM) ADD(TO, IMM(NUM))
108 #define ADD_W_CARRY(TO1, TO2, FROM) addl FROM, TO1; adcl IMM(0), TO2;
109 #define SUB_IMM(TO, NUM) subl IMM(NUM), TO
110 #define ADD2_IMM(TO, FROM, NUM) leal NUM(FROM), TO
111 #define ADD3_IMM(TO, FROM, NUM) leal NUM(TO,FROM,1), TO
112 #define MUL(REG) mull REG
113
114 #define SHL_IMM(REG, SHIFT) shll IMM(SHIFT), REG
115 #define SHR_IMM(REG, SHIFT) shrl IMM(SHIFT), REG
116 #define SHL2_3(TO, FROM) leal 0(,FROM,8), TO
117
118 #define XOR(TO, FROM) xorl FROM, TO
119 #define AND(TO, FROM) andl FROM, TO
120 #define OR(TO, FROM) orl FROM, TO
121 #define NOT(REG) notl REG
122 #define ZEROIZE(REG) XOR(REG, REG)
123
124 #define ROTL_IMM(REG, NUM) roll IMM(NUM), REG
125 #define ROTR_IMM(REG, NUM) rorl IMM(NUM), REG
126 #define BSWAP(REG) bswapl REG
127
128 #endif