# 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 # #include # # 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= 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; # } # <<<