Skip to content

Commit 27da6ce

Browse files
committed
rustc_target/asm: add LoongArch LSX/LASX inline asm register support
Add support for LoongArch LSX and LASX registers in inline assembly by introducing the `vreg` and `xreg` register classes, along with their associated vector types and operand modifiers. The new register classes are gated behind the `asm_experimental_reg` feature. Also model the overlap between FPU, LSX, and LASX registers so register conflict checking works correctly for aliased registers.
1 parent 9ff44af commit 27da6ce

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

src/asm.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,9 @@ fn reg_class_to_gcc(reg_class: InlineAsmRegClass) -> &'static str {
706706
unreachable!("clobber-only")
707707
}
708708
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::reg) => "r",
709-
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::freg) => "f",
709+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::freg)
710+
| InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::vreg)
711+
| InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::xreg) => "f",
710712
InlineAsmRegClass::M68k(M68kInlineAsmRegClass::reg) => "r",
711713
InlineAsmRegClass::M68k(M68kInlineAsmRegClass::reg_addr) => "a",
712714
InlineAsmRegClass::M68k(M68kInlineAsmRegClass::reg_data) => "d",
@@ -815,6 +817,12 @@ fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegCl
815817
}
816818
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::reg) => cx.type_i32(),
817819
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::freg) => cx.type_f32(),
820+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::vreg) => {
821+
cx.type_vector(cx.type_i32(), 4)
822+
}
823+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::xreg) => {
824+
cx.type_vector(cx.type_i32(), 8)
825+
}
818826
InlineAsmRegClass::Mips(MipsInlineAsmRegClass::reg) => cx.type_i32(),
819827
InlineAsmRegClass::Mips(MipsInlineAsmRegClass::freg) => cx.type_f32(),
820828
InlineAsmRegClass::Nvptx(NvptxInlineAsmRegClass::reg16) => cx.type_i16(),
@@ -1013,7 +1021,22 @@ fn modifier_to_gcc(
10131021
}
10141022
}
10151023
InlineAsmRegClass::Hexagon(_) => None,
1016-
InlineAsmRegClass::LoongArch(_) => None,
1024+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::reg) => None,
1025+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::freg) => modifier,
1026+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::vreg) => {
1027+
if modifier.is_none() {
1028+
Some('w')
1029+
} else {
1030+
modifier
1031+
}
1032+
}
1033+
InlineAsmRegClass::LoongArch(LoongArchInlineAsmRegClass::xreg) => {
1034+
if modifier.is_none() {
1035+
Some('u')
1036+
} else {
1037+
modifier
1038+
}
1039+
}
10171040
InlineAsmRegClass::Mips(_) => None,
10181041
InlineAsmRegClass::Nvptx(_) => None,
10191042
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::vsreg) => {

0 commit comments

Comments
 (0)