diff mbox series

[V4,2/2] mips: remove old syscall restart convention

Message ID 20201229114741.14685-3-huangpei@loongson.cn
State New
Headers show
Series [V4,1/2] mips: add hp-timing support for MIPS R2 | expand

Commit Message

Huang Pei Dec. 29, 2020, 11:47 a.m. UTC
Before Linux/MIPS 2.6.36, kernel expected setting syscall number(aka
"li v0, #sys_number") right precedes "syscall", so the kernel syscall
restart sequence can use CP0 EPC - 4 to restart the syscall, because
kernel DID NOT save v0 during syscall handling. Linux 2.6.36 canceled
this restriction.

See sysdeps/unix/sysv/linux/mips/{mips32,mips64}/sysdep.h

Since glibc-2.24 the minimum kernel version is 3.2(much higer than
2.6.36), I think it is OK to remove the ugly register spill in
syscall.S just because of the old convention

This also remove the unaligned stack pointer.

For consistency, it also remove all other old syscall restart sequence.
---
 sysdeps/unix/sysv/linux/mips/mips32/sysdep.h  |  89 ++++-----------
 sysdeps/unix/sysv/linux/mips/mips64/syscall.S |  14 +--
 sysdeps/unix/sysv/linux/mips/mips64/sysdep.h  | 103 +++++-------------
 3 files changed, 49 insertions(+), 157 deletions(-)
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
index 49856c3249..601bd9abc7 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
@@ -60,18 +60,7 @@ 
    GIT repository as commit 96187fb0bc30cd7919759d371d810e928048249d, that
    first appeared in the 2.6.36 release.  Since then the kernel has had
    code that reloads $v0 upon syscall restart and resumes right at the
-   SYSCALL instruction, so no special arrangement is needed anymore.
-
-   For backwards compatibility with existing kernel binaries we support
-   the old convention by choosing the instruction preceding SYSCALL
-   carefully.  This also means we have to force a 32-bit encoding of the
-   microMIPS MOVE instruction if one is used.  */
-
-#ifdef __mips_micromips
-# define MOVE32 "move32"
-#else
-# define MOVE32 "move"
-#endif
+   SYSCALL instruction, so no special arrangement is needed anymore. */
 
 #undef INTERNAL_SYSCALL
 #undef INTERNAL_SYSCALL_NCS
@@ -109,97 +98,75 @@  union __mips_syscall_return
 })
 
 # define INTERNAL_SYSCALL_MIPS16(number, err, nr, args...)		\
-	internal_syscall##nr ("lw\t%0, %2\n\t",				\
-			      "R" (number),				\
-			      number, err, args)
+	internal_syscall##nr (number, err, args)
 
 #else /* !__mips16 */
 # define INTERNAL_SYSCALL(name, nr, args...)				\
-	internal_syscall##nr ("li\t%0, %2\t\t\t# " #name "\n\t",	\
-			      "IK" (SYS_ify (name)),			\
-			      SYS_ify (name), err, args)
+	internal_syscall##nr (SYS_ify (name), err, args)
 
 # define INTERNAL_SYSCALL_NCS(number, nr, args...)			\
-	internal_syscall##nr (MOVE32 "\t%0, %2\n\t",			\
-			      "r" (__s0),				\
-			      number, err, args)
+	internal_syscall##nr (number, err, args)
 
 #endif /* !__mips16 */
 
