X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FPrimOps.cmm;h=c7c372756ce721c6bbcac7a8453b7edc763871cd;hb=b45e212f5f396f7787cd66ce03790ce36aabd259;hp=cbdfe67d93b19427143df2c84f90cc2dcb117b8e;hpb=4f92da533cd1c7b5f41ef8794ee6a284f1680413;p=ghc-hetmet.git diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index cbdfe67..c7c3727 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -452,11 +452,11 @@ int64ToIntegerzh_fast hi = TO_W_(val >> 32); lo = TO_W_(val); - if ( hi != 0 && hi != 0xFFFFFFFF ) { - words_needed = 2; - } else { + if ( hi == 0 || (hi == 0xFFFFFFFF && lo != 0) ) { // minimum is one word words_needed = 1; + } else { + words_needed = 2; } ALLOC_PRIM( SIZEOF_StgArrWords + WDS(words_needed), @@ -928,16 +928,20 @@ decodeDoublezu2Intzh_fast W_ p; FETCH_MP_TEMP(mp_tmp1); FETCH_MP_TEMP(mp_tmp2); - FETCH_MP_TEMP(mp_tmp_w); + FETCH_MP_TEMP(mp_result1); + FETCH_MP_TEMP(mp_result2); /* arguments: D1 = Double# */ arg = D1; /* Perform the operation */ - foreign "C" __decodeDouble_2Int(mp_tmp1 "ptr", mp_tmp2 "ptr", mp_tmp_w "ptr", arg) []; - - /* returns: (Int# (mant high), Int# (mant low), Int# (expn)) */ - RET_NNN(W_[mp_tmp1], W_[mp_tmp2], W_[mp_tmp_w]); + foreign "C" __decodeDouble_2Int(mp_tmp1 "ptr", mp_tmp2 "ptr", + mp_result1 "ptr", mp_result2 "ptr", + arg) []; + + /* returns: + (Int# (mant sign), Word# (mant high), Word# (mant low), Int# (expn)) */ + RET_NNNN(W_[mp_tmp1], W_[mp_tmp2], W_[mp_result1], W_[mp_result2]); } /* ----------------------------------------------------------------------------- @@ -2118,7 +2122,11 @@ delayzh_fast W_ time; W_ divisor; (time) = foreign "C" getourtimeofday() [R1]; - divisor = TO_W_(RtsFlags_MiscFlags_tickInterval(RtsFlags))*1000; + divisor = TO_W_(RtsFlags_MiscFlags_tickInterval(RtsFlags)); + if (divisor == 0) { + divisor = 50; + } + divisor = divisor * 1000; target = ((R1 + divisor - 1) / divisor) /* divide rounding up */ + time + 1; /* Add 1 as getourtimeofday rounds down */ StgTSO_block_info(CurrentTSO) = target;