Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1268517

[PATCH 3/8] MIPS: math-emu: Add IEEE Std 754-2008 ABS.fmt and NEG.fmt emulation

Path csiph.com!news.mixmin.net!proxad.net!feeder1-2.proxad.net!news.in2p3.fr!in2p3.fr!news.ecp.fr!aioe.org!bofh.it!news.nic.it!robomod
From "Maciej W. Rozycki" <macro@imgtec.com>
Newsgroups linux.kernel
Subject [PATCH 3/8] MIPS: math-emu: Add IEEE Std 754-2008 ABS.fmt and NEG.fmt emulation
Date Fri, 13 Nov 2015 01:50:01 +0100
Message-ID <quaIV-7Mk-11@gated-at.bofh.it> (permalink)
References <quaIV-7Mk-3@gated-at.bofh.it>
X-Original-To Ralf Baechle <ralf@linux-mips.org>
User-Agent Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version 1.0
Content-Type text/plain; charset="US-ASCII"
X-Originating-IP [10.100.200.62]
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 129
Organization linux.* mail to news gateway
X-Original-Cc Andrew Morton <akpm@linux-foundation.org>, Matthew Fortune <Matthew.Fortune@imgtec.com>, <linux-mips@linux-mips.org>, <linux-kernel@vger.kernel.org>
X-Original-Date Fri, 13 Nov 2015 00:47:08 +0000
X-Original-Message-ID <alpine.DEB.2.00.1511130006060.7097@tp.orcam.me.uk>
X-Original-References <alpine.DEB.2.00.1511111418430.7097@tp.orcam.me.uk>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1268517

Show key headers only | View raw


Implement IEEE Std 754-2008 non-arithmetic ABS.fmt and NEG.fmt emulation 
wired to the state of the FCSR.ABS2008 bit.  In the non-arithmetic mode 
the sign bit is altered according to the operation requested regardless 
of the datum encoded in the input operand, no other bits are changed, 
the resulting bit pattern is written to the output operand and no 
exception is ever signalled.

Signed-off-by: Maciej W. Rozycki <macro@imgtec.com>
---
linux-mips-emu-abs2008.diff
Index: linux-sfr-test/arch/mips/math-emu/dp_simple.c
===================================================================
--- linux-sfr-test.orig/arch/mips/math-emu/dp_simple.c	2015-11-10 17:45:25.145419000 +0000
+++ linux-sfr-test/arch/mips/math-emu/dp_simple.c	2015-11-11 02:19:59.120054000 +0000
@@ -23,27 +23,39 @@
 
 union ieee754dp ieee754dp_neg(union ieee754dp x)
 {
-	unsigned int oldrm;
 	union ieee754dp y;
 
-	oldrm = ieee754_csr.rm;
-	ieee754_csr.rm = FPU_CSR_RD;
-	y = ieee754dp_sub(ieee754dp_zero(0), x);
-	ieee754_csr.rm = oldrm;
+	if (ieee754_csr.abs2008) {
+		y = x;
+		DPSIGN(y) = !DPSIGN(x);
+	} else {
+		unsigned int oldrm;
+
+		oldrm = ieee754_csr.rm;
+		ieee754_csr.rm = FPU_CSR_RD;
+		y = ieee754dp_sub(ieee754dp_zero(0), x);
+		ieee754_csr.rm = oldrm;
+	}
 	return y;
 }
 
 union ieee754dp ieee754dp_abs(union ieee754dp x)
 {
-	unsigned int oldrm;
 	union ieee754dp y;
 
-	oldrm = ieee754_csr.rm;
-	ieee754_csr.rm = FPU_CSR_RD;
-	if (DPSIGN(x))
-		y = ieee754dp_sub(ieee754dp_zero(0), x);
-	else
-		y = ieee754dp_add(ieee754dp_zero(0), x);
-	ieee754_csr.rm = oldrm;
+	if (ieee754_csr.abs2008) {
+		y = x;
+		DPSIGN(y) = 0;
+	} else {
+		unsigned int oldrm;
+
+		oldrm = ieee754_csr.rm;
+		ieee754_csr.rm = FPU_CSR_RD;
+		if (DPSIGN(x))
+			y = ieee754dp_sub(ieee754dp_zero(0), x);
+		else
+			y = ieee754dp_add(ieee754dp_zero(0), x);
+		ieee754_csr.rm = oldrm;
+	}
 	return y;
 }
Index: linux-sfr-test/arch/mips/math-emu/sp_simple.c
===================================================================
--- linux-sfr-test.orig/arch/mips/math-emu/sp_simple.c	2015-11-10 17:45:25.147428000 +0000
+++ linux-sfr-test/arch/mips/math-emu/sp_simple.c	2015-11-11 02:19:59.165062000 +0000
@@ -23,27 +23,39 @@
 
 union ieee754sp ieee754sp_neg(union ieee754sp x)
 {
-	unsigned int oldrm;
 	union ieee754sp y;
 
-	oldrm = ieee754_csr.rm;
-	ieee754_csr.rm = FPU_CSR_RD;
-	y = ieee754sp_sub(ieee754sp_zero(0), x);
-	ieee754_csr.rm = oldrm;
+	if (ieee754_csr.abs2008) {
+		y = x;
+		SPSIGN(y) = !SPSIGN(x);
+	} else {
+		unsigned int oldrm;
+
+		oldrm = ieee754_csr.rm;
+		ieee754_csr.rm = FPU_CSR_RD;
+		y = ieee754sp_sub(ieee754sp_zero(0), x);
+		ieee754_csr.rm = oldrm;
+	}
 	return y;
 }
 
 union ieee754sp ieee754sp_abs(union ieee754sp x)
 {
-	unsigned int oldrm;
 	union ieee754sp y;
 
-	oldrm = ieee754_csr.rm;
-	ieee754_csr.rm = FPU_CSR_RD;
-	if (SPSIGN(x))
-		y = ieee754sp_sub(ieee754sp_zero(0), x);
-	else
-		y = ieee754sp_add(ieee754sp_zero(0), x);
-	ieee754_csr.rm = oldrm;
+	if (ieee754_csr.abs2008) {
+		y = x;
+		SPSIGN(y) = 0;
+	} else {
+		unsigned int oldrm;
+
+		oldrm = ieee754_csr.rm;
+		ieee754_csr.rm = FPU_CSR_RD;
+		if (SPSIGN(x))
+			y = ieee754sp_sub(ieee754sp_zero(0), x);
+		else
+			y = ieee754sp_add(ieee754sp_zero(0), x);
+		ieee754_csr.rm = oldrm;
+	}
 	return y;
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

[PATCH 3/8] MIPS: math-emu: Add IEEE Std 754-2008 ABS.fmt and NEG.fmt  emulation "Maciej W. Rozycki" <macro@imgtec.com> - 2015-11-13 01:50 +0100

csiph-web