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
| PowerPC/PowerPC64 |`cr`|`cr[0-7]`, `cr`| Only clobbers |
640
+
| PowerPC/PowerPC64 |`ctr`|`ctr`| Only clobbers |
641
+
| PowerPC/PowerPC64 |`lr`|`lr`| Only clobbers |
642
+
| PowerPC/PowerPC64 |`xer`|`xer`| Only clobbers |
630
643
631
644
> [!NOTE]
632
645
> - On x86 we treat `reg_byte` differently from `reg` because the compiler can allocate `al` and `ah` separately whereas `reg` reserves the whole register.
633
646
> - On x86-64 the high byte registers (e.g. `ah`) are not available in the `reg_byte` register class.
634
647
> - 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>) _`.
648
+
> - The `spe_acc` register is only available on PowerPC SPE targets.
635
649
636
650
r[asm.register-operands.value-type-constraints]
637
651
Each register class has constraints on which value types they can be used with. This is necessary because the way a value is loaded into a register depends on its type. For example, on big-endian systems, loading a `i32x4` and a `i8x16` into a SIMD register may result in different register contents even if the byte-wise memory representation of both values is identical. The availability of supported types for a particular register class may depend on what target features are currently enabled.
@@ -671,6 +685,17 @@ Each register class has constraints on which value types they can be used with.
| PowerPC/PowerPC64 |`vsreg`|`vsx`| The union of vsx and altivec vreg types |
695
+
| PowerPC/PowerPC64 |`cr`| None | Only clobbers |
696
+
| PowerPC/PowerPC64 |`ctr`| None | Only clobbers |
697
+
| PowerPC/PowerPC64 |`lr`| None | Only clobbers |
698
+
| PowerPC/PowerPC64 |`xer`| None | Only clobbers |
674
699
675
700
> [!NOTE]
676
701
> 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).
@@ -807,6 +832,10 @@ Some registers have multiple names. These are all treated by the compiler as ide
807
832
| LoongArch |`$f[0-7]`|`$fa[0-7]`|
808
833
| LoongArch |`$f[8-23]`|`$ft[0-15]`|
809
834
| LoongArch |`$f[24-31]`|`$fs[0-7]`|
835
+
| PowerPC/PowerPC64 |`r1`|`sp`|
836
+
| PowerPC/PowerPC64 |`r31`|`fp`|
837
+
| PowerPC/PowerPC64 |`r[0-31]`|`[0-31]`|
838
+
| PowerPC/PowerPC64 |`f[0-31]`|`fr[0-31]`|
810
839
811
840
```rust
812
841
# #[cfg(target_arch ="x86_64")] {
@@ -821,10 +850,10 @@ Some registers cannot be used for input or output operands:
821
850
822
851
| Architecture | Unsupported register | Reason |
823
852
| ------------ | -------------------- | ------ |
824
-
| 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. |
825
-
| 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. |
853
+
| 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. |
854
+
| 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. |
826
855
| 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. |
827
-
| 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. |
856
+
| 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. |
828
857
| x86 |`ip`| This is the program counter, not a real register. |
829
858
| AArch64 |`xzr`| This is a constant zero register which can't be modified. |
830
859
| AArch64 |`x18`| This is an OS-reserved register on some AArch64 targets. |
@@ -840,6 +869,8 @@ Some registers cannot be used for input or output operands:
840
869
| LoongArch |`$r21`| This is reserved by the ABI. |
841
870
| s390x |`c[0-15]`| Reserved by the kernel. |
842
871
| s390x |`a[0-1]`| Reserved for system use. |
872
+
| PowerPC/PowerPC64 |`r2`, `r13`| These are system reserved registers. |
873
+
| PowerPC/PowerPC64 |`vrsave`| The vrsave register cannot be used as an input or output. |
843
874
844
875
```rust,compile_fail
845
876
# #[cfg(target_arch = "x86_64")] {
@@ -914,6 +945,11 @@ The supported modifiers are a subset of LLVM's (and GCC's) [asm template argumen
> - on ARM `e` / `f`: this prints the low or high doubleword register name of a NEON quad (128-bit) register.
@@ -1313,6 +1349,9 @@ r[asm.rules.stack-below-sp]
1313
1349
- You should adjust the stack pointer when allocating stack memory as required by the target ABI.
1314
1350
- The stack pointer must be restored to its original value before leaving the assembly code.
1315
1351
1352
+
r[asm.rules.stack-above-sp]
1353
+
- Unless the `nostack` option is set, assembly code is allowed to modify the caller's stack frame when the target ABI requires storing certain values in the caller's frame (e.g., when saving the `lr` on PowerPC64).
1354
+
1316
1355
r[asm.rules.noreturn]
1317
1356
- If the `noreturn` option is set then behavior is undefined if execution falls through the end of the assembly code.
0 commit comments