#include "rust-compile-asm.h"
-#include "rust-system.h"
#include "rust-compile-expr.h"
namespace Rust {
namespace Compile {
CompileAsm::asm_construct_inputs (HIR::InlineAsm &expr)
{
// TODO: Do i need to do this?
- return NULL_TREE;
+ tree head = NULL_TREE;
+ for (auto &input : expr.get_operands ())
+ {
+ if (input.get_register_type () == AST::InlineAsmOperand::RegisterType::In)
+ {
+ auto in = input.get_in ();
+
+ tree in_tree = CompileExpr::Compile (in.expr.get (), this->ctx);
+ // expects a tree list
+ // TODO: This assumes that the input is a register
+ std::string expr_name = "r";
+ auto name = build_string (expr_name.size () + 1, expr_name.c_str ());
+ head
+ = chainon (head, build_tree_list (build_tree_list (NULL_TREE, name),
+ in_tree));
+
+ /*head = chainon (head, out_tree);*/
+ }
+ }
+ return head;
}
tree
// TODO: When we've succesfully parse an expr, remember to clone_expr()
// instead of nullptr
- // struct AST::InlineAsmOperand::In in (reg, nullptr);
- // inline_asm_ctx.inline_asm.operands.push_back (in);
+ struct AST::InlineAsmOperand::In in (reg, std::move (expr));
+ inline_asm_ctx.inline_asm.operands.push_back (in);
return inline_asm_ctx;
}
return tl::unexpected<InlineAsmParseError> (NONCOMMITED);
* trait});*/
transformed_template_str += "%" + std::to_string (idx);
- /*std::cout << "argument implicitly is: " << idx <<
- * std::endl;*/
+ // std::cout << "argument implicitly is: " << idx <<
+ // std::endl; std::cout << "transformed template str is:"
+ // << transformed_template_str << std::endl;
/*std::cout << "trait: " << trait.to_string () <<
* std::endl;*/
/*std::cout << "arg: " << arg.to_string () << std::endl;*/
fn main() -> i32 {
unsafe {
asm!(
- "add {}, {}",
+ "add {}, 1",
in(reg) 0
);
}
unsafe {
asm!(
"add {}, {}",
- inout(reg) num1 =>_num1,
in(reg) _num2,
+ out(reg) _num1,
);
}
let mut _output_testing: u32 = 0;
unsafe {
asm!(
- "add {}, {}",
+ "add {}, 1",
in(reg) _num1,
//out(reg) _,
);
/* { dg-do run { target arm*-*-* } } */
-/* { dg-output "5\r*\n" }*/
+/* { dg-output "5\r*\n9\r*\n" }*/
#![feature(rustc_attrs)]
#[rustc_builtin_macro]
fn main() -> i32 {
let mut _x: i32 = 0;
+ let mut _y: i32 = 9;
+
unsafe {
asm!(
"mov {}, 5",
out(reg) _x
);
printf("%d\n\0" as *const str as *const i8, _x);
+ };
+
+ unsafe {
+ asm!(
+ "mov {}, {}",
+ in(reg) _y,
+ out(reg) _x
+ );
+ printf("%d\n\0" as *const str as *const i8, _x);
}
+
0
}
/* { dg-do run { target x86_64*-*-* } } */
-/* { dg-output "5\r*\n" }*/
+/* { dg-output "5\r*\n9\r*\n" }*/
#![feature(rustc_attrs)]
#[rustc_builtin_macro]
}
fn main() -> i32 {
- let mut _x: i32 = 0;
+ let mut x: i32 = 0;
+ let mut _y: i32 = 9; // Mark it as _y since it is only used as input operand, not printing
+
unsafe {
asm!(
"mov $5, {}",
- out(reg) _x
+ out(reg) x
+ );
+ printf("%d\n\0" as *const str as *const i8, x);
+ };
+
+ unsafe {
+ asm!(
+ "mov {}, {}",
+ in(reg) _y,
+ out(reg) x,
);
- printf("%d\n\0" as *const str as *const i8, _x);
+ printf("%d\n\0" as *const str as *const i8, x);
}
0
}