在Javascript中生成LLVM浮点十六进制文字

时间:2013-06-12 18:08:58

标签: javascript floating-point type-conversion llvm

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

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

2 个答案:

答案 0 :(得分:1)

您要做的是转储double的二进制表示。以下是它在C中的完成方式:

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

要在Javascript中执行此操作,您需要提取float的二进制表示。这不是微不足道的,但幸运的是,它似乎已经在Stackoverflow上有了一个解决方案:Read/Write bytes of float in JS(具体而言,this answer似乎很方便)

答案 1 :(得分: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调用后半部分。