kempe 0.1.1.2 → 0.1.1.3
raw patch · 12 files changed
+721/−436 lines, 12 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- 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.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: irToX86 :: SizeEnv -> WriteSt -> [Stmt] -> [X86 AbsReg ()]
- 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
+ Kempe.Asm.X86.Trans: irToX86 :: SizeEnv -> WriteSt -> [Stmt] -> [X86 AbsReg ()]
Files
- CHANGELOG.md +6/−0
- LICENSE +1/−1
- bench/Bench.hs +2/−1
- docs/manual.pdf binary
- kempe.cabal +55/−51
- lib/gaussian.kmp +11/−0
- src/Kempe/Asm/Liveness.hs +0/−2
- src/Kempe/Asm/X86.hs +0/−375
- src/Kempe/Asm/X86/Trans.hs +375/−0
- src/Kempe/Pipeline.hs +1/−1
- src/Kempe/TyAssign.hs +2/−2
- test/golden/gaussian.ir +268/−3
CHANGELOG.md view
@@ -1,5 +1,11 @@ # kempe +## 0.1.1.3++ * Tweak some RTS flags for faster performance+ * `lib/gaussian.kmp` has `mult` function+ * A couple inefficiencies under the hood+ ## 0.1.1.2 * Case statements with a single branch are plain and efficient.
LICENSE view
@@ -1,4 +1,4 @@-Copyright Vanessa McHale (c) 2020+Copyright Vanessa McHale (c) 2020-2021 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
bench/Bench.hs view
@@ -6,9 +6,9 @@ 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.Trans import Kempe.Check.Pattern import Kempe.File import Kempe.IR@@ -95,6 +95,7 @@ , bench "Generate assembly (examples/factorial.kmp)" $ nfIO (writeAsm "examples/factorial.kmp") , bench "Generate assembly (examples/splitmix.kmp)" $ nfIO (writeAsm "examples/splitmix.kmp") , bench "Generate assembly (lib/numbertheory.kmp)" $ nfIO (writeAsm "lib/numbertheory.kmp")+ , bench "Generate assembly (lib/gaussian.kmp)" $ nfIO (writeAsm "lib/gaussian.kmp") -- , bench "Generate assembly (lib/rational.kmp)" $ nfIO (writeAsm "lib/rational.kmp") , 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)
docs/manual.pdf view
binary file changed (214002 → 214002 bytes)
kempe.cabal view
@@ -1,9 +1,9 @@ cabal-version: 3.0 name: kempe-version: 0.1.1.2+version: 0.1.1.3 license: BSD-3-Clause license-file: LICENSE-copyright: Copyright: (c) 2020 Vanessa McHale+copyright: Copyright: (c) 2020-2021 Vanessa McHale maintainer: vamchale@gmail.com author: Vanessa McHale synopsis: Kempe compiler@@ -30,10 +30,6 @@ type: git location: https://github.com/vmchale/kempe -flag no-par- description: Disable concurrent build- manual: True- flag cross description: Enable to ease cross-compiling default: False@@ -54,7 +50,7 @@ Kempe.Check.Pattern Kempe.IR Kempe.IR.Opt- Kempe.Asm.X86+ Kempe.Asm.X86.Trans Kempe.Asm.X86.ControlFlow Kempe.Asm.Liveness Kempe.Asm.X86.Linear@@ -86,26 +82,37 @@ ghc-options: -Wall build-depends: base >=4.9 && <5,- array -any,- bytestring -any,+ array,+ bytestring, containers >=0.6.0.0,- deepseq -any,- text -any,- mtl -any,- microlens -any,- transformers -any,+ deepseq,+ text,+ mtl,+ microlens,+ transformers, extra >=1.7.4, prettyprinter >=1.7.0, composition-prelude >=2.0.2.0,- microlens-mtl -any,+ microlens-mtl, process >=1.2.3.0,- temporary -any+ temporary - if !flag(no-par)- ghc-options: -j +RTS -A32m -RTS+ if impl(ghc >=8.0)+ ghc-options:+ -Wincomplete-uni-patterns -Wincomplete-record-updates+ -Wredundant-constraints -Widentities + if impl(ghc >=8.4)+ ghc-options: -Wmissing-export-lists++ if impl(ghc >=8.2)+ ghc-options: -Wcpp-undef++ if impl(ghc >=8.10)+ ghc-options: -Wunused-packages+ if !flag(cross)- build-tool-depends: alex:alex -any, happy:happy -any+ build-tool-depends: alex:alex, happy:happy if impl(ghc >=8.0) ghc-options:@@ -127,13 +134,13 @@ other-modules: Paths_kempe autogen-modules: Paths_kempe default-language: Haskell2010- ghc-options: -Wall+ ghc-options: -Wall -rtsopts -with-rtsopts=-A4m build-depends:- base -any,- optparse-applicative -any,- kempe-modules -any,+ base,+ optparse-applicative,+ kempe-modules, prettyprinter >=1.7.0,- bytestring -any+ bytestring if impl(ghc >=8.0) ghc-options:@@ -162,19 +169,16 @@ default-language: Haskell2010 ghc-options: -threaded -rtsopts "-with-rtsopts=-N -K1K" -Wall build-depends:- base -any,- kempe-modules -any,- tasty -any,- tasty-hunit -any,- bytestring -any,+ base,+ kempe-modules,+ tasty,+ tasty-hunit,+ bytestring, prettyprinter >=1.7.0,- deepseq -any,- tasty-golden -any,- text -any,- composition-prelude -any-- if !flag(no-par)- ghc-options: -j +RTS -A32m -RTS+ deepseq,+ tasty-golden,+ text,+ composition-prelude if impl(ghc >=8.0) ghc-options:@@ -198,14 +202,14 @@ default-language: Haskell2010 ghc-options: -threaded -rtsopts "-with-rtsopts=-N -K1K" -Wall build-depends:- base -any,- kempe-modules -any,- tasty -any,- bytestring -any,- process -any,- temporary -any,- filepath -any,- tasty-golden -any+ base,+ kempe-modules,+ tasty,+ bytestring,+ process,+ temporary,+ filepath,+ tasty-golden if impl(ghc >=8.0) ghc-options:@@ -226,14 +230,14 @@ main-is: Bench.hs hs-source-dirs: bench default-language: Haskell2010- ghc-options: -Wall+ ghc-options: -Wall -rtsopts -with-rtsopts=-A4m build-depends:- base -any,- kempe-modules -any,- bytestring -any,- criterion -any,- prettyprinter -any,- text -any+ base,+ kempe-modules,+ bytestring,+ criterion,+ prettyprinter,+ text if impl(ghc >=8.0) ghc-options:
lib/gaussian.kmp view
@@ -1,4 +1,5 @@ ; Gaussian integers+import"prelude/fn.kmp" type Gaussian { Gaussian Int Int } @@ -16,8 +17,18 @@ add : Gaussian Gaussian -- Gaussian =: [ dip(unGaussian) unGaussian grp + dip(+) Gaussian ] +multRe : Gaussian Gaussian -- Int+ =: [ dip(unGaussian) unGaussian dip(swap) * dip(*) - ]++multIm : Gaussian Gaussian -- Int+ =: [ dip(unGaussian) unGaussian dip(*) swap dip(*) + ]++mult : Gaussian Gaussian -- Gaussian+ =: [ dup2 multIm dip(multRe) Gaussian ]+ conjugate : Gaussian -- Gaussian =: [ unGaussian ~ Gaussian ] %foreign kabi add %foreign kabi conjugate+%foreign kabi mult
src/Kempe/Asm/Liveness.hs view
@@ -16,8 +16,6 @@ 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)))
− src/Kempe/Asm/X86.hs
@@ -1,375 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- | Started out trying to implement maximal munch but ended with something--- "flatter" that works with Kempe IR and my shitty register allocator.-module Kempe.Asm.X86 ( irToX86- ) where--import Control.Monad.State.Strict (State, evalState, gets, modify)-import Data.Foldable.Ext-import Data.List (scanl')-import Data.Word (Word8)-import Kempe.AST.Size-import Kempe.Asm.X86.Type-import qualified Kempe.IR.Type as IR--toAbsReg :: IR.Temp -> AbsReg-toAbsReg (IR.Temp8 i) = AllocReg8 i-toAbsReg (IR.Temp64 i) = AllocReg64 i-toAbsReg IR.DataPointer = DataPointer--type WriteM = State IR.WriteSt--irToX86 :: SizeEnv -> IR.WriteSt -> [IR.Stmt] -> [X86 AbsReg ()]-irToX86 env w = runWriteM w . foldMapA (irEmit env)--nextLabels :: IR.WriteSt -> IR.WriteSt-nextLabels (IR.WriteSt ls ts) = IR.WriteSt (tail ls) ts--nextInt :: IR.WriteSt -> IR.WriteSt-nextInt (IR.WriteSt ls ts) = IR.WriteSt ls (tail ts)--getInt :: WriteM Int-getInt = gets (head . IR.temps) <* modify nextInt--getLabel :: WriteM IR.Label-getLabel = gets (head . IR.wlabels) <* modify nextLabels--allocTemp64 :: WriteM IR.Temp-allocTemp64 = IR.Temp64 <$> getInt--allocTemp8 :: WriteM IR.Temp-allocTemp8 = IR.Temp8 <$> getInt--allocReg64 :: WriteM AbsReg-allocReg64 = AllocReg64 <$> getInt--allocReg8 :: WriteM AbsReg-allocReg8 = AllocReg8 <$> getInt--runWriteM :: IR.WriteSt -> WriteM a -> a-runWriteM = flip evalState---- | This should handle 'MovMem's of divers sizes but for now it just does--- 1 byte or 8 bytes at a time.-irEmit :: SizeEnv -> IR.Stmt -> WriteM [X86 AbsReg ()]-irEmit _ (IR.Jump l) = pure [Jump () l]-irEmit _ (IR.Labeled l) = pure [Label () l]-irEmit _ (IR.KCall l) = pure [Call () l]-irEmit _ IR.Ret = pure [Ret ()]-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.Reg r2))) = do- { r' <- allocReg64- ; pure [ MovRR () r' (toAbsReg r1), SubRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstInt i)) =- pure [ MovAC () (Reg $ toAbsReg r) i ]-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstBool b)) =- pure [ MovABool () (Reg $ toAbsReg r) (toByte b) ]-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstTag b)) =- pure [ MovACTag () (Reg $ toAbsReg r) b ]-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntTimesIR (IR.Reg r1) (IR.Reg r2))) = do- { r' <- allocReg64- ; pure [ MovRR () r' (toAbsReg r1), ImulRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg8- ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCPlus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg8- ; pure [ MovRA () r' (AddrRCMinus (toAbsReg r1) j), MovAR () (AddrRCPlus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg8- ; pure [ MovRA () r' (AddrRCMinus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg8- ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 8 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg64- ; pure [ MovRA () r' (AddrRCMinus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 8 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg64- ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 8 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do- { r' <- allocReg64- ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCPlus (toAbsReg r0) i) r' ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntEqIR (IR.Reg r1) (IR.Reg r2))) = do -- TODO: int eq more general (Reg r1) could be e1 &c.- { l0 <- getLabel- ; l1 <- getLabel- ; l2 <- getLabel- ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Je () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntLtIR (IR.Reg r1) (IR.Reg r2))) = do- { l0 <- getLabel- ; l1 <- getLabel- ; l2 <- getLabel- ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jl () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntGtIR (IR.Reg r1) (IR.Reg r2))) = do- { l0 <- getLabel- ; l1 <- getLabel- ; l2 <- getLabel- ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jg () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntGeqIR (IR.Reg r1) (IR.Reg r2))) = do- { l0 <- getLabel- ; l1 <- getLabel- ; l2 <- getLabel- ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jge () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntNeqIR (IR.Reg r1) (IR.Reg r2))) = do- { l0 <- getLabel- ; l1 <- getLabel- ; l2 <- getLabel- ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jne () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntLeqIR (IR.Reg r1) (IR.Reg r2))) = do- { l0 <- getLabel- ; l1 <- getLabel- ; l2 <- getLabel- ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jle () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]- }-irEmit _ (IR.MovTemp r1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r2) (IR.ConstInt i))) | r1 == r2 = do- pure [ SubRC () (toAbsReg r1) i ]-irEmit _ (IR.MovTemp r1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r2) (IR.ConstInt i))) | r1 == r2 = do- pure [ AddRC () (toAbsReg r1) i ]-irEmit env (IR.CCall (is, []) b) | all (\i -> size' env i <= 8) is && length is <= 6 =- pure [NasmMacro0 () "callersave", CallBS () b, NasmMacro0 () "callerrestore"]-irEmit env (IR.CCall (is, [o]) b) | all (\i -> size' env i <= 8) is && size' env o <= 8 && length is <= 6 =- pure [NasmMacro0 () "callersave", CallBS () b, NasmMacro0 () "callerrestore"]--- For 128-bit returns we'd have to use rax and rdx-irEmit env (IR.WrapKCall Cabi (is, [o]) n l) | all (\i -> size' env i <= 8) is && size' env o <= 8 && length is <= 6 = do- { let offs = scanl' (+) 0 (fmap (size' env) is)- ; let totalSize = sizeStack env is- ; let argRegs = [CArg1, CArg2, CArg3, CArg4, CArg5, CArg6]- ; pure $ [BSLabel () n, MovRL () DataPointer "kempe_data", NasmMacro0 () "calleesave"] ++ zipWith (\r i-> MovAR () (AddrRCPlus DataPointer i) r) argRegs offs ++ [AddRC () DataPointer totalSize, Call () l, MovRA () CRet (AddrRCMinus DataPointer (size' env o)), NasmMacro0 () "calleerestore", Ret ()] -- TODO: bytes on the stack eh- }-irEmit _ (IR.WrapKCall Kabi (_, _) n l) =- pure [BSLabel () n, Call () l, Ret ()]-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstInt8 i)) =- pure [ MovACi8 () (Reg $ toAbsReg r) i ]- -- see: https://github.com/cirosantilli/x86-assembly-cheat/blob/master/x86-64/movabs.asm for why we don't do this ^ for words-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntXorIR (IR.Reg r1) (IR.Reg r2))) = do- { r' <- allocReg64- ; pure [ MovRR () r' (toAbsReg r1), XorRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.Reg r2))) = do- { r' <- allocReg64- ; pure [ MovRR () r' (toAbsReg r1), AddRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.WordShiftRIR (IR.Reg r1) (IR.Reg r2))) = do- { r' <- allocReg64- ; pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () r' (toAbsReg r1), ShiftRRR () r' ShiftExponent, MovAR () (Reg $ toAbsReg r) r' ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.WordShiftLIR (IR.Reg r1) (IR.Reg r2))) = do- { r' <- allocReg64- ; pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () r' (toAbsReg r1), ShiftLRR () r' ShiftExponent, MovAR () (Reg $ toAbsReg r) r' ]- }-irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntModIR (IR.Reg r1) (IR.Reg r2))) =- -- QuotRes is rax, so move r1 to rax first- pure [ MovRR () QuotRes (toAbsReg r1), Cqo (), IdivR () (toAbsReg r2), MovAR () (Reg $ toAbsReg r) RemRes ]-irEmit _ (IR.MovTemp r e) = evalE e r-irEmit _ (IR.MovMem (IR.Reg r) 1 e) = do- { r' <- allocTemp8- ; put <- evalE e r'- ; pure $ put ++ [MovAR () (Reg $ toAbsReg r) (toAbsReg r')]- }-irEmit _ (IR.MovMem e 8 e') = do- { r <- allocTemp64- ; r' <- allocTemp64- ; eEval <- evalE e r- ; e'Eval <- evalE e' r'- ; pure (eEval ++ e'Eval ++ [MovAR () (Reg $ toAbsReg r) (toAbsReg r')])- }-irEmit _ (IR.MovMem e 1 e') = do- { r <- allocTemp64- ; r' <- allocTemp8- ; eEval <- evalE e r- ; e'Eval <- evalE e' r'- ; pure (eEval ++ e'Eval ++ [MovAR () (Reg $ toAbsReg r) (toAbsReg r')])- }-irEmit _ (IR.CJump (IR.Mem 1 (IR.Reg r)) l l') =- pure [CmpAddrBool () (Reg (toAbsReg r)) 1, Je () l, Jump () l']-irEmit _ (IR.MJump (IR.Mem 1 (IR.Reg r)) l) =- pure [CmpAddrBool () (Reg (toAbsReg r)) 1, Je () l]-irEmit _ (IR.CJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r) (IR.ConstInt i))) l l') =- pure [CmpAddrBool () (AddrRCMinus (toAbsReg r) i) 1, Je () l, Jump () l']-irEmit _ (IR.MJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r) (IR.ConstInt i))) l) =- pure [CmpAddrBool () (AddrRCMinus (toAbsReg r) i) 1, Je () l]-irEmit _ (IR.CJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r) (IR.ConstInt i))) l l') =- pure [CmpAddrBool () (AddrRCPlus (toAbsReg r) i) 1, Je () l, Jump () l']-irEmit _ (IR.MJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r) (IR.ConstInt i))) l) =- pure [CmpAddrBool () (AddrRCPlus (toAbsReg r) i) 1, Je () l]-irEmit _ (IR.CJump e l l') = do- { r <- allocTemp8- ; bEval <- evalE e r- ; pure (bEval ++ [CmpRegBool () (toAbsReg r) 1, Je () l, Jump () l'])- }-irEmit _ (IR.MJump (IR.EqByte (IR.Mem 1 (IR.Reg r)) (IR.ConstTag b)) l) =- pure [CmpAddrBool () (Reg $ toAbsReg r) b, Je () l]-irEmit _ (IR.MJump (IR.EqByte e0 e1) l) = do- { r0 <- allocTemp8- ; r1 <- allocTemp8- ; placeE0 <- evalE e0 r0- ; placeE1 <- evalE e1 r1- ; pure $ placeE0 ++ placeE1 ++ [CmpRegReg () (toAbsReg r0) (toAbsReg r1), Je () l]- }-irEmit _ (IR.MJump e l) = do- { r <- allocTemp8- ; bEval <- evalE e r- ; pure (bEval ++ [CmpRegBool () (toAbsReg r) 1, Je () l])- }---- | Code to evaluate and put some expression in a chosen 'Temp'------ This more or less conforms to maximal munch.-evalE :: IR.Exp -> IR.Temp -> WriteM [X86 AbsReg ()]-evalE (IR.ConstInt i) r = pure [MovRC () (toAbsReg r) i]-evalE (IR.ConstBool b) r = pure [MovRCBool () (toAbsReg r) (toByte b)]-evalE (IR.ConstInt8 i) r = pure [MovRCi8 () (toAbsReg r) i]-evalE (IR.ConstWord w) r = pure [MovRWord () (toAbsReg r) w]-evalE (IR.ConstTag b) r = pure [MovRCTag () (toAbsReg r) b]-evalE (IR.Reg r') r = pure [MovRR () (toAbsReg r) (toAbsReg r')]-evalE (IR.Mem _ (IR.Reg r1)) r = pure [MovRA () (toAbsReg r) (Reg $ toAbsReg r1) ] -- TODO: sanity check reg/mem access size?-evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt i)) r | r == r1 = pure [SubRC () (toAbsReg r) i]-evalE (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt i)) r | r == r1 = pure [AddRC () (toAbsReg r) i]-evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt 0)) r = pure [MovRR () (toAbsReg r) (toAbsReg r1)]-evalE (IR.Mem 8 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt i))) r =- pure [ MovRA () (toAbsReg r) (AddrRCMinus (toAbsReg r1) i) ]-evalE (IR.Mem 8 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt i))) r =- pure [ MovRA () (toAbsReg r) (AddrRCPlus (toAbsReg r1) i) ]-evalE (IR.Mem _ e) r = do -- don't need to check size b/c we're storing in r- { r' <- allocTemp64- ; placeE <- evalE e r'- ; pure $ placeE ++ [MovRA () (toAbsReg r) (Reg $ toAbsReg r')]- }-evalE (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.Reg r2)) r =- pure [ MovRR () (toAbsReg r) (toAbsReg r1), AddRR () (toAbsReg r) (toAbsReg r2) ]-evalE (IR.ExprIntBinOp IR.IntTimesIR (IR.Reg r1) (IR.Reg r2)) r = do- pure [ MovRR () (toAbsReg r) (toAbsReg r1), ImulRR () (toAbsReg r) (toAbsReg r2) ]-evalE (IR.ExprIntBinOp IR.IntXorIR (IR.Reg r1) (IR.Reg r2)) r = do- pure [ MovRR () (toAbsReg r) (toAbsReg r1), XorRR () (toAbsReg r) (toAbsReg r2) ]-evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt i)) r = do- pure [ MovRR () (toAbsReg r) (toAbsReg r1), SubRC () (toAbsReg r) i ]-evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.Reg r2)) r = do- pure [ MovRR () (toAbsReg r) (toAbsReg r1), SubRR () (toAbsReg r) (toAbsReg r2) ]--- FIXME: because my linear register allocator is shitty, I can't keep--- registers across jumps... so evaluating = or < as an expression in--- general is hard ?-evalE (IR.ExprIntBinOp IR.WordShiftLIR (IR.Reg r1) (IR.Reg r2)) r =- pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () (toAbsReg r) (toAbsReg r1), ShiftLRR () (toAbsReg r) ShiftExponent ]-evalE (IR.ExprIntBinOp IR.WordShiftRIR (IR.Reg r1) (IR.Reg r2)) r = -- FIXME: maximal munch use evalE recursively- pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () (toAbsReg r) (toAbsReg r1), ShiftRRR () (toAbsReg r) ShiftExponent]-evalE (IR.ExprIntBinOp IR.WordShiftLIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp8- ; placeE0 <- evalE e0 r0- ; placeE1 <- evalE e1 r1- ; pure $ placeE0 ++ placeE1 ++ [ MovRR () ShiftExponent (toAbsReg r0), MovRR () (toAbsReg r) (toAbsReg r1), ShiftLRR () (toAbsReg r) ShiftExponent ]- }-evalE (IR.ExprIntBinOp IR.WordShiftRIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp8- ; placeE0 <- evalE e0 r0- ; placeE1 <- evalE e1 r1- ; pure $ placeE0 ++ placeE1 ++ [ MovRR () ShiftExponent (toAbsReg r0), MovRR () (toAbsReg r) (toAbsReg r1), ShiftRRR () (toAbsReg r) ShiftExponent ]- }-evalE (IR.ExprIntBinOp IR.IntModIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- -- QuotRes is rax, so move r1 to rax first- ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), Cqo (), IdivR () (toAbsReg r1), MovRR () (toAbsReg r) RemRes ]- }-evalE (IR.ExprIntBinOp IR.IntDivIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), Cqo (), IdivR () (toAbsReg r1), MovRR () (toAbsReg r) QuotRes ]- }-evalE (IR.ExprIntBinOp IR.WordDivIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), XorRR () RemRes RemRes, DivR () (toAbsReg r1), MovRR () (toAbsReg r) QuotRes ]- }-evalE (IR.ExprIntBinOp IR.WordModIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), XorRR () RemRes RemRes, DivR () (toAbsReg r1), MovRR () (toAbsReg r) RemRes ]- }-evalE (IR.BoolBinOp IR.BoolAnd e0 e1) r = do- { r0 <- allocTemp8- ; r1 <- allocTemp8- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), AndRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.BoolBinOp IR.BoolOr e0 e1) r = do- { r0 <- allocTemp8- ; r1 <- allocTemp8- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), OrRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.BoolBinOp IR.BoolXor e0 e1) r = do- { r0 <- allocTemp8- ; r1 <- allocTemp8- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), XorRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.ExprIntBinOp IR.IntMinusIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), SubRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.ExprIntBinOp IR.IntPlusIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), AddRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.ExprIntBinOp IR.IntTimesIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), ImulRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.ExprIntBinOp IR.IntXorIR e0 e1) r = do- { r0 <- allocTemp64- ; r1 <- allocTemp64- ; placeE <- evalE e0 r0- ; placeE' <- evalE e1 r1- ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), XorRR () (toAbsReg r) (toAbsReg r1) ]- }-evalE (IR.PopcountIR e0) r = do- { r' <- allocTemp64- ; placeE <- evalE e0 r'- ; pure $ placeE ++ [ PopcountRR () (toAbsReg r) (toAbsReg r') ]- }-evalE (IR.IntNegIR e) r = do- { placeE <- evalE e r- ; pure $ placeE ++ [ NegR () (toAbsReg r) ]- }--toByte :: Bool -> Word8-toByte False = 0-toByte True = 1---- I wonder if I could use a hylo.?
+ src/Kempe/Asm/X86/Trans.hs view
@@ -0,0 +1,375 @@+{-# LANGUAGE OverloadedStrings #-}++-- | Started out trying to implement maximal munch but ended with something+-- "flatter" that works with Kempe IR and my shitty register allocator.+module Kempe.Asm.X86.Trans ( irToX86+ ) where++import Control.Monad.State.Strict (State, evalState, gets, modify)+import Data.Foldable.Ext+import Data.List (scanl')+import Data.Word (Word8)+import Kempe.AST.Size+import Kempe.Asm.X86.Type+import qualified Kempe.IR.Type as IR++toAbsReg :: IR.Temp -> AbsReg+toAbsReg (IR.Temp8 i) = AllocReg8 i+toAbsReg (IR.Temp64 i) = AllocReg64 i+toAbsReg IR.DataPointer = DataPointer++type WriteM = State IR.WriteSt++irToX86 :: SizeEnv -> IR.WriteSt -> [IR.Stmt] -> [X86 AbsReg ()]+irToX86 env w = runWriteM w . foldMapA (irEmit env)++nextLabels :: IR.WriteSt -> IR.WriteSt+nextLabels (IR.WriteSt ls ts) = IR.WriteSt (tail ls) ts++nextInt :: IR.WriteSt -> IR.WriteSt+nextInt (IR.WriteSt ls ts) = IR.WriteSt ls (tail ts)++getInt :: WriteM Int+getInt = gets (head . IR.temps) <* modify nextInt++getLabel :: WriteM IR.Label+getLabel = gets (head . IR.wlabels) <* modify nextLabels++allocTemp64 :: WriteM IR.Temp+allocTemp64 = IR.Temp64 <$> getInt++allocTemp8 :: WriteM IR.Temp+allocTemp8 = IR.Temp8 <$> getInt++allocReg64 :: WriteM AbsReg+allocReg64 = AllocReg64 <$> getInt++allocReg8 :: WriteM AbsReg+allocReg8 = AllocReg8 <$> getInt++runWriteM :: IR.WriteSt -> WriteM a -> a+runWriteM = flip evalState++-- | This should handle 'MovMem's of divers sizes but for now it just does+-- 1 byte or 8 bytes at a time.+irEmit :: SizeEnv -> IR.Stmt -> WriteM [X86 AbsReg ()]+irEmit _ (IR.Jump l) = pure [Jump () l]+irEmit _ (IR.Labeled l) = pure [Label () l]+irEmit _ (IR.KCall l) = pure [Call () l]+irEmit _ IR.Ret = pure [Ret ()]+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.Reg r2))) = do+ { r' <- allocReg64+ ; pure [ MovRR () r' (toAbsReg r1), SubRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstInt i)) =+ pure [ MovAC () (Reg $ toAbsReg r) i ]+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstBool b)) =+ pure [ MovABool () (Reg $ toAbsReg r) (toByte b) ]+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstTag b)) =+ pure [ MovACTag () (Reg $ toAbsReg r) b ]+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntTimesIR (IR.Reg r1) (IR.Reg r2))) = do+ { r' <- allocReg64+ ; pure [ MovRR () r' (toAbsReg r1), ImulRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg8+ ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCPlus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg8+ ; pure [ MovRA () r' (AddrRCMinus (toAbsReg r1) j), MovAR () (AddrRCPlus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg8+ ; pure [ MovRA () r' (AddrRCMinus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg8+ ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 8 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg64+ ; pure [ MovRA () r' (AddrRCMinus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 8 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg64+ ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCMinus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r0) (IR.ConstInt i)) _ (IR.Mem 8 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt j)))) = do+ { r' <- allocReg64+ ; pure [ MovRA () r' (AddrRCPlus (toAbsReg r1) j), MovAR () (AddrRCPlus (toAbsReg r0) i) r' ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntEqIR (IR.Reg r1) (IR.Reg r2))) = do -- TODO: int eq more general (Reg r1) could be e1 &c.+ { l0 <- getLabel+ ; l1 <- getLabel+ ; l2 <- getLabel+ ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Je () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntLtIR (IR.Reg r1) (IR.Reg r2))) = do+ { l0 <- getLabel+ ; l1 <- getLabel+ ; l2 <- getLabel+ ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jl () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntGtIR (IR.Reg r1) (IR.Reg r2))) = do+ { l0 <- getLabel+ ; l1 <- getLabel+ ; l2 <- getLabel+ ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jg () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntGeqIR (IR.Reg r1) (IR.Reg r2))) = do+ { l0 <- getLabel+ ; l1 <- getLabel+ ; l2 <- getLabel+ ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jge () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntNeqIR (IR.Reg r1) (IR.Reg r2))) = do+ { l0 <- getLabel+ ; l1 <- getLabel+ ; l2 <- getLabel+ ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jne () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntRel IR.IntLeqIR (IR.Reg r1) (IR.Reg r2))) = do+ { l0 <- getLabel+ ; l1 <- getLabel+ ; l2 <- getLabel+ ; pure [ CmpRegReg () (toAbsReg r1) (toAbsReg r2), Jle () l0, Jump () l1, Label () l0, MovABool () (Reg $ toAbsReg r) 1, Jump () l2, Label () l1, MovABool () (Reg $ toAbsReg r) 0, Label () l2 ]+ }+irEmit _ (IR.MovTemp r1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r2) (IR.ConstInt i))) | r1 == r2 = do+ pure [ SubRC () (toAbsReg r1) i ]+irEmit _ (IR.MovTemp r1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r2) (IR.ConstInt i))) | r1 == r2 = do+ pure [ AddRC () (toAbsReg r1) i ]+irEmit env (IR.CCall (is, []) b) | all (\i -> size' env i <= 8) is && length is <= 6 =+ pure [NasmMacro0 () "callersave", CallBS () b, NasmMacro0 () "callerrestore"]+irEmit env (IR.CCall (is, [o]) b) | all (\i -> size' env i <= 8) is && size' env o <= 8 && length is <= 6 =+ pure [NasmMacro0 () "callersave", CallBS () b, NasmMacro0 () "callerrestore"]+-- For 128-bit returns we'd have to use rax and rdx+irEmit env (IR.WrapKCall Cabi (is, [o]) n l) | all (\i -> size' env i <= 8) is && size' env o <= 8 && length is <= 6 = do+ { let offs = scanl' (+) 0 (fmap (size' env) is)+ ; let totalSize = sizeStack env is+ ; let argRegs = [CArg1, CArg2, CArg3, CArg4, CArg5, CArg6]+ ; pure $ [BSLabel () n, MovRL () DataPointer "kempe_data", NasmMacro0 () "calleesave"] ++ zipWith (\r i-> MovAR () (AddrRCPlus DataPointer i) r) argRegs offs ++ [AddRC () DataPointer totalSize, Call () l, MovRA () CRet (AddrRCMinus DataPointer (size' env o)), NasmMacro0 () "calleerestore", Ret ()] -- TODO: bytes on the stack eh+ }+irEmit _ (IR.WrapKCall Kabi (_, _) n l) =+ pure [BSLabel () n, Call () l, Ret ()]+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ConstInt8 i)) =+ pure [ MovACi8 () (Reg $ toAbsReg r) i ]+ -- see: https://github.com/cirosantilli/x86-assembly-cheat/blob/master/x86-64/movabs.asm for why we don't do this ^ for words+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntXorIR (IR.Reg r1) (IR.Reg r2))) = do+ { r' <- allocReg64+ ; pure [ MovRR () r' (toAbsReg r1), XorRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.Reg r2))) = do+ { r' <- allocReg64+ ; pure [ MovRR () r' (toAbsReg r1), AddRR () r' (toAbsReg r2), MovAR () (Reg $ toAbsReg r) r' ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.WordShiftRIR (IR.Reg r1) (IR.Reg r2))) = do+ { r' <- allocReg64+ ; pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () r' (toAbsReg r1), ShiftRRR () r' ShiftExponent, MovAR () (Reg $ toAbsReg r) r' ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.WordShiftLIR (IR.Reg r1) (IR.Reg r2))) = do+ { r' <- allocReg64+ ; pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () r' (toAbsReg r1), ShiftLRR () r' ShiftExponent, MovAR () (Reg $ toAbsReg r) r' ]+ }+irEmit _ (IR.MovMem (IR.Reg r) _ (IR.ExprIntBinOp IR.IntModIR (IR.Reg r1) (IR.Reg r2))) =+ -- QuotRes is rax, so move r1 to rax first+ pure [ MovRR () QuotRes (toAbsReg r1), Cqo (), IdivR () (toAbsReg r2), MovAR () (Reg $ toAbsReg r) RemRes ]+irEmit _ (IR.MovTemp r e) = evalE e r+irEmit _ (IR.MovMem (IR.Reg r) 1 e) = do+ { r' <- allocTemp8+ ; put <- evalE e r'+ ; pure $ put ++ [MovAR () (Reg $ toAbsReg r) (toAbsReg r')]+ }+irEmit _ (IR.MovMem e 8 e') = do+ { r <- allocTemp64+ ; r' <- allocTemp64+ ; eEval <- evalE e r+ ; e'Eval <- evalE e' r'+ ; pure (eEval ++ e'Eval ++ [MovAR () (Reg $ toAbsReg r) (toAbsReg r')])+ }+irEmit _ (IR.MovMem e 1 e') = do+ { r <- allocTemp64+ ; r' <- allocTemp8+ ; eEval <- evalE e r+ ; e'Eval <- evalE e' r'+ ; pure (eEval ++ e'Eval ++ [MovAR () (Reg $ toAbsReg r) (toAbsReg r')])+ }+irEmit _ (IR.CJump (IR.Mem 1 (IR.Reg r)) l l') =+ pure [CmpAddrBool () (Reg (toAbsReg r)) 1, Je () l, Jump () l']+irEmit _ (IR.MJump (IR.Mem 1 (IR.Reg r)) l) =+ pure [CmpAddrBool () (Reg (toAbsReg r)) 1, Je () l]+irEmit _ (IR.CJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r) (IR.ConstInt i))) l l') =+ pure [CmpAddrBool () (AddrRCMinus (toAbsReg r) i) 1, Je () l, Jump () l']+irEmit _ (IR.MJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r) (IR.ConstInt i))) l) =+ pure [CmpAddrBool () (AddrRCMinus (toAbsReg r) i) 1, Je () l]+irEmit _ (IR.CJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r) (IR.ConstInt i))) l l') =+ pure [CmpAddrBool () (AddrRCPlus (toAbsReg r) i) 1, Je () l, Jump () l']+irEmit _ (IR.MJump (IR.Mem 1 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r) (IR.ConstInt i))) l) =+ pure [CmpAddrBool () (AddrRCPlus (toAbsReg r) i) 1, Je () l]+irEmit _ (IR.CJump e l l') = do+ { r <- allocTemp8+ ; bEval <- evalE e r+ ; pure (bEval ++ [CmpRegBool () (toAbsReg r) 1, Je () l, Jump () l'])+ }+irEmit _ (IR.MJump (IR.EqByte (IR.Mem 1 (IR.Reg r)) (IR.ConstTag b)) l) =+ pure [CmpAddrBool () (Reg $ toAbsReg r) b, Je () l]+irEmit _ (IR.MJump (IR.EqByte e0 e1) l) = do+ { r0 <- allocTemp8+ ; r1 <- allocTemp8+ ; placeE0 <- evalE e0 r0+ ; placeE1 <- evalE e1 r1+ ; pure $ placeE0 ++ placeE1 ++ [CmpRegReg () (toAbsReg r0) (toAbsReg r1), Je () l]+ }+irEmit _ (IR.MJump e l) = do+ { r <- allocTemp8+ ; bEval <- evalE e r+ ; pure (bEval ++ [CmpRegBool () (toAbsReg r) 1, Je () l])+ }++-- | Code to evaluate and put some expression in a chosen 'Temp'+--+-- This more or less conforms to maximal munch.+evalE :: IR.Exp -> IR.Temp -> WriteM [X86 AbsReg ()]+evalE (IR.ConstInt i) r = pure [MovRC () (toAbsReg r) i]+evalE (IR.ConstBool b) r = pure [MovRCBool () (toAbsReg r) (toByte b)]+evalE (IR.ConstInt8 i) r = pure [MovRCi8 () (toAbsReg r) i]+evalE (IR.ConstWord w) r = pure [MovRWord () (toAbsReg r) w]+evalE (IR.ConstTag b) r = pure [MovRCTag () (toAbsReg r) b]+evalE (IR.Reg r') r = pure [MovRR () (toAbsReg r) (toAbsReg r')]+evalE (IR.Mem _ (IR.Reg r1)) r = pure [MovRA () (toAbsReg r) (Reg $ toAbsReg r1) ] -- TODO: sanity check reg/mem access size?+evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt i)) r | r == r1 = pure [SubRC () (toAbsReg r) i]+evalE (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt i)) r | r == r1 = pure [AddRC () (toAbsReg r) i]+evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt 0)) r = pure [MovRR () (toAbsReg r) (toAbsReg r1)]+evalE (IR.Mem 8 (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt i))) r =+ pure [ MovRA () (toAbsReg r) (AddrRCMinus (toAbsReg r1) i) ]+evalE (IR.Mem 8 (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.ConstInt i))) r =+ pure [ MovRA () (toAbsReg r) (AddrRCPlus (toAbsReg r1) i) ]+evalE (IR.Mem _ e) r = do -- don't need to check size b/c we're storing in r+ { r' <- allocTemp64+ ; placeE <- evalE e r'+ ; pure $ placeE ++ [MovRA () (toAbsReg r) (Reg $ toAbsReg r')]+ }+evalE (IR.ExprIntBinOp IR.IntPlusIR (IR.Reg r1) (IR.Reg r2)) r =+ pure [ MovRR () (toAbsReg r) (toAbsReg r1), AddRR () (toAbsReg r) (toAbsReg r2) ]+evalE (IR.ExprIntBinOp IR.IntTimesIR (IR.Reg r1) (IR.Reg r2)) r = do+ pure [ MovRR () (toAbsReg r) (toAbsReg r1), ImulRR () (toAbsReg r) (toAbsReg r2) ]+evalE (IR.ExprIntBinOp IR.IntXorIR (IR.Reg r1) (IR.Reg r2)) r = do+ pure [ MovRR () (toAbsReg r) (toAbsReg r1), XorRR () (toAbsReg r) (toAbsReg r2) ]+evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.ConstInt i)) r = do+ pure [ MovRR () (toAbsReg r) (toAbsReg r1), SubRC () (toAbsReg r) i ]+evalE (IR.ExprIntBinOp IR.IntMinusIR (IR.Reg r1) (IR.Reg r2)) r = do+ pure [ MovRR () (toAbsReg r) (toAbsReg r1), SubRR () (toAbsReg r) (toAbsReg r2) ]+-- FIXME: because my linear register allocator is shitty, I can't keep+-- registers across jumps... so evaluating = or < as an expression in+-- general is hard ?+evalE (IR.ExprIntBinOp IR.WordShiftLIR (IR.Reg r1) (IR.Reg r2)) r =+ pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () (toAbsReg r) (toAbsReg r1), ShiftLRR () (toAbsReg r) ShiftExponent ]+evalE (IR.ExprIntBinOp IR.WordShiftRIR (IR.Reg r1) (IR.Reg r2)) r = -- FIXME: maximal munch use evalE recursively+ pure [ MovRR () ShiftExponent (toAbsReg r2), MovRR () (toAbsReg r) (toAbsReg r1), ShiftRRR () (toAbsReg r) ShiftExponent]+evalE (IR.ExprIntBinOp IR.WordShiftLIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp8+ ; placeE0 <- evalE e0 r0+ ; placeE1 <- evalE e1 r1+ ; pure $ placeE0 ++ placeE1 ++ [ MovRR () ShiftExponent (toAbsReg r0), MovRR () (toAbsReg r) (toAbsReg r1), ShiftLRR () (toAbsReg r) ShiftExponent ]+ }+evalE (IR.ExprIntBinOp IR.WordShiftRIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp8+ ; placeE0 <- evalE e0 r0+ ; placeE1 <- evalE e1 r1+ ; pure $ placeE0 ++ placeE1 ++ [ MovRR () ShiftExponent (toAbsReg r0), MovRR () (toAbsReg r) (toAbsReg r1), ShiftRRR () (toAbsReg r) ShiftExponent ]+ }+evalE (IR.ExprIntBinOp IR.IntModIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ -- QuotRes is rax, so move r1 to rax first+ ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), Cqo (), IdivR () (toAbsReg r1), MovRR () (toAbsReg r) RemRes ]+ }+evalE (IR.ExprIntBinOp IR.IntDivIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), Cqo (), IdivR () (toAbsReg r1), MovRR () (toAbsReg r) QuotRes ]+ }+evalE (IR.ExprIntBinOp IR.WordDivIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), XorRR () RemRes RemRes, DivR () (toAbsReg r1), MovRR () (toAbsReg r) QuotRes ]+ }+evalE (IR.ExprIntBinOp IR.WordModIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () QuotRes (toAbsReg r0), XorRR () RemRes RemRes, DivR () (toAbsReg r1), MovRR () (toAbsReg r) RemRes ]+ }+evalE (IR.BoolBinOp IR.BoolAnd e0 e1) r = do+ { r0 <- allocTemp8+ ; r1 <- allocTemp8+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), AndRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.BoolBinOp IR.BoolOr e0 e1) r = do+ { r0 <- allocTemp8+ ; r1 <- allocTemp8+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), OrRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.BoolBinOp IR.BoolXor e0 e1) r = do+ { r0 <- allocTemp8+ ; r1 <- allocTemp8+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), XorRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.ExprIntBinOp IR.IntMinusIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), SubRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.ExprIntBinOp IR.IntPlusIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), AddRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.ExprIntBinOp IR.IntTimesIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), ImulRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.ExprIntBinOp IR.IntXorIR e0 e1) r = do+ { r0 <- allocTemp64+ ; r1 <- allocTemp64+ ; placeE <- evalE e0 r0+ ; placeE' <- evalE e1 r1+ ; pure $ placeE ++ placeE' ++ [ MovRR () (toAbsReg r) (toAbsReg r0), XorRR () (toAbsReg r) (toAbsReg r1) ]+ }+evalE (IR.PopcountIR e0) r = do+ { r' <- allocTemp64+ ; placeE <- evalE e0 r'+ ; pure $ placeE ++ [ PopcountRR () (toAbsReg r) (toAbsReg r') ]+ }+evalE (IR.IntNegIR e) r = do+ { placeE <- evalE e r+ ; pure $ placeE ++ [ NegR () (toAbsReg r) ]+ }++toByte :: Bool -> Word8+toByte False = 0+toByte True = 1++-- I wonder if I could use a hylo.?
src/Kempe/Pipeline.hs view
@@ -10,9 +10,9 @@ 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.Trans import Kempe.Asm.X86.Type import Kempe.Check.Restrict import Kempe.IR
src/Kempe/TyAssign.hs view
@@ -503,7 +503,7 @@ pure $ StackType (S.singleton aN) [TyVar () aN] [] tyPattern PatternInt{} = pure $ StackType S.empty [TyBuiltin () TyInt] [] tyPattern PatternBool{} = pure $ StackType S.empty [TyBuiltin () TyBool] []-tyPattern (PatternCons _ tn) = renameStack =<< (flipStackType <$> consLookup (void tn))+tyPattern (PatternCons _ tn) = renameStack . flipStackType =<< consLookup (void tn) assignPattern :: Pattern b a -> TypeM () (StackType (), Pattern (StackType ()) (StackType ())) assignPattern (PatternInt _ i) =@@ -512,7 +512,7 @@ assignPattern (PatternBool _ i) = let sTy = StackType S.empty [TyBuiltin () TyBool] [] in pure (sTy, PatternBool sTy i)-assignPattern (PatternCons _ tn) = do { ty <- renameStack =<< (flipStackType <$> consLookup (void tn)) ; pure (ty, PatternCons ty (tn $> ty)) }+assignPattern (PatternCons _ tn) = do { ty <- renameStack . flipStackType =<< consLookup (void tn) ; pure (ty, PatternCons ty (tn $> ty)) } assignPattern PatternWildcard{} = do aN <- dummyName "a" let resType = StackType (S.singleton aN) [TyVar () aN] []
test/golden/gaussian.ir view
@@ -44,14 +44,279 @@ (ret) kmp3:-(movtemp datapointer (- (reg datapointer) (int 25)))+(movtemp datapointer (- (reg datapointer) (int 17)))+(call kmp1)+(movmem (- (reg datapointer) (int 0)) (mem [1] (+ (reg datapointer) (int 17))))+(movmem (+ (reg datapointer) (int 1)) (mem [1] (+ (reg datapointer) (int 18))))+(movmem (+ (reg datapointer) (int 2)) (mem [1] (+ (reg datapointer) (int 19))))+(movmem (+ (reg datapointer) (int 3)) (mem [1] (+ (reg datapointer) (int 20))))+(movmem (+ (reg datapointer) (int 4)) (mem [1] (+ (reg datapointer) (int 21))))+(movmem (+ (reg datapointer) (int 5)) (mem [1] (+ (reg datapointer) (int 22))))+(movmem (+ (reg datapointer) (int 6)) (mem [1] (+ (reg datapointer) (int 23))))+(movmem (+ (reg datapointer) (int 7)) (mem [1] (+ (reg datapointer) (int 24))))+(movmem (+ (reg datapointer) (int 8)) (mem [1] (+ (reg datapointer) (int 25))))+(movmem (+ (reg datapointer) (int 9)) (mem [1] (+ (reg datapointer) (int 26))))+(movmem (+ (reg datapointer) (int 10)) (mem [1] (+ (reg datapointer) (int 27))))+(movmem (+ (reg datapointer) (int 11)) (mem [1] (+ (reg datapointer) (int 28))))+(movmem (+ (reg datapointer) (int 12)) (mem [1] (+ (reg datapointer) (int 29))))+(movmem (+ (reg datapointer) (int 13)) (mem [1] (+ (reg datapointer) (int 30))))+(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))))+(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))))+(movtemp datapointer (- (reg datapointer) (int 8))) (movtemp t_5 (mem [8] (reg datapointer)))-(movmem (reg datapointer) (~ (reg t_5)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_6 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_6) (reg t_5)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_7 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_8 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_8) (reg t_7))) (movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (- (reg datapointer) (int 0)) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp t_9 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_10 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (- (reg t_10) (reg t_9)))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(ret)++kmp4:+(movmem (- (reg datapointer) (int 0)) (mem [1] (- (reg datapointer) (int 17))))+(movmem (+ (reg datapointer) (int 1)) (mem [1] (- (reg datapointer) (int 16))))+(movmem (+ (reg datapointer) (int 2)) (mem [1] (- (reg datapointer) (int 15))))+(movmem (+ (reg datapointer) (int 3)) (mem [1] (- (reg datapointer) (int 14))))+(movmem (+ (reg datapointer) (int 4)) (mem [1] (- (reg datapointer) (int 13))))+(movmem (+ (reg datapointer) (int 5)) (mem [1] (- (reg datapointer) (int 12))))+(movmem (+ (reg datapointer) (int 6)) (mem [1] (- (reg datapointer) (int 11))))+(movmem (+ (reg datapointer) (int 7)) (mem [1] (- (reg datapointer) (int 10))))+(movmem (+ (reg datapointer) (int 8)) (mem [1] (- (reg datapointer) (int 9))))+(movmem (+ (reg datapointer) (int 9)) (mem [1] (- (reg datapointer) (int 8))))+(movmem (+ (reg datapointer) (int 10)) (mem [1] (- (reg datapointer) (int 7))))+(movmem (+ (reg datapointer) (int 11)) (mem [1] (- (reg datapointer) (int 6))))+(movmem (+ (reg datapointer) (int 12)) (mem [1] (- (reg datapointer) (int 5))))+(movmem (+ (reg datapointer) (int 13)) (mem [1] (- (reg datapointer) (int 4))))+(movmem (+ (reg datapointer) (int 14)) (mem [1] (- (reg datapointer) (int 3))))+(movmem (+ (reg datapointer) (int 15)) (mem [1] (- (reg datapointer) (int 2))))+(movmem (+ (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 1))))+(movmem (- (reg datapointer) (int 17)) (mem [1] (- (reg datapointer) (int 34))))+(movmem (- (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 33))))+(movmem (- (reg datapointer) (int 15)) (mem [1] (- (reg datapointer) (int 32))))+(movmem (- (reg datapointer) (int 14)) (mem [1] (- (reg datapointer) (int 31))))+(movmem (- (reg datapointer) (int 13)) (mem [1] (- (reg datapointer) (int 30))))+(movmem (- (reg datapointer) (int 12)) (mem [1] (- (reg datapointer) (int 29))))+(movmem (- (reg datapointer) (int 11)) (mem [1] (- (reg datapointer) (int 28))))+(movmem (- (reg datapointer) (int 10)) (mem [1] (- (reg datapointer) (int 27))))+(movmem (- (reg datapointer) (int 9)) (mem [1] (- (reg datapointer) (int 26))))+(movmem (- (reg datapointer) (int 8)) (mem [1] (- (reg datapointer) (int 25))))+(movmem (- (reg datapointer) (int 7)) (mem [1] (- (reg datapointer) (int 24))))+(movmem (- (reg datapointer) (int 6)) (mem [1] (- (reg datapointer) (int 23))))+(movmem (- (reg datapointer) (int 5)) (mem [1] (- (reg datapointer) (int 22))))+(movmem (- (reg datapointer) (int 4)) (mem [1] (- (reg datapointer) (int 21))))+(movmem (- (reg datapointer) (int 3)) (mem [1] (- (reg datapointer) (int 20))))+(movmem (- (reg datapointer) (int 2)) (mem [1] (- (reg datapointer) (int 19))))+(movmem (- (reg datapointer) (int 1)) (mem [1] (- (reg datapointer) (int 18))))+(movtemp datapointer (+ (reg datapointer) (int 17)))+(movmem (- (reg datapointer) (int 0)) (mem [1] (- (reg datapointer) (int 34))))+(movmem (+ (reg datapointer) (int 1)) (mem [1] (- (reg datapointer) (int 33))))+(movmem (+ (reg datapointer) (int 2)) (mem [1] (- (reg datapointer) (int 32))))+(movmem (+ (reg datapointer) (int 3)) (mem [1] (- (reg datapointer) (int 31))))+(movmem (+ (reg datapointer) (int 4)) (mem [1] (- (reg datapointer) (int 30))))+(movmem (+ (reg datapointer) (int 5)) (mem [1] (- (reg datapointer) (int 29))))+(movmem (+ (reg datapointer) (int 6)) (mem [1] (- (reg datapointer) (int 28))))+(movmem (+ (reg datapointer) (int 7)) (mem [1] (- (reg datapointer) (int 27))))+(movmem (+ (reg datapointer) (int 8)) (mem [1] (- (reg datapointer) (int 26))))+(movmem (+ (reg datapointer) (int 9)) (mem [1] (- (reg datapointer) (int 25))))+(movmem (+ (reg datapointer) (int 10)) (mem [1] (- (reg datapointer) (int 24))))+(movmem (+ (reg datapointer) (int 11)) (mem [1] (- (reg datapointer) (int 23))))+(movmem (+ (reg datapointer) (int 12)) (mem [1] (- (reg datapointer) (int 22))))+(movmem (+ (reg datapointer) (int 13)) (mem [1] (- (reg datapointer) (int 21))))+(movmem (+ (reg datapointer) (int 14)) (mem [1] (- (reg datapointer) (int 20))))+(movmem (+ (reg datapointer) (int 15)) (mem [1] (- (reg datapointer) (int 19))))+(movmem (+ (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 18))))+(movmem (- (reg datapointer) (int 34)) (mem [1] (- (reg datapointer) (int 17))))+(movmem (- (reg datapointer) (int 33)) (mem [1] (- (reg datapointer) (int 16))))+(movmem (- (reg datapointer) (int 32)) (mem [1] (- (reg datapointer) (int 15))))+(movmem (- (reg datapointer) (int 31)) (mem [1] (- (reg datapointer) (int 14))))+(movmem (- (reg datapointer) (int 30)) (mem [1] (- (reg datapointer) (int 13))))+(movmem (- (reg datapointer) (int 29)) (mem [1] (- (reg datapointer) (int 12))))+(movmem (- (reg datapointer) (int 28)) (mem [1] (- (reg datapointer) (int 11))))+(movmem (- (reg datapointer) (int 27)) (mem [1] (- (reg datapointer) (int 10))))+(movmem (- (reg datapointer) (int 26)) (mem [1] (- (reg datapointer) (int 9))))+(movmem (- (reg datapointer) (int 25)) (mem [1] (- (reg datapointer) (int 8))))+(movmem (- (reg datapointer) (int 24)) (mem [1] (- (reg datapointer) (int 7))))+(movmem (- (reg datapointer) (int 23)) (mem [1] (- (reg datapointer) (int 6))))+(movmem (- (reg datapointer) (int 22)) (mem [1] (- (reg datapointer) (int 5))))+(movmem (- (reg datapointer) (int 21)) (mem [1] (- (reg datapointer) (int 4))))+(movmem (- (reg datapointer) (int 20)) (mem [1] (- (reg datapointer) (int 3))))+(movmem (- (reg datapointer) (int 19)) (mem [1] (- (reg datapointer) (int 2))))+(movmem (- (reg datapointer) (int 18)) (mem [1] (- (reg datapointer) (int 1))))+(movmem (- (reg datapointer) (int 17)) (mem [1] (- (reg datapointer) (int 0))))+(movmem (- (reg datapointer) (int 16)) (mem [1] (+ (reg datapointer) (int 1))))+(movmem (- (reg datapointer) (int 15)) (mem [1] (+ (reg datapointer) (int 2))))+(movmem (- (reg datapointer) (int 14)) (mem [1] (+ (reg datapointer) (int 3))))+(movmem (- (reg datapointer) (int 13)) (mem [1] (+ (reg datapointer) (int 4))))+(movmem (- (reg datapointer) (int 12)) (mem [1] (+ (reg datapointer) (int 5))))+(movmem (- (reg datapointer) (int 11)) (mem [1] (+ (reg datapointer) (int 6))))+(movmem (- (reg datapointer) (int 10)) (mem [1] (+ (reg datapointer) (int 7))))+(movmem (- (reg datapointer) (int 9)) (mem [1] (+ (reg datapointer) (int 8))))+(movmem (- (reg datapointer) (int 8)) (mem [1] (+ (reg datapointer) (int 9))))+(movmem (- (reg datapointer) (int 7)) (mem [1] (+ (reg datapointer) (int 10))))+(movmem (- (reg datapointer) (int 6)) (mem [1] (+ (reg datapointer) (int 11))))+(movmem (- (reg datapointer) (int 5)) (mem [1] (+ (reg datapointer) (int 12))))+(movmem (- (reg datapointer) (int 4)) (mem [1] (+ (reg datapointer) (int 13))))+(movmem (- (reg datapointer) (int 3)) (mem [1] (+ (reg datapointer) (int 14))))+(movmem (- (reg datapointer) (int 2)) (mem [1] (+ (reg datapointer) (int 15))))+(movmem (- (reg datapointer) (int 1)) (mem [1] (+ (reg datapointer) (int 16))))+(movmem (- (reg datapointer) (int 0)) (mem [1] (- (reg datapointer) (int 17))))+(movmem (+ (reg datapointer) (int 1)) (mem [1] (- (reg datapointer) (int 16))))+(movmem (+ (reg datapointer) (int 2)) (mem [1] (- (reg datapointer) (int 15))))+(movmem (+ (reg datapointer) (int 3)) (mem [1] (- (reg datapointer) (int 14))))+(movmem (+ (reg datapointer) (int 4)) (mem [1] (- (reg datapointer) (int 13))))+(movmem (+ (reg datapointer) (int 5)) (mem [1] (- (reg datapointer) (int 12))))+(movmem (+ (reg datapointer) (int 6)) (mem [1] (- (reg datapointer) (int 11))))+(movmem (+ (reg datapointer) (int 7)) (mem [1] (- (reg datapointer) (int 10))))+(movmem (+ (reg datapointer) (int 8)) (mem [1] (- (reg datapointer) (int 9))))+(movmem (+ (reg datapointer) (int 9)) (mem [1] (- (reg datapointer) (int 8))))+(movmem (+ (reg datapointer) (int 10)) (mem [1] (- (reg datapointer) (int 7))))+(movmem (+ (reg datapointer) (int 11)) (mem [1] (- (reg datapointer) (int 6))))+(movmem (+ (reg datapointer) (int 12)) (mem [1] (- (reg datapointer) (int 5))))+(movmem (+ (reg datapointer) (int 13)) (mem [1] (- (reg datapointer) (int 4))))+(movmem (+ (reg datapointer) (int 14)) (mem [1] (- (reg datapointer) (int 3))))+(movmem (+ (reg datapointer) (int 15)) (mem [1] (- (reg datapointer) (int 2))))+(movmem (+ (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 1))))+(movmem (- (reg datapointer) (int 17)) (mem [1] (- (reg datapointer) (int 34))))+(movmem (- (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 33))))+(movmem (- (reg datapointer) (int 15)) (mem [1] (- (reg datapointer) (int 32))))+(movmem (- (reg datapointer) (int 14)) (mem [1] (- (reg datapointer) (int 31))))+(movmem (- (reg datapointer) (int 13)) (mem [1] (- (reg datapointer) (int 30))))+(movmem (- (reg datapointer) (int 12)) (mem [1] (- (reg datapointer) (int 29))))+(movmem (- (reg datapointer) (int 11)) (mem [1] (- (reg datapointer) (int 28))))+(movmem (- (reg datapointer) (int 10)) (mem [1] (- (reg datapointer) (int 27))))+(movmem (- (reg datapointer) (int 9)) (mem [1] (- (reg datapointer) (int 26))))+(movmem (- (reg datapointer) (int 8)) (mem [1] (- (reg datapointer) (int 25))))+(movmem (- (reg datapointer) (int 7)) (mem [1] (- (reg datapointer) (int 24))))+(movmem (- (reg datapointer) (int 6)) (mem [1] (- (reg datapointer) (int 23))))+(movmem (- (reg datapointer) (int 5)) (mem [1] (- (reg datapointer) (int 22))))+(movmem (- (reg datapointer) (int 4)) (mem [1] (- (reg datapointer) (int 21))))+(movmem (- (reg datapointer) (int 3)) (mem [1] (- (reg datapointer) (int 20))))+(movmem (- (reg datapointer) (int 2)) (mem [1] (- (reg datapointer) (int 19))))+(movmem (- (reg datapointer) (int 1)) (mem [1] (- (reg datapointer) (int 18))))+(movtemp datapointer (+ (reg datapointer) (int 17)))+(movmem (- (reg datapointer) (int 0)) (mem [1] (- (reg datapointer) (int 34))))+(movmem (+ (reg datapointer) (int 1)) (mem [1] (- (reg datapointer) (int 33))))+(movmem (+ (reg datapointer) (int 2)) (mem [1] (- (reg datapointer) (int 32))))+(movmem (+ (reg datapointer) (int 3)) (mem [1] (- (reg datapointer) (int 31))))+(movmem (+ (reg datapointer) (int 4)) (mem [1] (- (reg datapointer) (int 30))))+(movmem (+ (reg datapointer) (int 5)) (mem [1] (- (reg datapointer) (int 29))))+(movmem (+ (reg datapointer) (int 6)) (mem [1] (- (reg datapointer) (int 28))))+(movmem (+ (reg datapointer) (int 7)) (mem [1] (- (reg datapointer) (int 27))))+(movmem (+ (reg datapointer) (int 8)) (mem [1] (- (reg datapointer) (int 26))))+(movmem (+ (reg datapointer) (int 9)) (mem [1] (- (reg datapointer) (int 25))))+(movmem (+ (reg datapointer) (int 10)) (mem [1] (- (reg datapointer) (int 24))))+(movmem (+ (reg datapointer) (int 11)) (mem [1] (- (reg datapointer) (int 23))))+(movmem (+ (reg datapointer) (int 12)) (mem [1] (- (reg datapointer) (int 22))))+(movmem (+ (reg datapointer) (int 13)) (mem [1] (- (reg datapointer) (int 21))))+(movmem (+ (reg datapointer) (int 14)) (mem [1] (- (reg datapointer) (int 20))))+(movmem (+ (reg datapointer) (int 15)) (mem [1] (- (reg datapointer) (int 19))))+(movmem (+ (reg datapointer) (int 16)) (mem [1] (- (reg datapointer) (int 18))))+(movmem (- (reg datapointer) (int 34)) (mem [1] (- (reg datapointer) (int 17))))+(movmem (- (reg datapointer) (int 33)) (mem [1] (- (reg datapointer) (int 16))))+(movmem (- (reg datapointer) (int 32)) (mem [1] (- (reg datapointer) (int 15))))+(movmem (- (reg datapointer) (int 31)) (mem [1] (- (reg datapointer) (int 14))))+(movmem (- (reg datapointer) (int 30)) (mem [1] (- (reg datapointer) (int 13))))+(movmem (- (reg datapointer) (int 29)) (mem [1] (- (reg datapointer) (int 12))))+(movmem (- (reg datapointer) (int 28)) (mem [1] (- (reg datapointer) (int 11))))+(movmem (- (reg datapointer) (int 27)) (mem [1] (- (reg datapointer) (int 10))))+(movmem (- (reg datapointer) (int 26)) (mem [1] (- (reg datapointer) (int 9))))+(movmem (- (reg datapointer) (int 25)) (mem [1] (- (reg datapointer) (int 8))))+(movmem (- (reg datapointer) (int 24)) (mem [1] (- (reg datapointer) (int 7))))+(movmem (- (reg datapointer) (int 23)) (mem [1] (- (reg datapointer) (int 6))))+(movmem (- (reg datapointer) (int 22)) (mem [1] (- (reg datapointer) (int 5))))+(movmem (- (reg datapointer) (int 21)) (mem [1] (- (reg datapointer) (int 4))))+(movmem (- (reg datapointer) (int 20)) (mem [1] (- (reg datapointer) (int 3))))+(movmem (- (reg datapointer) (int 19)) (mem [1] (- (reg datapointer) (int 2))))+(movmem (- (reg datapointer) (int 18)) (mem [1] (- (reg datapointer) (int 1))))+(movmem (- (reg datapointer) (int 17)) (mem [1] (- (reg datapointer) (int 0))))+(movmem (- (reg datapointer) (int 16)) (mem [1] (+ (reg datapointer) (int 1))))+(movmem (- (reg datapointer) (int 15)) (mem [1] (+ (reg datapointer) (int 2))))+(movmem (- (reg datapointer) (int 14)) (mem [1] (+ (reg datapointer) (int 3))))+(movmem (- (reg datapointer) (int 13)) (mem [1] (+ (reg datapointer) (int 4))))+(movmem (- (reg datapointer) (int 12)) (mem [1] (+ (reg datapointer) (int 5))))+(movmem (- (reg datapointer) (int 11)) (mem [1] (+ (reg datapointer) (int 6))))+(movmem (- (reg datapointer) (int 10)) (mem [1] (+ (reg datapointer) (int 7))))+(movmem (- (reg datapointer) (int 9)) (mem [1] (+ (reg datapointer) (int 8))))+(movmem (- (reg datapointer) (int 8)) (mem [1] (+ (reg datapointer) (int 9))))+(movmem (- (reg datapointer) (int 7)) (mem [1] (+ (reg datapointer) (int 10))))+(movmem (- (reg datapointer) (int 6)) (mem [1] (+ (reg datapointer) (int 11))))+(movmem (- (reg datapointer) (int 5)) (mem [1] (+ (reg datapointer) (int 12))))+(movmem (- (reg datapointer) (int 4)) (mem [1] (+ (reg datapointer) (int 13))))+(movmem (- (reg datapointer) (int 3)) (mem [1] (+ (reg datapointer) (int 14))))+(movmem (- (reg datapointer) (int 2)) (mem [1] (+ (reg datapointer) (int 15))))+(movmem (- (reg datapointer) (int 1)) (mem [1] (+ (reg datapointer) (int 16))))+(movtemp datapointer (- (reg datapointer) (int 17)))+(call kmp1)+(movmem (- (reg datapointer) (int 0)) (mem [1] (+ (reg datapointer) (int 17))))+(movmem (+ (reg datapointer) (int 1)) (mem [1] (+ (reg datapointer) (int 18))))+(movmem (+ (reg datapointer) (int 2)) (mem [1] (+ (reg datapointer) (int 19))))+(movmem (+ (reg datapointer) (int 3)) (mem [1] (+ (reg datapointer) (int 20))))+(movmem (+ (reg datapointer) (int 4)) (mem [1] (+ (reg datapointer) (int 21))))+(movmem (+ (reg datapointer) (int 5)) (mem [1] (+ (reg datapointer) (int 22))))+(movmem (+ (reg datapointer) (int 6)) (mem [1] (+ (reg datapointer) (int 23))))+(movmem (+ (reg datapointer) (int 7)) (mem [1] (+ (reg datapointer) (int 24))))+(movmem (+ (reg datapointer) (int 8)) (mem [1] (+ (reg datapointer) (int 25))))+(movmem (+ (reg datapointer) (int 9)) (mem [1] (+ (reg datapointer) (int 26))))+(movmem (+ (reg datapointer) (int 10)) (mem [1] (+ (reg datapointer) (int 27))))+(movmem (+ (reg datapointer) (int 11)) (mem [1] (+ (reg datapointer) (int 28))))+(movmem (+ (reg datapointer) (int 12)) (mem [1] (+ (reg datapointer) (int 29))))+(movmem (+ (reg datapointer) (int 13)) (mem [1] (+ (reg datapointer) (int 30))))+(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))))+(movtemp datapointer (- (reg datapointer) (int 16)))+(movtemp t_11 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_12 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_12) (reg t_11)))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (- (reg datapointer) (int 0)) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (- (reg datapointer) (int 0)) (mem [8] (- (reg datapointer) (int 16))))+(movmem (- (reg datapointer) (int 16)) (mem [8] (- (reg datapointer) (int 8))))+(movmem (- (reg datapointer) (int 8)) (mem [8] (- (reg datapointer) (int 0))))+(movtemp datapointer (- (reg datapointer) (int 16)))+(movtemp t_13 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_14 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (* (reg t_14) (reg t_13)))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (- (reg datapointer) (int 0)) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp t_15 (mem [8] (reg datapointer)))+(movtemp datapointer (- (reg datapointer) (int 8)))+(movtemp t_16 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (+ (reg t_16) (reg t_15)))+(call kmp3)+(movmem (- (reg datapointer) (int 0)) (mem [8] (+ (reg datapointer) (int 8))))+(movtemp datapointer (+ (reg datapointer) (int 8))) (movmem (reg datapointer) (tag 0x0)) (movtemp datapointer (+ (reg datapointer) (int 1))) (ret) +kmp5:+(movtemp datapointer (- (reg datapointer) (int 25)))+(movtemp t_17 (mem [8] (reg datapointer)))+(movmem (reg datapointer) (~ (reg t_17)))+(movtemp datapointer (+ (reg datapointer) (int 8)))+(movmem (reg datapointer) (tag 0x0))+(movtemp datapointer (+ (reg datapointer) (int 1)))+(ret)+ export add {Gaussian_1 Gaussian_1 -- Gaussian_1} kmp2 -export conjugate {Gaussian_1 -- Gaussian_1} kmp3+export conjugate {Gaussian_1 -- Gaussian_1} kmp5++export mult {Gaussian_1 Gaussian_1 -- Gaussian_1} kmp4