Skip to content

Commit 54862c8

Browse files
committed
c-writer.cc: represent float consts as integer literals
1 parent 1263c6a commit 54862c8

File tree

2 files changed

+7
-45
lines changed

2 files changed

+7
-45
lines changed

src/c-writer.cc

Lines changed: 5 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,52 +1250,14 @@ void CWriter::Write(const Const& const_) {
12501250
Writef("%" PRIu64 "ull", static_cast<int64_t>(const_.u64()));
12511251
break;
12521252

1253-
case Type::F32: {
1254-
uint32_t f32_bits = const_.f32_bits();
1255-
// TODO(binji): Share with similar float info in interp.cc and literal.cc
1256-
if ((f32_bits & 0x7f800000u) == 0x7f800000u) {
1257-
const char* sign = (f32_bits & 0x80000000) ? "-" : "";
1258-
uint32_t significand = f32_bits & 0x7fffffu;
1259-
if (significand == 0) {
1260-
// Infinity.
1261-
Writef("%sINFINITY", sign);
1262-
} else {
1263-
// Nan.
1264-
Writef("f32_reinterpret_i32(0x%08x) /* %snan:0x%06x */", f32_bits,
1265-
sign, significand);
1266-
}
1267-
} else if (f32_bits == 0x80000000) {
1268-
// Negative zero. Special-cased so it isn't written as -0 below.
1269-
Writef("-0.f");
1270-
} else {
1271-
Writef("%.9g", Bitcast<float>(f32_bits));
1272-
}
1253+
case Type::F32:
1254+
Writef("f32_reinterpret_i32(0x%" PRIx32 ")", const_.f32_bits());
12731255
break;
1274-
}
12751256

1276-
case Type::F64: {
1277-
uint64_t f64_bits = const_.f64_bits();
1278-
// TODO(binji): Share with similar float info in interp.cc and literal.cc
1279-
if ((f64_bits & 0x7ff0000000000000ull) == 0x7ff0000000000000ull) {
1280-
const char* sign = (f64_bits & 0x8000000000000000ull) ? "-" : "";
1281-
uint64_t significand = f64_bits & 0xfffffffffffffull;
1282-
if (significand == 0) {
1283-
// Infinity.
1284-
Writef("%sINFINITY", sign);
1285-
} else {
1286-
// Nan.
1287-
Writef("f64_reinterpret_i64(0x%016" PRIx64 ") /* %snan:0x%013" PRIx64
1288-
" */",
1289-
f64_bits, sign, significand);
1290-
}
1291-
} else if (f64_bits == 0x8000000000000000ull) {
1292-
// Negative zero. Special-cased so it isn't written as -0 below.
1293-
Writef("-0.0");
1294-
} else {
1295-
Writef("%.17g", Bitcast<double>(f64_bits));
1296-
}
1257+
case Type::F64:
1258+
Writef("f64_reinterpret_i64(0x%" PRIx64 ")", const_.f64_bits());
12971259
break;
1298-
}
1260+
12991261
case Type::V128: {
13001262
Writef("v128_const(0x%02x", const_.vec128().u8(0));
13011263
for (int i = 1; i < 16; i++) {

test/wasm2c/tail-calls.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ void w2c_test_tailcaller_0(w2c_test* instance) {
823823
u32 var_i0, var_i2;
824824
f32 var_f1;
825825
var_i0 = 1u;
826-
var_f1 = 2;
826+
var_f1 = f32_reinterpret_i32(0x40000000);
827827
var_i2 = 0u;
828828
static_assert(sizeof(struct wasm_multi_if) <= 1024);
829829
CHECK_CALL_INDIRECT(instance->w2c_tab, w2c_test_i32_f32, var_i2);
@@ -855,7 +855,7 @@ void wasm_tailcall_w2c_test_tailcaller_0(void **instance_ptr, void *tail_call_st
855855
u32 var_i0, var_i2;
856856
f32 var_f1;
857857
var_i0 = 1u;
858-
var_f1 = 2;
858+
var_f1 = f32_reinterpret_i32(0x40000000);
859859
var_i2 = 0u;
860860
static_assert(sizeof(struct wasm_multi_if) <= 1024);
861861
CHECK_CALL_INDIRECT(instance->w2c_tab, w2c_test_i32_f32, var_i2);

0 commit comments

Comments
 (0)