Skip to content

Commit

Permalink
[SveEmitter] Fix encoding/decoding of SVETypeFlags
Browse files Browse the repository at this point in the history
Summary:
This issue was introduced when reworking D75861. The bug isn't
actually hit with current unit tests because the contiguous loads/stores
infer the EltType and the MemEltType from the pointer and result, rather
than using the flags. But it will be needed for other intrinsics, such as
gather/scatter.

Reviewers: SjoerdMeijer, Andrzej

Reviewed By: SjoerdMeijer

Subscribers: andwar, tschuett, cfe-commits, llvm-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D76617
  • Loading branch information
sdesmalen-arm committed Apr 14, 2020
1 parent 17a68c6 commit f6ea026
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 98 deletions.
24 changes: 20 additions & 4 deletions clang/include/clang/Basic/TargetBuiltins.h
Expand Up @@ -17,6 +17,7 @@

#include <stdint.h>
#include "clang/Basic/Builtins.h"
#include "llvm/Support/MathExtras.h"
#undef PPC

namespace clang {
Expand Down Expand Up @@ -163,6 +164,9 @@ namespace clang {
/// Flags to identify the types for overloaded SVE builtins.
class SVETypeFlags {
uint64_t Flags;
unsigned EltTypeShift;
unsigned MemEltTypeShift;
unsigned MergeTypeShift;

public:
#define LLVM_GET_SVE_TYPEFLAGS
Expand All @@ -181,15 +185,27 @@ namespace clang {
#undef LLVM_GET_SVE_MEMELTTYPES
};

SVETypeFlags(uint64_t F) : Flags(F) {}
SVETypeFlags(EltType ET, bool IsUnsigned) : Flags(ET) {}
enum MergeType {
#define LLVM_GET_SVE_MERGETYPES
#include "clang/Basic/arm_sve_typeflags.inc"
#undef LLVM_GET_SVE_MERGETYPES
};
SVETypeFlags(uint64_t F) : Flags(F) {
EltTypeShift = llvm::countTrailingZeros(EltTypeMask);
MemEltTypeShift = llvm::countTrailingZeros(MemEltTypeMask);
MergeTypeShift = llvm::countTrailingZeros(MergeTypeMask);
}

EltType getEltType() const {
return (EltType)((Flags & EltTypeMask) - FirstEltType);
return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
}

MemEltType getMemEltType() const {
return (MemEltType)((Flags & MemEltTypeMask) - FirstMemEltType);
return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
}

MergeType getMergeType() const {
return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
}

bool isLoad() const { return Flags & IsLoad; }
Expand Down
32 changes: 19 additions & 13 deletions clang/include/clang/Basic/arm_sve.td
Expand Up @@ -84,15 +84,16 @@
// Y: const pointer to uint32_t
// Z: const pointer to uint64_t

class MergeType<int val> {
class MergeType<int val, string suffix=""> {
int Value = val;
string Suffix = suffix;
}
def MergeNone : MergeType<0>;
def MergeAny : MergeType<1>;
def MergeOp1 : MergeType<2>;
def MergeZero : MergeType<3>;
def MergeAnyExp : MergeType<4>; // Use merged builtin with explicit
def MergeZeroExp : MergeType<5>; // generation of its inactive argument.
def MergeAny : MergeType<1, "_x">;
def MergeOp1 : MergeType<2, "_m">;
def MergeZero : MergeType<3, "_z">;
def MergeAnyExp : MergeType<4, "_x">; // Use merged builtin with explicit
def MergeZeroExp : MergeType<5, "_z">; // generation of its inactive argument.

class EltType<int val> {
int Value = val;
Expand Down Expand Up @@ -134,13 +135,17 @@ def FirstMemEltType : FlagType<0x00000010>;
// : :
// : :
def MemEltTypeMask : FlagType<0x00000070>;
def IsLoad : FlagType<0x00000080>;
def IsStore : FlagType<0x00000100>;
def IsGatherLoad : FlagType<0x00000200>;
def IsScatterStore : FlagType<0x00000400>;
def IsStructLoad : FlagType<0x00000800>;
def IsStructStore : FlagType<0x00001000>;
def IsZExtReturn : FlagType<0x00002000>; // Return value is sign-extend by default
def FirstMergeTypeMask : FlagType<0x00000080>;
// : :
// : :
def MergeTypeMask : FlagType<0x00000380>;
def IsLoad : FlagType<0x00002000>;
def IsStore : FlagType<0x00004000>;
def IsGatherLoad : FlagType<0x00008000>;
def IsScatterStore : FlagType<0x00010000>;
def IsStructLoad : FlagType<0x00020000>;
def IsStructStore : FlagType<0x00040000>;
def IsZExtReturn : FlagType<0x00080000>; // Return value is sign-extend by default

// Every intrinsic subclasses Inst.
class Inst<string n, string p, string t, MergeType mt, string i,
Expand All @@ -150,6 +155,7 @@ class Inst<string n, string p, string t, MergeType mt, string i,
string Types = t;
string ArchGuard = "";
int Merge = mt.Value;
string MergeSuffix = mt.Suffix;
string LLVMIntrinsic = i;
list<FlagType> Flags = ft;
int MemEltType = met.Value;
Expand Down

0 comments on commit f6ea026

Please sign in to comment.