[PATCH] MIPS: Use SLL by 0 for 32-bit truncation in `__read_64bit_c0_split'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Optimize `__read_64bit_c0_split' and reduce the instruction count by 1, 
observing that a DSLL/DSRA pair by 32, is equivalent to SLL by 0, which 
architecturally truncates the value requested to 32 bits on 64-bit MIPS 
hardware regardless of whether the input operand is or is not a properly 
sign-extended 32-bit value.

Signed-off-by: Maciej W. Rozycki <macro@xxxxxxxxxx>
---
 Tested by compilation only to verify syntax correctnes as I do not know 
if this execution path is actually used by any configuration (suggestions 
welcome).  I believe it to be technically correct though, being 
sufficiently straightforward to verify by proofreading, and an obvious 
improvement.

 Therefore, please apply.

 NB if this turns out indeed used, then we might have to do something 
about DMFC0 hazard avoidance for the sake of MIPS III support, and also
choose to use an MFC0/MFHC0 instruction pair instead on MIPS64r5+.

  Maciej

---
 arch/mips/include/asm/mipsregs.h |   14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

linux-mips-read-64bit-c0-split-sll.diff
Index: linux-sfr-test/arch/mips/include/asm/mipsregs.h
===================================================================
--- linux-sfr-test.orig/arch/mips/include/asm/mipsregs.h	2017-07-08 15:32:02.000000000 +0100
+++ linux-sfr-test/arch/mips/include/asm/mipsregs.h	2017-09-29 01:02:01.390974000 +0100
@@ -1344,19 +1344,17 @@ do {									\
 	if (sel == 0)							\
 		__asm__ __volatile__(					\
 			".set\tmips64\n\t"				\
-			"dmfc0\t%M0, " #source "\n\t"			\
-			"dsll\t%L0, %M0, 32\n\t"			\
-			"dsra\t%M0, %M0, 32\n\t"			\
-			"dsra\t%L0, %L0, 32\n\t"			\
+			"dmfc0\t%L0, " #source "\n\t"			\
+			"dsra\t%M0, %L0, 32\n\t"			\
+			"sll\t%L0, %L0, 0\n\t"				\
 			".set\tmips0"					\
 			: "=r" (__val));				\
 	else								\
 		__asm__ __volatile__(					\
 			".set\tmips64\n\t"				\
-			"dmfc0\t%M0, " #source ", " #sel "\n\t"		\
-			"dsll\t%L0, %M0, 32\n\t"			\
-			"dsra\t%M0, %M0, 32\n\t"			\
-			"dsra\t%L0, %L0, 32\n\t"			\
+			"dmfc0\t%L0, " #source ", " #sel "\n\t"		\
+			"dsra\t%M0, %L0, 32\n\t"			\
+			"sll\t%L0, %L0, 0\n\t"				\
 			".set\tmips0"					\
 			: "=r" (__val));				\
 	local_irq_restore(__flags);					\


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux