/* Copied from ghc for backwards compatibility: * https://gitlab.haskell.org/ghc/ghc/-/blob/6d172e63f3dd3590b0a57371efb8f924f1fcdf05/libraries/base/cbits/CastFloatWord.cmm */ #include "Cmm.h" #include "MachDeps.h" #if WORD_SIZE_IN_BITS == 64 #define DOUBLE_SIZE_WDS 1 #else #define DOUBLE_SIZE_WDS 2 #endif #if SIZEOF_W == 4 #define TO_ZXW_(x) %zx32(x) #elif SIZEOF_W == 8 #define TO_ZXW_(x) %zx64(x) #endif primal_stg_word64ToDoublezh(I64 w) { D_ d; P_ ptr; STK_CHK_GEN_N (DOUBLE_SIZE_WDS); reserve DOUBLE_SIZE_WDS = ptr { I64[ptr] = w; d = D_[ptr]; } return (d); } primal_stg_doubleToWord64zh(D_ d) { I64 w; P_ ptr; STK_CHK_GEN_N (DOUBLE_SIZE_WDS); reserve DOUBLE_SIZE_WDS = ptr { D_[ptr] = d; w = I64[ptr]; } return (w); } primal_stg_word32ToFloatzh(W_ w) { F_ f; P_ ptr; STK_CHK_GEN_N (1); reserve 1 = ptr { I32[ptr] = %lobits32(w); f = F_[ptr]; } return (f); } primal_stg_floatToWord32zh(F_ f) { W_ w; P_ ptr; STK_CHK_GEN_N (1); reserve 1 = ptr { F_[ptr] = f; // Fix #16617: use zero-extending (TO_ZXW_) here w = TO_ZXW_(I32[ptr]); } return (w); }