Module Name:    src
Committed By:   matt
Date:           Thu May 26 01:46:41 UTC 2011

Modified Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: mipsX_subr.S

Log Message:
Use some mipsNNr2 instructions to extract the non-wired bits from a pte.
(Saves on instruction per use).


To generate a diff of this commit:
cvs rdiff -u -r1.26.36.1.2.40 -r1.26.36.1.2.41 \
    src/sys/arch/mips/mips/mipsX_subr.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/mips/mipsX_subr.S
diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.40 src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.41
--- src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.40	Fri Apr 29 08:26:28 2011
+++ src/sys/arch/mips/mips/mipsX_subr.S	Thu May 26 01:46:40 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: mipsX_subr.S,v 1.26.36.1.2.40 2011/04/29 08:26:28 matt Exp $	*/
+/*	$NetBSD: mipsX_subr.S,v 1.26.36.1.2.41 2011/05/26 01:46:40 matt Exp $	*/
 
 /*
  * Copyright 2002 Wasabi Systems, Inc.
@@ -181,11 +181,17 @@
 #if defined(USE_64BIT_CP0_FUNCTIONS)
 #define	_SLL		dsll
 #define	_SRL		dsrl
+#define	_EXT		dext
+#define	_INS		dins
 #define	WIRED_SHIFT	34
+#define	WIRED_POS	30
 #else
 #define	_SLL		sll
 #define	_SRL		srl
+#define	_EXT		ext
+#define	_INS		ins
 #define	WIRED_SHIFT	2
+#define	WIRED_POS	30
 #endif
 
 /*
@@ -329,7 +335,7 @@
 	.set	noat
 	_MFC0	k0, MIPS_COP_0_BAD_VADDR	#00: k0=bad address
 	lui	k1, %hi(CPUVAR(PMAP_SEG0TAB))	#01: k1=hi of seg0tab
-	bltz	k0, MIPSX(kernelfault)		#02: k0<0 -> 4f (kernel fault)
+	bltz	k0, MIPSX(kernelfault)		#02: k0<0 -> kernel fault
 	 PTR_SRL k0, 1*(PGSHIFT-PTR_SCALESHIFT)+(PGSHIFT-2)#03: k0=seg offset (almost)
 	PTR_L	k1, %lo(CPUVAR(PMAP_SEG0TAB))(k1)#04: k1=seg0tab
 MIPSX(tlb_miss_common):
@@ -341,17 +347,32 @@
 	PTR_ADDU k1, k0				#08: k1=seg entry address
 	PTR_L	k1, 0(k1)			#09: k1=seg entry
 	_MFC0	k0, MIPS_COP_0_BAD_VADDR	#0a: k0=bad address (again)
+#if (MIPS32R2 + MIPS64R2) > 0
+	beqz	k1, MIPSX(nopagetable)		#0b: ==0 -- no page table
+	 _EXT	k0, k0, PGSHIFT+1, PGSHIFT-3	#0c: k0=VA[13:21]
+	_INS	k1, k0, 3, PGSHIFT-3		#0d: k0=page table index
+						#0d: k1=pte address
+#else
 	beqz	k1, MIPSX(nopagetable)		#0b: ==0 -- no page table
 	 PTR_SRL k0, (PGSHIFT-2)		#0c: k0=VPN (aka va>>10)
 	andi	k0, (NBPG-8)			#0d: k0=page table offset
 	PTR_ADDU k1, k0				#0e: k1=pte address
+#endif
 	INT_L	k0, 0(k1)			#0f: k0=lo0 pte
 	INT_L	k1, 4(k1)			#10: k1=lo1 pte
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k0, k0, 0, WIRED_POS
+#else
 	_SLL	k0, WIRED_SHIFT			#11: chop top 2 bits (part 1a)
 	_SRL	k0, WIRED_SHIFT			#12: chop top 2 bits (part 1b)
+#endif
 	_MTC0	k0, MIPS_COP_0_TLB_LO0		#13: lo0 is loaded
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k1, k1, 0, WIRED_POS
+#else
 	_SLL	k1, WIRED_SHIFT			#14: chop top 2 bits (part 2a)
 	_SRL	k1, WIRED_SHIFT			#15: chop top 2 bits (part 2b)
+#endif
 	_MTC0	k1, MIPS_COP_0_TLB_LO1		#16: lo1 is loaded
 	sll	$0, $0, 3			#17: standard nop (ehb)
 #ifdef MIPS3
@@ -1527,13 +1548,20 @@
 	PTR_ADDU k1, k0
 	INT_L	k0, 0(k1)			# get PTE entry
 	INT_L	k1, 4(k1)			# get odd PTE entry
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k0, k0, 0, WIRED_POS		# get rid of "wired" bit
+#else
 	_SLL	k0, k0, WIRED_SHIFT		# get rid of "wired" bit
 	_SRL	k0, k0, WIRED_SHIFT
+#endif
 	_MTC0	k0, MIPS_COP_0_TLB_LO0		# load PTE entry
-	COP0_SYNC
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k1, k1, 0, WIRED_POS
+#else
 	_SLL	k1, k1, WIRED_SHIFT
 	_SRL	k1, k1, WIRED_SHIFT
 	_MTC0	k1, MIPS_COP_0_TLB_LO1		# load PTE entry
+#endif
 	COP0_SYNC
 	tlbwr					# write random TLB
 	COP0_SYNC
@@ -1607,8 +1635,12 @@
 	 nop
 
 	INT_L	k0, 0(k1)			# get PTE entry
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k0, k0, 0, WIRED_POS
+#else
 	_SLL	k0, k0, WIRED_SHIFT		# get rid of "wired" bit
 	_SRL	k0, k0, WIRED_SHIFT
+#endif
 	_MTC0	k0, MIPS_COP_0_TLB_LO0		# load PTE entry
 	COP0_SYNC
 	and	k0, k0, MIPS3_PG_V		# check for valid entry
@@ -1619,9 +1651,13 @@
 	 nop					# - delay slot -
 
 	INT_L	k0, 4(k1)			# get odd PTE entry
-	_SLL	k0, k0, WIRED_SHIFT
 	mfc0	k1, MIPS_COP_0_TLB_INDEX
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k0, k0, 0, WIRED_POS
+#else
+	_SLL	k0, k0, WIRED_SHIFT
 	_SRL	k0, k0, WIRED_SHIFT
+#endif
 	sltiu	k1, k1, MIPS3_TLB_WIRED_UPAGES	# Luckily this is MIPS3_PG_G
 	or	k1, k1, k0
 	_MTC0	k0, MIPS_COP_0_TLB_LO1		# load PTE entry
@@ -1636,8 +1672,12 @@
 
 MIPSX(kern_tlbi_odd):
 	INT_L	k0, 0(k1)			# get PTE entry
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k0, k0, 0, WIRED_POS
+#else
 	_SLL	k0, k0, WIRED_SHIFT		# get rid of wired bit
 	_SRL	k0, k0, WIRED_SHIFT
+#endif
 	_MTC0	k0, MIPS_COP_0_TLB_LO1		# save PTE entry
 	COP0_SYNC
 	and	k0, k0, MIPS3_PG_V		# check for valid entry
@@ -1648,9 +1688,13 @@
 	 nop					# - delay slot -
 
 	INT_L	k0, -4(k1)			# get even PTE entry
-	_SLL	k0, k0, WIRED_SHIFT
 	mfc0	k1, MIPS_COP_0_TLB_INDEX
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	k0, k0, 0, WIRED_POS
+#else
+	_SLL	k0, k0, WIRED_SHIFT
 	_SRL	k0, k0, WIRED_SHIFT
+#endif
 	sltiu	k1, k1, MIPS3_TLB_WIRED_UPAGES	# Luckily this is MIPS3_PG_G
 	or	k1, k1, k0
 	_MTC0	k0, MIPS_COP_0_TLB_LO0		# save PTE entry
@@ -1722,8 +1766,12 @@
 	and	a2, a1, MIPS3_PG_G		# Copy global bit
 	tlbp					# Probe for the entry.
 	COP0_SYNC
+#if (MIPS32R2 + MIPS64R2) > 0
+	_EXT	a1, a1, 0, WIRED_POS
+#else
 	_SLL	a1, a1, WIRED_SHIFT		# Clear top 34 bits of EntryLo
 	_SRL	a1, a1, WIRED_SHIFT
+#endif
 	mfc0	v0, MIPS_COP_0_TLB_INDEX	# See what we got
 	bnez	t1, 1f				# Decide even odd
 	 nop

Reply via email to