]>
git.proxmox.com Git - rustc.git/blob - src/test/assembly/asm/avr-types.rs
1 // assembly-output: emit-asm
2 // compile-flags: --target avr-unknown-gnu-atmega328
3 // needs-llvm-components: avr
5 #![feature(no_core, lang_items, rustc_attrs, asm_experimental_arch)]
6 #![crate_type = "rlib"]
8 #![allow(non_camel_case_types)]
10 #[rustc_builtin_macro]
14 #[rustc_builtin_macro]
24 type ptr
= *const u64;
33 ($func
:ident $ty
:ident $class
:ident
) => {
35 pub unsafe fn $
func(x
: $ty
) -> $ty
{
37 asm
!("mov {}, {}", lateout($class
) y
, in($class
) x
);
44 ($func
:ident $ty
:ident $class
:ident
) => {
46 pub unsafe fn $
func(x
: $ty
) -> $ty
{
48 asm
!("movw {}, {}", lateout($class
) y
, in($class
) x
);
54 macro_rules
! check_reg
{
55 ($func
:ident $ty
:ident $reg
:tt
) => {
57 pub unsafe fn $
func(x
: $ty
) -> $ty
{
59 asm
!(concat
!("mov ", $reg
, ", ", $reg
), lateout($reg
) y
, in($reg
) x
);
65 macro_rules
! check_regw
{
66 ($func
:ident $ty
:ident $reg
:tt $reg_lit
:tt
) => {
68 pub unsafe fn $
func(x
: $ty
) -> $ty
{
70 asm
!(concat
!("movw ", $reg_lit
, ", ", $reg_lit
), lateout($reg
) y
, in($reg
) x
);
78 static extern_static
: i8;
81 // CHECK-LABEL: sym_fn
83 // CHECK: call extern_func
86 pub unsafe fn sym_fn() {
87 asm
!("call {}", sym extern_func
);
90 // CHECK-LABEL: sym_static
92 // CHECK: lds r{{[0-9]+}}, extern_static
95 pub unsafe fn sym_static() -> i8 {
97 asm
!("lds {}, {}", lateout(reg
) y
, sym extern_static
);
101 // CHECK-LABEL: ld_z:
103 // CHECK: ld r{{[0-9]+}}, Z
106 pub unsafe fn ld_z(x
: i16) -> i8 {
108 asm
!("ld {}, Z", out(reg
) y
, in("Z") x
);
112 // CHECK-LABEL: ldd_z:
114 // CHECK: ldd r{{[0-9]+}}, Z+4
117 pub unsafe fn ldd_z(x
: i16) -> i8 {
119 asm
!("ldd {}, Z+4", out(reg
) y
, in("Z") x
);
123 // CHECK-LABEL: ld_predecrement:
125 // CHECK: ld r{{[0-9]+}}, -Z
128 pub unsafe fn ld_predecrement(x
: i16) -> i8 {
130 asm
!("ld {}, -Z", out(reg
) y
, in("Z") x
);
134 // CHECK-LABEL: ld_postincrement:
136 // CHECK: ld r{{[0-9]+}}, Z+
139 pub unsafe fn ld_postincrement(x
: i16) -> i8 {
141 asm
!("ld {}, Z+", out(reg
) y
, in("Z") x
);
145 // CHECK-LABEL: muls_clobber:
147 // CHECK: muls r{{[0-9]+}}, r{{[0-9]+}}
148 // CHECK: movw r{{[0-9]+}}, r0
151 pub unsafe fn muls_clobber(x
: i8, y
: i8) -> i16 {
163 // CHECK-LABEL: reg_i8:
165 // CHECK: mov r{{[0-9]+}}, r{{[0-9]+}}
167 check
!(reg_i8
i8 reg
);
169 // CHECK-LABEL: reg_upper_i8:
171 // CHECK: mov r{{[1-3][0-9]}}, r{{[1-3][0-9]}}
173 check
!(reg_upper_i8
i8 reg_upper
);
175 // CHECK-LABEL: reg_pair_i16:
177 // CHECK: movw r{{[0-9]+}}, r{{[0-9]+}}
179 checkw
!(reg_pair_i16
i16 reg_pair
);
181 // CHECK-LABEL: reg_iw_i16:
183 // CHECK: movw r{{[0-9]+}}, r{{[0-9]+}}
185 checkw
!(reg_iw_i16
i16 reg_iw
);
187 // CHECK-LABEL: reg_ptr_i16:
189 // CHECK: movw r{{[0-9]+}}, r{{[0-9]+}}
191 checkw
!(reg_ptr_i16
i16 reg_ptr
);
193 // CHECK-LABEL: r2_i8:
197 check_reg
!(r2_i8
i8 "r2");
199 // CHECK-LABEL: xl_i8:
201 // CHECK: mov r26, r26
203 check_reg
!(xl_i8
i8 "XL");
205 // CHECK-LABEL: xh_i8:
207 // CHECK: mov r27, r27
209 check_reg
!(xh_i8
i8 "XH");
211 // CHECK-LABEL: x_i16:
213 // CHECK: movw r26, r26
215 check_regw
!(x_i16
i16 "X" "X");
217 // CHECK-LABEL: r25r24_i16:
219 // CHECK: movw r24, r24
221 check_regw
!(r25r24_i16
i16 "r25r24" "r24");