You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Mark status and sticky bits of vscr, fpscr and spefscr as being
preserved when using the `preserves_flags` option. These are not
enforced by codegen today, but might be in future LLVM releases.
| PowerPC/PowerPC64 |`cr`|`cr[0-7]`, `cr`| Only clobbers |
615
+
| PowerPC/PowerPC64 |`ctr`|`ctr`| Only clobbers |
616
+
| PowerPC/PowerPC64 |`lr`|`lr`| Only clobbers |
617
+
| PowerPC/PowerPC64 |`xer`|`xer`| Only clobbers |
605
618
606
619
> [!NOTE]
607
620
> - On x86 we treat `reg_byte` differently from `reg` because the compiler can allocate `al` and `ah` separately whereas `reg` reserves the whole register.
608
621
> - On x86-64 the high byte registers (e.g. `ah`) are not available in the `reg_byte` register class.
609
622
> - Some register classes are marked as "Only clobbers" which means that registers in these classes cannot be used for inputs or outputs, only clobbers of the form `out(<explicit register>) _` or `lateout(<explicit register>) _`.
623
+
> - The `spe_acc` register is only available on PowerPC SPE targets
610
624
611
625
r[asm.register-operands.value-type-constraints]
612
626
Each register class has constraints on which value types they can be used with.
@@ -649,6 +663,17 @@ The availability of supported types for a particular register class may depend o
| PowerPC/PowerPC64 |`vsreg`|`vsx`| The union of vsx and altivec vreg types |
673
+
| PowerPC/PowerPC64 |`cr`| None | Only clobbers |
674
+
| PowerPC/PowerPC64 |`ctr`| None | Only clobbers |
675
+
| PowerPC/PowerPC64 |`lr`| None | Only clobbers |
676
+
| PowerPC/PowerPC64 |`xer`| None | Only clobbers |
652
677
653
678
> [!NOTE]
654
679
> For the purposes of the above table pointers, function pointers and `isize`/`usize` are treated as the equivalent integer type (`i16`/`i32`/`i64` depending on the target).
@@ -790,6 +815,10 @@ Here is the list of all supported register aliases:
790
815
| LoongArch |`$f[0-7]`|`$fa[0-7]`|
791
816
| LoongArch |`$f[8-23]`|`$ft[0-15]`|
792
817
| LoongArch |`$f[24-31]`|`$fs[0-7]`|
818
+
| PowerPC/PowerPC64 |`r1`|`sp`|
819
+
| PowerPC/PowerPC64 |`r31`|`fp`|
820
+
| PowerPC/PowerPC64 |`r[0-31]`|`[0-31]`|
821
+
| PowerPC/PowerPC64 |`f[0-31]`|`fr[0-31]`|
793
822
794
823
```rust
795
824
# #[cfg(target_arch ="x86_64")] {
@@ -804,10 +833,10 @@ Some registers cannot be used for input or output operands:
804
833
805
834
| Architecture | Unsupported register | Reason |
806
835
| ------------ | -------------------- | ------ |
807
-
| All |`sp`, `r15` (s390x) | The stack pointer must be restored to its original value at the end of the assembly code or before jumping to a `label` block. |
808
-
| All |`bp` (x86), `x29` (AArch64 and Arm64EC), `x8` (RISC-V), `$fp` (LoongArch), `r11` (s390x) | The frame pointer cannot be used as an input or output. |
836
+
| All |`sp`, `r15` (s390x), `r1` (PowerPC and PowerPC64)| The stack pointer must be restored to its original value at the end of the assembly code or before jumping to a `label` block. |
837
+
| All |`bp` (x86), `x29` (AArch64 and Arm64EC), `x8` (RISC-V), `$fp` (LoongArch), `r11` (s390x), `fp` (PowerPC and PowerPC64)| The frame pointer cannot be used as an input or output. |
809
838
| ARM |`r7` or `r11`| On ARM the frame pointer can be either `r7` or `r11` depending on the target. The frame pointer cannot be used as an input or output. |
810
-
| All |`si` (x86-32), `bx` (x86-64), `r6` (ARM), `x19` (AArch64 and Arm64EC), `x9` (RISC-V), `$s8` (LoongArch) | This is used internally by LLVM as a "base pointer" for functions with complex stack frames. |
839
+
| All |`si` (x86-32), `bx` (x86-64), `r6` (ARM), `x19` (AArch64 and Arm64EC), `x9` (RISC-V), `$s8` (LoongArch), `r29` and `r30` (PowerPC), `r30` (PowerPC64)| This is used internally by LLVM as a "base pointer" for functions with complex stack frames. |
811
840
| x86 |`ip`| This is the program counter, not a real register. |
812
841
| AArch64 |`xzr`| This is a constant zero register which can't be modified. |
813
842
| AArch64 |`x18`| This is an OS-reserved register on some AArch64 targets. |
@@ -823,6 +852,8 @@ Some registers cannot be used for input or output operands:
823
852
| LoongArch |`$r21`| This is reserved by the ABI. |
824
853
| s390x |`c[0-15]`| Reserved by the kernel. |
825
854
| s390x |`a[0-1]`| Reserved for system use. |
855
+
| PowerPC/PowerPC64 |`r2`, `r13`| These are system reserved registers. |
856
+
| PowerPC/PowerPC64 |`vrsave`| The vrsave register cannot be used as an input or output. |
826
857
827
858
```rust,compile_fail
828
859
# #[cfg(target_arch = "x86_64")] {
@@ -898,6 +929,11 @@ The supported modifiers are a subset of LLVM's (and GCC's) [asm template argumen
0 commit comments