| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # floating point casts and conversions
- export
- function s $fneg(s %f) {
- @fneg
- %b0 =w cast %f
- %b1 =w xor 2147483648, %b0
- %rs =s cast %b1
- ret %rs
- }
- export
- function d $ftrunc(d %f) {
- @ftrunc
- %l0 =w dtosi %f
- %rt =d swtof %l0
- ret %rt
- }
- export
- function s $wtos(w %w) {
- @start
- %rt =s uwtof %w
- ret %rt
- }
- export
- function d $wtod(w %w) {
- @start
- %rt =d uwtof %w
- ret %rt
- }
- export
- function s $ltos(l %l) {
- @start
- %rt =s ultof %l
- ret %rt
- }
- export
- function d $ltod(l %l) {
- @start
- %rt =d ultof %l
- ret %rt
- }
- export
- function w $stow(s %f) {
- @start
- %rt =w stoui %f
- ret %rt
- }
- export
- function w $dtow(d %f) {
- @start
- %rt =w dtoui %f
- ret %rt
- }
- export
- function l $stol(s %f) {
- @start
- %rt =l stoui %f
- ret %rt
- }
- export
- function l $dtol(d %f) {
- @start
- %rt =l dtoui %f
- ret %rt
- }
- # >>> driver
- # #include <float.h>
- # #include <limits.h>
- #
- # extern float fneg(float);
- # extern double ftrunc(double);
- #
- # extern float wtos(unsigned int);
- # extern double wtod(unsigned int);
- # extern float ltos(long long unsigned int);
- # extern double ltod(long long unsigned int);
- #
- # extern unsigned int stow(float);
- # extern unsigned int dtow(double);
- # extern unsigned long long stol(float);
- # extern unsigned long long dtol(double);
- #
- # unsigned long long iin[] = { 0, 1, 16, 234987, 427386245, 0x7fff0000,
- # 0xffff0000, 23602938196141, 72259248152500195, 9589010795705032704ull,
- # 0xdcf5fbe299d0148aull, 0xffffffff00000000ull, -1 };
- #
- # double fin[] = { 0.17346516197824458, 442.0760005466251, 4342856.879893436,
- # 4294967295.0, 98547543006.49626, 236003043787688.3, 9.499222733527032e+18,
- # 1.1936266170755652e+19 };
- #
- # int main() {
- # int i;
- #
- # if (fneg(1.23f) != -1.23f) return 1;
- # if (ftrunc(3.1415) != 3.0) return 2;
- # if (ftrunc(-1.234) != -1.0) return 3;
- #
- # for (i=0; i<sizeof(iin)/sizeof(iin[0]); i++) {
- # if (wtos(iin[i]) != (float) (unsigned int)iin[i])
- # return 4;
- # if (wtod(iin[i]) != (double)(unsigned int)iin[i])
- # return 5;
- # if (ltos(iin[i]) != (float) iin[i])
- # return 6;
- # if (ltod(iin[i]) != (double)iin[i])
- # return 7;
- # }
- # for (i=0; i<sizeof(fin)/sizeof(fin[0]); i++) {
- # if (fin[i] >= 1LL << DBL_MANT_DIG)
- # break;
- # if (dtol(fin[i]) != (unsigned long long)fin[i])
- # return 8;
- # if((unsigned long long)fin[i] > UINT_MAX)
- # continue;
- # if (dtow(fin[i]) != (unsigned int)fin[i])
- # return 9;
- # if (fin[i] >= 1LL << FLT_MANT_DIG)
- # continue;
- # if (stol((float)fin[i]) != (unsigned long long)(float)fin[i])
- # return 10;
- # if (stow((float)fin[i]) != (unsigned int)(float)fin[i])
- # return 11;
- # }
- # return 0;
- # }
- # <<<
|