on master help sign in
Fix case on strings and bigints
commitcca0ac0880cea352cc692d03f579f6db8a2bea7c authorBenjamin Saunders <besaunde@sfu.ca> dateTue 25 Jun 2013, 18:26 (13 years ago) parent7e29890
1 file changed+7−16
src/IRTS/CodegenLLVM.hs+7−16
src/IRTS/CodegenLLVM.hs+7−16
@@ -87,7 +87,7 @@ mainDef =
8787 , G.name = Name "main"
8888 , G.basicBlocks =
8989 [ BasicBlock (UnName 0)
90− [ UnName 1 := idrCall "{runMain0}" [] ]
90+ [ UnName 1 := idrCall "{runMain0}" [] ] -- TODO: Set GMP memory functions
9191 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
9292 ]}
9393
@@ -516,26 +516,17 @@ cgConCase con defExp alts = do
516516
517517cgChainCase :: Operand -> Maybe SExp -> [SAlt] -> Codegen (Maybe Operand)
518518cgChainCase caseValPtr defExp alts = do
519− (caseTy, comparator, caseVal) <-
520− case head alts of
521− SConstCase (TT.BI _) _ -> do
522− realPtr <- inst $ BitCast caseValPtr (PointerType (primTy mpzTy) (AddrSpace 0)) []
523− valPtr <- inst $ GetElementPtr True realPtr [ ConstantOperand (C.Int 32 0)
524− , ConstantOperand (C.Int 32 1)] []
525− return (mpzTy, "__gmpz_cmp", valPtr)
526− SConstCase (TT.Str _) _ -> do
527− let caseTy = PointerType (IntegerType 8) (AddrSpace 0)
528− realPtr <- inst $ BitCast caseValPtr (PointerType (primTy caseTy) (AddrSpace 0)) []
529− valPtr <- inst $ GetElementPtr True realPtr [ ConstantOperand (C.Int 32 0)
530− , ConstantOperand (C.Int 32 1)] []
531− strPtr <- inst $ Load False valPtr Nothing 0 []
532− return (caseTy, "strcmp", strPtr)
519+ let (caseTy, comparator) =
520+ case head alts of
521+ SConstCase (TT.BI _) _ -> (FInt ITBig, "__gmpz_cmp")
522+ SConstCase (TT.Str _) _ -> (FString, "strcmp")
523+ caseVal <- unbox caseTy caseValPtr
533524 defBlockName <- getName "default"
534525 exitBlockName <- getName "caseExit"
535526 namedAlts <- mapM (\a -> do n <- nameAlt defBlockName a; return (n, a)) alts
536527 initEnv <- gets lexenv
537528 results <- forM namedAlts $ \(name, SConstCase c e) ->
538− do const <- cgConst c
529+ do const <- unbox caseTy =<< cgConst c
539530 cmp <- inst $ simpleCall comparator [const, caseVal]
540531 cmpResult <- inst $ ICmp IPred.EQ cmp (ConstantOperand (C.Int 32 0)) []
541532 elseName <- getName "else"