11use std:: fmt;
22
3- use rustc_span:: Symbol ;
3+ use rustc_data_structures:: fx:: FxIndexSet ;
4+ use rustc_span:: { Symbol , sym} ;
45
56use super :: { InlineAsmArch , InlineAsmType , ModifierInfo } ;
7+ use crate :: spec:: { RelocModel , Target } ;
68
79def_reg_class ! {
810 Avr AvrInlineAsmRegClass {
@@ -52,24 +54,44 @@ impl AvrInlineAsmRegClass {
5254 }
5355}
5456
57+ pub ( crate ) fn is_tiny ( target_features : & FxIndexSet < Symbol > ) -> bool {
58+ target_features. contains ( & sym:: tinyencoding)
59+ }
60+
61+ fn not_tiny (
62+ _arch : InlineAsmArch ,
63+ _reloc_model : RelocModel ,
64+ target_features : & FxIndexSet < Symbol > ,
65+ _target : & Target ,
66+ _is_clobber : bool ,
67+ ) -> Result < ( ) , & ' static str > {
68+ if is_tiny ( target_features) {
69+ Err (
70+ "on AVRTiny, r[2-15] are unavailable, r16 (scratch register) and r17 (zero register) are reserved by LLVM" ,
71+ )
72+ } else {
73+ Ok ( ( ) )
74+ }
75+ }
76+
5577def_regs ! {
5678 Avr AvrInlineAsmReg AvrInlineAsmRegClass {
57- r2: reg = [ "r2" ] ,
58- r3: reg = [ "r3" ] ,
59- r4: reg = [ "r4" ] ,
60- r5: reg = [ "r5" ] ,
61- r6: reg = [ "r6" ] ,
62- r7: reg = [ "r7" ] ,
63- r8: reg = [ "r8" ] ,
64- r9: reg = [ "r9" ] ,
65- r10: reg = [ "r10" ] ,
66- r11: reg = [ "r11" ] ,
67- r12: reg = [ "r12" ] ,
68- r13: reg = [ "r13" ] ,
69- r14: reg = [ "r14" ] ,
70- r15: reg = [ "r15" ] ,
71- r16: reg, reg_upper = [ "r16" ] ,
72- r17: reg, reg_upper = [ "r17" ] ,
79+ r2: reg = [ "r2" ] % not_tiny ,
80+ r3: reg = [ "r3" ] % not_tiny ,
81+ r4: reg = [ "r4" ] % not_tiny ,
82+ r5: reg = [ "r5" ] % not_tiny ,
83+ r6: reg = [ "r6" ] % not_tiny ,
84+ r7: reg = [ "r7" ] % not_tiny ,
85+ r8: reg = [ "r8" ] % not_tiny ,
86+ r9: reg = [ "r9" ] % not_tiny ,
87+ r10: reg = [ "r10" ] % not_tiny ,
88+ r11: reg = [ "r11" ] % not_tiny ,
89+ r12: reg = [ "r12" ] % not_tiny ,
90+ r13: reg = [ "r13" ] % not_tiny ,
91+ r14: reg = [ "r14" ] % not_tiny ,
92+ r15: reg = [ "r15" ] % not_tiny ,
93+ r16: reg, reg_upper = [ "r16" ] % not_tiny ,
94+ r17: reg, reg_upper = [ "r17" ] % not_tiny ,
7395 r18: reg, reg_upper = [ "r18" ] ,
7496 r19: reg, reg_upper = [ "r19" ] ,
7597 r20: reg, reg_upper = [ "r20" ] ,
@@ -83,14 +105,14 @@ def_regs! {
83105 r30: reg, reg_upper = [ "r30" , "ZL" ] ,
84106 r31: reg, reg_upper = [ "r31" , "ZH" ] ,
85107
86- r3r2: reg_pair = [ "r3r2" ] ,
87- r5r4: reg_pair = [ "r5r4" ] ,
88- r7r6: reg_pair = [ "r7r6" ] ,
89- r9r8: reg_pair = [ "r9r8" ] ,
90- r11r10: reg_pair = [ "r11r10" ] ,
91- r13r12: reg_pair = [ "r13r12" ] ,
92- r15r14: reg_pair = [ "r15r14" ] ,
93- r17r16: reg_pair = [ "r17r16" ] ,
108+ r3r2: reg_pair = [ "r3r2" ] % not_tiny ,
109+ r5r4: reg_pair = [ "r5r4" ] % not_tiny ,
110+ r7r6: reg_pair = [ "r7r6" ] % not_tiny ,
111+ r9r8: reg_pair = [ "r9r8" ] % not_tiny ,
112+ r11r10: reg_pair = [ "r11r10" ] % not_tiny ,
113+ r13r12: reg_pair = [ "r13r12" ] % not_tiny ,
114+ r15r14: reg_pair = [ "r15r14" ] % not_tiny ,
115+ r17r16: reg_pair = [ "r17r16" ] % not_tiny ,
94116 r19r18: reg_pair = [ "r19r18" ] ,
95117 r21r20: reg_pair = [ "r21r20" ] ,
96118 r23r22: reg_pair = [ "r23r22" ] ,
0 commit comments