diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 7ee6a3d8304be..c1b3936c1dcec 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -668,6 +668,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { if (parseFunctionTableOperand(&FunctionTable)) return true; ExpectFuncType = true; + } else if (Name == "ref.test") { + ExpectFuncType = true; } // Returns true if the next tokens are a catch clause diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td index 2654a09387fd4..40b87a084c687 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td @@ -36,6 +36,14 @@ multiclass REF_I { Requires<[HasReferenceTypes]>; } +defm REF_TEST_FUNCREF : + I<(outs I32: $res), + (ins TypeIndex:$type, FUNCREF: $ref), + (outs), + (ins TypeIndex:$type), + [], + "ref.test\t$type, $ref", "ref.test $type", 0xfb14>; + defm "" : REF_I; defm "" : REF_I; defm "" : REF_I; diff --git a/llvm/test/MC/WebAssembly/reference-types.s b/llvm/test/MC/WebAssembly/reference-types.s index cfadede8295ef..08aafb23969eb 100644 --- a/llvm/test/MC/WebAssembly/reference-types.s +++ b/llvm/test/MC/WebAssembly/reference-types.s @@ -27,6 +27,21 @@ ref_null_test: drop end_function +# CHECK-LABEL: ref_test_test: +# CHECK: ref.null_func # encoding: [0xd0,0x70] +# CHECK: ref.test () -> () # encoding: [0xfb,0x14,0x80'A',0x80'A',0x80'A',0x80'A',A] +# CHECK: # fixup A - offset: 2, value: .Ltypeindex0@TYPEINDEX, kind: fixup_uleb128_i32 +# CHECK: ref.null_func # encoding: [0xd0,0x70] +# CHECK: ref.test () -> (i32) # encoding: [0xfb,0x14,0x80'A',0x80'A',0x80'A',0x80'A',A] +# CHECK: # fixup A - offset: 2, value: .Ltypeindex1@TYPEINDEX, kind: fixup_uleb128_i32 +ref_test_test: + .functype ref_test_test () -> (i32, i32) + ref.null_func + ref.test () -> () + ref.null_func + ref.test () -> (i32) + end_function + # CHECK-LABEL: ref_sig_test_funcref: # CHECK-NEXT: .functype ref_sig_test_funcref (funcref) -> (funcref) ref_sig_test_funcref: