Skip to content

Commit 2064793

Browse files
committed
Allow vector-scalar (vs) registers in ppc inline assembly
Where supported, VSX is a 64x128b register set which encompasses both the floating point and vector registers. In the type tests, xvsqrtdp is used as it is the only two-argument vsx opcode supported by all targets on llvm. If you need to copy a vsx register, the preferred way is "xxlor xt, xa, xa".
1 parent c9145e1 commit 2064793

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

src/asm.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,7 @@ fn reg_class_to_gcc(reg_class: InlineAsmRegClass) -> &'static str {
698698
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg_nonzero) => "b",
699699
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::freg) => "f",
700700
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::vreg) => "v",
701+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::vsreg) => "wa",
701702
InlineAsmRegClass::PowerPC(
702703
PowerPCInlineAsmRegClass::cr
703704
| PowerPCInlineAsmRegClass::ctr
@@ -778,9 +779,9 @@ fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegCl
778779
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg) => cx.type_i32(),
779780
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::reg_nonzero) => cx.type_i32(),
780781
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::freg) => cx.type_f64(),
781-
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::vreg) => {
782-
cx.type_vector(cx.type_i32(), 4)
783-
}
782+
InlineAsmRegClass::PowerPC(
783+
PowerPCInlineAsmRegClass::vreg | PowerPCInlineAsmRegClass::vsreg,
784+
) => cx.type_vector(cx.type_i32(), 4),
784785
InlineAsmRegClass::PowerPC(
785786
PowerPCInlineAsmRegClass::cr
786787
| PowerPCInlineAsmRegClass::ctr
@@ -957,6 +958,13 @@ fn modifier_to_gcc(
957958
InlineAsmRegClass::LoongArch(_) => None,
958959
InlineAsmRegClass::Mips(_) => None,
959960
InlineAsmRegClass::Nvptx(_) => None,
961+
InlineAsmRegClass::PowerPC(PowerPCInlineAsmRegClass::vsreg) => {
962+
if modifier.is_none() {
963+
Some('x')
964+
} else {
965+
modifier
966+
}
967+
}
960968
InlineAsmRegClass::PowerPC(_) => None,
961969
InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::reg)
962970
| InlineAsmRegClass::RiscV(RiscVInlineAsmRegClass::freg) => None,

0 commit comments

Comments
 (0)