From a956fdba063b5fb6e3006770d8c1dd423284390c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Mon, 7 Oct 2024 12:39:50 -0700 Subject: [PATCH] Implement the `ref.eq` Wasm GC instruction --- crates/cranelift/src/translate/code_translator.rs | 11 ++++++++--- tests/wast.rs | 1 - 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/cranelift/src/translate/code_translator.rs b/crates/cranelift/src/translate/code_translator.rs index 2e9d8489d025..c332edb226b9 100644 --- a/crates/cranelift/src/translate/code_translator.rs +++ b/crates/cranelift/src/translate/code_translator.rs @@ -2723,9 +2723,14 @@ pub fn translate_operator( let (array, index, elem) = state.pop3(); environ.translate_array_set(builder, array_type_index, array, index, elem)?; } + Operator::RefEq => { + let (r1, r2) = state.pop2(); + let eq = builder.ins().icmp(ir::condcodes::IntCC::Equal, r1, r2); + let eq = builder.ins().uextend(ir::types::I32, eq); + state.push1(eq); + } - Operator::RefEq - | Operator::RefTestNonNull { .. } + Operator::RefTestNonNull { .. } | Operator::RefTestNullable { .. } | Operator::RefCastNonNull { .. } | Operator::RefCastNullable { .. } @@ -2733,7 +2738,7 @@ pub fn translate_operator( | Operator::BrOnCastFail { .. } | Operator::AnyConvertExtern | Operator::ExternConvertAny => { - return Err(wasm_unsupported!("GC operators are not yet implemented")); + return Err(wasm_unsupported!("GC operator not yet implemented: {op:?}")); } Operator::GlobalAtomicGet { .. } diff --git a/tests/wast.rs b/tests/wast.rs index e3f4985583e7..e3f09012f3e4 100644 --- a/tests/wast.rs +++ b/tests/wast.rs @@ -207,7 +207,6 @@ fn should_fail(test: &Path, strategy: Strategy) -> bool { "br_on_cast.wast", "extern.wast", "ref_cast.wast", - "ref_eq.wast", "ref_test.wast", "table_sub.wast", "type_canon.wast",