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