mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
c360a1f5f8
Summary: Implements target-specific LLVM intrinsics and clang builtins for these new SIMD operations, as described at https://github.com/WebAssembly/simd/blob/master/proposals/simd/SIMD.md#integer-to-integer-narrowing. Reviewers: aheejin Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D67425 llvm-svn: 371906
180 lines
7.4 KiB
TableGen
180 lines
7.4 KiB
TableGen
//===- IntrinsicsWebAssembly.td - Defines wasm intrinsics --*- tablegen -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file defines all of the WebAssembly-specific intrinsics.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
let TargetPrefix = "wasm" in { // All intrinsics start with "llvm.wasm.".
|
|
|
|
// Query the current memory size, and increase the current memory size.
|
|
// Note that memory.size is not IntrNoMem because it must be sequenced with
|
|
// respect to memory.grow calls.
|
|
def int_wasm_memory_size : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_i32_ty],
|
|
[IntrReadMem]>;
|
|
def int_wasm_memory_grow : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_i32_ty, LLVMMatchType<0>],
|
|
[]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Saturating float-to-int conversions
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def int_wasm_trunc_saturate_signed : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_anyfloat_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_trunc_saturate_unsigned : Intrinsic<[llvm_anyint_ty],
|
|
[llvm_anyfloat_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Exception handling intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// throw / rethrow
|
|
def int_wasm_throw : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty],
|
|
[Throws, IntrNoReturn, ImmArg<0>]>;
|
|
def int_wasm_rethrow_in_catch : Intrinsic<[], [], [Throws, IntrNoReturn]>;
|
|
|
|
// Since wasm does not use landingpad instructions, these instructions return
|
|
// exception pointer and selector values until we lower them in WasmEHPrepare.
|
|
def int_wasm_get_exception : Intrinsic<[llvm_ptr_ty], [llvm_token_ty],
|
|
[IntrHasSideEffects]>;
|
|
def int_wasm_get_ehselector : Intrinsic<[llvm_i32_ty], [llvm_token_ty],
|
|
[IntrHasSideEffects]>;
|
|
// This is the same as llvm.wasm.get.exception except that it does not take a
|
|
// token operand. This is only for instruction selection purpose.
|
|
def int_wasm_extract_exception : Intrinsic<[llvm_ptr_ty], [],
|
|
[IntrHasSideEffects]>;
|
|
|
|
// WebAssembly EH must maintain the landingpads in the order assigned to them
|
|
// by WasmEHPrepare pass to generate landingpad table in EHStreamer. This is
|
|
// used in order to give them the indices in WasmEHPrepare.
|
|
def int_wasm_landingpad_index: Intrinsic<[], [llvm_token_ty, llvm_i32_ty],
|
|
[IntrNoMem, ImmArg<1>]>;
|
|
|
|
// Returns LSDA address of the current function.
|
|
def int_wasm_lsda : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Atomic intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// wait / notify
|
|
def int_wasm_atomic_wait_i32 :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[LLVMPointerType<llvm_i32_ty>, llvm_i32_ty, llvm_i64_ty],
|
|
[IntrInaccessibleMemOrArgMemOnly, ReadOnly<0>, NoCapture<0>,
|
|
IntrHasSideEffects],
|
|
"", [SDNPMemOperand]>;
|
|
def int_wasm_atomic_wait_i64 :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[LLVMPointerType<llvm_i64_ty>, llvm_i64_ty, llvm_i64_ty],
|
|
[IntrInaccessibleMemOrArgMemOnly, ReadOnly<0>, NoCapture<0>,
|
|
IntrHasSideEffects],
|
|
"", [SDNPMemOperand]>;
|
|
def int_wasm_atomic_notify:
|
|
Intrinsic<[llvm_i32_ty], [LLVMPointerType<llvm_i32_ty>, llvm_i32_ty],
|
|
[IntrInaccessibleMemOnly, NoCapture<0>, IntrHasSideEffects], "",
|
|
[SDNPMemOperand]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// SIMD intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def int_wasm_sub_saturate_signed :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_sub_saturate_unsigned :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_bitselect :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_anytrue :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_alltrue :
|
|
Intrinsic<[llvm_i32_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_qfma :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_qfms :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_narrow_signed :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[llvm_anyvector_ty, LLVMMatchType<1>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_narrow_unsigned :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[llvm_anyvector_ty, LLVMMatchType<1>],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_widen_low_signed :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_widen_high_signed :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_widen_low_unsigned :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
def int_wasm_widen_high_unsigned :
|
|
Intrinsic<[llvm_anyvector_ty],
|
|
[llvm_anyvector_ty],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Bulk memory intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def int_wasm_memory_init :
|
|
Intrinsic<[],
|
|
[llvm_i32_ty, llvm_i32_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
|
|
[IntrWriteMem, IntrInaccessibleMemOrArgMemOnly, WriteOnly<2>,
|
|
IntrHasSideEffects, ImmArg<0>, ImmArg<1>]>;
|
|
def int_wasm_data_drop :
|
|
Intrinsic<[],
|
|
[llvm_i32_ty],
|
|
[IntrNoDuplicate, IntrHasSideEffects, ImmArg<0>]>;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Thread-local storage intrinsics
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def int_wasm_tls_size :
|
|
Intrinsic<[llvm_anyint_ty],
|
|
[],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
|
|
def int_wasm_tls_align :
|
|
Intrinsic<[llvm_anyint_ty],
|
|
[],
|
|
[IntrNoMem, IntrSpeculatable]>;
|
|
|
|
def int_wasm_tls_base :
|
|
Intrinsic<[llvm_ptr_ty],
|
|
[],
|
|
[IntrReadMem]>;
|
|
|
|
} // TargetPrefix = "wasm"
|