@@ -46,7 +46,7 @@ version (LDC)
46
46
}
47
47
48
48
pragma (LDC_intrinsic, " llvm.eh.unwind.init" )
49
- void llvm_unwind_init ();
49
+ void llvm_unwind_init () nothrow @nogc ;
50
50
}
51
51
52
52
@@ -1571,8 +1571,8 @@ in (fn)
1571
1571
}}
1572
1572
asm pure nothrow @nogc {
1573
1573
(" sd $gp, %0" ) : " =m" (regs[8 ]);
1574
- (" sd $fp, %0" ) : " =m" (regs[9 ]);
1575
- (" sd $ra , %0" ) : " =m" (sp);
1574
+ (" sd $fp, %0" ) : " =m" (regs[9 ]);
1575
+ (" sd $sp , %0" ) : " =m" (sp);
1576
1576
}
1577
1577
}
1578
1578
else version (MIPS_Any)
@@ -1638,22 +1638,14 @@ in (fn)
1638
1638
}
1639
1639
else version (SystemZ )
1640
1640
{
1641
- size_t [19 ] regs = void ;
1641
+ // Callee-save registers, according to SystemZ Calling Convention
1642
+ // https://github.com/IBM/s390x-abi/blob/main/lzsabi.tex
1643
+ size_t [10 ] regs = void ;
1642
1644
asm pure nothrow @nogc {
1643
- // save argument/return register
1644
- " stg %%r2, %0" : " =m" (regs[0 ]);
1645
- // save callee-saved GPRs (%r6 - %r14)
1646
- " stmg %%r6, %%r14, %0" : " =m" (regs[1 ]);
1647
- // save floating point control register
1648
- " stfpc %0" : " =m" (regs[10 ]);
1645
+ // save callee-saved GPRs (%r6 - %r15)
1646
+ " stmg %%r6, %%r15, %0" : " =m" (regs[0 ]);
1649
1647
}
1650
- static foreach (i; 8 .. 16 )
1651
- {{
1652
- enum int j = i;
1653
- // save %f8 - %f15
1654
- asm pure nothrow @nogc { ( " std %%f" ~ j.stringof~ " , %0" ) : " =m" (regs[i + 3 ]); }
1655
- }}
1656
- asm pure nothrow @nogc { ( " stg %%r15, %0" ) : " =m" (sp); }
1648
+ sp = regs[9 ];
1657
1649
}
1658
1650
else
1659
1651
{
@@ -1723,6 +1715,7 @@ version (LDC)
1723
1715
version (ARM_Any) version = LDC_stackTopAsm;
1724
1716
version (PPC_Any) version = LDC_stackTopAsm;
1725
1717
version (MIPS_Any) version = LDC_stackTopAsm;
1718
+ version (SystemZ ) version = LDC_stackTopAsm;
1726
1719
1727
1720
version (LDC_stackTopAsm)
1728
1721
{
@@ -1742,6 +1735,8 @@ version (LDC)
1742
1735
return __asm! (void * )(" mr $0, 1" , " =r" );
1743
1736
else version (MIPS_Any)
1744
1737
return __asm! (void * )(" move $0, $$sp" , " =r" );
1738
+ else version (SystemZ )
1739
+ return __asm! (void * )(" lgr $0, %r15" , " =r" );
1745
1740
else
1746
1741
static assert (0 );
1747
1742
}
0 commit comments