Module Name:    src
Committed By:   nakayama
Date:           Fri Dec  5 11:31:50 UTC 2014

Modified Files:
        src/sys/arch/sparc64/include: psl.h

Log Message:
Make getver() into a constant function since Version Register (%ver)
is read only and its value is constant.

This change reduces multipule %ver reads to one in the functions
which uses a number of CPU_IS_* macros.


To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.54 src/sys/arch/sparc64/include/psl.h

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/sparc64/include/psl.h
diff -u src/sys/arch/sparc64/include/psl.h:1.53 src/sys/arch/sparc64/include/psl.h:1.54
--- src/sys/arch/sparc64/include/psl.h:1.53	Sun Aug 18 09:31:38 2013
+++ src/sys/arch/sparc64/include/psl.h	Fri Dec  5 11:31:50 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: psl.h,v 1.53 2013/08/18 09:31:38 martin Exp $ */
+/*	$NetBSD: psl.h,v 1.54 2014/12/05 11:31:50 nakayama Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -287,6 +287,13 @@
 /*
  * Inlines for manipulating privileged and ancillary state registers
  */
+#define SPARC64_RDCONST_DEF(rd, name, reg, type)			\
+static __inline __constfunc type get##name(void)			\
+{									\
+	type _val;							\
+	__asm(#rd " %" #reg ",%0" : "=r" (_val));			\
+	return _val;							\
+}
 #define SPARC64_RD_DEF(rd, name, reg, type)				\
 static __inline type get##name(void)					\
 {									\
@@ -301,9 +308,19 @@ static __inline void set##name(type _val
 }
 
 #ifdef __arch64__
+#define SPARC64_RDCONST64_DEF(rd, name, reg) \
+	SPARC64_RDCONST_DEF(rd, name, reg, uint64_t)
 #define SPARC64_RD64_DEF(rd, name, reg) SPARC64_RD_DEF(rd, name, reg, uint64_t)
 #define SPARC64_WR64_DEF(wr, name, reg) SPARC64_WR_DEF(wr, name, reg, uint64_t)
 #else
+#define SPARC64_RDCONST64_DEF(rd, name, reg)				\
+static __inline __constfunc uint64_t get##name(void)			\
+{									\
+	uint32_t _hi, _lo;						\
+	__asm(#rd " %" #reg ",%0; srl %0,0,%1; srlx %0,32,%0"		\
+		: "=r" (_hi), "=r" (_lo));				\
+	return ((uint64_t)_hi << 32) | _lo;				\
+}
 #define SPARC64_RD64_DEF(rd, name, reg)					\
 static __inline uint64_t get##name(void)				\
 {									\
@@ -345,7 +362,7 @@ SPARC64_RDPR_DEF(cwp, %cwp, int)		/* get
 SPARC64_WRPR_DEF(cwp, %cwp, int)		/* setcwp() */
 
 /* Version Register (PR 31) */
-SPARC64_RDPR64_DEF(ver, %ver)			/* getver() */
+SPARC64_RDCONST64_DEF(rdpr, ver, %ver)		/* getver() */
 
 /* System Tick Register (ASR 24) */
 SPARC64_RDASR64_DEF(stick, STICK)		/* getstick() */

Reply via email to