// assembly-output: emit-asm // compile-flags: --target m68k-unknown-linux-gnu // needs-llvm-components: m68k #![feature(no_core, lang_items, rustc_attrs, asm_experimental_arch)] #![crate_type = "rlib"] #![no_core] #![allow(non_camel_case_types)] #[rustc_builtin_macro] macro_rules! asm { () => {}; } #[rustc_builtin_macro] macro_rules! concat { () => {}; } #[lang = "sized"] trait Sized {} #[lang = "copy"] trait Copy {} type ptr = *const u64; impl Copy for i8 {} impl Copy for i16 {} impl Copy for i32 {} impl Copy for i64 {} impl Copy for ptr {} macro_rules! check { ($func:ident $ty:ident $class:ident $mov:literal) => { #[no_mangle] pub unsafe fn $func(x: $ty) -> $ty { let y; asm!(concat!($mov, " {}, {};"), out($class) y, in($class) x); y } }; } // CHECK-LABEL: reg_data_i8: // CHECK: ;APP // CHECK: move.b %d{{[0-9]}}, %d{{[0-9]}} // CHECK: ;NO_APP check!(reg_data_i8 i8 reg_data "move.b"); // CHECK-LABEL: reg_data_i16: // CHECK: ;APP // CHECK: move.w %d{{[0-9]}}, %d{{[0-9]}} // CHECK: ;NO_APP check!(reg_data_i16 i16 reg_data "move.w"); // CHECK-LABEL: reg_data_i32: // CHECK: ;APP // CHECK: move.l %d{{[0-9]}}, %d{{[0-9]}} // CHECK: ;NO_APP check!(reg_data_i32 i32 reg_data "move.l"); // CHECK-LABEL: reg_addr_i16: // CHECK: ;APP // CHECK: move.w %a{{[0-9]}}, %a{{[0-9]}} // CHECK: ;NO_APP check!(reg_addr_i16 i16 reg_addr "move.w"); // CHECK-LABEL: reg_addr_i32: // CHECK: ;APP // CHECK: move.l %a{{[0-9]}}, %a{{[0-9]}} // CHECK: ;NO_APP check!(reg_addr_i32 i32 reg_addr "move.l"); // CHECK-LABEL: reg_i16: // CHECK: ;APP // CHECK: move.w %{{[da][0-9]}}, %{{[da][0-9]}} // CHECK: ;NO_APP check!(reg_i16 i16 reg "move.w"); // CHECK-LABEL: reg_i32: // CHECK: ;APP // CHECK: move.l %{{[da][0-9]}}, %{{[da][0-9]}} // CHECK: ;NO_APP check!(reg_i32 i32 reg "move.l");