-- @generated {-# OPTIONS_GHC -Wno-unused-matches #-} module Glean.RTS.Bytecode.Gen.Instruction ( Insn(..) , mapLabels , insnLabels , insnSize , insnWords , insnShow ) where import Data.Word (Word64) import Text.Show (showListWith) import qualified Glean.Bytecode.Decode as D import Glean.Bytecode.Types data Insn where InputNat :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'Word) -> Insn InputByte :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'Word) -> Insn InputBytes :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'Word) -> Insn InputSkipUntrustedString :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> Insn InputShiftLit :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !Literal -> {-# UNPACK #-} !(Register 'Word) -> Insn InputShiftBytes :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'Word) -> Insn InputSkipNat :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> Insn InputSkipTrustedString :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> Insn ResetOutput :: {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputNat :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputNatImm :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputByte :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputByteImm :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputBytes :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputStringToLower :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputRelToAbsByteSpans :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputUnpackByteSpans :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn OutputStringReverse :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> Insn GetOutput :: {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> Insn GetOutputSize :: {-# UNPACK #-} !(Register 'BinaryOutputPtr) -> {-# UNPACK #-} !(Register 'Word) -> Insn LoadConst :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !(Register 'Word) -> Insn LoadLiteral :: {-# UNPACK #-} !Literal -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> Insn Move :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> Insn SubConst :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !(Register 'Word) -> Insn Sub :: {-# UNPACK #-} !(Register b) -> {-# UNPACK #-} !(Register a) -> Insn AddConst :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !(Register a) -> Insn Add :: {-# UNPACK #-} !(Register b) -> {-# UNPACK #-} !(Register a) -> Insn PtrDiff :: {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'DataPtr) -> {-# UNPACK #-} !(Register 'Word) -> Insn LoadLabel :: {-# UNPACK #-} !Label -> {-# UNPACK #-} !(Register 'Offset) -> Insn Jump :: {-# UNPACK #-} !Label -> Insn JumpReg :: {-# UNPACK #-} !(Register 'Offset) -> Insn JumpIf0 :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !Label -> Insn JumpIfNot0 :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !Label -> Insn JumpIfEq :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !Label -> Insn JumpIfNe :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !Label -> Insn JumpIfGt :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !Label -> Insn JumpIfGe :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !Label -> Insn JumpIfLt :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !Label -> Insn JumpIfLe :: {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !(Register a) -> {-# UNPACK #-} !Label -> Insn DecrAndJumpIfNot0 :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !Label -> Insn DecrAndJumpIf0 :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !Label -> Insn CallFun_0_1 :: {-# UNPACK #-} !(Register ('Fun '[ 'WordPtr ])) -> (Register 'Word) -> Insn CallFun_0_2 :: {-# UNPACK #-} !(Register ('Fun '[ 'WordPtr,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_1_1 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_1_0 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word ])) -> (Register 'Word) -> Insn CallFun_2_1 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_2_0 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word ])) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_3_0 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'Word ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_4_0 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'Word,'Word ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_3_1 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'Word,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_5_0 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'Word,'Word,'Word ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_5_1 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'Word,'Word,'Word,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_2_2 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'WordPtr,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn CallFun_2_5 :: {-# UNPACK #-} !(Register ('Fun '[ 'Word,'Word,'WordPtr,'WordPtr,'WordPtr,'WordPtr,'WordPtr ])) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> (Register 'Word) -> Insn Select :: {-# UNPACK #-} !(Register 'Word) -> [Label] -> Insn Raise :: {-# UNPACK #-} !Literal -> Insn Trace :: {-# UNPACK #-} !Literal -> Insn TraceReg :: {-# UNPACK #-} !Literal -> {-# UNPACK #-} !(Register 'Word) -> Insn Suspend :: {-# UNPACK #-} !(Register 'Word) -> {-# UNPACK #-} !Label -> Insn Ret :: Insn mapLabels :: (Label -> Label) -> Insn -> Insn mapLabels f (LoadLabel lbl dst) = LoadLabel (f lbl) dst mapLabels f (Jump tgt) = Jump (f tgt) mapLabels f (JumpIf0 reg tgt) = JumpIf0 reg (f tgt) mapLabels f (JumpIfNot0 reg tgt) = JumpIfNot0 reg (f tgt) mapLabels f (JumpIfEq reg1 reg2 tgt) = JumpIfEq reg1 reg2 (f tgt) mapLabels f (JumpIfNe reg1 reg2 tgt) = JumpIfNe reg1 reg2 (f tgt) mapLabels f (JumpIfGt reg1 reg2 tgt) = JumpIfGt reg1 reg2 (f tgt) mapLabels f (JumpIfGe reg1 reg2 tgt) = JumpIfGe reg1 reg2 (f tgt) mapLabels f (JumpIfLt reg1 reg2 tgt) = JumpIfLt reg1 reg2 (f tgt) mapLabels f (JumpIfLe reg1 reg2 tgt) = JumpIfLe reg1 reg2 (f tgt) mapLabels f (DecrAndJumpIfNot0 reg tgt) = DecrAndJumpIfNot0 reg (f tgt) mapLabels f (DecrAndJumpIf0 reg tgt) = DecrAndJumpIf0 reg (f tgt) mapLabels f (Select sel tgts) = Select sel (map f tgts) mapLabels f (Suspend unused cont) = Suspend unused (f cont) mapLabels _ insn = insn insnLabels :: Insn -> [Label] insnLabels (LoadLabel lbl dst) = [lbl] insnLabels (Jump tgt) = [tgt] insnLabels (JumpIf0 reg tgt) = [tgt] insnLabels (JumpIfNot0 reg tgt) = [tgt] insnLabels (JumpIfEq reg1 reg2 tgt) = [tgt] insnLabels (JumpIfNe reg1 reg2 tgt) = [tgt] insnLabels (JumpIfGt reg1 reg2 tgt) = [tgt] insnLabels (JumpIfGe reg1 reg2 tgt) = [tgt] insnLabels (JumpIfLt reg1 reg2 tgt) = [tgt] insnLabels (JumpIfLe reg1 reg2 tgt) = [tgt] insnLabels (DecrAndJumpIfNot0 reg tgt) = [tgt] insnLabels (DecrAndJumpIf0 reg tgt) = [tgt] insnLabels (Select sel tgts) = tgts insnLabels (Suspend unused cont) = [cont] insnLabels _ = [] insnSize :: Insn -> Word64 insnSize InputNat{} = 4 insnSize InputByte{} = 4 insnSize InputBytes{} = 4 insnSize InputSkipUntrustedString{} = 3 insnSize InputShiftLit{} = 5 insnSize InputShiftBytes{} = 6 insnSize InputSkipNat{} = 3 insnSize InputSkipTrustedString{} = 3 insnSize ResetOutput{} = 2 insnSize OutputNat{} = 3 insnSize OutputNatImm{} = 3 insnSize OutputByte{} = 3 insnSize OutputByteImm{} = 3 insnSize OutputBytes{} = 4 insnSize OutputStringToLower{} = 4 insnSize OutputRelToAbsByteSpans{} = 4 insnSize OutputUnpackByteSpans{} = 4 insnSize OutputStringReverse{} = 4 insnSize GetOutput{} = 4 insnSize GetOutputSize{} = 3 insnSize LoadConst{} = 3 insnSize LoadLiteral{} = 4 insnSize Move{} = 3 insnSize SubConst{} = 3 insnSize Sub{} = 3 insnSize AddConst{} = 3 insnSize Add{} = 3 insnSize PtrDiff{} = 4 insnSize LoadLabel{} = 3 insnSize Jump{} = 2 insnSize JumpReg{} = 2 insnSize JumpIf0{} = 3 insnSize JumpIfNot0{} = 3 insnSize JumpIfEq{} = 4 insnSize JumpIfNe{} = 4 insnSize JumpIfGt{} = 4 insnSize JumpIfGe{} = 4 insnSize JumpIfLt{} = 4 insnSize JumpIfLe{} = 4 insnSize DecrAndJumpIfNot0{} = 3 insnSize DecrAndJumpIf0{} = 3 insnSize CallFun_0_1{} = 3 insnSize CallFun_0_2{} = 4 insnSize CallFun_1_1{} = 4 insnSize CallFun_1_0{} = 3 insnSize CallFun_2_1{} = 5 insnSize CallFun_2_0{} = 4 insnSize CallFun_3_0{} = 5 insnSize CallFun_4_0{} = 6 insnSize CallFun_3_1{} = 6 insnSize CallFun_5_0{} = 7 insnSize CallFun_5_1{} = 8 insnSize CallFun_2_2{} = 6 insnSize CallFun_2_5{} = 9 insnSize (Select _ tgts) = 3 + fromIntegral (length tgts) insnSize Raise{} = 2 insnSize Trace{} = 2 insnSize TraceReg{} = 3 insnSize Suspend{} = 3 insnSize Ret = 1 insnWords :: (forall ty. Register ty -> Word64) -> (Label -> Word64) -> Insn -> [Word64] insnWords fromReg fromLabel (InputNat begin end dst) = [0, fromReg begin, fromReg end, fromReg dst] insnWords fromReg fromLabel (InputByte begin end dst) = [1, fromReg begin, fromReg end, fromReg dst] insnWords fromReg fromLabel (InputBytes begin end size) = [2, fromReg begin, fromReg end, fromReg size] insnWords fromReg fromLabel (InputSkipUntrustedString begin end) = [3, fromReg begin, fromReg end] insnWords fromReg fromLabel (InputShiftLit begin end lit match) = [4, fromReg begin, fromReg end, fromLiteral lit, fromReg match] insnWords fromReg fromLabel (InputShiftBytes begin end ptr ptrend match) = [5, fromReg begin, fromReg end, fromReg ptr, fromReg ptrend, fromReg match] insnWords fromReg fromLabel (InputSkipNat begin end) = [6, fromReg begin, fromReg end] insnWords fromReg fromLabel (InputSkipTrustedString begin end) = [7, fromReg begin, fromReg end] insnWords fromReg fromLabel (ResetOutput output) = [8, fromReg output] insnWords fromReg fromLabel (OutputNat src output) = [9, fromReg src, fromReg output] insnWords fromReg fromLabel (OutputNatImm src output) = [10, src, fromReg output] insnWords fromReg fromLabel (OutputByte src output) = [11, fromReg src, fromReg output] insnWords fromReg fromLabel (OutputByteImm src output) = [12, src, fromReg output] insnWords fromReg fromLabel (OutputBytes ptr end output) = [13, fromReg ptr, fromReg end, fromReg output] insnWords fromReg fromLabel (OutputStringToLower begin end dst) = [14, fromReg begin, fromReg end, fromReg dst] insnWords fromReg fromLabel (OutputRelToAbsByteSpans begin end dst) = [15, fromReg begin, fromReg end, fromReg dst] insnWords fromReg fromLabel (OutputUnpackByteSpans begin end dst) = [16, fromReg begin, fromReg end, fromReg dst] insnWords fromReg fromLabel (OutputStringReverse begin end dst) = [17, fromReg begin, fromReg end, fromReg dst] insnWords fromReg fromLabel (GetOutput output ptr end) = [18, fromReg output, fromReg ptr, fromReg end] insnWords fromReg fromLabel (GetOutputSize output dst) = [19, fromReg output, fromReg dst] insnWords fromReg fromLabel (LoadConst imm dst) = [20, imm, fromReg dst] insnWords fromReg fromLabel (LoadLiteral lit ptr end) = [21, fromLiteral lit, fromReg ptr, fromReg end] insnWords fromReg fromLabel (Move src dst) = [22, fromReg src, fromReg dst] insnWords fromReg fromLabel (SubConst imm dst) = [23, imm, fromReg dst] insnWords fromReg fromLabel (Sub src dst) = [24, fromReg src, fromReg dst] insnWords fromReg fromLabel (AddConst imm dst) = [25, imm, fromReg dst] insnWords fromReg fromLabel (Add src dst) = [26, fromReg src, fromReg dst] insnWords fromReg fromLabel (PtrDiff src1 src2 dst) = [27, fromReg src1, fromReg src2, fromReg dst] insnWords fromReg fromLabel (LoadLabel lbl dst) = [28, fromLabel lbl, fromReg dst] insnWords fromReg fromLabel (Jump tgt) = [29, fromLabel tgt] insnWords fromReg fromLabel (JumpReg tgt) = [30, fromReg tgt] insnWords fromReg fromLabel (JumpIf0 reg tgt) = [31, fromReg reg, fromLabel tgt] insnWords fromReg fromLabel (JumpIfNot0 reg tgt) = [32, fromReg reg, fromLabel tgt] insnWords fromReg fromLabel (JumpIfEq reg1 reg2 tgt) = [33, fromReg reg1, fromReg reg2, fromLabel tgt] insnWords fromReg fromLabel (JumpIfNe reg1 reg2 tgt) = [34, fromReg reg1, fromReg reg2, fromLabel tgt] insnWords fromReg fromLabel (JumpIfGt reg1 reg2 tgt) = [35, fromReg reg1, fromReg reg2, fromLabel tgt] insnWords fromReg fromLabel (JumpIfGe reg1 reg2 tgt) = [36, fromReg reg1, fromReg reg2, fromLabel tgt] insnWords fromReg fromLabel (JumpIfLt reg1 reg2 tgt) = [37, fromReg reg1, fromReg reg2, fromLabel tgt] insnWords fromReg fromLabel (JumpIfLe reg1 reg2 tgt) = [38, fromReg reg1, fromReg reg2, fromLabel tgt] insnWords fromReg fromLabel (DecrAndJumpIfNot0 reg tgt) = [39, fromReg reg, fromLabel tgt] insnWords fromReg fromLabel (DecrAndJumpIf0 reg tgt) = [40, fromReg reg, fromLabel tgt] insnWords fromReg fromLabel (CallFun_0_1 fun args1) = [41, fromReg fun, fromReg args1] insnWords fromReg fromLabel (CallFun_0_2 fun args1 args2) = [42, fromReg fun, fromReg args1, fromReg args2] insnWords fromReg fromLabel (CallFun_1_1 fun args1 args2) = [43, fromReg fun, fromReg args1, fromReg args2] insnWords fromReg fromLabel (CallFun_1_0 fun args1) = [44, fromReg fun, fromReg args1] insnWords fromReg fromLabel (CallFun_2_1 fun args1 args2 args3) = [45, fromReg fun, fromReg args1, fromReg args2, fromReg args3] insnWords fromReg fromLabel (CallFun_2_0 fun args1 args2) = [46, fromReg fun, fromReg args1, fromReg args2] insnWords fromReg fromLabel (CallFun_3_0 fun args1 args2 args3) = [47, fromReg fun, fromReg args1, fromReg args2, fromReg args3] insnWords fromReg fromLabel (CallFun_4_0 fun args1 args2 args3 args4) = [48, fromReg fun, fromReg args1, fromReg args2, fromReg args3, fromReg args4] insnWords fromReg fromLabel (CallFun_3_1 fun args1 args2 args3 args4) = [49, fromReg fun, fromReg args1, fromReg args2, fromReg args3, fromReg args4] insnWords fromReg fromLabel (CallFun_5_0 fun args1 args2 args3 args4 args5) = [50, fromReg fun, fromReg args1, fromReg args2, fromReg args3, fromReg args4, fromReg args5] insnWords fromReg fromLabel (CallFun_5_1 fun args1 args2 args3 args4 args5 args6) = [51, fromReg fun, fromReg args1, fromReg args2, fromReg args3, fromReg args4, fromReg args5, fromReg args6] insnWords fromReg fromLabel (CallFun_2_2 fun args1 args2 args3 args4) = [52, fromReg fun, fromReg args1, fromReg args2, fromReg args3, fromReg args4] insnWords fromReg fromLabel (CallFun_2_5 fun args1 args2 args3 args4 args5 args6 args7) = [53, fromReg fun, fromReg args1, fromReg args2, fromReg args3, fromReg args4, fromReg args5, fromReg args6, fromReg args7] insnWords fromReg fromLabel (Select sel tgts) = [54, fromReg sel, fromIntegral (length tgts)] ++ map fromLabel tgts ++ [] insnWords fromReg fromLabel (Raise msg) = [55, fromLiteral msg] insnWords fromReg fromLabel (Trace msg) = [56, fromLiteral msg] insnWords fromReg fromLabel (TraceReg msg reg) = [57, fromLiteral msg, fromReg reg] insnWords fromReg fromLabel (Suspend unused cont) = [58, fromReg unused, fromLabel cont] insnWords fromReg fromLabel (Ret) = [59] instance D.Decodable Insn where decode = do op <- D.decode case (op :: Word64) of 0 -> InputNat <$> D.decode <*> D.decode <*> D.decode 1 -> InputByte <$> D.decode <*> D.decode <*> D.decode 2 -> InputBytes <$> D.decode <*> D.decode <*> D.decode 3 -> InputSkipUntrustedString <$> D.decode <*> D.decode 4 -> InputShiftLit <$> D.decode <*> D.decode <*> D.decode <*> D.decode 5 -> InputShiftBytes <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 6 -> InputSkipNat <$> D.decode <*> D.decode 7 -> InputSkipTrustedString <$> D.decode <*> D.decode 8 -> ResetOutput <$> D.decode 9 -> OutputNat <$> D.decode <*> D.decode 10 -> OutputNatImm <$> D.decode <*> D.decode 11 -> OutputByte <$> D.decode <*> D.decode 12 -> OutputByteImm <$> D.decode <*> D.decode 13 -> OutputBytes <$> D.decode <*> D.decode <*> D.decode 14 -> OutputStringToLower <$> D.decode <*> D.decode <*> D.decode 15 -> OutputRelToAbsByteSpans <$> D.decode <*> D.decode <*> D.decode 16 -> OutputUnpackByteSpans <$> D.decode <*> D.decode <*> D.decode 17 -> OutputStringReverse <$> D.decode <*> D.decode <*> D.decode 18 -> GetOutput <$> D.decode <*> D.decode <*> D.decode 19 -> GetOutputSize <$> D.decode <*> D.decode 20 -> LoadConst <$> D.decode <*> D.decode 21 -> LoadLiteral <$> D.decode <*> D.decode <*> D.decode 22 -> Move <$> D.decode <*> D.decode 23 -> SubConst <$> D.decode <*> D.decode 24 -> Sub <$> D.decode <*> D.decode 25 -> AddConst <$> D.decode <*> D.decode 26 -> Add <$> D.decode <*> D.decode 27 -> PtrDiff <$> D.decode <*> D.decode <*> D.decode 28 -> LoadLabel <$> D.decode <*> D.decode 29 -> Jump <$> D.decode 30 -> JumpReg <$> D.decode 31 -> JumpIf0 <$> D.decode <*> D.decode 32 -> JumpIfNot0 <$> D.decode <*> D.decode 33 -> JumpIfEq <$> D.decode <*> D.decode <*> D.decode 34 -> JumpIfNe <$> D.decode <*> D.decode <*> D.decode 35 -> JumpIfGt <$> D.decode <*> D.decode <*> D.decode 36 -> JumpIfGe <$> D.decode <*> D.decode <*> D.decode 37 -> JumpIfLt <$> D.decode <*> D.decode <*> D.decode 38 -> JumpIfLe <$> D.decode <*> D.decode <*> D.decode 39 -> DecrAndJumpIfNot0 <$> D.decode <*> D.decode 40 -> DecrAndJumpIf0 <$> D.decode <*> D.decode 41 -> CallFun_0_1 <$> D.decode <*> D.decode 42 -> CallFun_0_2 <$> D.decode <*> D.decode <*> D.decode 43 -> CallFun_1_1 <$> D.decode <*> D.decode <*> D.decode 44 -> CallFun_1_0 <$> D.decode <*> D.decode 45 -> CallFun_2_1 <$> D.decode <*> D.decode <*> D.decode <*> D.decode 46 -> CallFun_2_0 <$> D.decode <*> D.decode <*> D.decode 47 -> CallFun_3_0 <$> D.decode <*> D.decode <*> D.decode <*> D.decode 48 -> CallFun_4_0 <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 49 -> CallFun_3_1 <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 50 -> CallFun_5_0 <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 51 -> CallFun_5_1 <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 52 -> CallFun_2_2 <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 53 -> CallFun_2_5 <$> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode <*> D.decode 54 -> Select <$> D.decode <*> D.decode 55 -> Raise <$> D.decode 56 -> Trace <$> D.decode 57 -> TraceReg <$> D.decode <*> D.decode 58 -> Suspend <$> D.decode <*> D.decode 59 -> pure Ret _ -> fail $ "invalid opcode " ++ show op insnShow :: [String] -> (Label -> String) -> (forall t. Register t -> String) -> Insn -> String insnShow syscalls showLabel showReg (InputNat begin end dst) = concat ["InputNat", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (InputByte begin end dst) = concat ["InputByte", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (InputBytes begin end size) = concat ["InputBytes", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg size] insnShow syscalls showLabel showReg (InputSkipUntrustedString begin end) = concat ["InputSkipUntrustedString", ' ' : showReg begin, ",", ' ' : showReg end] insnShow syscalls showLabel showReg (InputShiftLit begin end lit match) = concat ["InputShiftLit", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : show (fromLiteral lit), ",", ' ' : showReg match] insnShow syscalls showLabel showReg (InputShiftBytes begin end ptr ptrend match) = concat ["InputShiftBytes", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg ptr, ",", ' ' : showReg ptrend, ",", ' ' : showReg match] insnShow syscalls showLabel showReg (InputSkipNat begin end) = concat ["InputSkipNat", ' ' : showReg begin, ",", ' ' : showReg end] insnShow syscalls showLabel showReg (InputSkipTrustedString begin end) = concat ["InputSkipTrustedString", ' ' : showReg begin, ",", ' ' : showReg end] insnShow syscalls showLabel showReg (ResetOutput output) = concat ["ResetOutput", ' ' : showReg output] insnShow syscalls showLabel showReg (OutputNat src output) = concat ["OutputNat", ' ' : showReg src, ",", ' ' : showReg output] insnShow syscalls showLabel showReg (OutputNatImm src output) = concat ["OutputNatImm", ' ' : show src, ",", ' ' : showReg output] insnShow syscalls showLabel showReg (OutputByte src output) = concat ["OutputByte", ' ' : showReg src, ",", ' ' : showReg output] insnShow syscalls showLabel showReg (OutputByteImm src output) = concat ["OutputByteImm", ' ' : show src, ",", ' ' : showReg output] insnShow syscalls showLabel showReg (OutputBytes ptr end output) = concat ["OutputBytes", ' ' : showReg ptr, ",", ' ' : showReg end, ",", ' ' : showReg output] insnShow syscalls showLabel showReg (OutputStringToLower begin end dst) = concat ["OutputStringToLower", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (OutputRelToAbsByteSpans begin end dst) = concat ["OutputRelToAbsByteSpans", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (OutputUnpackByteSpans begin end dst) = concat ["OutputUnpackByteSpans", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (OutputStringReverse begin end dst) = concat ["OutputStringReverse", ' ' : showReg begin, ",", ' ' : showReg end, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (GetOutput output ptr end) = concat ["GetOutput", ' ' : showReg output, ",", ' ' : showReg ptr, ",", ' ' : showReg end] insnShow syscalls showLabel showReg (GetOutputSize output dst) = concat ["GetOutputSize", ' ' : showReg output, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (LoadConst imm dst) = concat ["LoadConst", ' ' : show imm, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (LoadLiteral lit ptr end) = concat ["LoadLiteral", ' ' : show (fromLiteral lit), ",", ' ' : showReg ptr, ",", ' ' : showReg end] insnShow syscalls showLabel showReg (Move src dst) = concat ["Move", ' ' : showReg src, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (SubConst imm dst) = concat ["SubConst", ' ' : show imm, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (Sub src dst) = concat ["Sub", ' ' : showReg src, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (AddConst imm dst) = concat ["AddConst", ' ' : show imm, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (Add src dst) = concat ["Add", ' ' : showReg src, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (PtrDiff src1 src2 dst) = concat ["PtrDiff", ' ' : showReg src1, ",", ' ' : showReg src2, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (LoadLabel lbl dst) = concat ["LoadLabel", ' ' : showLabel lbl, ",", ' ' : showReg dst] insnShow syscalls showLabel showReg (Jump tgt) = concat ["Jump", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpReg tgt) = concat ["JumpReg", ' ' : showReg tgt] insnShow syscalls showLabel showReg (JumpIf0 reg tgt) = concat ["JumpIf0", ' ' : showReg reg, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfNot0 reg tgt) = concat ["JumpIfNot0", ' ' : showReg reg, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfEq reg1 reg2 tgt) = concat ["JumpIfEq", ' ' : showReg reg1, ",", ' ' : showReg reg2, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfNe reg1 reg2 tgt) = concat ["JumpIfNe", ' ' : showReg reg1, ",", ' ' : showReg reg2, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfGt reg1 reg2 tgt) = concat ["JumpIfGt", ' ' : showReg reg1, ",", ' ' : showReg reg2, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfGe reg1 reg2 tgt) = concat ["JumpIfGe", ' ' : showReg reg1, ",", ' ' : showReg reg2, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfLt reg1 reg2 tgt) = concat ["JumpIfLt", ' ' : showReg reg1, ",", ' ' : showReg reg2, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (JumpIfLe reg1 reg2 tgt) = concat ["JumpIfLe", ' ' : showReg reg1, ",", ' ' : showReg reg2, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (DecrAndJumpIfNot0 reg tgt) = concat ["DecrAndJumpIfNot0", ' ' : showReg reg, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (DecrAndJumpIf0 reg tgt) = concat ["DecrAndJumpIf0", ' ' : showReg reg, ",", ' ' : showLabel tgt] insnShow syscalls showLabel showReg (CallFun_0_1 fun args1) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1] insnShow syscalls showLabel showReg (CallFun_0_2 fun args1 args2) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2] insnShow syscalls showLabel showReg (CallFun_1_1 fun args1 args2) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2] insnShow syscalls showLabel showReg (CallFun_1_0 fun args1) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1] insnShow syscalls showLabel showReg (CallFun_2_1 fun args1 args2 args3) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3] insnShow syscalls showLabel showReg (CallFun_2_0 fun args1 args2) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2] insnShow syscalls showLabel showReg (CallFun_3_0 fun args1 args2 args3) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3] insnShow syscalls showLabel showReg (CallFun_4_0 fun args1 args2 args3 args4) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3, ",", ' ' : showReg args4] insnShow syscalls showLabel showReg (CallFun_3_1 fun args1 args2 args3 args4) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3, ",", ' ' : showReg args4] insnShow syscalls showLabel showReg (CallFun_5_0 fun args1 args2 args3 args4 args5) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3, ",", ' ' : showReg args4, ",", ' ' : showReg args5] insnShow syscalls showLabel showReg (CallFun_5_1 fun args1 args2 args3 args4 args5 args6) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3, ",", ' ' : showReg args4, ",", ' ' : showReg args5, ",", ' ' : showReg args6] insnShow syscalls showLabel showReg (CallFun_2_2 fun args1 args2 args3 args4) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3, ",", ' ' : showReg args4] insnShow syscalls showLabel showReg (CallFun_2_5 fun args1 args2 args3 args4 args5 args6 args7) = concat [(syscalls !! fromIntegral (fromRegister fun)), ' ' : showReg args1, ",", ' ' : showReg args2, ",", ' ' : showReg args3, ",", ' ' : showReg args4, ",", ' ' : showReg args5, ",", ' ' : showReg args6, ",", ' ' : showReg args7] insnShow syscalls showLabel showReg (Select sel tgts) = concat ["Select", ' ' : showReg sel, ",", ' ' : showListWith (showString . showLabel) tgts ""] insnShow syscalls showLabel showReg (Raise msg) = concat ["Raise", ' ' : show (fromLiteral msg)] insnShow syscalls showLabel showReg (Trace msg) = concat ["Trace", ' ' : show (fromLiteral msg)] insnShow syscalls showLabel showReg (TraceReg msg reg) = concat ["TraceReg", ' ' : show (fromLiteral msg), ",", ' ' : showReg reg] insnShow syscalls showLabel showReg (Suspend unused cont) = concat ["Suspend", ' ' : showReg unused, ",", ' ' : showLabel cont] insnShow syscalls showLabel showReg (Ret) = concat ["Ret"]