blob: 06de35198d1040aec1e04063900ce8907dfd1bff (
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
(***********************************************************************)
(* *)
(* OCaml *)
(* *)
(* Fabrice Le Fessant, projet Gallium, INRIA Rocquencourt *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed *)
(* under the terms of the Q Public License version 1.0. *)
(* *)
(***********************************************************************)
(** Helpers for Intel code generators *)
(* The DSL* modules expose functions to emit x86/x86_64 instructions
using a syntax close to AT&T (in particular, arguments are reversed compared
to the official Intel syntax).
Some notes:
- Unary floating point instructions such as fadd/fmul/fstp/fld/etc come with a single version
supporting both the single and double precision instructions. (As with Intel syntax.)
- A legacy bug in GAS:
https://sourceware.org/binutils/docs-2.22/as/i386_002dBugs.html#i386_002dBugs
is not replicated here. It is managed by Intel_gas.
*)
open Intel_ast
module DSL : sig
val sym: string -> arg
val emit_nat: nativeint -> arg
val int: int -> arg
val const_64: int64 -> constant
val const_32: int32 -> constant
val const_nat: nativeint -> constant
val const: int -> constant
val _cfi_startproc: unit -> unit
val _cfi_endproc: unit -> unit
val _cfi_adjust_cfa_offset: int -> unit
val _file: int -> string -> unit
val _loc: int -> int -> unit
val _text: unit -> unit
val _data: unit -> unit
val _section: string list -> string option -> string list -> unit
val _386: unit -> unit
val _model: string -> unit
val _global: string -> unit
val _align: int -> unit
val _llabel: string -> unit
val _comment: string -> unit
val _extrn: string -> data_type -> unit
val _private_extern: string -> unit
val _indirect_symbol: string -> unit
val _size: string -> constant -> unit
val _type: string -> string -> unit
val _qword: constant -> unit
val _long: constant -> unit
val _word: constant -> unit
val _byte: constant -> unit
val _ascii: string -> unit
val _space: int -> unit
val _setvar: string * constant -> unit
val _end: unit -> unit
val al: arg
val ah: arg
val cl: arg
val ax: arg
val rax: arg
val r10: arg
val r11: arg
val r14: arg
val r15: arg
val rsp: arg
val rbp: arg
val xmm15: arg
val eax: arg
val ebx: arg
val ecx: arg
val edx: arg
val ebp: arg
val esp: arg
val st0: arg
val st1: arg
end
module INS : sig
val jmp: arg -> unit
val call: arg -> unit
val set: condition -> arg -> unit
val j: condition -> arg -> unit
val je: arg -> unit
val jae: arg -> unit
val jb: arg -> unit
val jg: arg -> unit
val jbe: arg -> unit
val ja: arg -> unit
val jne: arg -> unit
val jp: arg -> unit
val ret: unit -> unit
val hlt: unit -> unit
val nop: unit -> unit
val movw: arg * arg -> unit
val decb: arg -> unit
val cmpb: arg * arg -> unit
val movb: arg * arg -> unit
val andb: arg * arg -> unit
val xorb: arg * arg -> unit
val testb: arg * arg -> unit
val movl: arg * arg -> unit
end
module INS32 : sig
include module type of INS
val addl: arg * arg -> unit
val subl: arg * arg -> unit
val andl: arg * arg -> unit
val orl: arg * arg -> unit
val xorl: arg * arg -> unit
val cmpl: arg * arg -> unit
val testl: arg * arg -> unit
val movzbl: arg * arg -> unit
val movsbl: arg * arg -> unit
val movzwl: arg * arg -> unit
val movswl: arg * arg -> unit
val sall: arg * arg -> unit
val sarl: arg * arg -> unit
val shrl: arg * arg -> unit
val imull: arg * arg option -> unit
val idivl: arg -> unit
val popl: arg -> unit
val pushl: arg -> unit
val decl: arg -> unit
val incl: arg -> unit
val leal: arg * arg -> unit
val fistpl: arg -> unit
val fildl: arg -> unit
val fchs: unit -> unit
val fabs: unit -> unit
val fadd: arg -> unit
val fsub: arg -> unit
val fdiv: arg -> unit
val fmul: arg -> unit
val fsubr: arg -> unit
val fdivr: arg -> unit
val faddp: arg * arg -> unit
val fmulp: arg * arg -> unit
val fcompp: unit -> unit
val fcomp: arg -> unit
val fld: arg -> unit
val fnstsw: arg -> unit
val fld1: unit -> unit
val fpatan: unit -> unit
val fptan: unit -> unit
val fcos: unit -> unit
val fldln2: unit -> unit
val fldlg2: unit -> unit
val fxch: arg -> unit
val fyl2x: unit -> unit
val fsin: unit -> unit
val fsqrt: unit -> unit
val fstp: arg -> unit
val fldz: unit -> unit
val fnstcw: arg -> unit
val fldcw: arg -> unit
val cltd: unit -> unit
val fsubp: arg * arg -> unit
val fsubrp: arg * arg -> unit
val fdivp: arg * arg -> unit
val fdivrp: arg * arg -> unit
end
module DSL32 : sig
include module type of DSL
val _label: string -> unit
val mem_ptr:
data_type -> ?scale:int -> ?base:reg64 -> ?sym:string ->
int -> reg64 -> arg
val mem_sym: data_type -> ?ofs:int -> string -> arg
end
module INS64 : sig
include module type of INS
val add: arg * arg -> unit
val sub: arg * arg -> unit
val and_: arg * arg -> unit
val or_: arg * arg -> unit
val xor: arg * arg -> unit
val cmp: arg * arg -> unit
val test: arg * arg -> unit
val mov: arg * arg -> unit
val movzx: arg * arg -> unit
val movsx: arg * arg -> unit
val idiv: arg -> unit
val sal: arg * arg -> unit
val sar: arg * arg -> unit
val shr: arg * arg -> unit
val imul: arg * arg option -> unit
val pop: arg -> unit
val push: arg -> unit
val lea: arg * arg -> unit
val movsd: arg * arg -> unit
val ucomisd: arg * arg -> unit
val comisd: arg * arg -> unit
val movapd: arg * arg -> unit
val xorpd: arg * arg -> unit
val andpd: arg * arg -> unit
val movsxd: arg * arg -> unit
val movss: arg * arg -> unit
val cvtss2sd: arg * arg -> unit
val cvtsd2ss: arg * arg -> unit
val cvtsi2sd: arg * arg -> unit
val cvttsd2si: arg * arg -> unit
val addsd: arg * arg -> unit
val subsd: arg * arg -> unit
val mulsd: arg * arg -> unit
val divsd: arg * arg -> unit
val sqrtsd: arg * arg -> unit
val cqo: unit -> unit
val inc: arg -> unit
val dec: arg -> unit
val xchg: arg * arg -> unit
val bswap: arg -> unit
end
module DSL64 : sig
include module type of DSL
val _label: string -> unit
val mem_ptr:
data_type -> ?scale:int -> ?base:reg64 ->
int -> reg64 -> arg
val from_rip: data_type -> ?ofs:int -> string -> arg
end
|