summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yjit/src/backend/tests.rs15
-rw-r--r--yjit/src/backend/x86_64/mod.rs1
2 files changed, 16 insertions, 0 deletions
diff --git a/yjit/src/backend/tests.rs b/yjit/src/backend/tests.rs
index 9ec986f734..d72f0ec0ac 100644
--- a/yjit/src/backend/tests.rs
+++ b/yjit/src/backend/tests.rs
@@ -138,6 +138,21 @@ fn test_load_reg()
asm.compile_with_num_regs(&mut cb, 1);
}
+// Test load of a GC'd value
+#[test]
+fn test_load_value()
+{
+ let (mut asm, mut cb) = setup_asm();
+
+ let gcd_value = VALUE(0xFFFFFFFFFFFF00);
+ assert!(!gcd_value.special_const_p());
+
+ let out = asm.load(Opnd::Value(gcd_value));
+ asm.mov(Opnd::mem(64, SP, 0), out);
+
+ asm.compile_with_num_regs(&mut cb, 1);
+}
+
// Multiple registers needed and register reuse
#[test]
fn test_reuse_reg()
diff --git a/yjit/src/backend/x86_64/mod.rs b/yjit/src/backend/x86_64/mod.rs
index 19b5096a26..7a26650549 100644
--- a/yjit/src/backend/x86_64/mod.rs
+++ b/yjit/src/backend/x86_64/mod.rs
@@ -44,6 +44,7 @@ impl From<Opnd> for X86Opnd {
Opnd::UImm(val) => uimm_opnd(val),
Opnd::Imm(val) => imm_opnd(val),
+ Opnd::Value(VALUE(uimm)) => uimm_opnd(uimm as u64),
// General-purpose register
Opnd::Reg(reg) => X86Opnd::Reg(reg),