Skip to content

Commit 09e33ec

Browse files
MabezDevtaiki-e
andcommitted
asm! support for the Xtensa architecture (#68)
Co-authored-by: Taiki Endo <[email protected]>
1 parent 0f24083 commit 09e33ec

File tree

6 files changed

+525
-0
lines changed

6 files changed

+525
-0
lines changed

compiler/rustc_codegen_llvm/src/asm.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ impl<'ll, 'tcx> AsmBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
278278
}
279279
InlineAsmArch::SpirV => {}
280280
InlineAsmArch::Wasm32 | InlineAsmArch::Wasm64 => {}
281+
InlineAsmArch::Xtensa => {}
281282
InlineAsmArch::Bpf => {}
282283
InlineAsmArch::Msp430 => {
283284
constraints.push("~{sr}".to_string());
@@ -680,6 +681,9 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'_>>) ->
680681
| X86InlineAsmRegClass::kreg0
681682
| X86InlineAsmRegClass::tmm_reg,
682683
) => unreachable!("clobber-only"),
684+
Xtensa(XtensaInlineAsmRegClass::freg) => "f",
685+
Xtensa(XtensaInlineAsmRegClass::reg) => "r",
686+
Xtensa(XtensaInlineAsmRegClass::breg) => "b",
683687
Wasm(WasmInlineAsmRegClass::local) => "r",
684688
Bpf(BpfInlineAsmRegClass::reg) => "r",
685689
Bpf(BpfInlineAsmRegClass::wreg) => "w",
@@ -779,6 +783,7 @@ fn modifier_to_llvm(
779783
| X86InlineAsmRegClass::kreg0
780784
| X86InlineAsmRegClass::tmm_reg,
781785
) => unreachable!("clobber-only"),
786+
Xtensa(_) => None,
782787
Wasm(WasmInlineAsmRegClass::local) => None,
783788
Bpf(_) => None,
784789
Avr(AvrInlineAsmRegClass::reg_pair)
@@ -848,6 +853,9 @@ fn dummy_output_type<'ll>(cx: &CodegenCx<'ll, '_>, reg: InlineAsmRegClass) -> &'
848853
| X86InlineAsmRegClass::kreg0
849854
| X86InlineAsmRegClass::tmm_reg,
850855
) => unreachable!("clobber-only"),
856+
Xtensa(XtensaInlineAsmRegClass::reg) => cx.type_i32(),
857+
Xtensa(XtensaInlineAsmRegClass::freg) => cx.type_f32(),
858+
Xtensa(XtensaInlineAsmRegClass::breg) => cx.type_i1(),
851859
Wasm(WasmInlineAsmRegClass::local) => cx.type_i32(),
852860
Bpf(BpfInlineAsmRegClass::reg) => cx.type_i64(),
853861
Bpf(BpfInlineAsmRegClass::wreg) => cx.type_i32(),

