summaryrefslogtreecommitdiff
path: root/sys/src/libc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-10-04 19:49:02 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-10-04 19:49:02 +0200
commitd2af6b40af268fafdbd04c0222e785167b9ae021 (patch)
treee9af398812fffa0d3209780e09731a1e533bb83f /sys/src/libc
parent9124e491e5d172feec53dd662c2fe6d999cb2d3f (diff)
libc: add _uv2d()/uv2f() and _vas*d() functions to vlrt.c
on 32 bit archs, implement 64 bit vasop with floatingpoint right hand side. also added is uvlong->double conversion function.
Diffstat (limited to 'sys/src/libc')
-rw-r--r--sys/src/libc/386/vlrt.c38
-rw-r--r--sys/src/libc/arm/vlrt.c37
-rw-r--r--sys/src/libc/mips/vlrt.c38
-rw-r--r--sys/src/libc/power/vlrt.c37
-rw-r--r--sys/src/libc/sparc/vlrt.c37
-rw-r--r--sys/src/libc/spim/vlrt.c38
6 files changed, 222 insertions, 3 deletions
diff --git a/sys/src/libc/386/vlrt.c b/sys/src/libc/386/vlrt.c
index 83fd09683..8e5633b05 100644
--- a/sys/src/libc/386/vlrt.c
+++ b/sys/src/libc/386/vlrt.c
@@ -89,7 +89,6 @@ _d2v(Vlong *y, double d)
void
_f2v(Vlong *y, float f)
{
-
_d2v(y, f);
}
@@ -113,6 +112,43 @@ _v2f(Vlong x)
return _v2d(x);
}
+double
+_uv2d(Vlong x)
+{
+ return x.hi*4294967296. + x.lo;
+}
+
+float
+_uv2f(Vlong x)
+{
+ return _uv2d(x);
+}
+
+void
+_vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)+rv);
+ *ret = *lv;
+}
+void
+_vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)-rv);
+ *ret = *lv;
+}
+void
+_vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)*rv);
+ *ret = *lv;
+}
+void
+_vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)/rv);
+ *ret = *lv;
+}
+
ulong _div64by32(Vlong, ulong, ulong*);
void _mul64by32(Vlong*, Vlong, ulong);
diff --git a/sys/src/libc/arm/vlrt.c b/sys/src/libc/arm/vlrt.c
index 6a0c5df6a..cba8b27f1 100644
--- a/sys/src/libc/arm/vlrt.c
+++ b/sys/src/libc/arm/vlrt.c
@@ -128,6 +128,43 @@ _v2f(Vlong x)
return _v2d(x);
}
+double
+_uv2d(Vlong x)
+{
+ return x.hi*4294967296. + x.lo;
+}
+
+float
+_uv2f(Vlong x)
+{
+ return _uv2d(x);
+}
+
+void
+_vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)+rv);
+ *ret = *lv;
+}
+void
+_vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)-rv);
+ *ret = *lv;
+}
+void
+_vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)*rv);
+ *ret = *lv;
+}
+void
+_vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)/rv);
+ *ret = *lv;
+}
+
/* too many of these are also needed by profiler; leave them out */
#pragma profile off
diff --git a/sys/src/libc/mips/vlrt.c b/sys/src/libc/mips/vlrt.c
index 099c2c55d..2ca7288be 100644
--- a/sys/src/libc/mips/vlrt.c
+++ b/sys/src/libc/mips/vlrt.c
@@ -117,7 +117,6 @@ _d2v(Vlong *y, double d)
void
_f2v(Vlong *y, float f)
{
-
_d2v(y, f);
}
@@ -141,6 +140,43 @@ _v2f(Vlong x)
return _v2d(x);
}
+double
+_uv2d(Vlong x)
+{
+ return x.hi*4294967296. + x.lo;
+}
+
+float
+_uv2f(Vlong x)
+{
+ return _uv2d(x);
+}
+
+void
+_vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)+rv);
+ *ret = *lv;
+}
+void
+_vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)-rv);
+ *ret = *lv;
+}
+void
+_vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)*rv);
+ *ret = *lv;
+}
+void
+_vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)/rv);
+ *ret = *lv;
+}
+
static void
dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp)
{
diff --git a/sys/src/libc/power/vlrt.c b/sys/src/libc/power/vlrt.c
index 681a3b49b..e9fd3e8bf 100644
--- a/sys/src/libc/power/vlrt.c
+++ b/sys/src/libc/power/vlrt.c
@@ -99,6 +99,43 @@ _v2f(Vlong x)
return _v2d(x);
}
+double
+_uv2d(Vlong x)
+{
+ return x.hi*4294967296. + x.lo;
+}
+
+float
+_uv2f(Vlong x)
+{
+ return _uv2d(x);
+}
+
+void
+_vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)+rv);
+ *ret = *lv;
+}
+void
+_vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)-rv);
+ *ret = *lv;
+}
+void
+_vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)*rv);
+ *ret = *lv;
+}
+void
+_vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)/rv);
+ *ret = *lv;
+}
+
void
_divvu(Vlong *q, Vlong n, Vlong d)
{
diff --git a/sys/src/libc/sparc/vlrt.c b/sys/src/libc/sparc/vlrt.c
index b71c92f73..92c9b73c6 100644
--- a/sys/src/libc/sparc/vlrt.c
+++ b/sys/src/libc/sparc/vlrt.c
@@ -141,6 +141,43 @@ _v2f(Vlong x)
return _v2d(x);
}
+double
+_uv2d(Vlong x)
+{
+ return x.hi*4294967296. + x.lo;
+}
+
+float
+_uv2f(Vlong x)
+{
+ return _uv2d(x);
+}
+
+void
+_vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)+rv);
+ *ret = *lv;
+}
+void
+_vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)-rv);
+ *ret = *lv;
+}
+void
+_vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)*rv);
+ *ret = *lv;
+}
+void
+_vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)/rv);
+ *ret = *lv;
+}
+
static void
dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r)
{
diff --git a/sys/src/libc/spim/vlrt.c b/sys/src/libc/spim/vlrt.c
index ef7902a28..f17cda42d 100644
--- a/sys/src/libc/spim/vlrt.c
+++ b/sys/src/libc/spim/vlrt.c
@@ -117,7 +117,6 @@ _d2v(Vlong *y, double d)
void
_f2v(Vlong *y, float f)
{
-
_d2v(y, f);
}
@@ -141,6 +140,43 @@ _v2f(Vlong x)
return _v2d(x);
}
+double
+_uv2d(Vlong x)
+{
+ return x.hi*4294967296. + x.lo;
+}
+
+float
+_uv2f(Vlong x)
+{
+ return _uv2d(x);
+}
+
+void
+_vasaddd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)+rv);
+ *ret = *lv;
+}
+void
+_vassubd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)-rv);
+ *ret = *lv;
+}
+void
+_vasmuld(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)*rv);
+ *ret = *lv;
+}
+void
+_vasdivd(Vlong *ret, Vlong *lv, double v2d(Vlong), double rv)
+{
+ _d2v(lv, v2d(*lv)/rv);
+ *ret = *lv;
+}
+
static void
dodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp)
{