Add fibers for powerpc64 ELFv2, and fix fibers for 32-bit powerpc ELF.
The old code was for some other platform (AIX?), not BSD nor Linux.
This patch fixes OpenBSD but might break the other platform.

Add fibers for sparc64 ELF for OpenBSD only.

Index: libphobos/libdruntime/core/thread/fiber/package.d
--- libphobos/libdruntime/core/thread/fiber/package.d.orig
+++ libphobos/libdruntime/core/thread/fiber/package.d
@@ -94,8 +94,13 @@ package
     {
         version = AlignFiberStackTo16Byte;
 
-        version (GNU_CET)
+        version (OpenBSD)
         {
+            version = AsmExternal;
+            version = AsmX86_64_Posix;
+        }
+        else version (GNU_CET)
+        {
             // fiber_switchContext does not support shadow stack from
             // Intel CET.  So use ucontext implementation.
         }
@@ -127,6 +132,7 @@ package
         {
             version = AsmPPC_Posix;
             version = AsmExternal;
+            version = AlignFiberStackTo16Byte;
         }
     }
     else version (PPC64)
@@ -139,6 +145,8 @@ package
         }
         else version (Posix)
         {
+            version = AsmPPC_Posix;
+            version = AsmExternal;
             version = AlignFiberStackTo16Byte;
         }
     }
@@ -182,6 +190,11 @@ package
     }
     else version (SPARC64)
     {
+        version (Posix)
+        {
+            version = AsmSPARC64_Posix;
+            version = AsmExternal;
+        }
         version = AlignFiberStackTo16Byte;
     }
     else version (LoongArch64)
@@ -229,6 +242,8 @@ package
         extern (C) void fiber_switchContext( void** oldp, void* newp ) nothrow @nogc;
         version (AArch64)
             extern (C) void fiber_trampoline() nothrow;
+        version (SPARC64)
+            extern (C) void fiber_trampoline() nothrow;
     }
     else
     extern (C) void fiber_switchContext( void** oldp, void* newp ) nothrow @nogc
@@ -1075,27 +1090,22 @@ class Fiber : FiberBase (protected)
         }
         else version (AsmPPC_Posix)
         {
-            version (StackGrowsDown)
-            {
-                pstack -= int.sizeof * 5;
-            }
-            else
-            {
-                pstack += int.sizeof * 5;
-            }
+            version (StackGrowsDown) {} else static assert (false);
 
-            push( cast(size_t) &fiber_entryPoint );     // link register
-            push( 0x00000000 );                         // control register
-            push( 0x00000000 );                         // old stack pointer
-
-            // GPR values
-            version (StackGrowsDown)
+            version (PPC64)
             {
-                pstack -= int.sizeof * 20;
+                pstack -= size_t.sizeof * 5;
+                push( cast(size_t) &fiber_entryPoint);  // link register
+                push( 0x00000000_00000000 );            // condition register
+                push( 0x00000000_00000000 );            // old stack pointer
+                pstack -= size_t.sizeof * 18;           // GPRs
             }
             else
             {
-                pstack += int.sizeof * 20;
+                pstack -= size_t.sizeof * 6;
+                push( cast(size_t) &fiber_entryPoint);  // link register
+                push( 0x00000000 );                     // old stack pointer
+                pstack -= size_t.sizeof * 20;           // GPRs and CR
             }
 
             assert( (cast(size_t) pstack & 0x0f) == 0 );
@@ -1248,6 +1258,29 @@ class Fiber : FiberBase (protected)
             pstack -= size_t.sizeof * 11;    // skip past x19-x29
             push(cast(size_t) &fiber_trampoline); // see threadasm.S for docs
             pstack += size_t.sizeof;         // adjust sp (newp) above lr
+        }
+        else version (AsmSPARC64_Posix)
+        {
+            // FP regs and return address kept below tstack to hide from GC.
+            // See switchcontext.S for frame layout. tstack points to %l0.
+            //   [0-127]   - reserved (register window save area)
+            //   [RSA+0]   - %o7 (return address)
+            //   [RSA+8]   - %f32-%f62
+            //   [RSA+136] - %l0-%l7  <-- tstack
+            //   [RSA+200] - %i0-%i7
+
+            version (StackGrowsDown) {}
+            else
+                static assert(false, "Only full descending stacks supported on SPARC64");
+
+            enum RSA = 128;
+            enum FRAME_SIZE = 400;
+            enum TSTACK_OFFSET = RSA + 136;
+
+            (cast(ubyte*)pstack - (FRAME_SIZE + RSA))[0 .. FRAME_SIZE + RSA] = 0;
+            pstack -= FRAME_SIZE + RSA;
+            *cast(size_t*)(pstack + RSA) = cast(size_t) &fiber_trampoline - 8;
+            pstack += TSTACK_OFFSET;
         }
         else version (AsmARM_Posix)
         {
