diff --git a/include/llvm/Support/ARMBuildAttributes.h b/include/llvm/Support/ARMBuildAttributes.h index 8ee3b01dc9a..f447cd072b5 100644 --- a/include/llvm/Support/ARMBuildAttributes.h +++ b/include/llvm/Support/ARMBuildAttributes.h @@ -67,6 +67,7 @@ enum AttrType { ABI_FP_16bit_format = 38, MPextension_use = 42, // recoded from 70 (ABI r2.08) DIV_use = 44, + DSP_extension = 46, also_compatible_with = 65, conformance = 67, Virtualization_use = 68, diff --git a/include/llvm/Support/ARMTargetParser.def b/include/llvm/Support/ARMTargetParser.def index d25edc5eadb..6f2f86e0db2 100644 --- a/include/llvm/Support/ARMTargetParser.def +++ b/include/llvm/Support/ARMTargetParser.def @@ -116,6 +116,7 @@ ARM_ARCH_EXT_NAME("invalid", AEK_INVALID, nullptr, nullptr) ARM_ARCH_EXT_NAME("none", AEK_NONE, nullptr, nullptr) ARM_ARCH_EXT_NAME("crc", AEK_CRC, "+crc", "-crc") ARM_ARCH_EXT_NAME("crypto", AEK_CRYPTO, "+crypto","-crypto") +ARM_ARCH_EXT_NAME("dsp", AEK_DSP, "+dsp", "-dsp") ARM_ARCH_EXT_NAME("fp", AEK_FP, nullptr, nullptr) ARM_ARCH_EXT_NAME("idiv", (AEK_HWDIVARM | AEK_HWDIV), nullptr, nullptr) ARM_ARCH_EXT_NAME("mp", AEK_MP, nullptr, nullptr) diff --git a/lib/Support/ARMBuildAttrs.cpp b/lib/Support/ARMBuildAttrs.cpp index 960a0f13c67..6d34f76f0c2 100644 --- a/lib/Support/ARMBuildAttrs.cpp +++ b/lib/Support/ARMBuildAttrs.cpp @@ -54,6 +54,7 @@ const struct { { ARMBuildAttrs::ABI_FP_16bit_format, "Tag_ABI_FP_16bit_format" }, { ARMBuildAttrs::MPextension_use, "Tag_MPextension_use" }, { ARMBuildAttrs::DIV_use, "Tag_DIV_use" }, + { ARMBuildAttrs::DSP_extension, "Tag_DSP_extension" }, { ARMBuildAttrs::nodefaults, "Tag_nodefaults" }, { ARMBuildAttrs::also_compatible_with, "Tag_also_compatible_with" }, { ARMBuildAttrs::T2EE_use, "Tag_T2EE_use" }, diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 84b494a88f6..9247160dd75 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -807,6 +807,9 @@ void ARMAsmPrinter::emitAttributes() { if (STI.hasDivideInARMMode() && !STI.hasV8Ops()) ATS.emitAttribute(ARMBuildAttrs::DIV_use, ARMBuildAttrs::AllowDIVExt); + if (STI.hasDSP() && isV8M(&STI)) + ATS.emitAttribute(ARMBuildAttrs::DSP_extension, ARMBuildAttrs::Allowed); + if (MMI) { if (const Module *SourceModule = MMI->getModule()) { // ABI_PCS_wchar_t to indicate wchar_t width diff --git a/test/CodeGen/ARM/build-attributes-encoding.s b/test/CodeGen/ARM/build-attributes-encoding.s index 29f13f09d31..5649726c12b 100644 --- a/test/CodeGen/ARM/build-attributes-encoding.s +++ b/test/CodeGen/ARM/build-attributes-encoding.s @@ -54,6 +54,9 @@ // Tag_DIV_use (=44) .eabi_attribute 44, 2 +// Tag_DSP_extension (=46) +.eabi_attribute 46, 1 + // Tag_Virtualization_use (=68) .eabi_attribute 68, 3 @@ -71,15 +74,15 @@ // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x0 // CHECK-NEXT: Offset: 0x34 -// CHECK-NEXT: Size: 71 +// CHECK-NEXT: Size: 73 // CHECK-NEXT: Link: 0 // CHECK-NEXT: Info: 0 // CHECK-NEXT: AddressAlignment: 1 // CHECK-NEXT: EntrySize: 0 // CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 41460000 00616561 62690001 3C000000 +// CHECK-NEXT: 0000: 41480000 00616561 62690001 3E000000 // CHECK-NEXT: 0010: 05636F72 7465782D 61380006 0A074108 // CHECK-NEXT: 0020: 0109020A 030C0214 01150117 01180119 -// CHECK-NEXT: 0030: 011B001C 0124012A 012C0244 036EA001 -// CHECK-NEXT: 0040: 81013100 FA0101 +// CHECK-NEXT: 0030: 011B001C 0124012A 012C022E 0144036E +// CHECK-NEXT: 0040: A0018101 3100FA01 01 // CHECK-NEXT: ) diff --git a/test/CodeGen/ARM/build-attributes.ll b/test/CodeGen/ARM/build-attributes.ll index 28fbcd7edc5..561ab9e3c58 100644 --- a/test/CodeGen/ARM/build-attributes.ll +++ b/test/CodeGen/ARM/build-attributes.ll @@ -29,6 +29,7 @@ ; RUN: llc < %s -mtriple=armv8-linux-gnueabi | FileCheck %s --check-prefix=V8-FPARMv8-NEON-CRYPTO ; RUN: llc < %s -mtriple=thumbv8m.base-linux-gnueabi | FileCheck %s --check-prefix=V8MBASELINE ; RUN: llc < %s -mtriple=thumbv8m.main-linux-gnueabi | FileCheck %s --check-prefix=V8MMAINLINE +; RUN: llc < %s -mtriple=thumbv8m.main-linux-gnueabi -mattr=+dsp | FileCheck %s --check-prefix=V8MMAINLINE_DSP ; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a5 | FileCheck %s --check-prefix=CORTEX-A5-DEFAULT ; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a5 -enable-unsafe-fp-math -disable-fp-elim -enable-no-infs-fp-math -enable-no-nans-fp-math -fp-contract=fast | FileCheck %s --check-prefix=CORTEX-A5-DEFAULT-FAST ; RUN: llc < %s -mtriple=armv7-linux-gnueabi -mcpu=cortex-a5 -enable-sign-dependent-rounding-fp-math | FileCheck %s --check-prefix=DYN-ROUNDING @@ -391,6 +392,14 @@ ; V8MMAINLINE: .eabi_attribute 7, 77 ; V8MMAINLINE: .eabi_attribute 8, 0 ; V8MMAINLINE: .eabi_attribute 9, 3 +; V8MMAINLINE_DSP-NOT: .eabi_attribute 46 + +; V8MMAINLINE_DSP: .syntax unified +; V8MBASELINE_DSP: .eabi_attribute 6, 17 +; V8MBASELINE_DSP: .eabi_attribute 7, 77 +; V8MMAINLINE_DSP: .eabi_attribute 8, 0 +; V8MMAINLINE_DSP: .eabi_attribute 9, 3 +; V8MMAINLINE_DSP: .eabi_attribute 46, 1 ; Tag_CPU_unaligned_access ; NO-STRICT-ALIGN: .eabi_attribute 34, 1 @@ -481,6 +490,9 @@ ; CORTEX-A7-NOFPU: .eabi_attribute 44, 2 ; CORTEX-A7-FPUV4: .eabi_attribute 44, 2 +; Tag_DSP_extension +; CORTEX-A7-CHECK-NOT: .eabi_attribute 46 + ; Tag_Virtualization_use ; CORTEX-A7-CHECK: .eabi_attribute 68, 3 ; CORTEX-A7-NOFPU: .eabi_attribute 68, 3 diff --git a/test/MC/ARM/directive-eabi_attribute.s b/test/MC/ARM/directive-eabi_attribute.s index 74a51ab7279..e848f774b34 100644 --- a/test/MC/ARM/directive-eabi_attribute.s +++ b/test/MC/ARM/directive-eabi_attribute.s @@ -209,6 +209,12 @@ @ CHECK-OBJ-NEXT: Value: 0 @ CHECK-OBJ-NEXT: TagName: DIV_use @ CHECK-OBJ-NEXT: Description: If Available + .eabi_attribute Tag_DSP_extension, 0 +@ CHECK: .eabi_attribute 46, 0 +@ CHECK-OBJ: Tag: 46 +@ CHECK-OBJ-NEXT: Value: 0 +@ CHECK-OBJ-NEXT: TagName: DSP_extension +@ CHECK-OBJ-NEXT: Description: Not Permitted .eabi_attribute Tag_nodefaults, 0 @ CHECK: .eabi_attribute 64, 0 @ CHECK-OBJ: Tag: 64 diff --git a/test/MC/ARM/thumbv8m.s b/test/MC/ARM/thumbv8m.s index 883503a4101..fe7a2df85b9 100644 --- a/test/MC/ARM/thumbv8m.s +++ b/test/MC/ARM/thumbv8m.s @@ -4,16 +4,30 @@ // RUN: not llvm-mc -triple=thumbv8m.main -show-encoding < %s 2>%t \ // RUN: | FileCheck --check-prefix=CHECK-MAINLINE --check-prefix=CHECK %s // RUN: FileCheck --check-prefix=UNDEF-MAINLINE --check-prefix=UNDEF < %t %s +// RUN: not llvm-mc -triple=thumbv8m.main -mattr=+dsp,+t2xtpk -show-encoding < %s 2>%t \ +// RUN: | FileCheck --check-prefix=CHECK-MAINLINE_DSP --check-prefix=CHECK %s +// RUN: FileCheck --check-prefix=UNDEF-MAINLINE_DSP --check-prefix=UNDEF < %t %s // Simple check that baseline is v6M and mainline is v7M // UNDEF-BASELINE: error: instruction requires: thumb2 // UNDEF-MAINLINE-NOT: error: instruction requires: +// UNDEF-MAINLINE_DSP-NOT: error: instruction requires: mov.w r0, r0 // Check that .arm is invalid // UNDEF: target does not support ARM mode .arm +// And only +dsp,+t2xtpk has DSP and t2xtpk instructions +// UNDEF-BASELINE: error: instruction requires: arm-mode +// UNDEF-MAINLINE: error: instruction requires: arm-mode +// UNDEF-MAINLINE_DSP-NOT: error: instruction requires: +qadd16 r0, r0, r0 +// UNDEF-BASELINE: error: instruction requires: arm-mode +// UNDEF-MAINLINE: error: instruction requires: arm-mode +// UNDEF-MAINLINE_DSP-NOT: error: instruction requires: +uxtab16 r0, r1, r2 + // Instruction availibility checks // 'Barrier instructions' @@ -157,10 +171,12 @@ ttat r0, r1 // UNDEF-BASELINE: error: instruction requires: armv8m.main // CHECK-MAINLINE: vlldm r5 @ encoding: [0x35,0xec,0x00,0x0a] +// CHECK-MAINLINE_DSP: vlldm r5 @ encoding: [0x35,0xec,0x00,0x0a] vlldm r5 // UNDEF-BASELINE: error: instruction requires: armv8m.main // CHECK-MAINLINE: vlstm r10 @ encoding: [0x2a,0xec,0x00,0x0a] +// CHECK-MAINLINE_DSP: vlstm r10 @ encoding: [0x2a,0xec,0x00,0x0a] vlstm r10 // New SYSm's diff --git a/test/tools/llvm-readobj/ARM/attribute-0.s b/test/tools/llvm-readobj/ARM/attribute-0.s index b761dd8f251..bad23957b79 100644 --- a/test/tools/llvm-readobj/ARM/attribute-0.s +++ b/test/tools/llvm-readobj/ARM/attribute-0.s @@ -225,6 +225,13 @@ @CHECK-OBJ-NEXT: TagName: DIV_use @CHECK-OBJ-NEXT: Description: If Available +.eabi_attribute Tag_DSP_extension, 0 +@CHECK: .eabi_attribute 46, 0 +@CHECK-OBJ: Tag: 46 +@CHECK-OBJ-NEXT: Value: 0 +@CHECK-OBJ-NEXT: TagName: DSP_extension +@CHECK-OBJ-NEXT: Description: Not Permitted + .eabi_attribute Tag_Virtualization_use, 0 @CHECK: .eabi_attribute 68, 0 @CHECK-OBJ: Tag: 68 diff --git a/test/tools/llvm-readobj/ARM/attribute-1.s b/test/tools/llvm-readobj/ARM/attribute-1.s index f433cbcc19b..c710bc873f1 100644 --- a/test/tools/llvm-readobj/ARM/attribute-1.s +++ b/test/tools/llvm-readobj/ARM/attribute-1.s @@ -211,6 +211,13 @@ @CHECK-OBJ-NEXT: TagName: DIV_use @CHECK-OBJ-NEXT: Description: Not Permitted +.eabi_attribute Tag_DSP_extension, 1 +@CHECK: .eabi_attribute 46, 1 +@CHECK-OBJ: Tag: 46 +@CHECK-OBJ-NEXT: Value: 1 +@CHECK-OBJ-NEXT: TagName: DSP_extension +@CHECK-OBJ-NEXT: Description: Permitted + .eabi_attribute Tag_Virtualization_use, 1 @CHECK: .eabi_attribute 68, 1 @CHECK-OBJ: Tag: 68 diff --git a/tools/llvm-readobj/ARMAttributeParser.cpp b/tools/llvm-readobj/ARMAttributeParser.cpp index 688d349d7ec..d490510abe7 100644 --- a/tools/llvm-readobj/ARMAttributeParser.cpp +++ b/tools/llvm-readobj/ARMAttributeParser.cpp @@ -63,6 +63,7 @@ ARMAttributeParser::DisplayRoutines[] = { ATTRIBUTE_HANDLER(ABI_FP_16bit_format), ATTRIBUTE_HANDLER(MPextension_use), ATTRIBUTE_HANDLER(DIV_use), + ATTRIBUTE_HANDLER(DSP_extension), ATTRIBUTE_HANDLER(T2EE_use), ATTRIBUTE_HANDLER(Virtualization_use), ATTRIBUTE_HANDLER(nodefaults) @@ -517,6 +518,16 @@ void ARMAttributeParser::DIV_use(AttrType Tag, const uint8_t *Data, PrintAttribute(Tag, Value, ValueDesc); } +void ARMAttributeParser::DSP_extension(AttrType Tag, const uint8_t *Data, + uint32_t &Offset) { + static const char *const Strings[] = { "Not Permitted", "Permitted" }; + + uint64_t Value = ParseInteger(Data, Offset); + StringRef ValueDesc = + (Value < array_lengthof(Strings)) ? Strings[Value] : nullptr; + PrintAttribute(Tag, Value, ValueDesc); +} + void ARMAttributeParser::T2EE_use(AttrType Tag, const uint8_t *Data, uint32_t &Offset) { static const char *const Strings[] = { "Not Permitted", "Permitted" }; diff --git a/tools/llvm-readobj/ARMAttributeParser.h b/tools/llvm-readobj/ARMAttributeParser.h index f924c835d3e..a58285688f2 100644 --- a/tools/llvm-readobj/ARMAttributeParser.h +++ b/tools/llvm-readobj/ARMAttributeParser.h @@ -100,6 +100,8 @@ class ARMAttributeParser { uint32_t &Offset); void DIV_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, uint32_t &Offset); + void DSP_extension(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, + uint32_t &Offset); void T2EE_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data, uint32_t &Offset); void Virtualization_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,