// // Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved. // #include "device/cpu/cpubuiltins.hpp" #include "device/cpu/cpucommand.hpp" #include #include // for printf #include #define BUF_SIZE_PRINTF 4095 //In the current implementation of printf in gcc 4.5.2 runtime libraries,inf/infinity and nan are not supported //The [-]infinity value is printed as [-]1.#INF00 //The [-]nan value is printed as [-]1.#INF00 //bufOutUpdate converts the all printed instanced of [-]1.#INF00 to inf,and // all printed instanced of [-]1.#IND00 to nan void bufOutUpdate(std::string& sBufOut,const char* strToReplace,const char* strReplace) { size_t foundIdx = 0; while ((foundIdx = sBufOut.find(strToReplace,foundIdx)) != std::string::npos) { sBufOut.replace(foundIdx,strlen(strToReplace),strReplace,strlen(strReplace)); foundIdx += 3; } } int cpuprintf(const char* format,...) { char cBufOut[BUF_SIZE_PRINTF]; std::string sBufOut; va_list args; va_start(args, format); //write to the buffer vsprintf(cBufOut,format,args); sBufOut = cBufOut; //convert to correct infinity/nan representation bufOutUpdate(sBufOut,"1.#INF00","inf"); bufOutUpdate(sBufOut,"1.#IND00","nan"); bufOutUpdate(sBufOut,"1.#QNAN0","nan"); int ret = amd::Os::printf("%s",sBufOut.c_str()); fflush(stdout); va_end (args); return ret; } namespace cpu { const clk_builtins_t Builtins::dispatchTable_ = { /* Synchronization functions */ &WorkItem::barrier, /* AMD Only builtins: FIXME_lmoriche: remove or add an extension */ NULL, cpuprintf }; } // namespace cpu