mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
b3e8c4675d
Summary: This patch adds support for scalable vectors in intrinsics, enabling intrinsics such as the following to be defined: declare <vscale x 4 x i32> @llvm.something.nxv4i32(<vscale x 4 x i32>) Support for this is implemented by defining a new type descriptor for scalable vectors and adding mangling support for scalable vector types in the name mangling scheme used by 'any' types in intrinsic signatures. Tests have been added for IRBuilder to test scalable vectors work as expected when using intrinsics through this interface. This required implementing an intrinsic that is explicitly defined with scalable vectors, e.g. LLVMType<nxv4i32>, an SVE floating-point convert intrinsic was used for this. The behaviour of the overloaded type LLVMScalarOrSameVectorWidth with scalable vectors is tested using the existing masked load intrinsic. Also added an .ll test to test the Verifier catches a bad intrinsic argument when passing a fixed-width predicate (mask) to the masked.load intrinsic where a scalable is expected. Patch by Paul Walker Reviewed By: sdesmalen Differential Revision: https://reviews.llvm.org/D65930 llvm-svn: 370053
47 lines
1.5 KiB
C++
47 lines
1.5 KiB
C++
//===- ScalableSize.h - Scalable vector size info ---------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file provides a struct that can be used to query the size of IR types
|
|
// which may be scalable vectors. It provides convenience operators so that
|
|
// it can be used in much the same way as a single scalar value.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_SCALABLESIZE_H
|
|
#define LLVM_SUPPORT_SCALABLESIZE_H
|
|
|
|
namespace llvm {
|
|
|
|
class ElementCount {
|
|
public:
|
|
unsigned Min; // Minimum number of vector elements.
|
|
bool Scalable; // If true, NumElements is a multiple of 'Min' determined
|
|
// at runtime rather than compile time.
|
|
|
|
ElementCount(unsigned Min, bool Scalable)
|
|
: Min(Min), Scalable(Scalable) {}
|
|
|
|
ElementCount operator*(unsigned RHS) {
|
|
return { Min * RHS, Scalable };
|
|
}
|
|
ElementCount operator/(unsigned RHS) {
|
|
return { Min / RHS, Scalable };
|
|
}
|
|
|
|
bool operator==(const ElementCount& RHS) const {
|
|
return Min == RHS.Min && Scalable == RHS.Scalable;
|
|
}
|
|
bool operator!=(const ElementCount& RHS) const {
|
|
return !(*this == RHS);
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_SUPPORT_SCALABLESIZE_H
|