1(**************************************************************************)
2(*                                                                        *)
3(*                                 OCaml                                  *)
4(*                                                                        *)
5(*         Fabrice Le Fessant, projet Gallium, INRIA Rocquencourt         *)
6(*                                                                        *)
7(*   Copyright 2014 Institut National de Recherche en Informatique et     *)
8(*     en Automatique.                                                    *)
9(*                                                                        *)
10(*   All rights reserved.  This file is distributed under the terms of    *)
11(*   the GNU Lesser General Public License version 2.1, with the          *)
12(*   special exception on linking described in the file LICENSE.          *)
13(*                                                                        *)
14(**************************************************************************)
15
16(** Helpers for Intel code generators *)
17
18(* The DSL* modules expose functions to emit x86/x86_64 instructions
19   using a syntax close to the official Intel syntax, except that
20   source and destination operands are reversed as in the AT&T
21   syntax:
22
23     mov src dst
24*)
25
26
27open X86_ast
28
29val sym: string -> arg
30val nat: nativeint -> arg
31val int: int -> arg
32val const_32: int32 -> constant
33val const_nat: nativeint -> constant
34val const: int -> constant
35val al: arg
36val ah: arg
37val cl: arg
38val ax: arg
39val rax: arg
40val r10: arg
41val r11: arg
42val r13: arg
43val r14: arg
44val r15: arg
45val rsp: arg
46val rbp: arg
47val xmm15: arg
48val eax: arg
49val ebx: arg
50val ecx: arg
51val edx: arg
52val ebp: arg
53val esp: arg
54val st0: arg
55val st1: arg
56
57val mem32:
58  data_type -> ?scale:int -> ?base:reg64 -> ?sym:string ->
59  int -> reg64 -> arg
60
61val mem64:
62  data_type -> ?scale:int -> ?base:reg64 -> ?sym:string ->
63  int -> reg64 -> arg
64
65val mem64_rip: data_type -> ?ofs:int -> string -> arg
66
67
68module D : sig
69  (** Directives *)
70
71  val align: int -> unit
72  val byte: constant -> unit
73  val bytes: string -> unit
74  val cfi_adjust_cfa_offset: int -> unit
75  val cfi_endproc: unit -> unit
76  val cfi_startproc: unit -> unit
77  val comment: string -> unit
78  val data: unit -> unit
79  val extrn: string -> data_type -> unit
80  val file: file_num:int -> file_name:string -> unit
81  val global: string -> unit
82  val indirect_symbol: string -> unit
83  val label: ?typ:data_type -> string -> unit
84  val loc: file_num:int -> line:int -> col:int -> unit
85  val long: constant -> unit
86  val mode386: unit -> unit
87  val model: string -> unit
88  val private_extern: string -> unit
89  val qword: constant -> unit
90  val section: string list -> string option -> string list -> unit
91  val setvar: string * constant -> unit
92  val size: string -> constant -> unit
93  val space: int -> unit
94  val text: unit -> unit
95  val type_: string -> string -> unit
96  val word: constant -> unit
97end
98
99module I : sig
100  (* Instructions *)
101
102  val add: arg -> arg -> unit
103  val addsd: arg -> arg -> unit
104  val and_: arg -> arg -> unit
105  val andpd: arg -> arg -> unit
106  val bswap: arg -> unit
107  val call: arg -> unit
108  val cdq: unit -> unit
109  val cmp: arg -> arg -> unit
110  val comisd: arg -> arg -> unit
111  val cqo: unit -> unit
112  val cvtsd2ss: arg -> arg -> unit
113  val cvtsi2sd: arg -> arg -> unit
114  val cvtss2sd: arg -> arg -> unit
115  val cvttsd2si: arg -> arg -> unit
116  val dec: arg -> unit
117  val divsd: arg -> arg -> unit
118  val fabs: unit -> unit
119  val fadd: arg -> unit
120  val faddp: arg -> arg -> unit
121  val fchs: unit -> unit
122  val fcomp: arg -> unit
123  val fcompp: unit -> unit
124  val fcos: unit -> unit
125  val fdiv: arg -> unit
126  val fdivp: arg -> arg -> unit
127  val fdivr: arg -> unit
128  val fdivrp: arg -> arg -> unit
129  val fild: arg -> unit
130  val fistp: arg -> unit
131  val fld1: unit -> unit
132  val fld: arg -> unit
133  val fldcw: arg -> unit
134  val fldlg2: unit -> unit
135  val fldln2: unit -> unit
136  val fldz: unit -> unit
137  val fmul: arg -> unit
138  val fmulp: arg -> arg -> unit
139  val fnstcw: arg -> unit
140  val fnstsw: arg -> unit
141  val fpatan: unit -> unit
142  val fptan: unit -> unit
143  val fsin: unit -> unit
144  val fsqrt: unit -> unit
145  val fstp: arg -> unit
146  val fsub: arg -> unit
147  val fsubp: arg -> arg -> unit
148  val fsubr: arg -> unit
149  val fsubrp: arg -> arg -> unit
150  val fxch: arg -> unit
151  val fyl2x: unit -> unit
152  val hlt: unit -> unit
153  val idiv: arg -> unit
154  val imul: arg -> arg option -> unit
155  val inc: arg -> unit
156  val j: condition -> arg -> unit
157  val ja: arg -> unit
158  val jae: arg -> unit
159  val jb: arg -> unit
160  val jbe: arg -> unit
161  val je: arg -> unit
162  val jg: arg -> unit
163  val jmp: arg -> unit
164  val jne: arg -> unit
165  val jp: arg -> unit
166  val lea: arg -> arg -> unit
167  val mov: arg -> arg -> unit
168  val movapd: arg -> arg -> unit
169  val movsd: arg -> arg -> unit
170  val movss: arg -> arg -> unit
171  val movsx: arg -> arg -> unit
172  val movsxd: arg -> arg -> unit
173  val movzx: arg -> arg -> unit
174  val mulsd: arg -> arg -> unit
175  val nop: unit -> unit
176  val or_: arg -> arg -> unit
177  val pop: arg -> unit
178  val push: arg -> unit
179  val ret: unit -> unit
180  val sal: arg -> arg -> unit
181  val sar: arg -> arg -> unit
182  val set: condition -> arg -> unit
183  val shr: arg -> arg -> unit
184  val sqrtsd: arg -> arg -> unit
185  val sub: arg -> arg -> unit
186  val subsd: arg -> arg -> unit
187  val test: arg -> arg -> unit
188  val ucomisd: arg -> arg -> unit
189  val xchg: arg -> arg -> unit
190  val xor: arg -> arg -> unit
191  val xorpd: arg -> arg -> unit
192end
193