diff options
Diffstat (limited to 'src/setjmp')
| -rw-r--r-- | src/setjmp/loongarch64/longjmp.S | 32 | ||||
| -rw-r--r-- | src/setjmp/loongarch64/setjmp.S | 34 | ||||
| -rw-r--r-- | src/setjmp/powerpc/longjmp.S | 32 | ||||
| -rw-r--r-- | src/setjmp/powerpc/setjmp.S | 32 | ||||
| -rw-r--r-- | src/setjmp/riscv32/longjmp.S | 48 | ||||
| -rw-r--r-- | src/setjmp/riscv32/setjmp.S | 47 | ||||
| -rw-r--r-- | src/setjmp/riscv64/longjmp.S | 30 | ||||
| -rw-r--r-- | src/setjmp/riscv64/setjmp.S | 30 | 
8 files changed, 259 insertions, 26 deletions
diff --git a/src/setjmp/loongarch64/longjmp.S b/src/setjmp/loongarch64/longjmp.S new file mode 100644 index 00000000..896d2e26 --- /dev/null +++ b/src/setjmp/loongarch64/longjmp.S @@ -0,0 +1,32 @@ +.global _longjmp +.global longjmp +.type   _longjmp,@function +.type   longjmp,@function +_longjmp: +longjmp: +	ld.d    $ra, $a0, 0 +	ld.d    $sp, $a0, 8 +	ld.d    $r21,$a0, 16 +	ld.d    $fp, $a0, 24 +	ld.d    $s0, $a0, 32 +	ld.d    $s1, $a0, 40 +	ld.d    $s2, $a0, 48 +	ld.d    $s3, $a0, 56 +	ld.d    $s4, $a0, 64 +	ld.d    $s5, $a0, 72 +	ld.d    $s6, $a0, 80 +	ld.d    $s7, $a0, 88 +	ld.d    $s8, $a0, 96 +#ifndef __loongarch_soft_float +	fld.d   $fs0, $a0, 104 +	fld.d   $fs1, $a0, 112 +	fld.d   $fs2, $a0, 120 +	fld.d   $fs3, $a0, 128 +	fld.d   $fs4, $a0, 136 +	fld.d   $fs5, $a0, 144 +	fld.d   $fs6, $a0, 152 +	fld.d   $fs7, $a0, 160 +#endif +	sltui   $a0, $a1, 1 +	add.d   $a0, $a0, $a1 +	jr      $ra diff --git a/src/setjmp/loongarch64/setjmp.S b/src/setjmp/loongarch64/setjmp.S new file mode 100644 index 00000000..d158a3d2 --- /dev/null +++ b/src/setjmp/loongarch64/setjmp.S @@ -0,0 +1,34 @@ +.global __setjmp +.global _setjmp +.global setjmp +.type __setjmp,@function +.type _setjmp,@function +.type setjmp,@function +__setjmp: +_setjmp: +setjmp: +	st.d    $ra, $a0, 0 +	st.d    $sp, $a0, 8 +	st.d    $r21,$a0, 16 +	st.d    $fp, $a0, 24 +	st.d    $s0, $a0, 32 +	st.d    $s1, $a0, 40 +	st.d    $s2, $a0, 48 +	st.d    $s3, $a0, 56 +	st.d    $s4, $a0, 64 +	st.d    $s5, $a0, 72 +	st.d    $s6, $a0, 80 +	st.d    $s7, $a0, 88 +	st.d    $s8, $a0, 96 +#ifndef __loongarch_soft_float +	fst.d   $fs0, $a0, 104 +	fst.d   $fs1, $a0, 112 +	fst.d   $fs2, $a0, 120 +	fst.d   $fs3, $a0, 128 +	fst.d   $fs4, $a0, 136 +	fst.d   $fs5, $a0, 144 +	fst.d   $fs6, $a0, 152 +	fst.d   $fs7, $a0, 160 +#endif +	move    $a0, $zero +	jr      $ra diff --git a/src/setjmp/powerpc/longjmp.S b/src/setjmp/powerpc/longjmp.S index e598bd05..465e4cd7 100644 --- a/src/setjmp/powerpc/longjmp.S +++ b/src/setjmp/powerpc/longjmp.S @@ -37,7 +37,37 @@ longjmp:  	lwz 29, 72(3)  	lwz 30, 76(3)  	lwz 31, 80(3) -#ifndef _SOFT_FLOAT +#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) +	mflr 0 +	bl 1f +	.hidden __hwcap +	.long __hwcap-. +1:	mflr 6 +	lwz 5, 0(6) +	lwzx 6, 6, 5 +	andis. 6, 6, 0x80 +	beq 1f +	.long 0x11c35b01 /* evldd 14,88(3) */ +	.long 0x11e36301 /* ... */ +	.long 0x12036b01 +	.long 0x12237301 +	.long 0x12437b01 +	.long 0x12638301 +	.long 0x12838b01 +	.long 0x12a39301 +	.long 0x12c39b01 +	.long 0x12e3a301 +	.long 0x1303ab01 +	.long 0x1323b301 +	.long 0x1343bb01 +	.long 0x1363c301 +	.long 0x1383cb01 +	.long 0x13a3d301 +	.long 0x13c3db01 +	.long 0x13e3e301 /* evldd 31,224(3) */ +	.long 0x11a3eb01 /* evldd 13,232(3) */ +1:	mtlr 0 +#else  	lfd 14,88(3)  	lfd 15,96(3)  	lfd 16,104(3) diff --git a/src/setjmp/powerpc/setjmp.S b/src/setjmp/powerpc/setjmp.S index cd91a207..f1fcce33 100644 --- a/src/setjmp/powerpc/setjmp.S +++ b/src/setjmp/powerpc/setjmp.S @@ -37,7 +37,37 @@ setjmp:  	stw 29, 72(3)  	stw 30, 76(3)  	stw 31, 80(3) -#ifndef _SOFT_FLOAT +#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__) +	mflr 0 +	bl 1f +	.hidden __hwcap +	.long __hwcap-. +1:	mflr 4 +	lwz 5, 0(4) +	lwzx 4, 4, 5 +	andis. 4, 4, 0x80 +	beq 1f +	.long 0x11c35b21 /* evstdd 14,88(3) */ +	.long 0x11e36321 /* ... */ +	.long 0x12036b21 +	.long 0x12237321 +	.long 0x12437b21 +	.long 0x12638321 +	.long 0x12838b21 +	.long 0x12a39321 +	.long 0x12c39b21 +	.long 0x12e3a321 +	.long 0x1303ab21 +	.long 0x1323b321 +	.long 0x1343bb21 +	.long 0x1363c321 +	.long 0x1383cb21 +	.long 0x13a3d321 +	.long 0x13c3db21 +	.long 0x13e3e321 /* evstdd 31,224(3) */ +	.long 0x11a3eb21 /* evstdd 13,232(3) */ +1:	mtlr 0 +#else  	stfd 14,88(3)  	stfd 15,96(3)  	stfd 16,104(3) diff --git a/src/setjmp/riscv32/longjmp.S b/src/setjmp/riscv32/longjmp.S new file mode 100644 index 00000000..b4e5458d --- /dev/null +++ b/src/setjmp/riscv32/longjmp.S @@ -0,0 +1,48 @@ +.global __longjmp +.global _longjmp +.global longjmp +.type __longjmp, %function +.type _longjmp,  %function +.type longjmp,   %function +__longjmp: +_longjmp: +longjmp: +	lw s0,    0(a0) +	lw s1,    4(a0) +	lw s2,    8(a0) +	lw s3,    12(a0) +	lw s4,    16(a0) +	lw s5,    20(a0) +	lw s6,    24(a0) +	lw s7,    28(a0) +	lw s8,    32(a0) +	lw s9,    36(a0) +	lw s10,   40(a0) +	lw s11,   44(a0) +	lw sp,    48(a0) +	lw ra,    52(a0) + +#ifndef __riscv_float_abi_soft +#ifdef __riscv_float_abi_double +#define FLX fld +#else +#define FLX flw +#endif + +	FLX fs0,  56(a0) +	FLX fs1,  64(a0) +	FLX fs2,  72(a0) +	FLX fs3,  80(a0) +	FLX fs4,  88(a0) +	FLX fs5,  96(a0) +	FLX fs6,  104(a0) +	FLX fs7,  112(a0) +	FLX fs8,  120(a0) +	FLX fs9,  128(a0) +	FLX fs10, 136(a0) +	FLX fs11, 144(a0) +#endif + +	seqz a0, a1 +	add a0, a0, a1 +	ret diff --git a/src/setjmp/riscv32/setjmp.S b/src/setjmp/riscv32/setjmp.S new file mode 100644 index 00000000..5a1a41ef --- /dev/null +++ b/src/setjmp/riscv32/setjmp.S @@ -0,0 +1,47 @@ +.global __setjmp +.global _setjmp +.global setjmp +.type __setjmp, %function +.type _setjmp,  %function +.type setjmp,   %function +__setjmp: +_setjmp: +setjmp: +	sw s0,    0(a0) +	sw s1,    4(a0) +	sw s2,    8(a0) +	sw s3,    12(a0) +	sw s4,    16(a0) +	sw s5,    20(a0) +	sw s6,    24(a0) +	sw s7,    28(a0) +	sw s8,    32(a0) +	sw s9,    36(a0) +	sw s10,   40(a0) +	sw s11,   44(a0) +	sw sp,    48(a0) +	sw ra,    52(a0) + +#ifndef __riscv_float_abi_soft +#ifdef __riscv_float_abi_double +#define FSX fsd +#else +#define FSX fsw +#endif + +	FSX fs0,  56(a0) +	FSX fs1,  64(a0) +	FSX fs2,  72(a0) +	FSX fs3,  80(a0) +	FSX fs4,  88(a0) +	FSX fs5,  96(a0) +	FSX fs6,  104(a0) +	FSX fs7,  112(a0) +	FSX fs8,  120(a0) +	FSX fs9,  128(a0) +	FSX fs10, 136(a0) +	FSX fs11, 144(a0) +#endif + +	li a0, 0 +	ret diff --git a/src/setjmp/riscv64/longjmp.S b/src/setjmp/riscv64/longjmp.S index 41e2d210..982475c7 100644 --- a/src/setjmp/riscv64/longjmp.S +++ b/src/setjmp/riscv64/longjmp.S @@ -23,18 +23,24 @@ longjmp:  	ld ra,    104(a0)  #ifndef __riscv_float_abi_soft -	fld fs0,  112(a0) -	fld fs1,  120(a0) -	fld fs2,  128(a0) -	fld fs3,  136(a0) -	fld fs4,  144(a0) -	fld fs5,  152(a0) -	fld fs6,  160(a0) -	fld fs7,  168(a0) -	fld fs8,  176(a0) -	fld fs9,  184(a0) -	fld fs10, 192(a0) -	fld fs11, 200(a0) +#ifdef __riscv_float_abi_double +#define FLX fld +#else +#define FLX flw +#endif + +	FLX fs0,  112(a0) +	FLX fs1,  120(a0) +	FLX fs2,  128(a0) +	FLX fs3,  136(a0) +	FLX fs4,  144(a0) +	FLX fs5,  152(a0) +	FLX fs6,  160(a0) +	FLX fs7,  168(a0) +	FLX fs8,  176(a0) +	FLX fs9,  184(a0) +	FLX fs10, 192(a0) +	FLX fs11, 200(a0)  #endif  	seqz a0, a1 diff --git a/src/setjmp/riscv64/setjmp.S b/src/setjmp/riscv64/setjmp.S index 51249672..0795bf7d 100644 --- a/src/setjmp/riscv64/setjmp.S +++ b/src/setjmp/riscv64/setjmp.S @@ -23,18 +23,24 @@ setjmp:  	sd ra,    104(a0)  #ifndef __riscv_float_abi_soft -	fsd fs0,  112(a0) -	fsd fs1,  120(a0) -	fsd fs2,  128(a0) -	fsd fs3,  136(a0) -	fsd fs4,  144(a0) -	fsd fs5,  152(a0) -	fsd fs6,  160(a0) -	fsd fs7,  168(a0) -	fsd fs8,  176(a0) -	fsd fs9,  184(a0) -	fsd fs10, 192(a0) -	fsd fs11, 200(a0) +#ifdef __riscv_float_abi_double +#define FSX fsd +#else +#define FSX fsw +#endif + +	FSX fs0,  112(a0) +	FSX fs1,  120(a0) +	FSX fs2,  128(a0) +	FSX fs3,  136(a0) +	FSX fs4,  144(a0) +	FSX fs5,  152(a0) +	FSX fs6,  160(a0) +	FSX fs7,  168(a0) +	FSX fs8,  176(a0) +	FSX fs9,  184(a0) +	FSX fs10, 192(a0) +	FSX fs11, 200(a0)  #endif  	li a0, 0  | 
