[486] | 1 | |
---|
| 2 | (** This file defines some common structures of several languages. *) |
---|
| 3 | |
---|
| 4 | type ident = string (* identifiers for variable and function names *) |
---|
| 5 | |
---|
| 6 | type immediate = int (* immediate values for assembler constants and offsets *) |
---|
| 7 | |
---|
| 8 | |
---|
| 9 | (* Comparison between integers or floats *) |
---|
| 10 | |
---|
| 11 | type cmp = Cmp_eq | Cmp_ne | Cmp_gt | Cmp_ge | Cmp_lt | Cmp_le |
---|
| 12 | |
---|
| 13 | (* Constants in high level languages *) |
---|
| 14 | |
---|
| 15 | type cst = |
---|
| 16 | | Cst_int of int (* integer constant *) |
---|
| 17 | | Cst_float of float (* float constant *) |
---|
| 18 | | Cst_addrsymbol of ident (* address of a global symbol *) |
---|
| 19 | | Cst_stackoffset of immediate (* offset in the stack *) |
---|
| 20 | |
---|
| 21 | (* Unary operations *) |
---|
| 22 | |
---|
| 23 | type op1 = |
---|
| 24 | | Op_cast8unsigned (**r 8-bit zero extension *) |
---|
| 25 | | Op_cast8signed (**r 8-bit sign extension *) |
---|
| 26 | | Op_cast16unsigned (**r 16-bit zero extension *) |
---|
| 27 | | Op_cast16signed (**r 16-bit sign extension *) |
---|
| 28 | | Op_negint (**r integer opposite *) |
---|
| 29 | | Op_notbool (**r boolean negation *) |
---|
| 30 | | Op_notint (**r bitwise complement *) |
---|
| 31 | | Op_negf (**r float opposite *) |
---|
| 32 | | Op_absf (**r float absolute value *) |
---|
| 33 | | Op_singleoffloat (**r float truncation *) |
---|
| 34 | | Op_intoffloat (**r signed integer to float *) |
---|
| 35 | | Op_intuoffloat (**r unsigned integer to float *) |
---|
| 36 | | Op_floatofint (**r float to signed integer *) |
---|
| 37 | | Op_floatofintu (**r float to unsigned integer *) |
---|
| 38 | | Op_id (**r identity *) |
---|
| 39 | | Op_ptrofint (**r int to pointer *) |
---|
| 40 | | Op_intofptr (**r pointer to int *) |
---|
| 41 | |
---|
| 42 | (* Binary operations *) |
---|
| 43 | |
---|
| 44 | type op2 = |
---|
| 45 | | Op_add (**r integer addition *) |
---|
| 46 | | Op_sub (**r integer subtraction *) |
---|
| 47 | | Op_mul (**r integer multiplication *) |
---|
| 48 | | Op_div (**r integer signed division *) |
---|
| 49 | | Op_divu (**r integer unsigned division *) |
---|
| 50 | | Op_mod (**r integer signed modulus *) |
---|
| 51 | | Op_modu (**r integer unsigned modulus *) |
---|
| 52 | | Op_and (**r bitwise ``and'' *) |
---|
| 53 | | Op_or (**r bitwise ``or'' *) |
---|
| 54 | | Op_xor (**r bitwise ``xor'' *) |
---|
| 55 | | Op_shl (**r left shift *) |
---|
| 56 | | Op_shr (**r right signed shift *) |
---|
| 57 | | Op_shru (**r right unsigned shift *) |
---|
| 58 | | Op_addf (**r float addition *) |
---|
| 59 | | Op_subf (**r float subtraction *) |
---|
| 60 | | Op_mulf (**r float multiplication *) |
---|
| 61 | | Op_divf (**r float division *) |
---|
| 62 | | Op_cmp of cmp (**r integer signed comparison *) |
---|
| 63 | | Op_cmpu of cmp (**r integer unsigned comparison *) |
---|
| 64 | | Op_cmpf of cmp (**r float comparison *) |
---|
| 65 | | Op_addp (**r addition for a pointer and an integer *) |
---|
| 66 | | Op_subp (**r substraction for a pointer and a integer *) |
---|
| 67 | | Op_cmpp of cmp (**r pointer comparaison *) |
---|
| 68 | |
---|
| 69 | (* Datas are used to initialize the value of variables *) |
---|
| 70 | |
---|
| 71 | type data = |
---|
| 72 | | Data_reserve of int (* only reserve some space *) |
---|
| 73 | | Data_int8 of int |
---|
| 74 | | Data_int16 of int |
---|
| 75 | | Data_int32 of int |
---|
| 76 | | Data_float32 of float |
---|
| 77 | | Data_float64 of float |
---|
| 78 | |
---|
| 79 | type data_size = Byte | HalfWord | Word |
---|
| 80 | |
---|
| 81 | (* Types and Signatures *) |
---|
| 82 | |
---|
| 83 | type sig_type = Sig_int | Sig_float | Sig_ptr |
---|
| 84 | |
---|
| 85 | type type_return = Type_ret of sig_type | Type_void |
---|
| 86 | |
---|
| 87 | type signature = { args: sig_type list ; res: type_return } |
---|
| 88 | |
---|
| 89 | (* External functions. *) |
---|
| 90 | |
---|
| 91 | type external_function = { ef_tag: ident ; ef_sig: signature } |
---|
| 92 | |
---|
| 93 | |
---|
| 94 | (* Traces returned by interpreters: only cost labels are observed. *) |
---|
| 95 | |
---|
| 96 | type trace = CostLabel.t list |
---|