about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2013-03-13 13:21:54 -0700
committerLuqman Aden <laden@mozilla.com>2013-03-15 18:55:44 -0700
commite182ac4bbde92a4a29fcdd3ff7c3906b394b8c16 (patch)
tree6962db4302a6c2d25721b56247b6e321526f6e94
parent9ead7dad934cc361f8e5e489238031c987ecfc82 (diff)
downloadrust-e182ac4bbde92a4a29fcdd3ff7c3906b394b8c16.tar.gz
rust-e182ac4bbde92a4a29fcdd3ff7c3906b394b8c16.zip
Actually use no or multiple operands properly.
-rw-r--r--src/librustc/middle/trans/build.rs8
-rw-r--r--src/librustc/middle/trans/expr.rs24
2 files changed, 22 insertions, 10 deletions
diff --git a/src/librustc/middle/trans/build.rs b/src/librustc/middle/trans/build.rs
index 3eab94b8bc4..1d31dc4fb8a 100644
--- a/src/librustc/middle/trans/build.rs
+++ b/src/librustc/middle/trans/build.rs
@@ -873,7 +873,7 @@ pub fn add_comment(bcx: block, text: &str) {
 }
 
 pub fn InlineAsmCall(cx: block, asm: *c_char, cons: *c_char,
-                     inputs: &[ValueRef], output: ValueRef,
+                     inputs: &[ValueRef], output: TypeRef,
                      volatile: bool, alignstack: bool,
                      dia: AsmDialect) -> ValueRef {
     unsafe {
@@ -885,12 +885,12 @@ pub fn InlineAsmCall(cx: block, asm: *c_char, cons: *c_char,
                          else          { lib::llvm::False };
 
         let argtys = do inputs.map |v| {
-            io::println(fmt!("INPUT TYPE: %?", val_str(cx.ccx().tn, *v)));
+            debug!("Asm Input Type: %?", val_str(cx.ccx().tn, *v));
             val_ty(*v)
         };
 
-        io::println(fmt!("OUTPUT TYPE: %?", val_str(cx.ccx().tn, output)));
-        let llfty = T_fn(argtys, val_ty(output));
+        debug!("Asm Output Type: %?", ty_str(cx.ccx().tn, output));
+        let llfty = T_fn(argtys, output);
         let v = llvm::LLVMInlineAsm(llfty, asm, cons, volatile,
                                     alignstack, dia as c_uint);
 
diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs
index 75097e151aa..73cff97de95 100644
--- a/src/librustc/middle/trans/expr.rs
+++ b/src/librustc/middle/trans/expr.rs
@@ -629,10 +629,15 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block {
                 constraints += *clobs;
             }
 
-            io::println(fmt!("Constraints: %?\n", constraints));
+            debug!("Asm Constraints: %?", constraints);
 
-            // TODO: Handle >1 outputs
-            let output = outputs[0];
+            let output = if outputs.len() == 0 {
+                T_void()
+            } else if outputs.len() == 1 {
+                val_ty(outputs[0])
+            } else {
+                T_struct(outputs.map(|o| val_ty(*o)))
+            };
 
             let r = do str::as_c_str(*asm) |a| {
                 do str::as_c_str(constraints) |c| {
@@ -641,9 +646,16 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block {
                 }
             };
 
-            // TODO: Handle >1 outputs
-            let op = PointerCast(bcx, aoutputs[0], T_ptr(val_ty(output)));
-            Store(bcx, r, op);
+            if outputs.len() == 1 {
+                let op = PointerCast(bcx, aoutputs[0], T_ptr(val_ty(outputs[0])));
+                Store(bcx, r, op);
+            } else {
+                for aoutputs.eachi |i, o| {
+                    let v = ExtractValue(bcx, r, i);
+                    let op = PointerCast(bcx, *o, T_ptr(val_ty(outputs[i])));
+                    Store(bcx, v, op);
+                }
+            }
 
             return bcx;
         }