diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-10-04 19:49:02 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-10-04 19:49:02 +0200 |
commit | d2af6b40af268fafdbd04c0222e785167b9ae021 (patch) | |
tree | e9af398812fffa0d3209780e09731a1e533bb83f /sys/src/ape/lib/ap/mips | |
parent | 9124e491e5d172feec53dd662c2fe6d999cb2d3f (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/ape/lib/ap/mips')
-rw-r--r-- | sys/src/ape/lib/ap/mips/vlrt.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/sys/src/ape/lib/ap/mips/vlrt.c b/sys/src/ape/lib/ap/mips/vlrt.c index 964562775..2ca7288be 100644 --- a/sys/src/ape/lib/ap/mips/vlrt.c +++ b/sys/src/ape/lib/ap/mips/vlrt.c @@ -28,6 +28,8 @@ struct Vlong void abort(void); +/* needed by profiler; can't be profiled. */ +#pragma profile off void _addv(Vlong *r, Vlong a, Vlong b) { @@ -54,6 +56,8 @@ _subv(Vlong *r, Vlong a, Vlong b) r->hi = hi; } +#pragma profile on + void _d2v(Vlong *y, double d) { @@ -113,7 +117,6 @@ _d2v(Vlong *y, double d) void _f2v(Vlong *y, float f) { - _d2v(y, f); } @@ -137,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) { |