//===- AtomicOps.cpp - MLIR SPIR-V Atomic Ops ----------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // Defines the atomic operations in the SPIR-V dialect. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" #include "SPIRVOpUtils.h" #include "SPIRVParsingUtils.h" using namespace mlir::spirv::AttrNames; namespace mlir::spirv { template static StringRef stringifyTypeName(); template <> StringRef stringifyTypeName() { return "integer"; } template <> StringRef stringifyTypeName() { return "float"; } // Verifies an atomic update op. template static LogicalResult verifyAtomicUpdateOp(Operation *op) { auto ptrType = llvm::cast(op->getOperand(0).getType()); auto elementType = ptrType.getPointeeType(); if (!llvm::isa(elementType)) return op->emitOpError() << "pointer operand must point to an " << stringifyTypeName() << " value, found " << elementType; auto memorySemantics = op->getAttrOfType(kSemanticsAttrName) .getValue(); if (failed(verifyMemorySemantics(op, memorySemantics))) { return failure(); } return success(); } //===----------------------------------------------------------------------===// // spirv.AtomicAndOp //===----------------------------------------------------------------------===// LogicalResult AtomicAndOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicIAddOp //===----------------------------------------------------------------------===// LogicalResult AtomicIAddOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.EXT.AtomicFAddOp //===----------------------------------------------------------------------===// LogicalResult EXTAtomicFAddOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicIDecrementOp //===----------------------------------------------------------------------===// LogicalResult AtomicIDecrementOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicIIncrementOp //===----------------------------------------------------------------------===// LogicalResult AtomicIIncrementOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicISubOp //===----------------------------------------------------------------------===// LogicalResult AtomicISubOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicOrOp //===----------------------------------------------------------------------===// LogicalResult AtomicOrOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicSMaxOp //===----------------------------------------------------------------------===// LogicalResult AtomicSMaxOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicSMinOp //===----------------------------------------------------------------------===// LogicalResult AtomicSMinOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicUMaxOp //===----------------------------------------------------------------------===// LogicalResult AtomicUMaxOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicUMinOp //===----------------------------------------------------------------------===// LogicalResult AtomicUMinOp::verify() { return verifyAtomicUpdateOp(getOperation()); } //===----------------------------------------------------------------------===// // spirv.AtomicXorOp //===----------------------------------------------------------------------===// LogicalResult AtomicXorOp::verify() { return verifyAtomicUpdateOp(getOperation()); } } // namespace mlir::spirv