-#define internal_syscall0(v0_init, input, number, err, dummy...)	\
+#define internal_syscall0(number, err, dummy...)			\
 ({									\
 	long int _sys_result;						\
 									\
 	{								\
-	register long int __s0 asm ("$16") __attribute__ ((unused))	\
-	  = (number);							\
-	register long int __v0 asm ("$2");				\
+	register long int __v0 asm ("$2") = number;			\
 	register long int __a3 asm ("$7");				\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set reorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input								\
+	: "r" (__v0)							\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall1(v0_init, input, number, err, arg1)		\
+#define internal_syscall1(number, err, arg1)				\
 ({									\
 	long int _sys_result;						\
 									\
 	{								\
 	long int _arg1 = (long int) (arg1);				\
-	register long int __s0 asm ("$16") __attribute__ ((unused))	\
-	  = (number);							\
-	register long int __v0 asm ("$2");				\
+	register long int __v0 asm ("$2") = number;			\
 	register long int __a0 asm ("$4") = _arg1;			\
 	register long int __a3 asm ("$7");				\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set reorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input, "r" (__a0)						\
+	: "r" (__v0), "r" (__a0)					\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall2(v0_init, input, number, err, arg1, arg2)	\
+#define internal_syscall2(number, err, arg1, arg2)			\
 ({									\
 	long int _sys_result;						\
 									\
 	{								\
 	long int _arg1 = (long int) (arg1);				\
 	long int _arg2 = (long int) (arg2);				\
-	register long int __s0 asm ("$16") __attribute__ ((unused))	\
-	  = (number);							\
-	register long int __v0 asm ("$2");				\
+	register long int __v0 asm ("$2") = number;			\
 	register long int __a0 asm ("$4") = _arg1;			\
 	register long int __a1 asm ("$5") = _arg2;			\
 	register long int __a3 asm ("$7");				\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1)					\
+	: "r" (__v0), "r" (__a0), "r" (__a1)				\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall3(v0_init, input, number, err,			\
-			  arg1, arg2, arg3)				\
+#define internal_syscall3(number, err, arg1, arg2, arg3)		\
 ({									\
 	long int _sys_result;						\
 									\
@@ -207,28 +174,22 @@  union __mips_syscall_return
 	long int _arg1 = (long int) (arg1);				\
 	long int _arg2 = (long int) (arg2);				\
 	long int _arg3 = (long int) (arg3);				\
-	register long int __s0 asm ("$16") __attribute__ ((unused))	\
-	  = (number);							\
-	register long int __v0 asm ("$2");				\
+	register long int __v0 asm ("$2") = number;			\
 	register long int __a0 asm ("$4") = _arg1;			\
 	register long int __a1 asm ("$5") = _arg2;			\
 	register long int __a2 asm ("$6") = _arg3;			\
 	register long int __a3 asm ("$7");				\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2)		\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall4(v0_init, input, number, err,			\
-			  arg1, arg2, arg3, arg4)			\
+#define internal_syscall4(number, err, arg1, arg2, arg3, arg4)		\
 ({									\
 	long int _sys_result;						\
 									\
@@ -237,20 +198,15 @@  union __mips_syscall_return
 	long int _arg2 = (long int) (arg2);				\
 	long int _arg3 = (long int) (arg3);				\
 	long int _arg4 = (long int) (arg4);				\
-	register long int __s0 asm ("$16") __attribute__ ((unused))	\
-	  = (number);							\
-	register long int __v0 asm ("$2");				\
+	register long int __v0 asm ("$2") = number;			\
 	register long int __a0 asm ("$4") = _arg1;			\
 	register long int __a1 asm ("$5") = _arg2;			\
 	register long int __a2 asm ("$6") = _arg3;			\
 	register long int __a3 asm ("$7") = _arg4;			\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "+r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2)		\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
@@ -272,8 +228,7 @@  long long int __nomips16 __mips_syscall5 (long int arg1, long int arg2,
 					  long int number);
 libc_hidden_proto (__mips_syscall5, nomips16)
 
-#define internal_syscall5(v0_init, input, number, err,			\
-			  arg1, arg2, arg3, arg4, arg5)			\
+#define internal_syscall5(number, err, arg1, arg2, arg3, arg4, arg5)	\
 ({									\
 	union __mips_syscall_return _sc_ret;				\
 	_sc_ret.val = __mips_syscall5 ((long int) (arg1),		\
@@ -291,7 +246,7 @@  long long int __nomips16 __mips_syscall6 (long int arg1, long int arg2,
 					  long int number);
 libc_hidden_proto (__mips_syscall6, nomips16)
 
-#define internal_syscall6(v0_init, input, number, err,			\
+#define internal_syscall6(number, err,					\
 			  arg1, arg2, arg3, arg4, arg5, arg6)		\
 ({									\
 	union __mips_syscall_return _sc_ret;				\
@@ -312,7 +267,7 @@  long long int __nomips16 __mips_syscall7 (long int arg1, long int arg2,
 					  long int number);
 libc_hidden_proto (__mips_syscall7, nomips16)
 
-#define internal_syscall7(v0_init, input, number, err,			\
+#define internal_syscall7(number, err,					\
 			  arg1, arg2, arg3, arg4, arg5, arg6, arg7)	\
 ({									\
 	union __mips_syscall_return _sc_ret;				\
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/syscall.S b/sysdeps/unix/sysv/linux/mips/mips64/syscall.S
index a9baff3c17..089524a40b 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/syscall.S
+++ b/sysdeps/unix/sysv/linux/mips/mips64/syscall.S
@@ -27,14 +27,9 @@ 
 
 	.text
 NESTED (syscall, SZREG, ra)
-	.mask 0x00010000, -SZREG
+	.mask 0x00000000, 0
 	.fmask 0x00000000, 0
-	PTR_ADDIU sp, -SZREG
-	cfi_adjust_cfa_offset (SZREG)
-	REG_S s0, (sp)
-	cfi_rel_offset (s0, 0)
-
-	move s0, a0
+	move v0, a0
 	move a0, a1		/* shift arg1 - arg7.  */
 	move a1, a2
 	move a2, a3
@@ -43,13 +38,8 @@  NESTED (syscall, SZREG, ra)
 	move a5, a6
 	move a6, a7
 
-	move v0, s0		/* Syscall number -> v0 */
 	syscall			/* Do the system call.  */
 
-	REG_L s0, (sp)
-	cfi_restore (s0)
-	PTR_ADDIU sp, SZREG
-	cfi_adjust_cfa_offset (-SZREG)
 	bne a3, zero, L(error)
 
 	ret
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
index 73816816d5..ae38b56f1a 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
@@ -68,104 +68,74 @@  typedef long int __syscall_arg_t;
    GIT repository as commit 96187fb0bc30cd7919759d371d810e928048249d, that
    first appeared in the 2.6.36 release.  Since then the kernel has had
    code that reloads $v0 upon syscall restart and resumes right at the
-   SYSCALL instruction, so no special arrangement is needed anymore.
-
-   For backwards compatibility with existing kernel binaries we support
-   the old convention by choosing the instruction preceding SYSCALL
-   carefully.  This also means we have to force a 32-bit encoding of the
-   microMIPS MOVE instruction if one is used.  */
-
-#ifdef __mips_micromips
-# define MOVE32 "move32"
-#else
-# define MOVE32 "move"
-#endif
+   SYSCALL instruction, so no special arrangement is needed anymore. */
 
 #undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...)			\
-	internal_syscall##nr ("li\t%0, %2\t\t\t# " #name "\n\t",	\
-			      "IK" (SYS_ify (name)),			\
-			      0, args)
+#define INTERNAL_SYSCALL(name, nr, args...)				\
+	internal_syscall##nr ((SYS_ify (name)),	args)
 
 #undef INTERNAL_SYSCALL_NCS
 #define INTERNAL_SYSCALL_NCS(number, nr, args...)			\
-	internal_syscall##nr (MOVE32 "\t%0, %2\n\t",			\
-			      "r" (__s0),				\
-			      number, args)
+	internal_syscall##nr (number, args)
 
-#define internal_syscall0(v0_init, input, number, dummy...)	\
+#define internal_syscall0(number, dummy...)				\
 ({									\
 	long int _sys_result;						\
 									\
 	{								\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a3 asm ("$7");			\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set reorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input								\
+	: "r" (__v0)							\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall1(v0_init, input, number, arg1)		\
+#define internal_syscall1(number, arg1)					\
 ({									\
 	long int _sys_result;						\
 									\
 	{								\
 	__syscall_arg_t _arg1 = ARGIFY (arg1);				\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a0 asm ("$4") = _arg1;		\
 	register __syscall_arg_t __a3 asm ("$7");			\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set reorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input, "r" (__a0)						\
+	: "r" (__v0), "r" (__a0)					\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall2(v0_init, input, number, arg1, arg2)	\
+#define internal_syscall2(number, arg1, arg2)				\
 ({									\
 	long int _sys_result;						\
 									\
 	{								\
 	__syscall_arg_t _arg1 = ARGIFY (arg1);				\
 	__syscall_arg_t _arg2 = ARGIFY (arg2);				\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a0 asm ("$4") = _arg1;		\
 	register __syscall_arg_t __a1 asm ("$5") = _arg2;		\
 	register __syscall_arg_t __a3 asm ("$7");			\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1)					\
+	: "r" (__v0), "r" (__a0), "r" (__a1)				\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall3(v0_init, input, number, arg1, arg2, arg3)	\
+#define internal_syscall3(number, arg1, arg2, arg3)			\
 ({									\
 	long int _sys_result;						\
 									\
@@ -173,28 +143,22 @@  typedef long int __syscall_arg_t;
 	__syscall_arg_t _arg1 = ARGIFY (arg1);				\
 	__syscall_arg_t _arg2 = ARGIFY (arg2);				\
 	__syscall_arg_t _arg3 = ARGIFY (arg3);				\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a0 asm ("$4") = _arg1;		\
 	register __syscall_arg_t __a1 asm ("$5") = _arg2;		\
 	register __syscall_arg_t __a2 asm ("$6") = _arg3;		\
 	register __syscall_arg_t __a3 asm ("$7");			\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "=r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2)		\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall4(v0_init, input, number, arg1, arg2, arg3, 	\
-			  arg4)						\
+#define internal_syscall4(number, arg1, arg2, arg3, arg4)		\
 ({									\
 	long int _sys_result;						\
 									\
@@ -203,28 +167,22 @@  typedef long int __syscall_arg_t;
 	__syscall_arg_t _arg2 = ARGIFY (arg2);				\
 	__syscall_arg_t _arg3 = ARGIFY (arg3);				\
 	__syscall_arg_t _arg4 = ARGIFY (arg4);				\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a0 asm ("$4") = _arg1;		\
 	register __syscall_arg_t __a1 asm ("$5") = _arg2;		\
 	register __syscall_arg_t __a2 asm ("$6") = _arg3;		\
 	register __syscall_arg_t __a3 asm ("$7") = _arg4;		\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "+r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2)		\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall5(v0_init, input, number, arg1, arg2, arg3, 	\
-			  arg4, arg5)					\
+#define internal_syscall5(number, arg1, arg2, arg3, arg4, arg5)		\
 ({									\
 	long int _sys_result;						\
 									\
@@ -234,29 +192,23 @@  typedef long int __syscall_arg_t;
 	__syscall_arg_t _arg3 = ARGIFY (arg3);				\
 	__syscall_arg_t _arg4 = ARGIFY (arg4);				\
 	__syscall_arg_t _arg5 = ARGIFY (arg5);				\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a0 asm ("$4") = _arg1;		\
 	register __syscall_arg_t __a1 asm ("$5") = _arg2;		\
 	register __syscall_arg_t __a2 asm ("$6") = _arg3;		\
 	register __syscall_arg_t __a3 asm ("$7") = _arg4;		\
 	register __syscall_arg_t __a4 asm ("$8") = _arg5;		\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "+r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4)		\
+	: "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4)	\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\
 	}								\
 	_sys_result;							\
 })
 
-#define internal_syscall6(v0_init, input, number, arg1, arg2, arg3, 	\
-			  arg4, arg5, arg6)				\
+#define internal_syscall6(number, arg1, arg2, arg3, arg4, arg5, arg6)	\
 ({									\
 	long int _sys_result;						\
 									\
@@ -267,9 +219,7 @@  typedef long int __syscall_arg_t;
 	__syscall_arg_t _arg4 = ARGIFY (arg4);				\
 	__syscall_arg_t _arg5 = ARGIFY (arg5);				\
 	__syscall_arg_t _arg6 = ARGIFY (arg6);				\
-	register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
-	  = (number);							\
-	register __syscall_arg_t __v0 asm ("$2");			\
+	register __syscall_arg_t __v0 asm ("$2") = number;		\
 	register __syscall_arg_t __a0 asm ("$4") = _arg1;		\
 	register __syscall_arg_t __a1 asm ("$5") = _arg2;		\
 	register __syscall_arg_t __a2 asm ("$6") = _arg3;		\
@@ -277,12 +227,9 @@  typedef long int __syscall_arg_t;
 	register __syscall_arg_t __a4 asm ("$8") = _arg5;		\
 	register __syscall_arg_t __a5 asm ("$9") = _arg6;		\
 	__asm__ volatile (						\
-	".set\tnoreorder\n\t"						\
-	v0_init								\
 	"syscall\n\t"							\
-	".set\treorder"							\
 	: "=r" (__v0), "+r" (__a3)					\
-	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4),	\
+	: "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4),	\
 	  "r" (__a5)							\
 	: __SYSCALL_CLOBBERS);						\
 	_sys_result = __a3 != 0 ? -__v0 : __v0;				\