LLVM: Add inline assembly to binding.
authorDavid Terei <davidterei@gmail.com>
Wed, 14 Jul 2010 15:25:30 +0000 (15:25 +0000)
committerDavid Terei <davidterei@gmail.com>
Wed, 14 Jul 2010 15:25:30 +0000 (15:25 +0000)
compiler/llvmGen/Llvm/AbsSyn.hs
compiler/llvmGen/Llvm/PpLlvm.hs

index 08d27d7..e25f5be 100644 (file)
@@ -210,5 +210,18 @@ data LlvmExpression
   -}
   | Phi LlvmType [(LlvmVar,LlvmVar)]
 
+  {- |
+    Inline assembly expression. Syntax is very similar to the style used by GCC.
+      * assembly:   Actual inline assembly code.
+      * contraints: Operand constraints.
+      * return ty:  Return type of function.
+      * vars:       Any variables involved in the assembly code.
+      * sideeffect: Does the expression have side effects not visible from the
+                    constraints list.
+      * alignstack: Should the stack be conservatively aligned before this
+                    expression is executed.
+  -}
+  | Asm LMString LMString LlvmType [LlvmVar] Bool Bool
+
   deriving (Show, Eq)
 
index b3e2d98..1a972e7 100644 (file)
@@ -176,6 +176,7 @@ ppLlvmExpression expr
         Load       ptr              -> ppLoad ptr
         Malloc     tp amount        -> ppMalloc tp amount
         Phi        tp precessors    -> ppPhi tp precessors
+        Asm        asm c ty v se sk -> ppAsm asm c ty v se sk
 
 
 --------------------------------------------------------------------------------
@@ -299,6 +300,18 @@ ppSwitch scrut dflt targets =
         <+> ppTargets targets
 
 
+ppAsm :: LMString -> LMString -> LlvmType -> [LlvmVar] -> Bool -> Bool -> Doc
+ppAsm asm constraints rty vars sideeffect alignstack =
+  let asm'  = doubleQuotes $ ftext asm
+      cons  = doubleQuotes $ ftext constraints
+      rty'  = texts rty 
+      vars' = lparen <+> ppCommaJoin vars <+> rparen
+      side  = if sideeffect then text "sideeffect" else empty
+      align = if alignstack then text "alignstack" else empty
+  in text "call" <+> rty' <+> text "asm" <+> side <+> align <+> asm' <> comma
+        <+> cons <> vars'
+
+
 --------------------------------------------------------------------------------
 -- * Misc functions
 --------------------------------------------------------------------------------