197403Sobrien(*
297403Sobrien    Copyright (c) 2016-17 David C.J. Matthews
397403Sobrien
497403Sobrien    This library is free software; you can redistribute it and/or
597403Sobrien    modify it under the terms of the GNU Lesser General Public
697403Sobrien    License version 2.1 as published by the Free Software Foundation.
797403Sobrien    
897403Sobrien    This library is distributed in the hope that it will be useful,
997403Sobrien    but WITHOUT ANY WARRANTY; without even the implied warranty of
1097403Sobrien    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1197403Sobrien    Lesser General Public License for more details.
1297403Sobrien    
1397403Sobrien    You should have received a copy of the GNU Lesser General Public
1497403Sobrien    License along with this library; if not, write to the Free Software
1597403Sobrien    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1697403Sobrien*)
1797403Sobrien
1897403Sobriensignature INTCODECONSSIG =
1997403Sobriensig
2097403Sobrien    type machineWord = Address.machineWord
2197403Sobrien    type address = Address.address
2297403Sobrien    type code
2397403Sobrien    type opcode
2497403Sobrien    type labels
25103447Skan
2697403Sobrien    val opcode_notBoolean: opcode
2797403Sobrien    val opcode_isTagged: opcode
2897403Sobrien    and opcode_cellLength: opcode
2997403Sobrien    and opcode_cellFlags: opcode
30103447Skan    and opcode_clearMutable: opcode
3197403Sobrien    and opcode_atomicIncr: opcode
3297403Sobrien    and opcode_atomicDecr: opcode
3397403Sobrien    and opcode_atomicReset: opcode
3497403Sobrien    and opcode_longWToTagged: opcode
3597403Sobrien    and opcode_signedToLongW: opcode
3697403Sobrien    and opcode_unsignedToLongW: opcode
3797403Sobrien    and opcode_realAbs: opcode
3897403Sobrien    and opcode_realNeg: opcode
3997403Sobrien    and opcode_floatFixedInt: opcode
4097403Sobrien    
4197403Sobrien    val opcode_equalWord: opcode
4297403Sobrien    val opcode_notequalWord: opcode (* Not currently generated. *)
4397403Sobrien    and opcode_lessSigned: opcode
44102782Skan    and opcode_lessUnsigned: opcode
4597403Sobrien    and opcode_lessEqSigned: opcode
4697403Sobrien    and opcode_lessEqUnsigned: opcode
4797403Sobrien    and opcode_greaterSigned: opcode
4897403Sobrien    and opcode_greaterUnsigned: opcode
4997403Sobrien    and opcode_greaterEqSigned: opcode
5097403Sobrien    and opcode_greaterEqUnsigned: opcode
5197403Sobrien
5297403Sobrien    val opcode_fixedAdd: opcode
5397403Sobrien    val opcode_fixedSub: opcode
5497403Sobrien    val opcode_fixedMult: opcode
5597403Sobrien    val opcode_fixedQuot: opcode
5697403Sobrien    val opcode_fixedRem: opcode
5797403Sobrien    val opcode_fixedDiv: opcode
5897403Sobrien    val opcode_fixedMod: opcode
5997403Sobrien    val opcode_wordAdd: opcode
6097403Sobrien    val opcode_wordSub: opcode
6197403Sobrien    val opcode_wordMult: opcode
6297403Sobrien    val opcode_wordDiv: opcode
63103447Skan    val opcode_wordMod: opcode
64103447Skan    val opcode_wordAnd: opcode
65103447Skan    val opcode_wordOr: opcode
66103447Skan    val opcode_wordXor: opcode
67103447Skan    val opcode_wordShiftLeft: opcode
68103447Skan    val opcode_wordShiftRLog: opcode
69103447Skan    val opcode_wordShiftRArith: opcode
70103447Skan    val opcode_allocByteMem: opcode
71103447Skan    val opcode_lgWordEqual: opcode
72103447Skan    val opcode_lgWordNotequal: opcode
73103447Skan    val opcode_lgWordLess: opcode
74103447Skan    val opcode_lgWordLessEq: opcode
75103447Skan    val opcode_lgWordGreater: opcode
76103447Skan    val opcode_lgWordGreaterEq: opcode
77103447Skan    val opcode_lgWordAdd: opcode
78103447Skan    val opcode_lgWordSub: opcode
79103447Skan    val opcode_lgWordMult: opcode
8097403Sobrien    val opcode_lgWordDiv: opcode
81102782Skan    val opcode_lgWordMod: opcode
82103447Skan    val opcode_lgWordAnd: opcode
83103447Skan    val opcode_lgWordOr: opcode
84103447Skan    val opcode_lgWordXor: opcode
85103447Skan    val opcode_lgWordShiftLeft: opcode
86103447Skan    val opcode_lgWordShiftRLog: opcode
87103447Skan    val opcode_lgWordShiftRArith: opcode
88103447Skan    val opcode_realEqual: opcode
89103447Skan    val opcode_realNotequal: opcode
90103447Skan    val opcode_realLess: opcode
91103447Skan    val opcode_realLessEq: opcode
92103447Skan    val opcode_realGreater: opcode
93103447Skan    val opcode_realGreaterEq: opcode
94103447Skan    val opcode_realAdd: opcode
95103447Skan    val opcode_realSub: opcode
96103447Skan    val opcode_realMult: opcode
97103447Skan    val opcode_realDiv: opcode
98103447Skan    val opcode_getThreadId: opcode
99103447Skan    val opcode_allocWordMemory: opcode
100103447Skan    val opcode_alloc_ref: opcode
101103447Skan    val opcode_loadMLWord: opcode
102103447Skan    val opcode_loadMLByte: opcode
103103447Skan    val opcode_loadC8: opcode
104103447Skan    val opcode_loadC16: opcode
105103447Skan    val opcode_loadC32: opcode
106103447Skan    val opcode_loadC64: opcode
107103447Skan    val opcode_loadCFloat: opcode
108103447Skan    val opcode_loadCDouble: opcode
109103447Skan    val opcode_loadUntagged: opcode
110103447Skan    val opcode_storeMLWord: opcode
11197403Sobrien    val opcode_storeMLByte: opcode
11297403Sobrien    val opcode_storeC8: opcode
11397403Sobrien    val opcode_storeC16: opcode
11497403Sobrien    val opcode_storeC32: opcode
11597403Sobrien    val opcode_storeC64: opcode
11697403Sobrien    val opcode_storeCFloat: opcode
11797403Sobrien    val opcode_storeCDouble: opcode
11897403Sobrien    val opcode_storeUntagged: opcode
11997403Sobrien    val opcode_blockMoveWord: opcode
12097403Sobrien    val opcode_blockMoveByte: opcode
12197403Sobrien    val opcode_blockEqualByte: opcode
12297403Sobrien    val opcode_blockCompareByte: opcode
12397403Sobrien    val opcode_deleteHandler: opcode
12497403Sobrien
12597403Sobrien    val codeCreate: string * Universal.universal list -> code  (* makes the initial segment. *)
12697403Sobrien
12797403Sobrien    (* GEN- routines all put a value at the instruction counter and add
12897403Sobrien      an appropriate amount to it. *)
12997403Sobrien      
13097403Sobrien   (* gen... - put instructions and their operands. *)
13197403Sobrien   val genCallClosure : code -> unit
13297403Sobrien   val genRaiseEx     : code -> unit
13397403Sobrien   val genLock        : code -> unit
13497403Sobrien   val genLdexc       : code -> unit
13597403Sobrien   val genPushHandler : code -> unit
13697403Sobrien      
13797403Sobrien   val genReturn      : int * code -> unit
13897403Sobrien   val genLocal       : int * code -> unit
13997403Sobrien   val genIndirect    : int * code -> unit
14097403Sobrien   val genMoveToVec   : int * code -> unit
14197403Sobrien   val genSetStackVal : int * code -> unit
14297403Sobrien   val genCase        : int * code -> labels list
14397403Sobrien   val genTuple       : int * code -> unit
14497403Sobrien   val genTailCall    : int * int * code -> unit
14597403Sobrien
14697403Sobrien   val genRTSCallFast:    int * code -> unit
14797403Sobrien   val genRTSCallFull:    int * code -> unit
14897403Sobrien   val genRTSCallFastFloatFloat: code -> unit
14997403Sobrien   val genRTSCallFastGeneralFloat: code -> unit
15097403Sobrien   
15197403Sobrien   val genOpcode: opcode * code -> unit
15297403Sobrien
15397403Sobrien   (* genEnter instructions are only needed when machine-code routines
15497403Sobrien      can call interpreted routines or vice-versa. The enterInt instruction
15597403Sobrien      causes the interpreter to be entered and the argument indicates the
15697403Sobrien      reason. *)
15797403Sobrien      
15897403Sobrien   val genEnterIntCatch : code -> unit
15997403Sobrien   val genEnterIntProc  : code * int -> unit
16097403Sobrien   val genEnterIntCall  : code * int -> unit
16197403Sobrien      
16297403Sobrien   (* pushConst - Generates code to push a constant. *)
16397403Sobrien   val pushConst        : machineWord * code -> unit
16497403Sobrien
16597403Sobrien   (* Create a container on the stack *)
16697403Sobrien   val genContainer : int * code -> unit
16797403Sobrien
16897403Sobrien   (* Create a tuple from a container. *)
16997403Sobrien   val genTupleFromContainer : int * code -> unit
17097403Sobrien      
17197403Sobrien   (* copyCode - Finish up after compiling a function. *)
17297403Sobrien   val copyCode : code * int -> address
17397403Sobrien   
17497403Sobrien   (* putBranchInstruction puts in an instruction which involves
17597403Sobrien      a forward reference. *)
17697403Sobrien   datatype jumpTypes = Jump | JumpFalse | SetHandler
17797403Sobrien   val putBranchInstruction: jumpTypes * labels * code -> unit
17897403Sobrien   
17997403Sobrien   val createLabel: unit -> labels
18097403Sobrien   
18197403Sobrien   (* Define the position of a label. *)
18297403Sobrien   val setLabel: labels * code -> unit
18397403Sobrien   
18497403Sobrien   val resetStack: int * bool * code -> unit (* Set a pending reset *)
18597403Sobrienend ;
18697403Sobrien