2013-06-12 63 views
2

我试图生成包含浮点文字的LLVM文本IR。为了能够可靠地工作,我需要能够将浮点数转换为它们的十六进制文字表示。例如,这里是结果应该是什么:在Javascript中生成LLVM浮点十六进制文字

f2hex(0.0001) -> "0x3F1A36E2E0000000" 
f2hex(0.1)  -> "0x3FB99999A0000000" 
f2hex(1.1)  -> "0x3FF19999A0000000" 
f2hex(3.33333) -> "0x400AAAA8E0000000" 
f2hex(4.9)  -> "0x40139999A0000000" 
f2hex(111.99998) -> "0x405BFFFFA0000000" 

我会满足于算法的详细说明(即不依赖于库或机器代码是从Javascript不可用),但工作JavaScript代码甚至更好。

LLVM的语言参考描述格式在这里:http://llvm.org/docs/LangRef.html#simple-constants

回答

1

我最终撬动了IEEE-754 Floating-Point Conversion Page源。我添加了以下两个函数:

function llvm_double_hex(input) { 
    ieee64 = new ieee(64) 
    ieee64.Dec2Bin(input.toString()) 
    ieee64.BinString = 
    ieee64.Convert2Bin(ieee64.DispStr, ieee64.StatCond64, ieee64.Result[0], 
         ieee64.BinaryPower, false) 
    return '0x' + ieee64.Convert2Hex() 
}; 
function llvm_float_hex(input) { 
    var d64 = llvm_double_hex(input); 
    return d64.replace(/(.*)........$/, "$1A0000000"); 
}; 

第二个调用LLVM IR的预期后半部分的第一个和零。

1

什么你正在试图做的是转储双重的二进制表示。以下是如何在C中完成的:

float f = ... // also works with double 
char str[19]; 
sprintf(str, "0x%llX", f); 

要在Javascript中执行此操作,您需要提取float的二进制表示形式。这是不平凡的,但幸运的是它似乎在这里已经有#2的解决方案:Read/Write bytes of float in JS(具体而言,this answer看起来很方便)