[patch][3/5] powerpc: Add the implementations to handle Vector SPFP instructions exceptions
ebony.zhu at freescale.com
ebony.zhu at freescale.com
Fri Jan 12 16:27:37 EST 2007
Add the implementations to handle Vector SPFP instructions exceptions
complying with IEEE-754.
Signed-off-by:Ebony Zhu <ebony.zhu at freescale.com>
---
arch/powerpc/math-emu/evfsabs.c | 33 ++++++++++++++++++
arch/powerpc/math-emu/evfsadd.c | 62 ++++++++++++++++++++++++++++++++++
arch/powerpc/math-emu/evfscmpeq.c | 68 +++++++++++++++++++++++++++++++++++++
arch/powerpc/math-emu/evfscmpgt.c | 68 +++++++++++++++++++++++++++++++++++++
arch/powerpc/math-emu/evfscmplt.c | 68 +++++++++++++++++++++++++++++++++++++
arch/powerpc/math-emu/evfsctsf.c | 38 +++++++++++++++++++++
arch/powerpc/math-emu/evfsctsi.c | 46 +++++++++++++++++++++++++
arch/powerpc/math-emu/evfsctsiz.c | 46 +++++++++++++++++++++++++
arch/powerpc/math-emu/evfsctuf.c | 39 +++++++++++++++++++++
arch/powerpc/math-emu/evfsctui.c | 46 +++++++++++++++++++++++++
arch/powerpc/math-emu/evfsctuiz.c | 46 +++++++++++++++++++++++++
arch/powerpc/math-emu/evfsdiv.c | 62 ++++++++++++++++++++++++++++++++++
arch/powerpc/math-emu/evfsmul.c | 68 +++++++++++++++++++++++++++++++++++++
arch/powerpc/math-emu/evfsnabs.c | 33 ++++++++++++++++++
arch/powerpc/math-emu/evfsneg.c | 33 ++++++++++++++++++
arch/powerpc/math-emu/evfssub.c | 67 ++++++++++++++++++++++++++++++++++++
16 files changed, 823 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/math-emu/evfsabs.c b/arch/powerpc/math-emu/evfsabs.c
new file mode 100644
index 0000000..ac45155
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsabs.c
@@ -0,0 +1,33 @@
+/*
+ * arch/powerpc/math-emu/evfsabs.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsabs"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+int
+evfsabs(u32 *rD, u32 *rA)
+{
+ rD[0] = rA[0] & 0x7fffffff;
+ rD[1] = rA[1] & 0x7fffffff;
+
+#ifdef DEBUG
+ printk("%s: D %p, A %p: ", __FUNCTION__, rD, rA);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsadd.c b/arch/powerpc/math-emu/evfsadd.c
new file mode 100644
index 0000000..194815f
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsadd.c
@@ -0,0 +1,62 @@
+/*
+ * arch/powerpc/math-emu/evfsadd.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsadd"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsadd(u64 *rD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ FP_DECL_S(R0);
+ FP_DECL_S(R1);
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p %p %p\n", __FUNCTION__, rD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld)\n", A0_s, A0_f, A0_e, A0_c);
+ printk("A1: %ld %lu %ld (%ld)\n", A1_s, A1_f, A1_e, A1_c);
+ printk("B0: %ld %lu %ld (%ld)\n", B0_s, B0_f, B0_e, B0_c);
+ printk("B1: %ld %lu %ld (%ld)\n", B1_s, B1_f, B1_e, B1_c);
+#endif
+
+ FP_ADD_S(R0, A0, B0);
+ FP_ADD_S(R1, A1, B1);
+
+#ifdef DEBUG
+ printk("D0: %ld %lu %ld (%ld)\n", R0_s, R0_f, R0_e, R0_c);
+ printk("D1: %ld %lu %ld (%ld)\n", R1_s, R1_f, R1_e, R1_c);
+#endif
+
+ return (ret | __FP_PACK_S(rD, R0) | __FP_PACK_S(rD+1, R1));
+}
diff --git a/arch/powerpc/math-emu/evfscmpeq.c b/arch/powerpc/math-emu/evfscmpeq.c
new file mode 100644
index 0000000..89f9005
--- /dev/null
+++ b/arch/powerpc/math-emu/evfscmpeq.c
@@ -0,0 +1,68 @@
+/*
+ * arch/powerpc/math-emu/evfscmpeq.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfscmpeq"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfscmpeq(u32 *ccr, int crD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ long cmp, cmp0, cmp1, ch, cl;
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld)\n", A0_s, A0_f, A0_e, A0_c);
+ printk("A1: %ld %lu %ld (%ld)\n", A1_s, A1_f, A1_e, A1_c);
+ printk("B0: %ld %lu %ld (%ld)\n", B0_s, B0_f, B0_e, B0_c);
+ printk("B1: %ld %lu %ld (%ld)\n", B1_s, B1_f, B1_e, B1_c);
+#endif
+
+ FP_CMP_S(cmp0, A0, B0, 2);
+ FP_CMP_S(cmp1, A1, B1, 2);
+
+ ch = (cmp0 == 0) ? 1 : 0;
+ cl = (cmp1 == 0) ? 1 : 0;
+ cmp = 0;
+ cmp = (ch << 3) | (cl << 2) | ((ch | cl) << 1) | ((ch & cl) << 0);
+
+ *ccr &= ~(15 << ((7 - crD) << 2));
+ *ccr |= (cmp << ((7 - crD) << 2));
+
+#ifdef DEBUG
+ printk("CR: %08x\n", *ccr);
+#endif
+
+ return ret;
+}
diff --git a/arch/powerpc/math-emu/evfscmpgt.c b/arch/powerpc/math-emu/evfscmpgt.c
new file mode 100644
index 0000000..2f9e006
--- /dev/null
+++ b/arch/powerpc/math-emu/evfscmpgt.c
@@ -0,0 +1,68 @@
+/*
+ * arch/powerpc/math-emu/evfscmpgt.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfscmpgt"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfscmpgt(u32 *ccr, int crD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ long cmp, cmp0, cmp1, ch, cl;
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld)\n", A0_s, A0_f, A0_e, A0_c);
+ printk("A1: %ld %lu %ld (%ld)\n", A1_s, A1_f, A1_e, A1_c);
+ printk("B0: %ld %lu %ld (%ld)\n", B0_s, B0_f, B0_e, B0_c);
+ printk("B1: %ld %lu %ld (%ld)\n", B1_s, B1_f, B1_e, B1_c);
+#endif
+
+ FP_CMP_S(cmp0, A0, B0, 2);
+ FP_CMP_S(cmp1, A1, B1, 2);
+
+ ch = (cmp0 == 1) ? 1 : 0;
+ cl = (cmp1 == 1) ? 1 : 0;
+ cmp = 0;
+ cmp = (ch << 3) | (cl << 2) | ((ch | cl) << 1) | ((ch & cl) << 0);
+
+ *ccr &= ~(15 << ((7 - crD) << 2));
+ *ccr |= (cmp << ((7 - crD) << 2));
+
+#ifdef DEBUG
+ printk("CR: %08x\n", *ccr);
+#endif
+
+ return ret;
+}
diff --git a/arch/powerpc/math-emu/evfscmplt.c b/arch/powerpc/math-emu/evfscmplt.c
new file mode 100644
index 0000000..6781ef6
--- /dev/null
+++ b/arch/powerpc/math-emu/evfscmplt.c
@@ -0,0 +1,68 @@
+/*
+ * arch/powerpc/math-emu/evfscmplt.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfscmplt"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfscmplt(u32 *ccr, int crD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ long cmp, cmp0, cmp1, ch, cl;
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p (%08x) %d %p %p\n", __FUNCTION__, ccr, *ccr, crD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld)\n", A0_s, A0_f, A0_e, A0_c);
+ printk("A1: %ld %lu %ld (%ld)\n", A1_s, A1_f, A1_e, A1_c);
+ printk("B0: %ld %lu %ld (%ld)\n", B0_s, B0_f, B0_e, B0_c);
+ printk("B1: %ld %lu %ld (%ld)\n", B1_s, B1_f, B1_e, B1_c);
+#endif
+
+ FP_CMP_S(cmp0, A0, B0, 2);
+ FP_CMP_S(cmp1, A1, B1, 2);
+
+ ch = (cmp0 == -1) ? 1 : 0;
+ cl = (cmp1 == -1) ? 1 : 0;
+ cmp = 0;
+ cmp = (ch << 3) | (cl << 2) | ((ch | cl) << 1) | ((ch & cl) << 0);
+
+ *ccr &= ~(15 << ((7 - crD) << 2));
+ *ccr |= (cmp << ((7 - crD) << 2));
+
+#ifdef DEBUG
+ printk("CR: %08x\n", *ccr);
+#endif
+
+ return ret;
+}
diff --git a/arch/powerpc/math-emu/evfsctsf.c b/arch/powerpc/math-emu/evfsctsf.c
new file mode 100644
index 0000000..f514ce3
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsctsf.c
@@ -0,0 +1,38 @@
+/*
+ * arch/powerpc/math-emu/evfsctsf.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsctsf"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsctsf(u32 *rD, u32 *rB)
+{
+ __asm__ __volatile__ ("mtspr 512, %4\n"
+ "efsctsf %0, %2\n"
+ "efsctsf %1, %3\n"
+ : "=r" (rD[0]), "=r" (rD[1])
+ : "r" (rB[0]), "r" (rB[1]), "r" (0));
+#ifdef DEBUG
+ printk("%s: D %p, B %p: ", __FUNCTION__, rD, rB);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsctsi.c b/arch/powerpc/math-emu/evfsctsi.c
new file mode 100644
index 0000000..bddd38d
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsctsi.c
@@ -0,0 +1,46 @@
+/*
+ * arch/powerpc/math-emu/evfsctsi.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsctsi"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsctsi(u32 *rD, u32 *rB)
+{
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ unsigned int r0, r1;
+
+ __FP_UNPACK_S(B0, rB);
+ __FP_UNPACK_S(B1, rB+1);
+ _FP_ROUND(1, B0);
+ _FP_ROUND(1, B1);
+ FP_TO_INT_S(r0, B0, 32, 1);
+ rD[0] = r0;
+ FP_TO_INT_S(r1, B1, 32, 1);
+ rD[1] = r1;
+
+#ifdef DEBUG
+ printk("%s: D %p, B %p: ", __FUNCTION__, rD, rB);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsctsiz.c b/arch/powerpc/math-emu/evfsctsiz.c
new file mode 100644
index 0000000..ad5958b
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsctsiz.c
@@ -0,0 +1,46 @@
+/*
+ * arch/powerpc/math-emu/evfsctsiz.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsctsiz"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsctsiz(u32 *rD, u32 *rB)
+{
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ unsigned int r0, r1;
+
+ __FP_UNPACK_S(B0, rB);
+ __FP_UNPACK_S(B1, rB+1);
+ _FP_ROUND_ZERO(1, B0);
+ _FP_ROUND_ZERO(1, B1);
+ FP_TO_INT_S(r0, B0, 32, 1);
+ rD[0] = r0;
+ FP_TO_INT_S(r1, B1, 32, 1);
+ rD[1] = r1;
+
+#ifdef DEBUG
+ printk("%s: D %p, B %p: ", __FUNCTION__, rD, rB);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsctuf.c b/arch/powerpc/math-emu/evfsctuf.c
new file mode 100644
index 0000000..3035691
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsctuf.c
@@ -0,0 +1,39 @@
+/*
+ * arch/powerpc/math-emu/evfsctuf.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsctuf"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsctuf(u32 *rD, u32 *rB)
+{
+ __asm__ __volatile__ ("mtspr 512, %4\n"
+ "efsctuf %0, %2\n"
+ "efsctuf %1, %3\n"
+ : "=r" (rD[0]), "=r" (rD[1])
+ : "r" (rB[0]), "r" (rB[1]), "r" (0));
+
+#ifdef DEBUG
+ printk("%s: D %p, B %p: ", __FUNCTION__, rD, rB);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsctui.c b/arch/powerpc/math-emu/evfsctui.c
new file mode 100644
index 0000000..f2ad843
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsctui.c
@@ -0,0 +1,46 @@
+/*
+ * arch/powerpc/math-emu/evfsctui.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsctui"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsctui(u32 *rD, u32 *rB)
+{
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ unsigned int r0, r1;
+
+ __FP_UNPACK_S(B0, rB);
+ __FP_UNPACK_S(B1, rB+1);
+ _FP_ROUND(1, B0);
+ _FP_ROUND(1, B1);
+ FP_TO_INT_S(r0, B0, 32, 0);
+ rD[0] = r0;
+ FP_TO_INT_S(r1, B1, 32, 0);
+ rD[1] = r1;
+
+#ifdef DEBUG
+ printk("%s: D %p, B %p: ", __FUNCTION__, rD, rB);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsctuiz.c b/arch/powerpc/math-emu/evfsctuiz.c
new file mode 100644
index 0000000..d2d9238
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsctuiz.c
@@ -0,0 +1,46 @@
+/*
+ * arch/powerpc/math-emu/evfsctuiz.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsctuiz"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsctuiz(u32 *rD, u32 *rB)
+{
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ unsigned int r0, r1;
+
+ __FP_UNPACK_S(B0, rB);
+ __FP_UNPACK_S(B1, rB+1);
+ _FP_ROUND_ZERO(1, B0);
+ _FP_ROUND_ZERO(1, B1);
+ FP_TO_INT_S(r0, B0, 32, 0);
+ rD[0] = r0;
+ FP_TO_INT_S(r1, B1, 32, 0);
+ rD[1] = r1;
+
+#ifdef DEBUG
+ printk("%s: D %p, B %p: ", __FUNCTION__, rD, rB);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsdiv.c b/arch/powerpc/math-emu/evfsdiv.c
new file mode 100644
index 0000000..87083bc
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsdiv.c
@@ -0,0 +1,62 @@
+/*
+ * arch/powerpc/math-emu/evfsdiv.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsdiv"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsdiv(u64 *rD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ FP_DECL_S(R0);
+ FP_DECL_S(R1);
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p %p %p\n", __FUNCTION__, rD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld)\n", A0_s, A0_f, A0_e, A0_c);
+ printk("A1: %ld %lu %ld (%ld)\n", A1_s, A1_f, A1_e, A1_c);
+ printk("B0: %ld %lu %ld (%ld)\n", B0_s, B0_f, B0_e, B0_c);
+ printk("B1: %ld %lu %ld (%ld)\n", B1_s, B1_f, B1_e, B1_c);
+#endif
+
+ FP_DIV_S(R0, A0, B0);
+ FP_DIV_S(R1, A1, B1);
+
+#ifdef DEBUG
+ printk("D0: %ld %lu %ld (%ld)\n", R0_s, R0_f, R0_e, R0_c);
+ printk("D1: %ld %lu %ld (%ld)\n", R1_s, R1_f, R1_e, R1_c);
+#endif
+
+ return (ret | __FP_PACK_S(rD, R0) | __FP_PACK_S(rD+1, R1));
+}
diff --git a/arch/powerpc/math-emu/evfsmul.c b/arch/powerpc/math-emu/evfsmul.c
new file mode 100644
index 0000000..f570eb7
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsmul.c
@@ -0,0 +1,68 @@
+/*
+ * arch/powerpc/math-emu/evfsmul.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsmul"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfsmul(u64 *rD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ FP_DECL_S(R0);
+ FP_DECL_S(R1);
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p %p %p\n", __FUNCTION__, rD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld) [%08lx %lx]\n",
+ A0_s, A0_f, A0_e, A0_c, A0_f, A0_e + 127);
+ printk("A1: %ld %lu %ld (%ld) [%08lx %lx]\n",
+ A1_s, A1_f, A1_e, A1_c, A1_f, A1_e + 127);
+ printk("B0: %ld %lu %ld (%ld) [%08lx %lx]\n",
+ B0_s, B0_f, B0_e, B0_c, B0_f, B0_e + 127);
+ printk("B1: %ld %lu %ld (%ld) [%08lx %lx]\n",
+ B1_s, B1_f, B1_e, B1_c, B1_f, B1_e + 127);
+#endif
+
+ FP_MUL_S(R0, A0, B0);
+ FP_MUL_S(R1, A1, B1);
+
+#ifdef DEBUG
+ printk("D0: %ld %lu %ld (%ld) [%08lx %lx]\n",
+ R0_s, R0_f, R0_e, R0_c, R0_f, R0_e + 127);
+ printk("D1: %ld %lu %ld (%ld) [%08lx %lx]\n",
+ R1_s, R1_f, R1_e, R1_c, R1_f, R1_e + 127);
+#endif
+
+ return (ret | __FP_PACK_S(rD, R0) | __FP_PACK_S(rD+1, R1));
+}
diff --git a/arch/powerpc/math-emu/evfsnabs.c b/arch/powerpc/math-emu/evfsnabs.c
new file mode 100644
index 0000000..c43d7ad
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsnabs.c
@@ -0,0 +1,33 @@
+/*
+ * arch/powerpc/math-emu/evfsnabs.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsnabs"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+int
+evfsnabs(u32 *rD, u32 *rA)
+{
+ rD[0] = rA[0] | 0x80000000;
+ rD[1] = rA[1] | 0x80000000;
+
+#ifdef DEBUG
+ printk("%s: D %p, A %p: ", __FUNCTION__, rD, rA);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfsneg.c b/arch/powerpc/math-emu/evfsneg.c
new file mode 100644
index 0000000..5274981
--- /dev/null
+++ b/arch/powerpc/math-emu/evfsneg.c
@@ -0,0 +1,33 @@
+/*
+ * arch/powerpc/math-emu/evfsneg.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfsneg"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+int
+evfsneg(u32 *rD, u32 *rA)
+{
+ rD[0] = rA[0] ^ 0x80000000;
+ rD[1] = rA[1] ^ 0x80000000;
+
+#ifdef DEBUG
+ printk("%s: D %p, A %p: ", __FUNCTION__, rD, rA);
+ printk("\n");
+#endif
+
+ return 0;
+}
diff --git a/arch/powerpc/math-emu/evfssub.c b/arch/powerpc/math-emu/evfssub.c
new file mode 100644
index 0000000..afbeff5
--- /dev/null
+++ b/arch/powerpc/math-emu/evfssub.c
@@ -0,0 +1,67 @@
+/*
+ * arch/powerpc/math-emu/evfssub.c
+ *
+ * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Ebony Zhu, ebony.zhu at freescale.com
+ *
+ * Description:
+ * This file is the implementation of SPE instruction "evfssub"
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+
+#include "soft-fp.h"
+#include "single.h"
+
+int
+evfssub(u64 *rD, u32 *rA, u32 *rB)
+{
+ FP_DECL_S(A0);
+ FP_DECL_S(A1);
+ FP_DECL_S(B0);
+ FP_DECL_S(B1);
+ FP_DECL_S(R0);
+ FP_DECL_S(R1);
+ int ret = 0;
+
+#ifdef DEBUG
+ printk("%s: %p %p %p\n", __FUNCTION__, rD, rA, rB);
+#endif
+
+ __FP_UNPACK_S(A0, rA);
+ rA[0] = rA[1];
+ __FP_UNPACK_S(A1, rA);
+ __FP_UNPACK_S(B0, rB);
+ rB[0] = rB[1];
+ __FP_UNPACK_S(B1, rB);
+
+#ifdef DEBUG
+ printk("A0: %ld %lu %ld (%ld)\n", A0_s, A0_f, A0_e, A0_c);
+ printk("A1: %ld %lu %ld (%ld)\n", A1_s, A1_f, A1_e, A1_c);
+ printk("B0: %ld %lu %ld (%ld)\n", B0_s, B0_f, B0_e, B0_c);
+ printk("B1: %ld %lu %ld (%ld)\n", B1_s, B1_f, B1_e, B1_c);
+#endif
+
+ if (B0_c != FP_CLS_NAN)
+ B0_s ^= 1;
+ if (B1_c != FP_CLS_NAN)
+ B1_s ^= 1;
+
+ FP_ADD_S(R0, A0, B0);
+ FP_ADD_S(R1, A1, B1);
+
+#ifdef DEBUG
+ printk("D0: %ld %lu %ld (%ld)\n", R0_s, R0_f, R0_e, R0_c);
+ printk("D1: %ld %lu %ld (%ld)\n", R1_s, R1_f, R1_e, R1_c);
+#endif
+
+ return (ret | __FP_PACK_S(rD, R0) | __FP_PACK_S(rD+1, R1));
+}
--
1.4.0
More information about the Linuxppc-dev
mailing list