packages feed

kempe 0.1.1.1 → 0.1.1.2

raw patch · 18 files changed

+151/−110 lines, 18 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Kempe.Asm.X86.Liveness: data Liveness
- Kempe.Asm.X86.Liveness: reconstruct :: [X86 reg ControlAnn] -> [X86 reg Liveness]
+ Data.Copointed: class Copointed p
+ Data.Copointed: copoint :: Copointed p => p a -> a
+ Data.Foldable.Ext: foldMapA :: (Applicative f, Traversable t, Monoid m) => (a -> f m) -> t a -> f m
+ Data.Foldable.Ext: foldMapAlternative :: (Traversable t, Alternative f) => (a -> f b) -> t a -> f b
+ Kempe.AST.Size: Cabi :: ABI
+ Kempe.AST.Size: Kabi :: ABI
+ Kempe.AST.Size: StackType :: Set (Name b) -> [KempeTy b] -> [KempeTy b] -> StackType b
+ Kempe.AST.Size: TyApp :: a -> KempeTy a -> KempeTy a -> KempeTy a
+ Kempe.AST.Size: TyBool :: BuiltinTy
+ Kempe.AST.Size: TyBuiltin :: a -> BuiltinTy -> KempeTy a
+ Kempe.AST.Size: TyInt :: BuiltinTy
+ Kempe.AST.Size: TyInt8 :: BuiltinTy
+ Kempe.AST.Size: TyNamed :: a -> TyName a -> KempeTy a
+ Kempe.AST.Size: TyVar :: a -> Name a -> KempeTy a
+ Kempe.AST.Size: TyWord :: BuiltinTy
+ Kempe.AST.Size: [inTypes] :: StackType b -> [KempeTy b]
+ Kempe.AST.Size: [outTypes] :: StackType b -> [KempeTy b]
+ Kempe.AST.Size: [quantify] :: StackType b -> Set (Name b)
+ Kempe.AST.Size: cSize :: Size -> Int64
+ Kempe.AST.Size: data ABI
+ Kempe.AST.Size: data BuiltinTy
+ Kempe.AST.Size: data KempeTy a
+ Kempe.AST.Size: data StackType b
+ Kempe.AST.Size: instance Control.DeepSeq.NFData Kempe.AST.Size.ABI
+ Kempe.AST.Size: instance Control.DeepSeq.NFData Kempe.AST.Size.BuiltinTy
+ Kempe.AST.Size: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Kempe.AST.Size.KempeTy a)
+ Kempe.AST.Size: instance Control.DeepSeq.NFData b => Control.DeepSeq.NFData (Kempe.AST.Size.StackType b)
+ Kempe.AST.Size: instance GHC.Base.Functor Kempe.AST.Size.KempeTy
+ Kempe.AST.Size: instance GHC.Classes.Eq Kempe.AST.Size.ABI
+ Kempe.AST.Size: instance GHC.Classes.Eq Kempe.AST.Size.BuiltinTy
+ Kempe.AST.Size: instance GHC.Classes.Eq a => GHC.Classes.Eq (Kempe.AST.Size.KempeTy a)
+ Kempe.AST.Size: instance GHC.Classes.Eq b => GHC.Classes.Eq (Kempe.AST.Size.StackType b)
+ Kempe.AST.Size: instance GHC.Classes.Ord Kempe.AST.Size.ABI
+ Kempe.AST.Size: instance GHC.Classes.Ord Kempe.AST.Size.BuiltinTy
+ Kempe.AST.Size: instance GHC.Classes.Ord a => GHC.Classes.Ord (Kempe.AST.Size.KempeTy a)
+ Kempe.AST.Size: instance GHC.Classes.Ord b => GHC.Classes.Ord (Kempe.AST.Size.StackType b)
+ Kempe.AST.Size: instance GHC.Generics.Generic (Kempe.AST.Size.KempeTy a)
+ Kempe.AST.Size: instance GHC.Generics.Generic (Kempe.AST.Size.StackType b)
+ Kempe.AST.Size: instance GHC.Generics.Generic Kempe.AST.Size.ABI
+ Kempe.AST.Size: instance GHC.Generics.Generic Kempe.AST.Size.BuiltinTy
+ Kempe.AST.Size: instance Prettyprinter.Internal.Pretty (Kempe.AST.Size.KempeTy a)
+ Kempe.AST.Size: instance Prettyprinter.Internal.Pretty (Kempe.AST.Size.StackType a)
+ Kempe.AST.Size: instance Prettyprinter.Internal.Pretty Kempe.AST.Size.ABI
+ Kempe.AST.Size: instance Prettyprinter.Internal.Pretty Kempe.AST.Size.BuiltinTy
+ Kempe.AST.Size: prettyMonoStackType :: MonoStackType -> Doc a
+ Kempe.AST.Size: size :: SizeEnv -> KempeTy a -> Size
+ Kempe.AST.Size: size' :: SizeEnv -> KempeTy a -> Int64
+ Kempe.AST.Size: sizeStack :: SizeEnv -> [KempeTy a] -> Int64
+ Kempe.AST.Size: type MonoStackType = ([KempeTy ()], [KempeTy ()])
+ Kempe.AST.Size: type Size = [Int64] -> Int64
+ Kempe.AST.Size: type SizeEnv = IntMap Size
+ Kempe.Asm.Liveness: data Liveness
+ Kempe.Asm.Liveness: reconstruct :: (Copointed p, Functor p) => [p ControlAnn] -> [p Liveness]
+ Kempe.Asm.Type: ControlAnn :: !Int -> [Int] -> IntSet -> IntSet -> ControlAnn
+ Kempe.Asm.Type: Liveness :: !IntSet -> !IntSet -> Liveness
+ Kempe.Asm.Type: [conn] :: ControlAnn -> [Int]
+ Kempe.Asm.Type: [defsNode] :: ControlAnn -> IntSet
+ Kempe.Asm.Type: [ins] :: Liveness -> !IntSet
+ Kempe.Asm.Type: [node] :: ControlAnn -> !Int
+ Kempe.Asm.Type: [out] :: Liveness -> !IntSet
+ Kempe.Asm.Type: [usesNode] :: ControlAnn -> IntSet
+ Kempe.Asm.Type: data ControlAnn
+ Kempe.Asm.Type: data Liveness
+ Kempe.Asm.Type: instance Control.DeepSeq.NFData Kempe.Asm.Type.ControlAnn
+ Kempe.Asm.Type: instance Control.DeepSeq.NFData Kempe.Asm.Type.Liveness
+ Kempe.Asm.Type: instance GHC.Classes.Eq Kempe.Asm.Type.Liveness
+ Kempe.Asm.Type: instance GHC.Generics.Generic Kempe.Asm.Type.ControlAnn
+ Kempe.Asm.Type: instance GHC.Generics.Generic Kempe.Asm.Type.Liveness
+ Kempe.Asm.Type: instance Prettyprinter.Internal.Pretty Kempe.Asm.Type.Liveness
+ Kempe.Asm.X86.Type: AH :: X86Reg
+ Kempe.Asm.X86.Type: AL :: X86Reg
+ Kempe.Asm.X86.Type: AddAC :: a -> Addr reg -> Int64 -> X86 reg a
+ Kempe.Asm.X86.Type: AddRC :: a -> reg -> Int64 -> X86 reg a
+ Kempe.Asm.X86.Type: AddRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: AddrRCMinus :: reg -> Int64 -> Addr reg
+ Kempe.Asm.X86.Type: AddrRCPlus :: reg -> Int64 -> Addr reg
+ Kempe.Asm.X86.Type: AddrRRPlus :: reg -> reg -> Addr reg
+ Kempe.Asm.X86.Type: AddrRRScale :: reg -> reg -> Int64 -> Addr reg
+ Kempe.Asm.X86.Type: AllocReg64 :: !Int -> AbsReg
+ Kempe.Asm.X86.Type: AllocReg8 :: !Int -> AbsReg
+ Kempe.Asm.X86.Type: AndRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: BSLabel :: a -> ByteString -> X86 reg a
+ Kempe.Asm.X86.Type: CArg1 :: AbsReg
+ Kempe.Asm.X86.Type: CArg2 :: AbsReg
+ Kempe.Asm.X86.Type: CArg3 :: AbsReg
+ Kempe.Asm.X86.Type: CArg4 :: AbsReg
+ Kempe.Asm.X86.Type: CArg5 :: AbsReg
+ Kempe.Asm.X86.Type: CArg6 :: AbsReg
+ Kempe.Asm.X86.Type: CH :: X86Reg
+ Kempe.Asm.X86.Type: CL :: X86Reg
+ Kempe.Asm.X86.Type: CRet :: AbsReg
+ Kempe.Asm.X86.Type: Call :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: CallBS :: a -> ByteString -> X86 reg a
+ Kempe.Asm.X86.Type: CmpAddrBool :: a -> Addr reg -> Word8 -> X86 reg a
+ Kempe.Asm.X86.Type: CmpAddrReg :: a -> Addr reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: CmpRegBool :: a -> reg -> Word8 -> X86 reg a
+ Kempe.Asm.X86.Type: CmpRegReg :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: Cqo :: a -> X86 reg a
+ Kempe.Asm.X86.Type: DH :: X86Reg
+ Kempe.Asm.X86.Type: DL :: X86Reg
+ Kempe.Asm.X86.Type: DataPointer :: AbsReg
+ Kempe.Asm.X86.Type: Dil :: X86Reg
+ Kempe.Asm.X86.Type: DivR :: a -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: IdivR :: a -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: ImulRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: Je :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Jg :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Jge :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Jl :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Jle :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Jne :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Jump :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: Label :: a -> Label -> X86 reg a
+ Kempe.Asm.X86.Type: MovABool :: a -> Addr reg -> Word8 -> X86 reg a
+ Kempe.Asm.X86.Type: MovAC :: a -> Addr reg -> Int64 -> X86 reg a
+ Kempe.Asm.X86.Type: MovACTag :: a -> Addr reg -> Word8 -> X86 reg a
+ Kempe.Asm.X86.Type: MovACi8 :: a -> Addr reg -> Int8 -> X86 reg a
+ Kempe.Asm.X86.Type: MovAR :: a -> Addr reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: MovRA :: a -> reg -> Addr reg -> X86 reg a
+ Kempe.Asm.X86.Type: MovRC :: a -> reg -> Int64 -> X86 reg a
+ Kempe.Asm.X86.Type: MovRCBool :: a -> reg -> Word8 -> X86 reg a
+ Kempe.Asm.X86.Type: MovRCTag :: a -> reg -> Word8 -> X86 reg a
+ Kempe.Asm.X86.Type: MovRCi8 :: a -> reg -> Int8 -> X86 reg a
+ Kempe.Asm.X86.Type: MovRL :: a -> reg -> ByteString -> X86 reg a
+ Kempe.Asm.X86.Type: MovRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: MovRWord :: a -> reg -> Word -> X86 reg a
+ Kempe.Asm.X86.Type: NasmMacro0 :: a -> ByteString -> X86 reg a
+ Kempe.Asm.X86.Type: NegR :: a -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: OrRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: PopMem :: a -> Addr reg -> X86 reg a
+ Kempe.Asm.X86.Type: PopReg :: a -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: PopcountRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: PushConst :: a -> Int64 -> X86 reg a
+ Kempe.Asm.X86.Type: PushMem :: a -> Addr reg -> X86 reg a
+ Kempe.Asm.X86.Type: PushReg :: a -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: QuotRes :: AbsReg
+ Kempe.Asm.X86.Type: R10 :: X86Reg
+ Kempe.Asm.X86.Type: R10b :: X86Reg
+ Kempe.Asm.X86.Type: R11 :: X86Reg
+ Kempe.Asm.X86.Type: R11b :: X86Reg
+ Kempe.Asm.X86.Type: R12 :: X86Reg
+ Kempe.Asm.X86.Type: R12b :: X86Reg
+ Kempe.Asm.X86.Type: R13 :: X86Reg
+ Kempe.Asm.X86.Type: R13b :: X86Reg
+ Kempe.Asm.X86.Type: R14 :: X86Reg
+ Kempe.Asm.X86.Type: R14b :: X86Reg
+ Kempe.Asm.X86.Type: R15 :: X86Reg
+ Kempe.Asm.X86.Type: R15b :: X86Reg
+ Kempe.Asm.X86.Type: R8 :: X86Reg
+ Kempe.Asm.X86.Type: R8b :: X86Reg
+ Kempe.Asm.X86.Type: R9 :: X86Reg
+ Kempe.Asm.X86.Type: R9b :: X86Reg
+ Kempe.Asm.X86.Type: Rax :: X86Reg
+ Kempe.Asm.X86.Type: Rbp :: X86Reg
+ Kempe.Asm.X86.Type: Rbx :: X86Reg
+ Kempe.Asm.X86.Type: Rcx :: X86Reg
+ Kempe.Asm.X86.Type: Rdi :: X86Reg
+ Kempe.Asm.X86.Type: Rdx :: X86Reg
+ Kempe.Asm.X86.Type: Reg :: reg -> Addr reg
+ Kempe.Asm.X86.Type: RemRes :: AbsReg
+ Kempe.Asm.X86.Type: Ret :: a -> X86 reg a
+ Kempe.Asm.X86.Type: Rsi :: X86Reg
+ Kempe.Asm.X86.Type: Rsp :: X86Reg
+ Kempe.Asm.X86.Type: ShiftExponent :: AbsReg
+ Kempe.Asm.X86.Type: ShiftLRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: ShiftRRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: Sil :: X86Reg
+ Kempe.Asm.X86.Type: SubRC :: a -> reg -> Int64 -> X86 reg a
+ Kempe.Asm.X86.Type: SubRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: XorRR :: a -> reg -> reg -> X86 reg a
+ Kempe.Asm.X86.Type: [addrAdd1] :: X86 reg a -> Addr reg
+ Kempe.Asm.X86.Type: [addrCmp] :: X86 reg a -> Addr reg
+ Kempe.Asm.X86.Type: [addrDest] :: X86 reg a -> Addr reg
+ Kempe.Asm.X86.Type: [addrSrc] :: X86 reg a -> Addr reg
+ Kempe.Asm.X86.Type: [addr] :: X86 reg a -> Addr reg
+ Kempe.Asm.X86.Type: [ann] :: X86 reg a -> a
+ Kempe.Asm.X86.Type: [bCmp] :: X86 reg a -> Word8
+ Kempe.Asm.X86.Type: [boolSrc] :: X86 reg a -> Word8
+ Kempe.Asm.X86.Type: [bsLabel] :: X86 reg a -> ByteString
+ Kempe.Asm.X86.Type: [bslLabel] :: X86 reg a -> ByteString
+ Kempe.Asm.X86.Type: [i8Src] :: X86 reg a -> Int8
+ Kempe.Asm.X86.Type: [iAdd2] :: X86 reg a -> Int64
+ Kempe.Asm.X86.Type: [iSrc] :: X86 reg a -> Int64
+ Kempe.Asm.X86.Type: [iSub2] :: X86 reg a -> Int64
+ Kempe.Asm.X86.Type: [jLabel] :: X86 reg a -> Label
+ Kempe.Asm.X86.Type: [label] :: X86 reg a -> Label
+ Kempe.Asm.X86.Type: [macroName] :: X86 reg a -> ByteString
+ Kempe.Asm.X86.Type: [rAdd1] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rAdd2] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rCmp'] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rCmp] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rDest] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rDiv] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rMul1] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rMul2] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rSrc] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rSub1] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rSub2] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rXor1] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [rXor2] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [reg] :: X86 reg a -> reg
+ Kempe.Asm.X86.Type: [tagSrc] :: X86 reg a -> Word8
+ Kempe.Asm.X86.Type: [wSrc] :: X86 reg a -> Word
+ Kempe.Asm.X86.Type: data AbsReg
+ Kempe.Asm.X86.Type: data Addr reg
+ Kempe.Asm.X86.Type: data X86 reg a
+ Kempe.Asm.X86.Type: data X86Reg
+ Kempe.Asm.X86.Type: instance (Control.DeepSeq.NFData a, Control.DeepSeq.NFData reg) => Control.DeepSeq.NFData (Kempe.Asm.X86.Type.X86 reg a)
+ Kempe.Asm.X86.Type: instance Control.DeepSeq.NFData Kempe.Asm.X86.Type.AbsReg
+ Kempe.Asm.X86.Type: instance Control.DeepSeq.NFData Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance Control.DeepSeq.NFData reg => Control.DeepSeq.NFData (Kempe.Asm.X86.Type.Addr reg)
+ Kempe.Asm.X86.Type: instance Data.Copointed.Copointed (Kempe.Asm.X86.Type.X86 reg)
+ Kempe.Asm.X86.Type: instance GHC.Base.Functor (Kempe.Asm.X86.Type.X86 reg)
+ Kempe.Asm.X86.Type: instance GHC.Classes.Eq Kempe.Asm.X86.Type.AbsReg
+ Kempe.Asm.X86.Type: instance GHC.Classes.Eq Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance GHC.Classes.Ord Kempe.Asm.X86.Type.AbsReg
+ Kempe.Asm.X86.Type: instance GHC.Classes.Ord Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance GHC.Enum.Bounded Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance GHC.Enum.Enum Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance GHC.Generics.Generic (Kempe.Asm.X86.Type.Addr reg)
+ Kempe.Asm.X86.Type: instance GHC.Generics.Generic (Kempe.Asm.X86.Type.X86 reg a)
+ Kempe.Asm.X86.Type: instance GHC.Generics.Generic Kempe.Asm.X86.Type.AbsReg
+ Kempe.Asm.X86.Type: instance GHC.Generics.Generic Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance Prettyprinter.Internal.Pretty Kempe.Asm.X86.Type.AbsReg
+ Kempe.Asm.X86.Type: instance Prettyprinter.Internal.Pretty Kempe.Asm.X86.Type.X86Reg
+ Kempe.Asm.X86.Type: instance Prettyprinter.Internal.Pretty reg => Prettyprinter.Internal.Pretty (Kempe.Asm.X86.Type.Addr reg)
+ Kempe.Asm.X86.Type: instance Prettyprinter.Internal.Pretty reg => Prettyprinter.Internal.Pretty (Kempe.Asm.X86.Type.X86 reg a)
+ Kempe.Asm.X86.Type: prettyAsm :: Pretty reg => [X86 reg a] -> Doc ann
+ Kempe.Asm.X86.Type: prettyDebugAsm :: Pretty reg => [X86 reg Liveness] -> Doc ann
+ Kempe.Asm.X86.Type: type Label = Word
+ Kempe.Check.Lint: lint :: Declarations a b b -> Maybe (Warning b)
+ Kempe.Check.Restrict: restrictConstructors :: Declarations a c b -> Maybe (Error a)
+ Kempe.Check.TopLevel: data Warning a
+ Kempe.Check.TopLevel: topLevelCheck :: Declarations a c a -> Maybe (Warning a)
+ Kempe.Error: BadType :: a -> Error a
+ Kempe.Error: FatSumType :: a -> TyName a -> Error a
+ Kempe.Error: IllKinded :: a -> KempeTy a -> Error a
+ Kempe.Error: InexhaustiveMatch :: a -> Error a
+ Kempe.Error: InvalidCExport :: a -> Name a -> Error a
+ Kempe.Error: InvalidCImport :: a -> Name a -> Error a
+ Kempe.Error: LessGeneral :: a -> StackType a -> StackType a -> Error a
+ Kempe.Error: MismatchedLengths :: a -> StackType a -> StackType a -> Error a
+ Kempe.Error: MonoFailed :: a -> Error a
+ Kempe.Error: PoorScope :: a -> Name a -> Error a
+ Kempe.Error: TyVarExt :: a -> Name a -> Error a
+ Kempe.Error: UnificationFailed :: a -> KempeTy a -> KempeTy a -> Error a
+ Kempe.Error: data Error a
+ Kempe.Error: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Kempe.Error.Error a)
+ Kempe.Error: instance Data.Typeable.Internal.Typeable a => GHC.Exception.Type.Exception (Kempe.Error.Error a)
+ Kempe.Error: instance GHC.Generics.Generic (Kempe.Error.Error a)
+ Kempe.Error: instance GHC.Show.Show (Kempe.Error.Error a)
+ Kempe.Error: instance Prettyprinter.Internal.Pretty (Kempe.Error.Error a)
+ Kempe.Error: mErr :: Maybe (Error ()) -> Either (Error ()) ()
+ Kempe.Error.Warning: DoubleDip :: a -> Atom a a -> Atom a a -> Warning a
+ Kempe.Error.Warning: NameClash :: a -> Name a -> Warning a
+ Kempe.Error.Warning: data Warning a
+ Kempe.Error.Warning: instance (Prettyprinter.Internal.Pretty a, Data.Typeable.Internal.Typeable a) => GHC.Exception.Type.Exception (Kempe.Error.Warning.Warning a)
+ Kempe.Error.Warning: instance Prettyprinter.Internal.Pretty a => GHC.Show.Show (Kempe.Error.Warning.Warning a)
+ Kempe.Error.Warning: instance Prettyprinter.Internal.Pretty a => Prettyprinter.Internal.Pretty (Kempe.Error.Warning.Warning a)
+ Kempe.IR.Type: BoolAnd :: BoolBinOp
+ Kempe.IR.Type: BoolBinOp :: BoolBinOp -> Exp -> Exp -> Exp
+ Kempe.IR.Type: BoolOr :: BoolBinOp
+ Kempe.IR.Type: BoolXor :: BoolBinOp
+ Kempe.IR.Type: CCall :: MonoStackType -> ByteString -> Stmt
+ Kempe.IR.Type: CJump :: Exp -> Label -> Label -> Stmt
+ Kempe.IR.Type: ConstBool :: Bool -> Exp
+ Kempe.IR.Type: ConstInt :: Int64 -> Exp
+ Kempe.IR.Type: ConstInt8 :: Int8 -> Exp
+ Kempe.IR.Type: ConstTag :: Word8 -> Exp
+ Kempe.IR.Type: ConstWord :: Word -> Exp
+ Kempe.IR.Type: DataPointer :: Temp
+ Kempe.IR.Type: EqByte :: Exp -> Exp -> Exp
+ Kempe.IR.Type: ExprIntBinOp :: IntBinOp -> Exp -> Exp -> Exp
+ Kempe.IR.Type: ExprIntRel :: RelBinOp -> Exp -> Exp -> Exp
+ Kempe.IR.Type: IntDivIR :: IntBinOp
+ Kempe.IR.Type: IntEqIR :: RelBinOp
+ Kempe.IR.Type: IntGeqIR :: RelBinOp
+ Kempe.IR.Type: IntGtIR :: RelBinOp
+ Kempe.IR.Type: IntLeqIR :: RelBinOp
+ Kempe.IR.Type: IntLtIR :: RelBinOp
+ Kempe.IR.Type: IntMinusIR :: IntBinOp
+ Kempe.IR.Type: IntModIR :: IntBinOp
+ Kempe.IR.Type: IntNegIR :: Exp -> Exp
+ Kempe.IR.Type: IntNeqIR :: RelBinOp
+ Kempe.IR.Type: IntPlusIR :: IntBinOp
+ Kempe.IR.Type: IntTimesIR :: IntBinOp
+ Kempe.IR.Type: IntXorIR :: IntBinOp
+ Kempe.IR.Type: Jump :: Label -> Stmt
+ Kempe.IR.Type: KCall :: Label -> Stmt
+ Kempe.IR.Type: Labeled :: Label -> Stmt
+ Kempe.IR.Type: MJump :: Exp -> Label -> Stmt
+ Kempe.IR.Type: Mem :: Int64 -> Exp -> Exp
+ Kempe.IR.Type: MovMem :: Exp -> Int64 -> Exp -> Stmt
+ Kempe.IR.Type: MovTemp :: Temp -> Exp -> Stmt
+ Kempe.IR.Type: PopcountIR :: Exp -> Exp
+ Kempe.IR.Type: Reg :: Temp -> Exp
+ Kempe.IR.Type: Ret :: Stmt
+ Kempe.IR.Type: Temp64 :: !Int -> Temp
+ Kempe.IR.Type: Temp8 :: !Int -> Temp
+ Kempe.IR.Type: WordDivIR :: IntBinOp
+ Kempe.IR.Type: WordModIR :: IntBinOp
+ Kempe.IR.Type: WordShiftLIR :: IntBinOp
+ Kempe.IR.Type: WordShiftRIR :: IntBinOp
+ Kempe.IR.Type: WrapKCall :: ABI -> MonoStackType -> ByteString -> Label -> Stmt
+ Kempe.IR.Type: WriteSt :: [Label] -> [Int] -> WriteSt
+ Kempe.IR.Type: [temps] :: WriteSt -> [Int]
+ Kempe.IR.Type: [wlabels] :: WriteSt -> [Label]
+ Kempe.IR.Type: data BoolBinOp
+ Kempe.IR.Type: data Exp
+ Kempe.IR.Type: data IntBinOp
+ Kempe.IR.Type: data RelBinOp
+ Kempe.IR.Type: data Stmt
+ Kempe.IR.Type: data Temp
+ Kempe.IR.Type: data WriteSt
+ Kempe.IR.Type: instance Control.DeepSeq.NFData Kempe.IR.Type.BoolBinOp
+ Kempe.IR.Type: instance Control.DeepSeq.NFData Kempe.IR.Type.Exp
+ Kempe.IR.Type: instance Control.DeepSeq.NFData Kempe.IR.Type.IntBinOp
+ Kempe.IR.Type: instance Control.DeepSeq.NFData Kempe.IR.Type.RelBinOp
+ Kempe.IR.Type: instance Control.DeepSeq.NFData Kempe.IR.Type.Stmt
+ Kempe.IR.Type: instance Control.DeepSeq.NFData Kempe.IR.Type.Temp
+ Kempe.IR.Type: instance GHC.Classes.Eq Kempe.IR.Type.BoolBinOp
+ Kempe.IR.Type: instance GHC.Classes.Eq Kempe.IR.Type.Exp
+ Kempe.IR.Type: instance GHC.Classes.Eq Kempe.IR.Type.IntBinOp
+ Kempe.IR.Type: instance GHC.Classes.Eq Kempe.IR.Type.RelBinOp
+ Kempe.IR.Type: instance GHC.Classes.Eq Kempe.IR.Type.Temp
+ Kempe.IR.Type: instance GHC.Generics.Generic Kempe.IR.Type.BoolBinOp
+ Kempe.IR.Type: instance GHC.Generics.Generic Kempe.IR.Type.Exp
+ Kempe.IR.Type: instance GHC.Generics.Generic Kempe.IR.Type.IntBinOp
+ Kempe.IR.Type: instance GHC.Generics.Generic Kempe.IR.Type.RelBinOp
+ Kempe.IR.Type: instance GHC.Generics.Generic Kempe.IR.Type.Stmt
+ Kempe.IR.Type: instance GHC.Generics.Generic Kempe.IR.Type.Temp
+ Kempe.IR.Type: instance Prettyprinter.Internal.Pretty Kempe.IR.Type.BoolBinOp
+ Kempe.IR.Type: instance Prettyprinter.Internal.Pretty Kempe.IR.Type.Exp
+ Kempe.IR.Type: instance Prettyprinter.Internal.Pretty Kempe.IR.Type.IntBinOp
+ Kempe.IR.Type: instance Prettyprinter.Internal.Pretty Kempe.IR.Type.RelBinOp
+ Kempe.IR.Type: instance Prettyprinter.Internal.Pretty Kempe.IR.Type.Stmt
+ Kempe.IR.Type: instance Prettyprinter.Internal.Pretty Kempe.IR.Type.Temp
+ Kempe.IR.Type: type Label = Word
+ Kempe.Name: Name :: Text -> !Unique -> a -> Name a
+ Kempe.Name: [loc] :: Name a -> a
+ Kempe.Name: [name] :: Name a -> Text
+ Kempe.Name: [unique] :: Name a -> !Unique
+ Kempe.Name: data Name a
+ Kempe.Name: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Kempe.Name.Name a)
+ Kempe.Name: instance Data.Foldable.Foldable Kempe.Name.Name
+ Kempe.Name: instance Data.Traversable.Traversable Kempe.Name.Name
+ Kempe.Name: instance GHC.Base.Functor Kempe.Name.Name
+ Kempe.Name: instance GHC.Classes.Eq (Kempe.Name.Name a)
+ Kempe.Name: instance GHC.Classes.Ord (Kempe.Name.Name a)
+ Kempe.Name: instance Prettyprinter.Internal.Pretty (Kempe.Name.Name a)
+ Kempe.Name: type TyName = Name
+ Kempe.Proc.Nasm: writeO :: Doc ann -> FilePath -> Bool -> IO ()
+ Kempe.Unique: Unique :: Int -> Unique
+ Kempe.Unique: [unUnique] :: Unique -> Int
+ Kempe.Unique: instance GHC.Classes.Eq Kempe.Unique.Unique
+ Kempe.Unique: instance GHC.Classes.Ord Kempe.Unique.Unique
+ Kempe.Unique: instance Prettyprinter.Internal.Pretty Kempe.Unique.Unique
+ Kempe.Unique: newtype Unique
+ Prettyprinter.Ext: (<##>) :: Doc a -> Doc a -> Doc a
+ Prettyprinter.Ext: (<#>) :: Doc a -> Doc a -> Doc a
+ Prettyprinter.Ext: infixr 6 <##>
+ Prettyprinter.Ext: prettyHex :: (Integral a, Show a) => a -> Doc ann
+ Prettyprinter.Ext: prettyLines :: [Doc ann] -> Doc ann
+ Prettyprinter.Ext: sepDecls :: [Doc ann] -> Doc ann

Files

CHANGELOG.md view
@@ -1,5 +1,10 @@ # kempe +## 0.1.1.2++  * Case statements with a single branch are plain and efficient.+  * Add `safeDiv` and `safeMod` to `prelude/arith.kmp`+ ## 0.1.1.1    * Performance improvements under the hood (use `IntSet`s for liveness
README.md view
@@ -36,3 +36,9 @@     This is less of an impediment than it sounds like.   * Cyclic module imports are not detected   * Modules (imports) are kind of defective++### Comparison++You may wish to use [Mirth](https://github.com/mirth-lang/mirth/) or+[Factor](https://factorcode.org/) instead. Mirth is statically typed (similar to+Kempe) but less mature.
bench/Bench.hs view
@@ -5,10 +5,10 @@ import           Data.Bifunctor            (Bifunctor, bimap) import qualified Data.ByteString.Lazy      as BSL import qualified Data.Text                 as T+import           Kempe.Asm.Liveness import           Kempe.Asm.X86 import           Kempe.Asm.X86.ControlFlow import           Kempe.Asm.X86.Linear-import           Kempe.Asm.X86.Liveness import           Kempe.Check.Pattern import           Kempe.File import           Kempe.IR@@ -99,6 +99,7 @@                         , bench "Object file (examples/factorial.kmp)" $ nfIO (compile "examples/factorial.kmp" "/tmp/factorial.o" False)                         , bench "Object file (lib/numbertheory.kmp)" $ nfIO (compile "lib/numbertheory.kmp" "/tmp/numbertheory.o" False)                         , bench "Object file (examples/splitmix.kmp)" $ nfIO (compile "examples/splitmix.kmp" "/tmp/splitmix.o" False)+                        , bench "Object file (lib/rational.kmp)" $ nfIO (compile "lib/rational.kmp" "/tmp/rational.o" False)                         ]                 ]     where parsedM = parseProcess "test/data/ty.kmp"
docs/manual.pdf view

