| //@ assembly-output: emit-asm |
| //@ compile-flags: --target avr-unknown-gnu-atmega328 |
| //@ needs-llvm-components: avr |
| |
| #![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 $hi:literal $lo:literal $reg:tt) => { |
| #[no_mangle] |
| unsafe fn $func() -> i16 { |
| let y; |
| asm!(concat!("mov {0:", $hi, "}, {0:", $lo, "}"), out($reg) y); |
| y |
| } |
| }; |
| } |
| |
| // CHECK-LABEL: reg_pair_modifiers: |
| // CHECK: ;APP |
| // CHECK: mov r{{[1-9]?[13579]}}, r{{[1-9]?[24680]}} |
| // CHECK: ;NO_APP |
| check!(reg_pair_modifiers "h" "l" reg_pair); |
| |
| // CHECK-LABEL: reg_iw_modifiers: |
| // CHECK: ;APP |
| // CHECK: mov r{{[1-9]?[13579]}}, r{{[1-9]?[24680]}} |
| // CHECK: ;NO_APP |
| check!(reg_iw_modifiers "h" "l" reg_iw); |
| |
| // CHECK-LABEL: reg_ptr_modifiers: |
| // CHECK: ;APP |
| // CHECK: mov r{{[1-9]?[13579]}}, r{{[1-9]?[24680]}} |
| // CHECK: ;NO_APP |
| check!(reg_ptr_modifiers "h" "l" reg_ptr); |