Author: Krzysztof Parzyszek Date: 2021-12-23T10:17:08-08:00 New Revision: 1d1b5efdef49fa814a7e4feadd175a3dfc6460a0
URL: https://github.com/llvm/llvm-project/commit/1d1b5efdef49fa814a7e4feadd175a3dfc6460a0 DIFF: https://github.com/llvm/llvm-project/commit/1d1b5efdef49fa814a7e4feadd175a3dfc6460a0.diff LOG: [Hexagon] Driver/preprocessor options for Hexagon v69 Added: clang/test/Driver/hexagon-hvx-ieee-fp.c clang/test/Driver/hexagon-hvx-qfloat.c Modified: clang/include/clang/Basic/DiagnosticDriverKinds.td clang/include/clang/Driver/Options.td clang/lib/Basic/Targets/Hexagon.cpp clang/lib/Driver/ToolChains/Hexagon.cpp clang/lib/Headers/hexagon_types.h clang/test/Driver/hexagon-hvx.c clang/test/Driver/hexagon-toolchain-elf.c clang/test/Misc/target-invalid-cpu-note.c clang/test/Preprocessor/hexagon-predefines.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 9776cd7b7b250..3025e6fe3c02d 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -449,6 +449,11 @@ def warn_drv_vectorize_needs_hvx : Warning< "auto-vectorization requires HVX, use -mhvx to enable it">, InGroup<OptionIgnored>; +def err_drv_invalid_hvx_qfloat : Error< + "-mhvx-qfloat is not supported without a -mhvx/-mhvx= flag.">; +def err_drv_invalid_arch_hvx_qfloat : Error< + "-mhvx-qfloat is not supported on HVX %0.">; + def err_drv_module_header_wrong_kind : Error< "header file '%0' input type '%1' does not match type of prior input " "in module compilation; use '-x %2' to override">; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 08e9e1a3432ae..dc8bd831f2a26 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4160,6 +4160,8 @@ def mv67t : Flag<["-"], "mv67t">, Group<m_hexagon_Features_Group>, Alias<mcpu_EQ>, AliasArgs<["hexagonv67t"]>; def mv68 : Flag<["-"], "mv68">, Group<m_hexagon_Features_Group>, Alias<mcpu_EQ>, AliasArgs<["hexagonv68"]>; +def mv69 : Flag<["-"], "mv69">, Group<m_hexagon_Features_Group>, + Alias<mcpu_EQ>, AliasArgs<["hexagonv69"]>; def mhexagon_hvx : Flag<["-"], "mhvx">, Group<m_hexagon_Features_HVX_Group>, HelpText<"Enable Hexagon Vector eXtensions">; def mhexagon_hvx_EQ : Joined<["-"], "mhvx=">, @@ -4171,6 +4173,18 @@ def mno_hexagon_hvx : Flag<["-"], "mno-hvx">, def mhexagon_hvx_length_EQ : Joined<["-"], "mhvx-length=">, Group<m_hexagon_Features_HVX_Group>, HelpText<"Set Hexagon Vector Length">, Values<"64B,128B">; +def mhexagon_hvx_qfloat : Flag<["-"], "mhvx-qfloat">, + Group<m_hexagon_Features_HVX_Group>, + HelpText<"Enable Hexagon HVX QFloat instructions">; +def mno_hexagon_hvx_qfloat : Flag<["-"], "mno-hvx-qfloat">, + Group<m_hexagon_Features_HVX_Group>, + HelpText<"Disable Hexagon HVX QFloat instructions">; +def mhexagon_hvx_ieee_fp : Flag<["-"], "mhvx-ieee-fp">, + Group<m_hexagon_Features_Group>, + HelpText<"Enable Hexagon HVX IEEE floating-point">; +def mno_hexagon_hvx_ieee_fp : Flag<["-"], "mno-hvx-ieee-fp">, + Group<m_hexagon_Features_Group>, + HelpText<"Disable Hexagon HVX IEEE floating-point">; def ffixed_r19: Flag<["-"], "ffixed-r19">, HelpText<"Reserve register r19 (Hexagon only)">; def mmemops : Flag<["-"], "mmemops">, Group<m_hexagon_Features_Group>, diff --git a/clang/lib/Basic/Targets/Hexagon.cpp b/clang/lib/Basic/Targets/Hexagon.cpp index 9c37dee7e89a4..161369242926e 100644 --- a/clang/lib/Basic/Targets/Hexagon.cpp +++ b/clang/lib/Basic/Targets/Hexagon.cpp @@ -68,6 +68,9 @@ void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, } else if (CPU == "hexagonv68") { Builder.defineMacro("__HEXAGON_V68__"); Builder.defineMacro("__HEXAGON_ARCH__", "68"); + } else if (CPU == "hexagonv69") { + Builder.defineMacro("__HEXAGON_V69__"); + Builder.defineMacro("__HEXAGON_ARCH__", "69"); } if (hasFeature("hvx-length64b")) { @@ -128,6 +131,10 @@ bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, else if (F == "+audio") HasAudio = true; } + if (CPU.compare("hexagonv68") >= 0) { + HasLegalHalfType = true; + HasFloat16 = true; + } return true; } @@ -214,7 +221,7 @@ static constexpr CPUSuffix Suffixes[] = { {{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}}, {{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}}, {{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}}, - {{"hexagonv68"}, {"68"}}, + {{"hexagonv68"}, {"68"}}, {{"hexagonv69"}, {"69"}}, }; const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) { diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp index 2ce7904ecc40d..f9785e42025cc 100644 --- a/clang/lib/Driver/ToolChains/Hexagon.cpp +++ b/clang/lib/Driver/ToolChains/Hexagon.cpp @@ -88,6 +88,27 @@ static void handleHVXTargetFeatures(const Driver &D, const ArgList &Args, Args.MakeArgString(llvm::Twine("+hvx-length") + HVXLength.lower()); Features.push_back(HVXFeature); } + + // Handle -mhvx-qfloat. + // QFloat is valid only on HVX v68/v68+ as of now. + unsigned short CpuVer; + Cpu.drop_front(1).getAsInteger(10, CpuVer); + if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_qfloat, + options::OPT_mno_hexagon_hvx_qfloat)) { + if (A->getOption().matches(options::OPT_mno_hexagon_hvx_qfloat)) { + StringRef OptName = A->getOption().getName().substr(4); + Features.push_back(Args.MakeArgString("-" + OptName)); + return; + } + StringRef OptName = A->getOption().getName().substr(1); + if (HasHVX) { + if (CpuVer >= 68) + Features.push_back(Args.MakeArgString("+" + OptName)); + else + D.Diag(diag::err_drv_invalid_arch_hvx_qfloat) << Cpu; + } else + D.Diag(diag::err_drv_invalid_hvx_qfloat); + } } // Hexagon target features. @@ -156,6 +177,12 @@ void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fsyntax-only"); } + if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_ieee_fp, + options::OPT_mno_hexagon_hvx_ieee_fp)) { + if (A->getOption().matches(options::OPT_mhexagon_hvx_ieee_fp)) + CmdArgs.push_back("-mhvx-ieee-fp"); + } + if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { CmdArgs.push_back(Args.MakeArgString("-gpsize=" + Twine(G.getValue()))); } diff --git a/clang/lib/Headers/hexagon_types.h b/clang/lib/Headers/hexagon_types.h index 6958809418d8f..029727cc48176 100644 --- a/clang/lib/Headers/hexagon_types.h +++ b/clang/lib/Headers/hexagon_types.h @@ -1177,37 +1177,6 @@ class HEXAGON_Vect32C { #endif /* __cplusplus */ -// V65 Silver types -#if __Q6S_ARCH__ >= 65 - // Silver vector types are 128 bytes, and pairs are 256. The vector predicate - // types are 16 bytes and 32 bytes for pairs. - typedef long HEXAGON_VecPred128 __attribute__((__vector_size__(16))) - __attribute__((aligned(128))); - - typedef long HEXAGON_VecPred256 __attribute__((__vector_size__(32))) - __attribute__((aligned(128))); - - typedef long HEXAGON_Vect1024 __attribute__((__vector_size__(128))) - __attribute__((aligned(128))); - - typedef long HEXAGON_Vect2048 __attribute__((__vector_size__(256))) - __attribute__((aligned(256))); - - typedef long HEXAGON_UVect1024 __attribute__((__vector_size__(128))) - __attribute__((aligned(4))); - - typedef long HEXAGON_UVect2048 __attribute__((__vector_size__(256))) - __attribute__((aligned(4))); - - #define Q6S_VectorPredPair HEXAGON_VecPred256 - #define Q6S_VectorPred HEXAGON_VecPred128 - #define Q6S_Vector HEXAGON_Vect1024 - #define Q6S_VectorPair HEXAGON_Vect2048 - #define Q6S_UVector HEXAGON_UVect1024 - #define Q6S_UVectorPair HEXAGON_UVect2048 - -#else /* __Q6S_ARCH__ >= 65 */ - // V65 Vector types #if __HVX_ARCH__ >= 65 #if defined __HVX__ && (__HVX_LENGTH__ == 128) @@ -1256,7 +1225,6 @@ class HEXAGON_Vect32C { #endif /* defined __HVX__ && (__HVX_LENGTH__ == 64) */ #endif /* defined __HVX__ && (__HVX_LENGTH__ == 128) */ #endif /* __HVX_ARCH__ >= 65 */ -#endif /* __Q6S_ARCH__ >= 65 */ /* Predicates */ diff --git a/clang/test/Driver/hexagon-hvx-ieee-fp.c b/clang/test/Driver/hexagon-hvx-ieee-fp.c new file mode 100644 index 0000000000000..acc9a910f0f12 --- /dev/null +++ b/clang/test/Driver/hexagon-hvx-ieee-fp.c @@ -0,0 +1,14 @@ +// ----------------------------------------------------------------------------- +// Tests for the hvx ieee fp feature and errors. +// ----------------------------------------------------------------------------- + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-IEEEFP %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx=v68 -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-IEEEFP %s +// CHECK-IEEEFP: "-target-feature" "+hvx-ieee-fp" + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx -mhvx-ieee-fp \ +// RUN: -mno-hvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-NO-IEEEFP %s +// CHECK-NO-IEEEFP: "-target-feature" "-hvx-ieee-fp" + diff --git a/clang/test/Driver/hexagon-hvx-qfloat.c b/clang/test/Driver/hexagon-hvx-qfloat.c new file mode 100644 index 0000000000000..698451aae58ff --- /dev/null +++ b/clang/test/Driver/hexagon-hvx-qfloat.c @@ -0,0 +1,25 @@ +// ----------------------------------------------------------------------------- +// Tests for the hvx qfloat feature and errors. +// ----------------------------------------------------------------------------- + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-QFLOAT %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx=v68 -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-QFLOAT %s +// CHECK-QFLOAT: "-target-feature" "+hvx-qfloat" + +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx -mhvx-qfloat \ +// RUN: -mno-hvx-qfloat 2>&1 | FileCheck -check-prefix=CHECK-NO-QFLOAT %s +// CHECK-NO-QFLOAT: "-target-feature" "-hvx-qfloat" + +// QFloat is valid only on hvxv68 and hvxv68+. +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx=v66 \ +// RUN: -mhvx-qfloat 2>&1 | FileCheck -check-prefix=CHECK-ERROR1 %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-ERROR1 %s +// CHECK-ERROR1: error: -mhvx-qfloat is not supported on HVX v66. + +// QFloat is valid only if HVX is enabled. +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv68 -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-ERROR2 %s +// CHECK-ERROR2: error: -mhvx-qfloat is not supported without a -mhvx/-mhvx= flag. diff --git a/clang/test/Driver/hexagon-hvx.c b/clang/test/Driver/hexagon-hvx.c index 4642aef81a319..aab7e329471b8 100644 --- a/clang/test/Driver/hexagon-hvx.c +++ b/clang/test/Driver/hexagon-hvx.c @@ -2,10 +2,6 @@ // Tests for the hvx features and warnings. // ----------------------------------------------------------------------------- -// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx \ -// RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX166 %s -// CHECKHVX166: "-target-feature" "+hvxv66" - // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 -mhvx \ // RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX165 %s // CHECKHVX165: "-target-feature" "+hvxv65" @@ -14,6 +10,10 @@ // RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX162 %s // CHECKHVX162: "-target-feature" "+hvxv62" +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv66 -mhvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECKHVX166 %s +// CHECKHVX166: "-target-feature" "+hvxv66" + // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv65 -mhvx \ // RUN: -mhvx-length=128B 2>&1 | FileCheck -check-prefix=CHECKHVX2 %s @@ -39,6 +39,17 @@ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-NOHVX %s // CHECK-NOHVX-NOT: "-target-feature" "+hvx +// No hvx-ieee-fp target feature must be added if -mno-hvx-ieee-fp occurs last +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp -mno-hvx \ +// RUN: -mno-hvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-NOHVX-IEEE-FP %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp -mhvx \ +// RUN: -mno-hvx-ieee-fp 2>&1 | FileCheck -check-prefix=CHECK-HVX-NOHVX-IEEE-FP %s +// +// CHECK-NOHVX-IEEE-FP-NOT: "-target-feature" "+hvx-ieee-fp" +// CHECK-HVX-NOHVX-IEEE-FP-NOT: "-target-feature" "+hvx-ieee-fp" +// CHECK-HVX-NOHVX-IEEE-FP: "-target-feature" "+hvx +// CHECK-HVX-NOHVX-IEEE-FP-NOT: "-target-feature" "+hvx-ieee-fp" + // Hvx target feature should be added if -mno-hvx doesn't occur last // RUN: %clang -c %s -### -target hexagon-unknown-elf -mv62 -mno-hvx -mhvx\ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXFEAT %s @@ -93,3 +104,15 @@ // RUN: %clang -c %s -### -target hexagon-unknown-elf -mhvx -mhvx-length=128 \ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXLENGTH-VALUE-ERROR %s // CHECK-HVXLENGTH-VALUE-ERROR: error: unsupported argument '{{.*}}' to option 'mhvx-length=' + +// Test -mhvx-ieee-fp flag +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXIEEEFP-LONE %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mhvx -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXIEEEFP %s +// RUN: %clang -c %s -### -target hexagon-unknown-elf -mv69 -mno-hvx -mhvx-ieee-fp \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVXIEEEFP %s +// CHECK-HVXIEEEFP-LONE-NOT: "-target-feature" "+hvx" +// CHECK-HVXIEEEFP-LONE: "-target-feature" "+hvx-ieee-fp" +// CHECK-HVXIEEEFP: "-target-feature" "+hvx-ieee-fp" +// CHECK-HVXIEEEFP-LONE-NOT: "-target-feature" "+hvx" diff --git a/clang/test/Driver/hexagon-toolchain-elf.c b/clang/test/Driver/hexagon-toolchain-elf.c index cc11f9fcba9e9..d7c8015547e47 100644 --- a/clang/test/Driver/hexagon-toolchain-elf.c +++ b/clang/test/Driver/hexagon-toolchain-elf.c @@ -151,6 +151,22 @@ // CHECK02B: "-cc1" {{.*}} "-target-cpu" "hexagonv67t" // CHECK02B: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v67t/crt0 +// RUN: %clang -### -target hexagon-unknown-elf \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: -mcpu=hexagonv68 -fuse-ld=hexagon-link\ +// RUN: %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK02C %s +// CHECK02C: "-cc1" {{.*}} "-target-cpu" "hexagonv68" +// CHECK02C: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v68/crt0 + +// RUN: %clang -### -target hexagon-unknown-elf \ +// RUN: -ccc-install-dir %S/Inputs/hexagon_tree/Tools/bin \ +// RUN: -mcpu=hexagonv69 -fuse-ld=hexagon-link\ +// RUN: %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK02D %s +// CHECK02D: "-cc1" {{.*}} "-target-cpu" "hexagonv69" +// CHECK02D: hexagon-link{{.*}}/Inputs/hexagon_tree/Tools/bin/../target/hexagon/lib/v69/crt0 + // ----------------------------------------------------------------------------- // Test Linker related args // ----------------------------------------------------------------------------- diff --git a/clang/test/Misc/target-invalid-cpu-note.c b/clang/test/Misc/target-invalid-cpu-note.c index 1b436d8d904f2..04f5a7532b421 100644 --- a/clang/test/Misc/target-invalid-cpu-note.c +++ b/clang/test/Misc/target-invalid-cpu-note.c @@ -69,7 +69,7 @@ // RUN: not %clang_cc1 -triple hexagon--- -target-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix HEXAGON // HEXAGON: error: unknown target CPU 'not-a-cpu' -// HEXAGON-NEXT: note: valid target CPU values are: hexagonv5, hexagonv55, hexagonv60, hexagonv62, hexagonv65, hexagonv66, hexagonv67, hexagonv67t, hexagonv68{{$}} +// HEXAGON-NEXT: note: valid target CPU values are: hexagonv5, hexagonv55, hexagonv60, hexagonv62, hexagonv65, hexagonv66, hexagonv67, hexagonv67t, hexagonv68, hexagonv69{{$}} // RUN: not %clang_cc1 -triple bpf--- -target-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix BPF // BPF: error: unknown target CPU 'not-a-cpu' diff --git a/clang/test/Preprocessor/hexagon-predefines.c b/clang/test/Preprocessor/hexagon-predefines.c index e948d70248504..576dc4b6cb381 100644 --- a/clang/test/Preprocessor/hexagon-predefines.c +++ b/clang/test/Preprocessor/hexagon-predefines.c @@ -107,6 +107,17 @@ // CHECK-V68HVX-128B: #define __HVX__ 1 // CHECK-V68HVX-128B: #define __hexagon__ 1 +// RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv69 \ +// RUN: -target-feature +hvxv69 -target-feature +hvx-length128b %s | FileCheck \ +// RUN: %s -check-prefix CHECK-V69HVX-128B +// CHECK-V69HVX-128B: #define __HEXAGON_ARCH__ 69 +// CHECK-V69HVX-128B: #define __HEXAGON_V69__ 1 +// CHECK-V69HVX-128B: #define __HVX_ARCH__ 69 +// CHECK-V69HVX-128B: #define __HVX_LENGTH__ 128 +// CHECK-V69HVX-128B: #define __HVX__ 1 +// CHECK-V69HVX-128B: #define __hexagon__ 1 + + // RUN: %clang_cc1 -E -dM -triple hexagon-unknown-elf -target-cpu hexagonv67 \ // RUN: -target-feature +hvxv67 -target-feature +hvx-length128b %s | FileCheck \ // RUN: %s -check-prefix CHECK-ELF _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits