module Compiler.Bytecode.Serializer (serializeInstruction) where
import Compiler.Instruction
import qualified Data.ByteString.Builder as B
import Compiler.Bytecode.Encoder (encodeInt32BE, encodeWord8, encodeBool)
import Common.Type.Integer (IntValue(..))
import Data.Word ()
serializeInstruction :: Instruction -> B.Builder
serializeInstruction :: Instruction -> Builder
serializeInstruction (Push (ImmBool Bool
b)) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x00 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Bool -> Builder
encodeBool Bool
b
serializeInstruction (Push (ImmInt (I8 Int8
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 (Int8 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int8
n)
serializeInstruction (Push (ImmInt (UI8 Word8
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x02 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
n
serializeInstruction (Push (ImmInt (I16 Int16
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x03 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int16 -> Builder
B.int16BE Int16
n
serializeInstruction (Push (ImmInt (UI16 Word16
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x04 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word16 -> Builder
B.word16BE Word16
n
serializeInstruction (Push (ImmInt (I32 Int32
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x05 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
B.int32BE Int32
n
serializeInstruction (Push (ImmInt (UI32 Word32
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x06 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word32 -> Builder
B.word32BE Word32
n
serializeInstruction (Push (ImmInt (I64 Int64
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x07 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int64 -> Builder
B.int64BE Int64
n
serializeInstruction (Push (ImmInt (UI64 Word64
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x08 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word64 -> Builder
B.word64BE Word64
n
serializeInstruction (Push (ImmInt (IChar Int8
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x09 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 (Int8 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int8
n)
serializeInstruction (Push (ImmInt (UIChar Word8
n))) =
Word8 -> Builder
encodeWord8 Word8
0x01 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
0x10 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
n
serializeInstruction Instruction
Pop = Word8 -> Builder
encodeWord8 Word8
0x02
serializeInstruction Instruction
Dup = Word8 -> Builder
encodeWord8 Word8
0x03
serializeInstruction Instruction
Swap = Word8 -> Builder
encodeWord8 Word8
0x04
serializeInstruction Instruction
Add = Word8 -> Builder
encodeWord8 Word8
0x10
serializeInstruction Instruction
Sub = Word8 -> Builder
encodeWord8 Word8
0x11
serializeInstruction Instruction
Mul = Word8 -> Builder
encodeWord8 Word8
0x12
serializeInstruction Instruction
Div = Word8 -> Builder
encodeWord8 Word8
0x13
serializeInstruction Instruction
Mod = Word8 -> Builder
encodeWord8 Word8
0x14
serializeInstruction Instruction
Eq = Word8 -> Builder
encodeWord8 Word8
0x20
serializeInstruction Instruction
Lt = Word8 -> Builder
encodeWord8 Word8
0x21
serializeInstruction Instruction
Not = Word8 -> Builder
encodeWord8 Word8
0x22
serializeInstruction Instruction
And = Word8 -> Builder
encodeWord8 Word8
0x23
serializeInstruction Instruction
Or = Word8 -> Builder
encodeWord8 Word8
0x24
serializeInstruction Instruction
Le = Word8 -> Builder
encodeWord8 Word8
0x25
serializeInstruction Instruction
TEq = Word8 -> Builder
encodeWord8 Word8
0x26
serializeInstruction (Jump Int
addr) =
Word8 -> Builder
encodeWord8 Word8
0x30 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
addr)
serializeInstruction (JumpIfFalse Int
addr) =
Word8 -> Builder
encodeWord8 Word8
0x31 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
addr)
serializeInstruction (JumpIfTrue Int
addr) =
Word8 -> Builder
encodeWord8 Word8
0x32 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
addr)
serializeInstruction (Call Int
addr) =
Word8 -> Builder
encodeWord8 Word8
0x40 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
addr)
serializeInstruction (TailCall Int
addr) =
Word8 -> Builder
encodeWord8 Word8
0x41 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
addr)
serializeInstruction Instruction
CallIndirect = Word8 -> Builder
encodeWord8 Word8
0x42
serializeInstruction (Ret Int
n) =
Word8 -> Builder
encodeWord8 Word8
0x43 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
serializeInstruction (LoadLocal Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x50 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (StoreLocal Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x51 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (LoadGlobal Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x52 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (StoreGlobal Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x53 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (LoadCapture Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x54 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (StoreCapture Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x55 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (MakeClosure Int
addr Int
n) =
Word8 -> Builder
encodeWord8 Word8
0x60 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
addr) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
serializeInstruction (GetFuncAddr Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x61 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction (BuildStruct Int
n) =
Word8 -> Builder
encodeWord8 Word8
0x62 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
serializeInstruction (GetStructField Int
idx) =
Word8 -> Builder
encodeWord8 Word8
0x63 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
idx)
serializeInstruction Instruction
AttrUpdate = Word8 -> Builder
encodeWord8 Word8
0x64
serializeInstruction (Cast Word8
typeId) =
Word8 -> Builder
encodeWord8 Word8
0x80 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
encodeWord8 Word8
typeId
serializeInstruction Instruction
TypeOf = Word8 -> Builder
encodeWord8 Word8
0x81
serializeInstruction Instruction
SizeOf = Word8 -> Builder
encodeWord8 Word8
0x82
serializeInstruction Instruction
Cons = Word8 -> Builder
encodeWord8 Word8
0x90
serializeInstruction Instruction
Head = Word8 -> Builder
encodeWord8 Word8
0x91
serializeInstruction Instruction
Tail = Word8 -> Builder
encodeWord8 Word8
0x92
serializeInstruction Instruction
Nth = Word8 -> Builder
encodeWord8 Word8
0x93
serializeInstruction (BuildList Int
n) =
Word8 -> Builder
encodeWord8 Word8
0x94 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
serializeInstruction Instruction
NthUpdate = Word8 -> Builder
encodeWord8 Word8
0x95
serializeInstruction Instruction
Open = Word8 -> Builder
encodeWord8 Word8
0xA0
serializeInstruction Instruction
Read = Word8 -> Builder
encodeWord8 Word8
0xA1
serializeInstruction Instruction
Write = Word8 -> Builder
encodeWord8 Word8
0xA2
serializeInstruction Instruction
Close = Word8 -> Builder
encodeWord8 Word8
0xA3
serializeInstruction Instruction
Input = Word8 -> Builder
encodeWord8 Word8
0xA4
serializeInstruction Instruction
Print = Word8 -> Builder
encodeWord8 Word8
0x70
serializeInstruction Instruction
Halt = Word8 -> Builder
encodeWord8 Word8
0x71
serializeInstruction Instruction
Exit = Word8 -> Builder
encodeWord8 Word8
0x72
serializeInstruction (CheckStack Int
n) =
Word8 -> Builder
encodeWord8 Word8
0xFE Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Int32 -> Builder
encodeInt32BE (Int -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
serializeInstruction Instruction
Nop = Word8 -> Builder
encodeWord8 Word8
0xFF