diff --git a/cranelift/filetests/filetests/runtests/float-bitcast.clif b/cranelift/filetests/filetests/runtests/float-bitcast.clif new file mode 100644 index 000000000000..0c0198bd8f53 --- /dev/null +++ b/cranelift/filetests/filetests/runtests/float-bitcast.clif @@ -0,0 +1,47 @@ +test interpret +test run +target x86_64 +target aarch64 +target s390x + +function %bcast_i32_f32_i32_convert(i32) -> i32 { +block0(v0: i32): + v1 = bitcast.f32 v0 + v2 = bitcast.i32 v1 + return v2 +} + +; run: %bcast_i32_f32_i32_convert(0xFFFFFFFF) == 0xFFFFFFFF +; run: %bcast_i32_f32_i32_convert(0x12345678) == 0x12345678 +; run: %bcast_i32_f32_i32_convert(0x0) == 0x0 + +function %bcast_i64_f64_i64_convert(i64) -> i64 { +block0(v0: i64): + v1 = bitcast.f64 v0 + v2 = bitcast.i64 v1 + return v2 +} + +; run: %bcast_i64_f64_i64_convert(0xFFFFFFFFFFFFFFFF) == 0xFFFFFFFFFFFFFFFF +; run: %bcast_i64_f64_i64_convert(0x1234567812345678) == 0x1234567812345678 +; run: %bcast_i64_f64_i64_convert(0x0) == 0x0 + +function %bcast_i32_to_f32(i32) -> f32 { +block0(v0: i32): + v1 = bitcast.f32 v0 + return v1 +} + +; run: %bcast_i32_to_f32(0xFFFFFFFF) == -NaN:0x3fffff +; run: %bcast_i32_to_f32(0x12345678) == 0x1.68acf0p-91 +; run: %bcast_i32_to_f32(0x0) == 0x0.0 + +function %bcast_i64_to_f64(i64) -> f64 { +block0(v0: i64): + v1 = bitcast.f64 v0 + return v1 +} + +; run: %bcast_i64_to_f64(0xFFFFFFFFFFFFFFFF) == -NaN:0x7ffffffffffff +; run: %bcast_i64_to_f64(0x1234567812345678) == 0x1.4567812345678p-732 +; run: %bcast_i64_to_f64(0x0) == 0x0.0 diff --git a/cranelift/interpreter/src/value.rs b/cranelift/interpreter/src/value.rs index 204195944ca3..82359e87dd0d 100644 --- a/cranelift/interpreter/src/value.rs +++ b/cranelift/interpreter/src/value.rs @@ -309,6 +309,8 @@ impl Value for DataValue { } (DataValue::F32(n), types::I32) => DataValue::I32(n.bits() as i32), (DataValue::F64(n), types::I64) => DataValue::I64(n.bits() as i64), + (DataValue::I32(n), types::F32) => DataValue::F32(Ieee32::with_bits(n as u32)), + (DataValue::I64(n), types::F64) => DataValue::F64(Ieee64::with_bits(n as u64)), (DataValue::B(b), t) if t.is_bool() => DataValue::B(b), (DataValue::B(b), t) if t.is_int() => { // Bools are represented in memory as all 1's