binary file changed (214027 → 214002 bytes)

kempe.cabal view
@@ -1,6 +1,6 @@ cabal-version:   3.0 name:            kempe-version:         0.1.1.1+version:         0.1.1.2 license:         BSD-3-Clause license-file:    LICENSE copyright:       Copyright: (c) 2020 Vanessa McHale@@ -56,7 +56,7 @@         Kempe.IR.Opt         Kempe.Asm.X86         Kempe.Asm.X86.ControlFlow-        Kempe.Asm.X86.Liveness+        Kempe.Asm.Liveness         Kempe.Asm.X86.Linear      hs-source-dirs:   src@@ -70,10 +70,12 @@         Kempe.Error.Warning         Kempe.AST.Size         Kempe.Asm.X86.Type+        Kempe.Asm.Type         Kempe.IR.Type         Kempe.Proc.Nasm         Prettyprinter.Ext         Data.Foldable.Ext+        Data.Copointed      default-language: Haskell2010     other-extensions:
lib/rational.kmp view
@@ -8,7 +8,7 @@            =: [ { case | Rational -> } ]  multRat : Rational Rational -- Rational-        =: [ dip(unRational) unRational dip(swap *) * Rational ]+        =: [ dip(unRational) unRational dip(swap *) * Rational reduce ]  reduce : Rational -- Rational        =: [ unRational dup2 gcd dup dip(swap dip(/)) / Rational ]
prelude/arith.kmp view
@@ -1,4 +1,5 @@ import "prelude/fn.kmp"+import "lib/maybe.kmp"  succInt : Int -- Int         =: [ 1 + ]@@ -15,3 +16,18 @@  minInt : Int Int -- Int        =: [ dup2 < if(drop, nip) ]++; checks for division by zero+safeDiv : Int Int -- (Maybe Int)+        =: [ dup isZeroInt+             if( drop2 Nothing+               , / Just+               )+           ]++safeMod : Int Int -- (Maybe Int)+        =: [ dup isZeroInt+             if( drop2 Nothing+               , % Just+               )+           ]
+ src/Data/Copointed.hs view
@@ -0,0 +1,5 @@+module Data.Copointed ( Copointed (..)+                      ) where++class Copointed p where+    copoint :: p a -> a
+ src/Kempe/Asm/Liveness.hs view
@@ -0,0 +1,67 @@+-- FIXME: this module is slow++-- | Based on the Appel book.+module Kempe.Asm.Liveness ( Liveness+                          , reconstruct+                          ) where++import           Control.Composition (thread)+import           Data.Copointed+-- this seems to be faster+import qualified Data.IntMap.Lazy    as IM+import qualified Data.IntSet         as IS+import           Data.Semigroup      ((<>))+import           Kempe.Asm.Type++emptyLiveness :: Liveness+emptyLiveness = Liveness IS.empty IS.empty++-- need: succ for a node++initLiveness :: Copointed p => [p ControlAnn] -> LivenessMap+initLiveness = IM.fromList . fmap (\asm -> let x = copoint asm in (node x, (x, emptyLiveness)))++type LivenessMap = IM.IntMap (ControlAnn, Liveness)++-- | All program points accessible from some node.+succNode :: ControlAnn -- ^ 'ControlAnn' associated w/ node @n@+         -> LivenessMap+         -> [Liveness] -- ^ 'Liveness' associated with 'succNode' @n@+succNode x ns =+    let conns = conn x+        in fmap (snd . flip lookupNode ns) conns++lookupNode :: Int -> LivenessMap -> (ControlAnn, Liveness)+lookupNode = IM.findWithDefault (error "Internal error: failed to look up instruction")++done :: LivenessMap -> LivenessMap -> Bool+done n0 n1 = {-# SCC "done" #-} and $ zipWith (\(_, l) (_, l') -> l == l') (IM.elems n0) (IM.elems n1) -- should be safe b/c n0, n1 must have same length++-- order in which to inspect nodes during liveness analysis+inspectOrder :: Copointed p => [p ControlAnn] -> [Int]+inspectOrder = fmap (node . copoint) -- don't need to reverse because thread goes in opposite order++reconstruct :: (Copointed p, Functor p) => [p ControlAnn] -> [p Liveness]+reconstruct asms = {-# SCC "reconstructL" #-} fmap (fmap lookupL) asms+    where l = {-# SCC "mkLiveness" #-} mkLiveness asms+          lookupL x = snd $ lookupNode (node x) l++mkLiveness :: Copointed p => [p ControlAnn] -> LivenessMap+mkLiveness asms = liveness is (initLiveness asms)+    where is = inspectOrder asms++liveness :: [Int] -> LivenessMap -> LivenessMap+liveness is nSt =+    if done nSt nSt'+        then nSt+        else liveness is nSt'+    where nSt' = {-# SCC "iterNodes" #-} iterNodes is nSt++iterNodes :: [Int] -> LivenessMap -> LivenessMap+iterNodes is = thread (fmap stepNode is)++stepNode :: Int -> LivenessMap -> LivenessMap+stepNode n ns = {-# SCC "stepNode" #-} IM.insert n (c, Liveness ins' out') ns+    where (c, l) = lookupNode n ns+          ins' = usesNode c <> (out l IS.\\ defsNode c)+          out' = IS.unions (fmap ins (succNode c ns))
+ src/Kempe/Asm/Type.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE DeriveAnyClass    #-}+{-# LANGUAGE DeriveGeneric     #-}+{-# LANGUAGE OverloadedStrings #-}++module Kempe.Asm.Type ( ControlAnn (..)+                      , Liveness (..)+                      ) where++import           Control.DeepSeq (NFData)+import qualified Data.IntSet     as IS+import           Data.Semigroup  ((<>))+import           GHC.Generics    (Generic)+import           Prettyprinter   (Pretty (pretty), braces, punctuate, (<+>))++data Liveness = Liveness { ins :: !IS.IntSet, out :: !IS.IntSet } -- strictness annotations make it perform better+    deriving (Eq, Generic, NFData)++instance Pretty Liveness where+    pretty (Liveness is os) = braces (pp is <+> ";" <+> pp os)+        where pp = mconcat . punctuate "," . fmap pretty . IS.toList++-- | Control-flow annotations+data ControlAnn = ControlAnn { node     :: !Int+                             , conn     :: [Int]+                             , usesNode :: IS.IntSet+                             , defsNode :: IS.IntSet+                             } deriving (Generic, NFData)
src/Kempe/Asm/X86/ControlFlow.hs view
@@ -9,6 +9,7 @@ import qualified Data.IntSet                as IS import qualified Data.Map                   as M import           Data.Semigroup             ((<>))+import           Kempe.Asm.Type import           Kempe.Asm.X86.Type  -- map of labels by node
src/Kempe/Asm/X86/Linear.hs view
@@ -15,6 +15,7 @@ import           Data.Maybe                 (fromMaybe) import           Data.Semigroup             ((<>)) import qualified Data.Set                   as S+import           Kempe.Asm.Type import           Kempe.Asm.X86.Type import           Lens.Micro                 (Lens') import           Lens.Micro.Mtl             (modifying, (.=))
− src/Kempe/Asm/X86/Liveness.hs
@@ -1,66 +0,0 @@--- FIXME: this module is slow---- | Based on the Appel book.-module Kempe.Asm.X86.Liveness ( Liveness-                              , reconstruct-                              ) where--import           Control.Composition (thread)--- this seems to be faster-import qualified Data.IntMap.Lazy    as IM-import qualified Data.IntSet         as IS-import           Data.Semigroup      ((<>))-import           Kempe.Asm.X86.Type--emptyLiveness :: Liveness-emptyLiveness = Liveness IS.empty IS.empty---- need: succ for a node--initLiveness :: [X86 reg ControlAnn] -> LivenessMap-initLiveness = IM.fromList . fmap (\asm -> let x = ann asm in (node x, (x, emptyLiveness)))--type LivenessMap = IM.IntMap (ControlAnn, Liveness)---- | All program points accessible from some node.-succNode :: ControlAnn -- ^ 'ControlAnn' associated w/ node @n@-         -> LivenessMap-         -> [Liveness] -- ^ 'Liveness' associated with 'succNode' @n@-succNode x ns =-    let conns = conn x-        in fmap (snd . flip lookupNode ns) conns--lookupNode :: Int -> LivenessMap -> (ControlAnn, Liveness)-lookupNode = IM.findWithDefault (error "Internal error: failed to look up instruction")--done :: LivenessMap -> LivenessMap -> Bool-done n0 n1 = {-# SCC "done" #-} and $ zipWith (\(_, l) (_, l') -> l == l') (IM.elems n0) (IM.elems n1) -- should be safe b/c n0, n1 must have same length---- order in which to inspect nodes during liveness analysis-inspectOrder :: [X86 reg ControlAnn] -> [Int]-inspectOrder = fmap (node . ann) -- don't need to reverse because thread goes in opposite order--reconstruct :: [X86 reg ControlAnn] -> [X86 reg Liveness]-reconstruct asms = {-# SCC "reconstructL" #-} fmap (fmap lookupL) asms-    where l = {-# SCC "mkLiveness" #-} mkLiveness asms-          lookupL x = snd $ lookupNode (node x) l--mkLiveness :: [X86 reg ControlAnn] -> LivenessMap-mkLiveness asms = liveness is (initLiveness asms)-    where is = inspectOrder asms--liveness :: [Int] -> LivenessMap -> LivenessMap-liveness is nSt =-    if done nSt nSt'-        then nSt-        else liveness is nSt'-    where nSt' = {-# SCC "iterNodes" #-} iterNodes is nSt--iterNodes :: [Int] -> LivenessMap -> LivenessMap-iterNodes is = thread (fmap stepNode is)--stepNode :: Int -> LivenessMap -> LivenessMap-stepNode n ns = {-# SCC "stepNode" #-} IM.insert n (c, Liveness ins' out') ns-    where (c, l) = lookupNode n ns-          ins' = usesNode c <> (out l IS.\\ defsNode c)-          out' = IS.unions (fmap ins (succNode c ns))
src/Kempe/Asm/X86/Type.hs view
@@ -7,8 +7,6 @@                           , Addr (..)                           , AbsReg (..)                           , X86Reg (..)-                          , ControlAnn (..)-                          , Liveness (..)                           , Label                           , prettyAsm                           , prettyDebugAsm@@ -17,31 +15,19 @@ import           Control.DeepSeq         (NFData) import qualified Data.ByteString         as BS import qualified Data.ByteString.Lazy    as BSL+import           Data.Copointed import           Data.Int                (Int64, Int8)-import qualified Data.IntSet             as IS import           Data.Semigroup          ((<>)) import           Data.Text.Encoding      (decodeUtf8) import qualified Data.Text.Lazy.Encoding as TL import           Data.Word               (Word8) import           GHC.Generics            (Generic)-import           Prettyprinter           (Doc, Pretty (pretty), braces, brackets, colon, concatWith, hardline, indent, punctuate, (<+>))+import           Kempe.Asm.Type+import           Prettyprinter           (Doc, Pretty (pretty), brackets, colon, concatWith, hardline, indent, (<+>)) import           Prettyprinter.Ext  type Label = Word -data Liveness = Liveness { ins :: !IS.IntSet, out :: !IS.IntSet } -- strictness annotations make it perform better-    deriving (Eq, Generic, NFData)--instance Pretty Liveness where-    pretty (Liveness is os) = braces (pp is <+> ";" <+> pp os)-        where pp = mconcat . punctuate "," . fmap pretty . IS.toList--data ControlAnn = ControlAnn { node     :: !Int-                             , conn     :: [Int]-                             , usesNode :: IS.IntSet-                             , defsNode :: IS.IntSet-                             } deriving (Generic, NFData)- -- currently just has 64-bit and 8-bit registers data X86Reg = R8             | R9@@ -211,6 +197,9 @@                | NegR { ann :: a, rSrc :: reg }                | NasmMacro0 { ann :: a, macroName :: BS.ByteString }                deriving (Generic, NFData, Functor)++instance Copointed (X86 reg) where+    copoint = ann  i4 :: Doc ann -> Doc ann i4 = indent 4
src/Kempe/IR.hs view
@@ -7,7 +7,7 @@                 ) where  import           Data.Foldable              (toList, traverse_)-import           Data.List.NonEmpty         (NonEmpty)+import           Data.List.NonEmpty         (NonEmpty (..)) import qualified Data.List.NonEmpty         as NE -- strict b/c it's faster according to benchmarks import           Control.Monad.State.Strict (State, gets, modify, runState)@@ -241,6 +241,12 @@ writeAtom env _ (AtCons ann@(ConsAnn _ tag' _) _) =     pure $ dataPointerInc (padBytes env ann) : push 1 (ConstTag tag') writeAtom _ _ (Case ([], _) _) = error "Internal error: Ill-typed case statement?!"+-- single-case leaf+writeAtom env l (Case (is, _) ((_, as) :| [])) =+    let decSz = size' env (last is)+    in do+        nextAs <- writeAtoms env l as+        pure $ dataPointerDec decSz : nextAs writeAtom env l (Case (is, _) ls) =     let (ps, ass) = NE.unzip ls         decSz = size' env (last is)
src/Kempe/Pipeline.hs view
@@ -9,10 +9,10 @@ import           Data.Typeable             (Typeable) import           Kempe.AST import           Kempe.AST.Size+import           Kempe.Asm.Liveness import           Kempe.Asm.X86 import           Kempe.Asm.X86.ControlFlow import           Kempe.Asm.X86.Linear-import           Kempe.Asm.X86.Liveness import           Kempe.Asm.X86.Type import           Kempe.Check.Restrict import           Kempe.IR
test/Backend.hs view
@@ -2,8 +2,8 @@                ) where  import           Control.DeepSeq           (deepseq)+import           Kempe.Asm.Liveness import           Kempe.Asm.X86.ControlFlow-import           Kempe.Asm.X86.Liveness import           Kempe.Inline import           Kempe.Module import           Kempe.Monomorphize
test/golden/gaussian.ir view
@@ -1,12 +1,6 @@  kmp1: (movtemp datapointer (- (reg datapointer) (int 17)))-(mjump (=b (mem [1] (+ (reg datapointer) (int 0))) (tag 0x0)) kmp4)--kmp4:-(j kmp5)--kmp5: (ret)  kmp2:@@ -29,12 +23,6 @@ (movmem (+ (reg datapointer) (int 14)) (mem [1] (+ (reg datapointer) (int 31)))) (movmem (+ (reg datapointer) (int 15)) (mem [1] (+ (reg datapointer) (int 32)))) (movmem (+ (reg datapointer) (int 16)) (mem [1] (+ (reg datapointer) (int 33))))-(mjump (=b (mem [1] (+ (reg datapointer) (int 0))) (tag 0x0)) kmp6)--kmp6:-(j kmp7)--kmp7: (movmem (- (reg datapointer) (int 0)) (mem [8] (- (reg datapointer) (int 24)))) (movmem (- (reg datapointer) (int 24)) (mem [8] (- (reg datapointer) (int 16)))) (movmem (- (reg datapointer) (int 16)) (mem [8] (- (reg datapointer) (int 0))))@@ -56,14 +44,7 @@ (ret)  kmp3:-(movtemp datapointer (- (reg datapointer) (int 17)))-(mjump (=b (mem [1] (+ (reg datapointer) (int 0))) (tag 0x0)) kmp8)--kmp8:-(j kmp9)--kmp9:-(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp datapointer (- (reg datapointer) (int 25))) (movtemp t_5 (mem [8] (reg datapointer))) (movmem (reg datapointer) (~ (reg t_5))) (movtemp datapointer (+ (reg datapointer) (int 8)))