Skip to content

Commit 5b1f953

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

File tree

7 files changed

+461
-2
lines changed

7 files changed

+461
-2
lines changed

compiler/rustc_codegen_gcc/src/asm.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,8 @@ fn reg_class_to_gcc(reg_class: InlineAsmRegClass) -> &'static str {
720720
| X86InlineAsmRegClass::mmx_reg
721721
| X86InlineAsmRegClass::tmm_reg,
722722
) => unreachable!("clobber-only"),
723+
InlineAsmRegClass::Xtensa(XtensaInlineAsmRegClass::reg) => "r",
724+
InlineAsmRegClass::Xtensa(XtensaInlineAsmRegClass::freg) => "f",
723725
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
724726
bug!("GCC backend does not support SPIR-V")
725727
}
@@ -825,7 +827,9 @@ fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegCl
825827
InlineAsmRegClass::CSKY(CSKYInlineAsmRegClass::freg) => cx.type_f32(),
826828
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
827829
bug!("GCC backend does not support SPIR-V")
828-
}
830+
},
831+
InlineAsmRegClass::Xtensa(XtensaInlineAsmRegClass::reg) => cx.type_i32(),
832+
InlineAsmRegClass::Xtensa(XtensaInlineAsmRegClass::freg) => cx.type_f32(),
829833
InlineAsmRegClass::Err => unreachable!(),
830834
}
831835
}
@@ -1009,7 +1013,8 @@ fn modifier_to_gcc(
10091013
InlineAsmRegClass::CSKY(_) => None,
10101014
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
10111015
bug!("LLVM backend does not support SPIR-V")
1012-
}
1016+
},
1017+
InlineAsmRegClass::Xtensa(_) => None,
10131018
InlineAsmRegClass::Err => unreachable!(),
10141019
}
10151020
}

compiler/rustc_codegen_llvm/src/asm.rs

Lines changed: 6 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());
@@ -682,6 +683,8 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'_>>) ->
682683
| X86InlineAsmRegClass::kreg0
683684
| X86InlineAsmRegClass::tmm_reg,
684685
) => unreachable!("clobber-only"),
686+
Xtensa(XtensaInlineAsmRegClass::freg) => "f",
687+
Xtensa(XtensaInlineAsmRegClass::reg) => "r",
685688
Wasm(WasmInlineAsmRegClass::local) => "r",
686689
Bpf(BpfInlineAsmRegClass::reg) => "r",
687690
Bpf(BpfInlineAsmRegClass::wreg) => "w",
@@ -781,6 +784,7 @@ fn modifier_to_llvm(
781784
| X86InlineAsmRegClass::kreg0
782785
| X86InlineAsmRegClass::tmm_reg,
783786
) => unreachable!("clobber-only"),
787+
Xtensa(_) => None,
784788
Wasm(WasmInlineAsmRegClass::local) => None,
785789
Bpf(_) => None,
786790
Avr(AvrInlineAsmRegClass::reg_pair)
@@ -850,6 +854,8 @@ fn dummy_output_type<'ll>(cx: &CodegenCx<'ll, '_>, reg: InlineAsmRegClass) -> &'
850854
| X86InlineAsmRegClass::kreg0
851855
| X86InlineAsmRegClass::tmm_reg,
852856
) => unreachable!("clobber-only"),
857+
Xtensa(XtensaInlineAsmRegClass::reg) => cx.type_i32(),
858+
Xtensa(XtensaInlineAsmRegClass::freg) => cx.type_f32(),
853859
Wasm(WasmInlineAsmRegClass::local) => cx.type_i32(),
854860
Bpf(BpfInlineAsmRegClass::reg) => cx.type_i64(),
855861
Bpf(BpfInlineAsmRegClass::wreg) => cx.type_i32(),