compiler/rustc_span/src/symbol.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ symbols! {
525525
async_iterator,
526526
async_iterator_poll_next,
527527
async_trait_bounds,
528+
atomctl,
528529
atomic,
529530
atomic_mod,
530531
atomics,
@@ -571,6 +572,7 @@ symbols! {
571572
braced_empty_structs,
572573
branch,
573574
breakpoint,
575+
breg,
574576
bridge,
575577
bswap,
576578
btreemap_contains_key,
@@ -729,6 +731,7 @@ symbols! {
729731
contracts_internals,
730732
contracts_requires,
731733
convert_identity,
734+
coprocessor,
732735
copy,
733736
copy_closures,
734737
copy_nonoverlapping,
@@ -822,6 +825,7 @@ symbols! {
822825
derive_smart_pointer,
823826
destruct,
824827
destructuring_assignment,
828+
dfpaccel,
825829
diagnostic,
826830
diagnostic_namespace,
827831
direct,
@@ -891,6 +895,7 @@ symbols! {
891895
ermsb_target_feature,
892896
exact_div,
893897
except,
898+
exception,
894899
exchange_malloc,
895900
exclusive_range_pattern,
896901
exhaustive_integer_patterns,
@@ -914,6 +919,7 @@ symbols! {
914919
expr_fragment_specifier_2024,
915920
extended_key_value_attributes,
916921
extended_varargs_abi_support,
922+
extendedl32r,
917923
extern_absolute_paths,
918924
extern_crate_item_prelude,
919925
extern_crate_self,
@@ -1026,6 +1032,7 @@ symbols! {
10261032
format_macro,
10271033
format_placeholder,
10281034
format_unsafe_arg,
1035+
fp,
10291036
freeze,
10301037
freeze_impls,
10311038
freg,
@@ -1093,6 +1100,7 @@ symbols! {
10931100
hashset_iter_ty,
10941101
hexagon_target_feature,
10951102
hidden,
1103+
highpriinterrupts,
10961104
hint,
10971105
homogeneous_aggregate,
10981106
host,
@@ -1175,6 +1183,8 @@ symbols! {
11751183
instruction_set,
11761184
integer_: "integer", // underscore to avoid clashing with the function `sym::integer` below
11771185
integral,
1186+
intel,
1187+
interrupt,
11781188
into_async_iter_into_iter,
11791189
into_future,
11801190
into_iter,
@@ -1269,6 +1279,7 @@ symbols! {
12691279
loop_break_value,
12701280
lt,
12711281
m68k_target_feature,
1282+
mac16,
12721283
macro_at_most_once_rep,
12731284
macro_attributes_in_derive_output,
12741285
macro_escape,
@@ -1312,6 +1323,7 @@ symbols! {
13121323
mem_variant_count,
13131324
mem_zeroed,
13141325
member_constraints,
1326+
memctl,
13151327
memory,
13161328
memtag,
13171329
message,
@@ -1367,6 +1379,8 @@ symbols! {
13671379
mir_unwind_unreachable,
13681380
mir_variant,
13691381
miri,
1382+
misc,
1383+
miscsr,
13701384
mmx_reg,
13711385
modifiers,
13721386
module,
@@ -1596,6 +1610,8 @@ symbols! {
15961610
prelude_import,
15971611
preserves_flags,
15981612
prfchw_target_feature,
1613+
prid,
1614+
primitive,
15991615
print_macro,
16001616
println_macro,
16011617
proc_dash_macro: "proc-macro",
@@ -1853,8 +1869,10 @@ symbols! {
18531869
rustdoc_missing_doc_code_examples,
18541870
rustfmt,
18551871
rvalue_static_promotion,
1872+
rvector,
18561873
rwpi,
18571874
s,
1875+
s32c1i,
18581876
s390x_target_feature,
18591877
safety,
18601878
sanitize,
@@ -2071,10 +2089,12 @@ symbols! {
20712089
thread,
20722090
thread_local,
20732091
thread_local_macro,
2092+
threadptr,
20742093
three_way_compare,
20752094
thumb2,
20762095
thumb_mode: "thumb-mode",
20772096
time,
2097+
timerint,
20782098
tmm_reg,
20792099
to_owned_method,
20802100
to_string,
@@ -2274,6 +2294,8 @@ symbols! {
22742294
wasm_target_feature,
22752295
where_clause_attrs,
22762296
while_let,
2297+
width,
2298+
windowed,
22772299
windows,
22782300
windows_subsystem,
22792301
with_negative_coherence,
@@ -2295,8 +2317,10 @@ symbols! {
22952317
x87_reg,
22962318
x87_target_feature,
22972319
xer,
2320+
xloop,
22982321
xmm_reg,
22992322
xop_target_feature,
2323+
xtensa_target_feature,
23002324
yeet_desugar_details,
23012325
yeet_expr,
23022326
yes,

compiler/rustc_target/src/asm/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ mod sparc;
195195
mod spirv;
196196
mod wasm;
197197
mod x86;
198+
mod xtensa;
198199

199200
pub use aarch64::{AArch64InlineAsmReg, AArch64InlineAsmRegClass};
200201
pub use arm::{ArmInlineAsmReg, ArmInlineAsmRegClass};
@@ -213,6 +214,7 @@ pub use s390x::{S390xInlineAsmReg, S390xInlineAsmRegClass};
213214
pub use sparc::{SparcInlineAsmReg, SparcInlineAsmRegClass};
214215
pub use spirv::{SpirVInlineAsmReg, SpirVInlineAsmRegClass};
215216
pub use wasm::{WasmInlineAsmReg, WasmInlineAsmRegClass};
217+
pub use xtensa::{XtensaInlineAsmReg, XtensaInlineAsmRegClass};
216218
pub use x86::{X86InlineAsmReg, X86InlineAsmRegClass};
217219

218220
#[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, Hash)]
@@ -237,6 +239,7 @@ pub enum InlineAsmArch {
237239
SpirV,
238240
Wasm32,
239241
Wasm64,
242+
Xtensa,
240243
Bpf,
241244
Avr,
242245
Msp430,
@@ -269,6 +272,7 @@ impl FromStr for InlineAsmArch {
269272
"spirv" => Ok(Self::SpirV),
270273
"wasm32" => Ok(Self::Wasm32),
271274
"wasm64" => Ok(Self::Wasm64),
275+
"xtensa" => Ok(Self::Xtensa),
272276
"bpf" => Ok(Self::Bpf),
273277
"avr" => Ok(Self::Avr),
274278
"msp430" => Ok(Self::Msp430),
@@ -295,6 +299,7 @@ pub enum InlineAsmReg {
295299
Sparc(SparcInlineAsmReg),
296300
SpirV(SpirVInlineAsmReg),
297301
Wasm(WasmInlineAsmReg),
302+
Xtensa(XtensaInlineAsmReg),
298303
Bpf(BpfInlineAsmReg),
299304
Avr(AvrInlineAsmReg),
300305
Msp430(Msp430InlineAsmReg),
@@ -317,6 +322,7 @@ impl InlineAsmReg {
317322
Self::Mips(r) => r.name(),
318323
Self::S390x(r) => r.name(),
319324
Self::Sparc(r) => r.name(),
325+
Self::Xtensa(r) => r.name(),
320326
Self::Bpf(r) => r.name(),
321327
Self::Avr(r) => r.name(),
322328
Self::Msp430(r) => r.name(),
@@ -338,6 +344,7 @@ impl InlineAsmReg {
338344
Self::Mips(r) => InlineAsmRegClass::Mips(r.reg_class()),
339345
Self::S390x(r) => InlineAsmRegClass::S390x(r.reg_class()),
340346
Self::Sparc(r) => InlineAsmRegClass::Sparc(r.reg_class()),
347+
Self::Xtensa(r) => InlineAsmRegClass::Xtensa(r.reg_class()),
341348
Self::Bpf(r) => InlineAsmRegClass::Bpf(r.reg_class()),
342349
Self::Avr(r) => InlineAsmRegClass::Avr(r.reg_class()),
343350
Self::Msp430(r) => InlineAsmRegClass::Msp430(r.reg_class()),
@@ -369,6 +376,9 @@ impl InlineAsmReg {
369376
InlineAsmArch::Mips | InlineAsmArch::Mips64 => {
370377
Self::Mips(MipsInlineAsmReg::parse(name)?)
371378
}
379+
InlineAsmArch::Xtensa => {
380+
Self::Xtensa(XtensaInlineAsmReg::parse(name)?)
381+
}
372382
InlineAsmArch::S390x => Self::S390x(S390xInlineAsmReg::parse(name)?),
373383
InlineAsmArch::Sparc | InlineAsmArch::Sparc64 => {
374384
Self::Sparc(SparcInlineAsmReg::parse(name)?)
@@ -408,6 +418,7 @@ impl InlineAsmReg {
408418
Self::Sparc(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
409419
Self::Bpf(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
410420
Self::Avr(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
421+
Self::Xtensa(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
411422
Self::Msp430(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
412423
Self::M68k(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
413424
Self::CSKY(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
@@ -434,6 +445,7 @@ impl InlineAsmReg {
434445
Self::Mips(r) => r.emit(out, arch, modifier),
435446
Self::S390x(r) => r.emit(out, arch, modifier),
436447
Self::Sparc(r) => r.emit(out, arch, modifier),
448+
Self::Xtensa(r) => r.emit(out, arch, modifier),
437449
Self::Bpf(r) => r.emit(out, arch, modifier),
438450
Self::Avr(r) => r.emit(out, arch, modifier),
439451
Self::Msp430(r) => r.emit(out, arch, modifier),
@@ -455,6 +467,7 @@ impl InlineAsmReg {
455467
Self::Mips(_) => cb(self),
456468
Self::S390x(r) => r.overlapping_regs(|r| cb(Self::S390x(r))),
457469
Self::Sparc(_) => cb(self),
470+
Self::Xtensa(_) => cb(self),
458471
Self::Bpf(r) => r.overlapping_regs(|r| cb(Self::Bpf(r))),
459472
Self::Avr(r) => r.overlapping_regs(|r| cb(Self::Avr(r))),
460473
Self::Msp430(_) => cb(self),
@@ -481,6 +494,7 @@ pub enum InlineAsmRegClass {
481494
Sparc(SparcInlineAsmRegClass),
482495
SpirV(SpirVInlineAsmRegClass),
483496
Wasm(WasmInlineAsmRegClass),
497+
Xtensa(XtensaInlineAsmRegClass),
484498
Bpf(BpfInlineAsmRegClass),
485499
Avr(AvrInlineAsmRegClass),
486500
Msp430(Msp430InlineAsmRegClass),
@@ -506,6 +520,7 @@ impl InlineAsmRegClass {
506520
Self::Sparc(r) => r.name(),
507521
Self::SpirV(r) => r.name(),
508522
Self::Wasm(r) => r.name(),
523+
Self::Xtensa(r) => r.name(),
509524
Self::Bpf(r) => r.name(),
510525
Self::Avr(r) => r.name(),
511526
Self::Msp430(r) => r.name(),
@@ -533,6 +548,7 @@ impl InlineAsmRegClass {
533548
Self::Sparc(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Sparc),
534549
Self::SpirV(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::SpirV),
535550
Self::Wasm(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Wasm),
551+
Self::Xtensa(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Xtensa),
536552
Self::Bpf(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Bpf),
537553
Self::Avr(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Avr),
538554
Self::Msp430(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Msp430),
@@ -563,6 +579,7 @@ impl InlineAsmRegClass {
563579
Self::Sparc(r) => r.suggest_modifier(arch, ty),
564580
Self::SpirV(r) => r.suggest_modifier(arch, ty),
565581
Self::Wasm(r) => r.suggest_modifier(arch, ty),
582+
Self::Xtensa(r) => r.suggest_modifier(arch, ty),
566583
Self::Bpf(r) => r.suggest_modifier(arch, ty),
567584
Self::Avr(r) => r.suggest_modifier(arch, ty),
568585
Self::Msp430(r) => r.suggest_modifier(arch, ty),
@@ -593,6 +610,7 @@ impl InlineAsmRegClass {
593610
Self::Sparc(r) => r.default_modifier(arch),
594611
Self::SpirV(r) => r.default_modifier(arch),
595612
Self::Wasm(r) => r.default_modifier(arch),
613+
Self::Xtensa(r) => r.default_modifier(arch),
596614
Self::Bpf(r) => r.default_modifier(arch),
597615
Self::Avr(r) => r.default_modifier(arch),
598616
Self::Msp430(r) => r.default_modifier(arch),
@@ -626,6 +644,7 @@ impl InlineAsmRegClass {
626644
Self::Sparc(r) => r.supported_types(arch),
627645
Self::SpirV(r) => r.supported_types(arch),
628646
Self::Wasm(r) => r.supported_types(arch),
647+
Self::Xtensa(r) => r.supported_types(arch),
629648
Self::Bpf(r) => r.supported_types(arch),
630649
Self::Avr(r) => r.supported_types(arch),
631650
Self::Msp430(r) => r.supported_types(arch),
@@ -666,6 +685,7 @@ impl InlineAsmRegClass {
666685
}
667686
InlineAsmArch::Bpf => Self::Bpf(BpfInlineAsmRegClass::parse(name)?),
668687
InlineAsmArch::Avr => Self::Avr(AvrInlineAsmRegClass::parse(name)?),
688+
InlineAsmArch::Xtensa => Self::Xtensa(XtensaInlineAsmRegClass::parse(name)?),
669689
InlineAsmArch::Msp430 => Self::Msp430(Msp430InlineAsmRegClass::parse(name)?),
670690
InlineAsmArch::M68k => Self::M68k(M68kInlineAsmRegClass::parse(name)?),
671691
InlineAsmArch::CSKY => Self::CSKY(CSKYInlineAsmRegClass::parse(name)?),
@@ -689,6 +709,7 @@ impl InlineAsmRegClass {
689709
Self::Sparc(r) => r.valid_modifiers(arch),
690710
Self::SpirV(r) => r.valid_modifiers(arch),
691711
Self::Wasm(r) => r.valid_modifiers(arch),
712+
Self::Xtensa(r) => r.valid_modifiers(arch),
692713
Self::Bpf(r) => r.valid_modifiers(arch),
693714
Self::Avr(r) => r.valid_modifiers(arch),
694715
Self::Msp430(r) => r.valid_modifiers(arch),
@@ -736,6 +757,7 @@ impl fmt::Display for InlineAsmRegOrRegClass {
736757
/// Set of types which can be used with a particular register class.
737758
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
738759
pub enum InlineAsmType {
760+
I1,
739761
I8,
740762
I16,
741763
I32,
@@ -763,6 +785,7 @@ impl InlineAsmType {
763785

764786
pub fn size(self) -> Size {
765787
Size::from_bytes(match self {
788+
Self::I1 => return Size::from_bits(1),
766789
Self::I8 => 1,
767790
Self::I16 => 2,
768791
Self::I32 => 4,
@@ -788,6 +811,7 @@ impl InlineAsmType {
788811
impl fmt::Display for InlineAsmType {
789812
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
790813
match *self {
814+
Self::I1 => f.write_str("i1"),
791815
Self::I8 => f.write_str("i8"),
792816
Self::I16 => f.write_str("i16"),
793817
Self::I32 => f.write_str("i32"),
@@ -890,6 +914,11 @@ pub fn allocatable_registers(
890914
wasm::fill_reg_map(arch, reloc_model, target_features, target, &mut map);
891915
map
892916
}
917+
InlineAsmArch::Xtensa => {
918+
let mut map = xtensa::regclass_map();
919+
xtensa::fill_reg_map(arch, reloc_model, target_features, target, &mut map);
920+
map
921+
}
893922
InlineAsmArch::Bpf => {
894923
let mut map = bpf::regclass_map();
895924
bpf::fill_reg_map(arch, reloc_model, target_features, target, &mut map);

0 commit comments

Comments
 (0)