aboutsummaryrefslogtreecommitdiffstats
path: root/modules/asm_ia32/asm_macr.h
blob: 392b05d5b8bc6f8a0a6a97f3d65cafeab3dd71aa (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*************************************************
* Assembly Macros Header File                    *
* (C) 1999-2008 Jack Lloyd                       *
*************************************************/

#ifndef BOTAN_EXT_IA32_ASM_MACROS_H__
#define BOTAN_EXT_IA32_ASM_MACROS_H__

#ifdef __ELF__
.section .note.GNU-stack,"",%progbits
#endif

/*************************************************
* General/Global Macros                          *
*************************************************/
#define ALIGN .p2align 4,,15

#define START_LISTING(FILENAME) \
   .file #FILENAME;             \
   .text;                       \
   .p2align 4,,15;

#ifdef __ELF__
.section .note.GNU-stack,"",%progbits
#endif

/*************************************************
* Function Definitions                           *
*************************************************/
#define START_FUNCTION(func_name) \
   .align   8;                    \
   ALIGN;                         \
   .global  func_name;            \
   .type    func_name,@function;  \
func_name:

#define END_FUNCTION(func_name) \
   ret

/*************************************************
* Loop Control                                   *
*************************************************/
#define START_LOOP(LABEL) \
   ALIGN;                 \
   LABEL##_LOOP:

#define LOOP_UNTIL_EQ(REG, NUM, LABEL) \
   cmpl IMM(NUM), REG;                 \
   jne LABEL##_LOOP

#define LOOP_UNTIL_LT(REG, NUM, LABEL) \
   cmpl IMM(NUM), REG;                 \
   jge LABEL##_LOOP

/*************************************************
 Conditional Jumps                              *
*************************************************/
#define JUMP_IF_ZERO(REG, LABEL) \
   cmpl IMM(0), REG;             \
   jz LABEL

#define JUMP_IF_LT(REG, NUM, LABEL) \
   cmpl IMM(NUM), REG;              \
   jl LABEL

/*************************************************
* Register Names                                 *
*************************************************/
#define EAX %eax
#define EBX %ebx
#define ECX %ecx
#define EDX %edx
#define EBP %ebp
#define EDI %edi
#define ESI %esi
#define ESP %esp

/*************************************************
* Memory Access Operations                       *
*************************************************/
#define ARRAY1(REG, NUM) (NUM)(REG)
#define ARRAY4(REG, NUM) 4*(NUM)(REG)
#define ARRAY4_INDIRECT(BASE, OFFSET, NUM) 4*(NUM)(BASE,OFFSET,4)
#define ARG(NUM) 4*(PUSHED) + ARRAY4(ESP, NUM)

#define ASSIGN(TO, FROM) movl FROM, TO
#define ASSIGN_BYTE(TO, FROM) movzbl FROM, TO

#define PUSH(REG) pushl REG
#define POP(REG) popl REG

#define SPILL_REGS() \
   PUSH(EBP) ; \
   PUSH(EDI) ; \
   PUSH(ESI) ; \
   PUSH(EBX)

#define RESTORE_REGS() \
   POP(EBX) ;  \
   POP(ESI) ;  \
   POP(EDI) ;  \
   POP(EBP)

/*************************************************
* ALU Operations                                 *
*************************************************/
#define IMM(VAL) $VAL

#define ADD(TO, FROM) addl FROM, TO
#define ADD_IMM(TO, NUM) ADD(TO, IMM(NUM))
#define ADD_W_CARRY(TO1, TO2, FROM) addl FROM, TO1; adcl IMM(0), TO2;
#define SUB_IMM(TO, NUM) subl IMM(NUM), TO
#define ADD2_IMM(TO, FROM, NUM) leal NUM(FROM), TO
#define ADD3_IMM(TO, FROM, NUM) leal NUM(TO,FROM,1), TO
#define MUL(REG) mull REG

#define SHL_IMM(REG, SHIFT) shll IMM(SHIFT), REG
#define SHR_IMM(REG, SHIFT) shrl IMM(SHIFT), REG
#define SHL2_3(TO, FROM) leal 0(,FROM,8), TO

#define XOR(TO, FROM) xorl FROM, TO
#define AND(TO, FROM) andl FROM, TO
#define OR(TO, FROM) orl FROM, TO
#define NOT(REG) notl REG
#define ZEROIZE(REG) XOR(REG, REG)

#define ROTL_IMM(REG, NUM) roll IMM(NUM), REG
#define ROTR_IMM(REG, NUM) rorl IMM(NUM), REG
#define BSWAP(REG) bswapl REG

#endif