compiler/rustc_span/src/symbol.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@ symbols! {
513513
async_iterator,
514514
async_iterator_poll_next,
515515
async_trait_bounds,
516+
atomctl,
516517
atomic,
517518
atomic_and,
518519
atomic_cxchg,
@@ -579,6 +580,7 @@ symbols! {
579580
braced_empty_structs,
580581
branch,
581582
breakpoint,
583+
breg,
582584
bridge,
583585
bswap,
584586
btreemap_contains_key,
@@ -742,6 +744,7 @@ symbols! {
742744
contracts_internals,
743745
contracts_requires,
744746
convert_identity,
747+
coprocessor,
745748
copy,
746749
copy_closures,
747750
copy_nonoverlapping,
@@ -922,6 +925,7 @@ symbols! {
922925
ermsb_target_feature,
923926
exact_div,
924927
except,
928+
exception,
925929
exchange_malloc,
926930
exclusive_range_pattern,
927931
exhaustive_integer_patterns,
@@ -947,6 +951,7 @@ symbols! {
947951
expr_fragment_specifier_2024,
948952
extended_key_value_attributes,
949953
extended_varargs_abi_support,
954+
extendedl32r,
950955
extern_absolute_paths,
951956
extern_crate_item_prelude,
952957
extern_crate_self,
@@ -1061,6 +1066,7 @@ symbols! {
10611066
format_macro,
10621067
format_placeholder,
10631068
format_unsafe_arg,
1069+
fp,
10641070
freeze,
10651071
freeze_impls,
10661072
freg,
@@ -1129,6 +1135,7 @@ symbols! {
11291135
hashset_iter_ty,
11301136
hexagon_target_feature,
11311137
hidden,
1138+
highpriinterrupts,
11321139
hint,
11331140
homogeneous_aggregate,
11341141
host,
@@ -1212,6 +1219,7 @@ symbols! {
12121219
integer_: "integer", // underscore to avoid clashing with the function `sym::integer` below
12131220
integral,
12141221
internal_features,
1222+
interrupt,
12151223
into_async_iter_into_iter,
12161224
into_future,
12171225
into_iter,
@@ -1309,6 +1317,7 @@ symbols! {
13091317
loop_match,
13101318
lt,
13111319
m68k_target_feature,
1320+
mac16,
13121321
macro_at_most_once_rep,
13131322
macro_attributes_in_derive_output,
13141323
macro_concat,
@@ -1358,6 +1367,7 @@ symbols! {
13581367
mem_variant_count,
13591368
mem_zeroed,
13601369
member_constraints,
1370+
memctl,
13611371
memory,
13621372
memtag,
13631373
message,
@@ -1416,6 +1426,8 @@ symbols! {
14161426
mir_unwind_unreachable,
14171427
mir_variant,
14181428
miri,
1429+
misc,
1430+
miscsr,
14191431
mmx_reg,
14201432
modifiers,
14211433
module,
@@ -1656,6 +1668,8 @@ symbols! {
16561668
prelude_import,
16571669
preserves_flags,
16581670
prfchw_target_feature,
1671+
prid,
1672+
primitive,
16591673
print_macro,
16601674
println_macro,
16611675
proc_dash_macro: "proc-macro",
@@ -1915,8 +1929,10 @@ symbols! {
19151929
rustdoc_missing_doc_code_examples,
19161930
rustfmt,
19171931
rvalue_static_promotion,
1932+
rvector,
19181933
rwpi,
19191934
s,
1935+
s32c1i,
19201936
s390x_target_feature,
19211937
safety,
19221938
sanitize,
@@ -2151,9 +2167,12 @@ symbols! {
21512167
thread,
21522168
thread_local,
21532169
thread_local_macro,
2170+
threadptr,
21542171
three_way_compare,
21552172
thumb2,
21562173
thumb_mode: "thumb-mode",
2174+
time,
2175+
timerint,
21572176
tmm_reg,
21582177
to_owned_method,
21592178
to_string,
@@ -2359,6 +2378,7 @@ symbols! {
23592378
where_clause_attrs,
23602379
while_let,
23612380
width,
2381+
windowed,
23622382
windows,
23632383
windows_subsystem,
23642384
with_negative_coherence,
@@ -2380,8 +2400,10 @@ symbols! {
23802400
x87_reg,
23812401
x87_target_feature,
23822402
xer,
2403+
xloop,
23832404
xmm_reg,
23842405
xop_target_feature,
2406+
xtensa_target_feature,
23852407
yeet_desugar_details,
23862408
yeet_expr,
23872409
yes,

compiler/rustc_target/src/asm/mod.rs

Lines changed: 26 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)]
@@ -238,6 +240,7 @@ pub enum InlineAsmArch {
238240
SpirV,
239241
Wasm32,
240242
Wasm64,
243+
Xtensa,
241244
Bpf,
242245
Avr,
243246
Msp430,
@@ -271,6 +274,7 @@ impl FromStr for InlineAsmArch {
271274
"spirv" => Ok(Self::SpirV),
272275
"wasm32" => Ok(Self::Wasm32),
273276
"wasm64" => Ok(Self::Wasm64),
277+
"xtensa" => Ok(Self::Xtensa),
274278
"bpf" => Ok(Self::Bpf),
275279
"avr" => Ok(Self::Avr),
276280
"msp430" => Ok(Self::Msp430),
@@ -297,6 +301,7 @@ pub enum InlineAsmReg {
297301
Sparc(SparcInlineAsmReg),
298302
SpirV(SpirVInlineAsmReg),
299303
Wasm(WasmInlineAsmReg),
304+
Xtensa(XtensaInlineAsmReg),
300305
Bpf(BpfInlineAsmReg),
301306
Avr(AvrInlineAsmReg),
302307
Msp430(Msp430InlineAsmReg),
@@ -319,6 +324,7 @@ impl InlineAsmReg {
319324
Self::Mips(r) => r.name(),
320325
Self::S390x(r) => r.name(),
321326
Self::Sparc(r) => r.name(),
327+
Self::Xtensa(r) => r.name(),
322328
Self::Bpf(r) => r.name(),
323329
Self::Avr(r) => r.name(),
324330
Self::Msp430(r) => r.name(),
@@ -340,6 +346,7 @@ impl InlineAsmReg {
340346
Self::Mips(r) => InlineAsmRegClass::Mips(r.reg_class()),
341347
Self::S390x(r) => InlineAsmRegClass::S390x(r.reg_class()),
342348
Self::Sparc(r) => InlineAsmRegClass::Sparc(r.reg_class()),
349+
Self::Xtensa(r) => InlineAsmRegClass::Xtensa(r.reg_class()),
343350
Self::Bpf(r) => InlineAsmRegClass::Bpf(r.reg_class()),
344351
Self::Avr(r) => InlineAsmRegClass::Avr(r.reg_class()),
345352
Self::Msp430(r) => InlineAsmRegClass::Msp430(r.reg_class()),
@@ -373,6 +380,9 @@ impl InlineAsmReg {
373380
InlineAsmArch::Mips | InlineAsmArch::Mips64 => {
374381
Self::Mips(MipsInlineAsmReg::parse(name)?)
375382
}
383+
InlineAsmArch::Xtensa => {
384+
Self::Xtensa(XtensaInlineAsmReg::parse(name)?)
385+
}
376386
InlineAsmArch::S390x => Self::S390x(S390xInlineAsmReg::parse(name)?),
377387
InlineAsmArch::Sparc | InlineAsmArch::Sparc64 => {
378388
Self::Sparc(SparcInlineAsmReg::parse(name)?)
@@ -412,6 +422,7 @@ impl InlineAsmReg {
412422
Self::Sparc(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
413423
Self::Bpf(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
414424
Self::Avr(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
425+
Self::Xtensa(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
415426
Self::Msp430(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
416427
Self::M68k(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
417428
Self::CSKY(r) => r.validate(arch, reloc_model, target_features, target, is_clobber),
@@ -438,6 +449,7 @@ impl InlineAsmReg {
438449
Self::Mips(r) => r.emit(out, arch, modifier),
439450
Self::S390x(r) => r.emit(out, arch, modifier),
440451
Self::Sparc(r) => r.emit(out, arch, modifier),
452+
Self::Xtensa(r) => r.emit(out, arch, modifier),
441453
Self::Bpf(r) => r.emit(out, arch, modifier),
442454
Self::Avr(r) => r.emit(out, arch, modifier),
443455
Self::Msp430(r) => r.emit(out, arch, modifier),
@@ -459,6 +471,7 @@ impl InlineAsmReg {
459471
Self::Mips(_) => cb(self),
460472
Self::S390x(r) => r.overlapping_regs(|r| cb(Self::S390x(r))),
461473
Self::Sparc(_) => cb(self),
474+
Self::Xtensa(_) => cb(self),
462475
Self::Bpf(r) => r.overlapping_regs(|r| cb(Self::Bpf(r))),
463476
Self::Avr(r) => r.overlapping_regs(|r| cb(Self::Avr(r))),
464477
Self::Msp430(_) => cb(self),
@@ -485,6 +498,7 @@ pub enum InlineAsmRegClass {
485498
Sparc(SparcInlineAsmRegClass),
486499
SpirV(SpirVInlineAsmRegClass),
487500
Wasm(WasmInlineAsmRegClass),
501+
Xtensa(XtensaInlineAsmRegClass),
488502
Bpf(BpfInlineAsmRegClass),
489503
Avr(AvrInlineAsmRegClass),
490504
Msp430(Msp430InlineAsmRegClass),
@@ -510,6 +524,7 @@ impl InlineAsmRegClass {
510524
Self::Sparc(r) => r.name(),
511525
Self::SpirV(r) => r.name(),
512526
Self::Wasm(r) => r.name(),
527+
Self::Xtensa(r) => r.name(),
513528
Self::Bpf(r) => r.name(),
514529
Self::Avr(r) => r.name(),
515530
Self::Msp430(r) => r.name(),
@@ -537,6 +552,7 @@ impl InlineAsmRegClass {
537552
Self::Sparc(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Sparc),
538553
Self::SpirV(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::SpirV),
539554
Self::Wasm(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Wasm),
555+
Self::Xtensa(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Xtensa),
540556
Self::Bpf(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Bpf),
541557
Self::Avr(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Avr),
542558
Self::Msp430(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Msp430),
@@ -567,6 +583,7 @@ impl InlineAsmRegClass {
567583
Self::Sparc(r) => r.suggest_modifier(arch, ty),
568584
Self::SpirV(r) => r.suggest_modifier(arch, ty),
569585
Self::Wasm(r) => r.suggest_modifier(arch, ty),
586+
Self::Xtensa(r) => r.suggest_modifier(arch, ty),
570587
Self::Bpf(r) => r.suggest_modifier(arch, ty),
571588
Self::Avr(r) => r.suggest_modifier(arch, ty),
572589
Self::Msp430(r) => r.suggest_modifier(arch, ty),
@@ -597,6 +614,7 @@ impl InlineAsmRegClass {
597614
Self::Sparc(r) => r.default_modifier(arch),
598615
Self::SpirV(r) => r.default_modifier(arch),
599616
Self::Wasm(r) => r.default_modifier(arch),
617+
Self::Xtensa(r) => r.default_modifier(arch),
600618
Self::Bpf(r) => r.default_modifier(arch),
601619
Self::Avr(r) => r.default_modifier(arch),
602620
Self::Msp430(r) => r.default_modifier(arch),
@@ -630,6 +648,7 @@ impl InlineAsmRegClass {
630648
Self::Sparc(r) => r.supported_types(arch),
631649
Self::SpirV(r) => r.supported_types(arch),
632650
Self::Wasm(r) => r.supported_types(arch),
651+
Self::Xtensa(r) => r.supported_types(arch),
633652
Self::Bpf(r) => r.supported_types(arch),
634653
Self::Avr(r) => r.supported_types(arch),
635654
Self::Msp430(r) => r.supported_types(arch),
@@ -672,6 +691,7 @@ impl InlineAsmRegClass {
672691
}
673692
InlineAsmArch::Bpf => Self::Bpf(BpfInlineAsmRegClass::parse(name)?),
674693
InlineAsmArch::Avr => Self::Avr(AvrInlineAsmRegClass::parse(name)?),
694+
InlineAsmArch::Xtensa => Self::Xtensa(XtensaInlineAsmRegClass::parse(name)?),
675695
InlineAsmArch::Msp430 => Self::Msp430(Msp430InlineAsmRegClass::parse(name)?),
676696
InlineAsmArch::M68k => Self::M68k(M68kInlineAsmRegClass::parse(name)?),
677697
InlineAsmArch::CSKY => Self::CSKY(CSKYInlineAsmRegClass::parse(name)?),
@@ -695,6 +715,7 @@ impl InlineAsmRegClass {
695715
Self::Sparc(r) => r.valid_modifiers(arch),
696716
Self::SpirV(r) => r.valid_modifiers(arch),
697717
Self::Wasm(r) => r.valid_modifiers(arch),
718+
Self::Xtensa(r) => r.valid_modifiers(arch),
698719
Self::Bpf(r) => r.valid_modifiers(arch),
699720
Self::Avr(r) => r.valid_modifiers(arch),
700721
Self::Msp430(r) => r.valid_modifiers(arch),
@@ -896,6 +917,11 @@ pub fn allocatable_registers(
896917
wasm::fill_reg_map(arch, reloc_model, target_features, target, &mut map);
897918
map
898919
}
920+
InlineAsmArch::Xtensa => {
921+
let mut map = xtensa::regclass_map();
922+
xtensa::fill_reg_map(arch, reloc_model, target_features, target, &mut map);
923+
map
924+
}
899925
InlineAsmArch::Bpf => {
900926
let mut map = bpf::regclass_map();
901927
bpf::fill_reg_map(arch, reloc_model, target_features, target, &mut map);

0 commit comments

Comments
 (0)