[MIPS] Modify PTR_* macros for mips32r6/mips64r6

Message ID 045e59a8-12b8-4203-bec9-5b86ade30cab@BAMAIL02.ba.imgtec.org
State Committed
Headers

Commit Message

Steve Ellcey Dec. 19, 2014, 10:13 p.m. UTC
  This patch modifies some PTR_* macro definitions for mips32r6 and mips64r6.
It uses addu/subu instructions for pointer arithmetic as these operations do
not trap on mips32r6/mips64r6 whereas the add/sub instructions do trap.

Tested with the mips32r6/mips64r6 GCC, binutils and qemu simulator.

OK to checkin?

Steve Ellcey
sellcey@imgtec.com

2014-12-19  Steve Ellcey  <sellcey@imgtec.com>

	* sysdeps/mips/sys/asm.h (PTR_ADDU): Use addu on mips32r6/mips64r6.
	(PTR_ADDIU): Use addiu for mips32r6/mips64r6.
	(PTR_SUBU): Use subu for mips32r6/mips64r6.
	(PTR_SUBIU): Use subu for mips32r6/mips64r6 (subiu does not exist).
	* sysdeps/mips/machine-gmon.h (PTR_ADDU_STRING) Use addu for 
	mips32r6/mips64r6.
	(PTR_SUBU_STRING) Use subu for mips32r6/mips64r6.
  

Comments

Joseph Myers Dec. 19, 2014, 10:17 p.m. UTC | #1
On Fri, 19 Dec 2014, Steve Ellcey  wrote:

> This patch modifies some PTR_* macro definitions for mips32r6 and mips64r6.
> It uses addu/subu instructions for pointer arithmetic as these operations do
> not trap on mips32r6/mips64r6 whereas the add/sub instructions do trap.
> 
> Tested with the mips32r6/mips64r6 GCC, binutils and qemu simulator.
> 
> OK to checkin?

OK.
  

Patch

diff --git a/sysdeps/mips/machine-gmon.h b/sysdeps/mips/machine-gmon.h
index aac1723..f5d1c64 100644
--- a/sysdeps/mips/machine-gmon.h
+++ b/sysdeps/mips/machine-gmon.h
@@ -83,8 +83,13 @@  static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
 #endif
 
 #if _MIPS_SIM == _ABIN32
-# define PTR_ADDU_STRING "add" /* no u */
-# define PTR_SUBU_STRING "sub" /* no u */
+# if __mips_isa_rev < 6
+#  define PTR_ADDU_STRING "add" /* no u */
+#  define PTR_SUBU_STRING "sub" /* no u */
+# else
+#  define PTR_ADDU_STRING "addu"
+#  define PTR_SUBU_STRING "subu"
+# endif
 #elif _MIPS_SIM == _ABI64
 # define PTR_ADDU_STRING "daddu"
 # define PTR_SUBU_STRING "dsubu"
diff --git a/sysdeps/mips/sys/asm.h b/sysdeps/mips/sys/asm.h
index e479e9b..a618d49 100644
--- a/sysdeps/mips/sys/asm.h
+++ b/sysdeps/mips/sys/asm.h
@@ -416,12 +416,19 @@  symbol		=	value
 #if _MIPS_SIM == _ABIN32
 # define PTR_ADD	add
 # define PTR_ADDI	addi
-# define PTR_ADDU	add /* no u */
-# define PTR_ADDIU	addi /* no u */
 # define PTR_SUB	sub
 # define PTR_SUBI	subi
+#if __mips_isa_rev < 6
+# define PTR_ADDU	add /* no u */
+# define PTR_ADDIU	addi /* no u */
 # define PTR_SUBU	sub /* no u */
 # define PTR_SUBIU	sub /* no u */
+#else
+# define PTR_ADDU       addu
+# define PTR_ADDIU      addiu
+# define PTR_SUBU       subu
+# define PTR_SUBIU      subu
+#endif
 # define PTR_L		lw
 # define PTR_LA		la
 # define PTR_S		sw