[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/aheejin closed https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/brendandahl updated https://github.com/llvm/llvm-project/pull/91545 >From adcb77e15d09f466f217d754f6f80aeb729aadc4 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 8 May 2024 23:10:07 + Subject: [PATCH 1/5] [WebAssembly] Implement prototype f32.store_f16 instruction. Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- .../clang/Basic/BuiltinsWebAssembly.def | 1 + clang/lib/CodeGen/CGBuiltin.cpp | 6 + clang/test/CodeGen/builtins-wasm.c| 6 + llvm/include/llvm/IR/IntrinsicsWebAssembly.td | 5 .../MCTargetDesc/WebAssemblyMCTargetDesc.h| 1 + .../WebAssembly/WebAssemblyISelLowering.cpp | 8 ++ .../WebAssembly/WebAssemblyInstrMemory.td | 4 +++ .../CodeGen/WebAssembly/half-precision.ll | 9 +++ llvm/test/CodeGen/WebAssembly/offset.ll | 27 +++ llvm/test/MC/WebAssembly/simd-encodings.s | 3 +++ 10 files changed, 70 insertions(+) diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f8..41fadd10e9432 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17e..abb644d8eb506 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae5..bcb15969de1c5 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e93..572d334ac9552 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae59179..d4e9fb057c44d 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned GetDefaultP2AlignAny(unsigned Opc) { WASM_LOAD_STORE(LOAD_LANE_I16x8) WASM_LOAD_STORE(STORE_LANE_I16x8) WASM_LOAD_STORE(LOAD_F16_F32) + WASM_LOAD_STORE(STORE_F16_F32) return 1; WASM_LOAD_STORE(LOAD_I32) WASM_LOAD_STORE(LOAD_F32) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/aheejin approved this pull request. LGTM with removing the pure attribute https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/brendandahl updated https://github.com/llvm/llvm-project/pull/91545 >From adcb77e15d09f466f217d754f6f80aeb729aadc4 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 8 May 2024 23:10:07 + Subject: [PATCH 1/4] [WebAssembly] Implement prototype f32.store_f16 instruction. Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- .../clang/Basic/BuiltinsWebAssembly.def | 1 + clang/lib/CodeGen/CGBuiltin.cpp | 6 + clang/test/CodeGen/builtins-wasm.c| 6 + llvm/include/llvm/IR/IntrinsicsWebAssembly.td | 5 .../MCTargetDesc/WebAssemblyMCTargetDesc.h| 1 + .../WebAssembly/WebAssemblyISelLowering.cpp | 8 ++ .../WebAssembly/WebAssemblyInstrMemory.td | 4 +++ .../CodeGen/WebAssembly/half-precision.ll | 9 +++ llvm/test/CodeGen/WebAssembly/offset.ll | 27 +++ llvm/test/MC/WebAssembly/simd-encodings.s | 3 +++ 10 files changed, 70 insertions(+) diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f8..41fadd10e9432 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17e..abb644d8eb506 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae5..bcb15969de1c5 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e93..572d334ac9552 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae59179..d4e9fb057c44d 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned GetDefaultP2AlignAny(unsigned Opc) { WASM_LOAD_STORE(LOAD_LANE_I16x8) WASM_LOAD_STORE(STORE_LANE_I16x8) WASM_LOAD_STORE(LOAD_F16_F32) + WASM_LOAD_STORE(STORE_F16_F32) return 1; WASM_LOAD_STORE(LOAD_I32) WASM_LOAD_STORE(LOAD_F32) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
@@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") aheejin wrote: I'm not exactly sure about the definition, but Builtins.def says it should be in sync with `Builtin::Context` class: https://github.com/llvm/llvm-project/blob/b942c24845a39e6161c8623b1efc4e2083d879e9/clang/include/clang/Basic/Builtins.def#L67-L68 And `Builtin::Context` says this: https://github.com/llvm/llvm-project/blob/b942c24845a39e6161c8623b1efc4e2083d879e9/clang/include/clang/Basic/Builtins.h#L115-L118 So I guess stores cannot be considered as pure, because they have side effects. https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
@@ -171,12 +171,16 @@ defm STORE8_I64 : WebAssemblyStore; defm STORE16_I64 : WebAssemblyStore; defm STORE32_I64 : WebAssemblyStore; +defm STORE_F16_F32 : WebAssemblyStore; aheejin wrote: How about adding one for `LOAD` too? https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
@@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") dschuff wrote: The only documentation I know of for this is https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html Clang has https://clang.llvm.org/docs/AttributeReference.html but it's not helpful here. I guess a store shouldn't be pure, since it has an observable side effect, and in any case it doesn't return a value. https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/brendandahl updated https://github.com/llvm/llvm-project/pull/91545 >From adcb77e15d09f466f217d754f6f80aeb729aadc4 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 8 May 2024 23:10:07 + Subject: [PATCH 1/3] [WebAssembly] Implement prototype f32.store_f16 instruction. Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- .../clang/Basic/BuiltinsWebAssembly.def | 1 + clang/lib/CodeGen/CGBuiltin.cpp | 6 + clang/test/CodeGen/builtins-wasm.c| 6 + llvm/include/llvm/IR/IntrinsicsWebAssembly.td | 5 .../MCTargetDesc/WebAssemblyMCTargetDesc.h| 1 + .../WebAssembly/WebAssemblyISelLowering.cpp | 8 ++ .../WebAssembly/WebAssemblyInstrMemory.td | 4 +++ .../CodeGen/WebAssembly/half-precision.ll | 9 +++ llvm/test/CodeGen/WebAssembly/offset.ll | 27 +++ llvm/test/MC/WebAssembly/simd-encodings.s | 3 +++ 10 files changed, 70 insertions(+) diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f..41fadd10e943 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17..abb644d8eb50 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae..bcb15969de1c 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e9..572d334ac955 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae5917..d4e9fb057c44 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned GetDefaultP2AlignAny(unsigned Opc) { WASM_LOAD_STORE(LOAD_LANE_I16x8) WASM_LOAD_STORE(STORE_LANE_I16x8) WASM_LOAD_STORE(LOAD_F16_F32) + WASM_LOAD_STORE(STORE_F16_F32) return 1; WASM_LOAD_STORE(LOAD_I32) WASM_LOAD_STORE(LOAD_F32) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/brendandahl updated https://github.com/llvm/llvm-project/pull/91545 >From adcb77e15d09f466f217d754f6f80aeb729aadc4 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 8 May 2024 23:10:07 + Subject: [PATCH 1/2] [WebAssembly] Implement prototype f32.store_f16 instruction. Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- .../clang/Basic/BuiltinsWebAssembly.def | 1 + clang/lib/CodeGen/CGBuiltin.cpp | 6 + clang/test/CodeGen/builtins-wasm.c| 6 + llvm/include/llvm/IR/IntrinsicsWebAssembly.td | 5 .../MCTargetDesc/WebAssemblyMCTargetDesc.h| 1 + .../WebAssembly/WebAssemblyISelLowering.cpp | 8 ++ .../WebAssembly/WebAssemblyInstrMemory.td | 4 +++ .../CodeGen/WebAssembly/half-precision.ll | 9 +++ llvm/test/CodeGen/WebAssembly/offset.ll | 27 +++ llvm/test/MC/WebAssembly/simd-encodings.s | 3 +++ 10 files changed, 70 insertions(+) diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f..41fadd10e943 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17..abb644d8eb50 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae..bcb15969de1c 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e9..572d334ac955 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae5917..d4e9fb057c44 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned GetDefaultP2AlignAny(unsigned Opc) { WASM_LOAD_STORE(LOAD_LANE_I16x8) WASM_LOAD_STORE(STORE_LANE_I16x8) WASM_LOAD_STORE(LOAD_F16_F32) + WASM_LOAD_STORE(STORE_F16_F32) return 1; WASM_LOAD_STORE(LOAD_I32) WASM_LOAD_STORE(LOAD_F32) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
@@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") brendandahl wrote: What does `pure` mean in this context? The docs in clang/Basic/Builtins.def don't have any info on this. https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
@@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") aheejin wrote: Can stores be considered pure? https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
@@ -171,12 +171,16 @@ defm STORE8_I64 : WebAssemblyStore; defm STORE16_I64 : WebAssemblyStore; defm STORE32_I64 : WebAssemblyStore; +defm STORE_F16_F32 : WebAssemblyStore; aheejin wrote: ```suggestion // Half-precision store. defm STORE_F16_F32 : WebAssemblyStore; ``` How about adding one-line comment? The same for `LOAD` too. Also 80-col wrapping. https://github.com/llvm/llvm-project/pull/91545 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
llvmbot wrote: @llvm/pr-subscribers-llvm-ir Author: Brendan Dahl (brendandahl) Changes Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- Full diff: https://github.com/llvm/llvm-project/pull/91545.diff 10 Files Affected: - (modified) clang/include/clang/Basic/BuiltinsWebAssembly.def (+1) - (modified) clang/lib/CodeGen/CGBuiltin.cpp (+6) - (modified) clang/test/CodeGen/builtins-wasm.c (+6) - (modified) llvm/include/llvm/IR/IntrinsicsWebAssembly.td (+5) - (modified) llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h (+1) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (+8) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td (+4) - (modified) llvm/test/CodeGen/WebAssembly/half-precision.ll (+9) - (modified) llvm/test/CodeGen/WebAssembly/offset.ll (+27) - (modified) llvm/test/MC/WebAssembly/simd-encodings.s (+3) ``diff diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f8..41fadd10e9432 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17e..abb644d8eb506 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae5..bcb15969de1c5 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e93..572d334ac9552 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae59179..d4e9fb057c44d 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned GetDefaultP2AlignAny(unsigned Opc) { WASM_LOAD_STORE(LOAD_LANE_I16x8) WASM_LOAD_STORE(STORE_LANE_I16x8) WASM_LOAD_STORE(LOAD_F16_F32) + WASM_LOAD_STORE(STORE_F16_F32) return 1; WASM_LOAD_STORE(LOAD_I32) WASM_LOAD_STORE(LOAD_F32) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index ed52fe53bc609..527bb4c9fbea6 100644 ---
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
llvmbot wrote: @llvm/pr-subscribers-mc @llvm/pr-subscribers-backend-webassembly Author: Brendan Dahl (brendandahl) Changes Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- Full diff: https://github.com/llvm/llvm-project/pull/91545.diff 10 Files Affected: - (modified) clang/include/clang/Basic/BuiltinsWebAssembly.def (+1) - (modified) clang/lib/CodeGen/CGBuiltin.cpp (+6) - (modified) clang/test/CodeGen/builtins-wasm.c (+6) - (modified) llvm/include/llvm/IR/IntrinsicsWebAssembly.td (+5) - (modified) llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h (+1) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (+8) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyInstrMemory.td (+4) - (modified) llvm/test/CodeGen/WebAssembly/half-precision.ll (+9) - (modified) llvm/test/CodeGen/WebAssembly/offset.ll (+27) - (modified) llvm/test/MC/WebAssembly/simd-encodings.s (+3) ``diff diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f8..41fadd10e9432 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17e..abb644d8eb506 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae5..bcb15969de1c5 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e93..572d334ac9552 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae59179..d4e9fb057c44d 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned GetDefaultP2AlignAny(unsigned Opc) { WASM_LOAD_STORE(LOAD_LANE_I16x8) WASM_LOAD_STORE(STORE_LANE_I16x8) WASM_LOAD_STORE(LOAD_F16_F32) + WASM_LOAD_STORE(STORE_F16_F32) return 1; WASM_LOAD_STORE(LOAD_I32) WASM_LOAD_STORE(LOAD_F32) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index ed52fe53bc609..527bb4c9fbea6
[clang] [llvm] [WebAssembly] Implement prototype f32.store_f16 instruction. (PR #91545)
https://github.com/brendandahl created https://github.com/llvm/llvm-project/pull/91545 Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. >From adcb77e15d09f466f217d754f6f80aeb729aadc4 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 8 May 2024 23:10:07 + Subject: [PATCH] [WebAssembly] Implement prototype f32.store_f16 instruction. Adds a builtin and intrinsic for the f32.store_f16 instruction. The instruction stores an f32 value as an f16 memory. Specified at: https://github.com/WebAssembly/half-precision/blob/29a9b9462c9285d4ccc1a5dc39214ddfd1892658/proposals/half-precision/Overview.md Note: the current spec has f32.store_f16 as opcode 0xFD0121, but this is incorrect and will be changed to 0xFC31 soon. --- .../clang/Basic/BuiltinsWebAssembly.def | 1 + clang/lib/CodeGen/CGBuiltin.cpp | 6 + clang/test/CodeGen/builtins-wasm.c| 6 + llvm/include/llvm/IR/IntrinsicsWebAssembly.td | 5 .../MCTargetDesc/WebAssemblyMCTargetDesc.h| 1 + .../WebAssembly/WebAssemblyISelLowering.cpp | 8 ++ .../WebAssembly/WebAssemblyInstrMemory.td | 4 +++ .../CodeGen/WebAssembly/half-precision.ll | 9 +++ llvm/test/CodeGen/WebAssembly/offset.ll | 27 +++ llvm/test/MC/WebAssembly/simd-encodings.s | 3 +++ 10 files changed, 70 insertions(+) diff --git a/clang/include/clang/Basic/BuiltinsWebAssembly.def b/clang/include/clang/Basic/BuiltinsWebAssembly.def index cf54f8f4422f8..41fadd10e9432 100644 --- a/clang/include/clang/Basic/BuiltinsWebAssembly.def +++ b/clang/include/clang/Basic/BuiltinsWebAssembly.def @@ -192,6 +192,7 @@ TARGET_BUILTIN(__builtin_wasm_relaxed_dot_bf16x8_add_f32_f32x4, "V4fV8UsV8UsV4f" // Half-Precision (fp16) TARGET_BUILTIN(__builtin_wasm_loadf16_f32, "fh*", "nU", "half-precision") +TARGET_BUILTIN(__builtin_wasm_storef16_f32, "vfh*", "nU", "half-precision") // Reference Types builtins // Some builtins are custom type-checked - see 't' as part of the third argument, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e8a6bd050e17e..abb644d8eb506 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -21308,6 +21308,12 @@ Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID, Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_loadf16_f32); return Builder.CreateCall(Callee, {Addr}); } + case WebAssembly::BI__builtin_wasm_storef16_f32: { +Value *Val = EmitScalarExpr(E->getArg(0)); +Value *Addr = EmitScalarExpr(E->getArg(1)); +Function *Callee = CGM.getIntrinsic(Intrinsic::wasm_storef16_f32); +return Builder.CreateCall(Callee, {Val, Addr}); + } case WebAssembly::BI__builtin_wasm_table_get: { assert(E->getArg(0)->getType()->isArrayType()); Value *Table = EmitArrayToPointerDecay(E->getArg(0)).emitRawPointer(*this); diff --git a/clang/test/CodeGen/builtins-wasm.c b/clang/test/CodeGen/builtins-wasm.c index ab1c6cd494ae5..bcb15969de1c5 100644 --- a/clang/test/CodeGen/builtins-wasm.c +++ b/clang/test/CodeGen/builtins-wasm.c @@ -807,6 +807,12 @@ float load_f16_f32(__fp16 *addr) { // WEBASSEMBLY: call float @llvm.wasm.loadf16.f32(ptr %{{.*}}) } +void store_f16_f32(float val, __fp16 *addr) { + return __builtin_wasm_storef16_f32(val, addr); + // WEBASSEMBLY: tail call void @llvm.wasm.storef16.f32(float %val, ptr %{{.*}}) + // WEBASSEMBLY-NEXT: ret +} + __externref_t externref_null() { return __builtin_wasm_ref_null_extern(); // WEBASSEMBLY: tail call ptr addrspace(10) @llvm.wasm.ref.null.extern() diff --git a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td index f8142a8ca9e93..572d334ac9552 100644 --- a/llvm/include/llvm/IR/IntrinsicsWebAssembly.td +++ b/llvm/include/llvm/IR/IntrinsicsWebAssembly.td @@ -332,6 +332,11 @@ def int_wasm_loadf16_f32: [llvm_ptr_ty], [IntrReadMem, IntrArgMemOnly], "", [SDNPMemOperand]>; +def int_wasm_storef16_f32: + Intrinsic<[], +[llvm_float_ty, llvm_ptr_ty], +[IntrWriteMem, IntrArgMemOnly], + "", [SDNPMemOperand]>; //===--===// diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h index d3b496ae59179..d4e9fb057c44d 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h @@ -207,6 +207,7 @@ inline unsigned