From 9c0408e3a210337766a991d06c1b0ec1eff1ef56 Mon Sep 17 00:00:00 2001
From: rarbore2 <rarbore2@illinois.edu>
Date: Thu, 13 Feb 2025 15:19:06 -0600
Subject: [PATCH] Fix float constants in LLVM

---
 hercules_cg/src/cpu.rs                          | 17 +++++++----------
 .../src/casts_and_intrinsics.jn                 |  2 +-
 juno_samples/casts_and_intrinsics/src/main.rs   |  2 +-
 3 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/hercules_cg/src/cpu.rs b/hercules_cg/src/cpu.rs
index ba78e8e2..7d87170b 100644
--- a/hercules_cg/src/cpu.rs
+++ b/hercules_cg/src/cpu.rs
@@ -1,6 +1,7 @@
 use std::collections::BTreeMap;
 use std::fmt::{Error, Write};
 use std::iter::zip;
+use std::mem::transmute;
 use std::sync::atomic::{AtomicUsize, Ordering};
 
 use hercules_ir::*;
@@ -264,18 +265,14 @@ impl<'a> CPUContext<'a> {
                         Constant::UnsignedInteger32(val) => write!(body, "i32 {} to i32\n", val)?,
                         Constant::UnsignedInteger64(val) => write!(body, "i64 {} to i64\n", val)?,
                         Constant::Float32(val) => {
-                            if val.fract() == 0.0 {
-                                write!(body, "float {}.0 to float\n", val)?
-                            } else {
-                                write!(body, "float {} to float\n", val)?
-                            }
+                            write!(body, "float 0x{:016x} to float\n", unsafe {
+                                transmute::<f64, u64>(*val as f64)
+                            })?;
                         }
                         Constant::Float64(val) => {
-                            if val.fract() == 0.0 {
-                                write!(body, "double {}.0 to double\n", val)?
-                            } else {
-                                write!(body, "double {} to double\n", val)?
-                            }
+                            write!(body, "float 0x{:016x} to float\n", unsafe {
+                                transmute::<f64, u64>(*val)
+                            })?;
                         }
                         _ => unreachable!(),
                     }
diff --git a/juno_samples/casts_and_intrinsics/src/casts_and_intrinsics.jn b/juno_samples/casts_and_intrinsics/src/casts_and_intrinsics.jn
index 52610633..06798f43 100644
--- a/juno_samples/casts_and_intrinsics/src/casts_and_intrinsics.jn
+++ b/juno_samples/casts_and_intrinsics/src/casts_and_intrinsics.jn
@@ -1,5 +1,5 @@
 #[entry]
 fn casts_and_intrinsics(input : f32) -> i32 {
-  let sqrt = sqrt!::<f32>(input);
+  let sqrt = sqrt!::<f32>(input + 0.3);
   return sqrt as i32;
 }
diff --git a/juno_samples/casts_and_intrinsics/src/main.rs b/juno_samples/casts_and_intrinsics/src/main.rs
index 6b27c60c..d0f7c872 100644
--- a/juno_samples/casts_and_intrinsics/src/main.rs
+++ b/juno_samples/casts_and_intrinsics/src/main.rs
@@ -7,7 +7,7 @@ juno_build::juno!("casts_and_intrinsics");
 fn main() {
     async_std::task::block_on(async {
         let mut r = runner!(casts_and_intrinsics);
-        let output = r.run(16.0).await;
+        let output = r.run(15.7).await;
         println!("{}", output);
         assert_eq!(output, 4);
     });
-- 
GitLab