1
1
use std:: fmt;
2
2
3
- use rustc_span:: Symbol ;
3
+ use rustc_data_structures:: fx:: FxIndexSet ;
4
+ use rustc_span:: { Symbol , sym} ;
4
5
5
6
use super :: { InlineAsmArch , InlineAsmType , ModifierInfo } ;
7
+ use crate :: spec:: { RelocModel , Target } ;
6
8
7
9
def_reg_class ! {
8
10
Avr AvrInlineAsmRegClass {
@@ -52,24 +54,44 @@ impl AvrInlineAsmRegClass {
52
54
}
53
55
}
54
56
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
+
55
77
def_regs ! {
56
78
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 ,
73
95
r18: reg, reg_upper = [ "r18" ] ,
74
96
r19: reg, reg_upper = [ "r19" ] ,
75
97
r20: reg, reg_upper = [ "r20" ] ,
@@ -83,14 +105,14 @@ def_regs! {
83
105
r30: reg, reg_upper = [ "r30" , "ZL" ] ,
84
106
r31: reg, reg_upper = [ "r31" , "ZH" ] ,
85
107
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 ,
94
116
r19r18: reg_pair = [ "r19r18" ] ,
95
117
r21r20: reg_pair = [ "r21r20" ] ,
96
118
r23r22: reg_pair = [ "r23r22" ] ,
0 commit comments