[ARM] Add DSP build attribute and extension targeting
authorBradley Smith <bradley.smith@arm.com>
Mon, 25 Jan 2016 11:26:11 +0000 (11:26 +0000)
committerBradley Smith <bradley.smith@arm.com>
Mon, 25 Jan 2016 11:26:11 +0000 (11:26 +0000)
This patch was originally committed as r257885, but was reverted due to windows
failures. The cause of these failures has been fixed under r258677, hence
re-committing the original patch.

llvm-svn: 258683

12 files changed:
llvm/include/llvm/Support/ARMBuildAttributes.h
llvm/include/llvm/Support/ARMTargetParser.def
llvm/lib/Support/ARMBuildAttrs.cpp
llvm/lib/Target/ARM/ARMAsmPrinter.cpp
llvm/test/CodeGen/ARM/build-attributes-encoding.s
llvm/test/CodeGen/ARM/build-attributes.ll
llvm/test/MC/ARM/directive-eabi_attribute.s
llvm/test/MC/ARM/thumbv8m.s
llvm/test/tools/llvm-readobj/ARM/attribute-0.s
llvm/test/tools/llvm-readobj/ARM/attribute-1.s
llvm/tools/llvm-readobj/ARMAttributeParser.cpp
llvm/tools/llvm-readobj/ARMAttributeParser.h

index 8ee3b01..f447cd0 100644 (file)
@@ -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,
index d25edc5..6f2f86e 100644 (file)
@@ -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)
index 960a0f1..6d34f76 100644 (file)
@@ -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" },
index 84b494a..9247160 100644 (file)
@@ -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
index 29f13f0..5649726 100644 (file)
@@ -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
 
 // 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:     )
index 28fbcd7..561ab9e 100644 (file)
@@ -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
 ; 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
 ; 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
index 74a51ab..e848f77 100644 (file)
 @ 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
index 883503a..fe7a2df 100644 (file)
@@ -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
index b761dd8..bad2395 100644 (file)
 @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
index f433cbc..c710bc8 100644 (file)
 @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
index 688d349..d490510 100644 (file)
@@ -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" };
index f924c83..a582856 100644 (file)
@@ -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,