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 +5/−0
- README.md +6/−0
- bench/Bench.hs +2/−1
- docs/manual.pdf binary
- kempe.cabal +4/−2
- lib/rational.kmp +1/−1
- prelude/arith.kmp +16/−0
- src/Data/Copointed.hs +5/−0
- src/Kempe/Asm/Liveness.hs +67/−0
- src/Kempe/Asm/Type.hs +27/−0
- src/Kempe/Asm/X86/ControlFlow.hs +1/−0
- src/Kempe/Asm/X86/Linear.hs +1/−0
- src/Kempe/Asm/X86/Liveness.hs +0/−66
- src/Kempe/Asm/X86/Type.hs +6/−17
- src/Kempe/IR.hs +7/−1
- src/Kempe/Pipeline.hs +1/−1
- test/Backend.hs +1/−1
- test/golden/gaussian.ir +1/−20
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)))