mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Report error if codegen tries to instantiate a ARM target when the cpu does support it. e.g. cortex-m* processors.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110798 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -28,6 +28,8 @@ def FeatureNEON : SubtargetFeature<"neon", "ARMFPUType", "NEON",
 | 
				
			|||||||
                                   "Enable NEON instructions">;
 | 
					                                   "Enable NEON instructions">;
 | 
				
			||||||
def FeatureThumb2 : SubtargetFeature<"thumb2", "ThumbMode", "Thumb2",
 | 
					def FeatureThumb2 : SubtargetFeature<"thumb2", "ThumbMode", "Thumb2",
 | 
				
			||||||
                                     "Enable Thumb2 instructions">;
 | 
					                                     "Enable Thumb2 instructions">;
 | 
				
			||||||
 | 
					def FeatureNoARM  : SubtargetFeature<"noarm", "NoARM", "true",
 | 
				
			||||||
 | 
					                                     "Does not support ARM mode execution">;
 | 
				
			||||||
def FeatureFP16   : SubtargetFeature<"fp16", "HasFP16", "true",
 | 
					def FeatureFP16   : SubtargetFeature<"fp16", "HasFP16", "true",
 | 
				
			||||||
                                     "Enable half-precision floating point">;
 | 
					                                     "Enable half-precision floating point">;
 | 
				
			||||||
def FeatureHWDiv  : SubtargetFeature<"hwdiv", "HasHardwareDivide", "true",
 | 
					def FeatureHWDiv  : SubtargetFeature<"hwdiv", "HasHardwareDivide", "true",
 | 
				
			||||||
@@ -69,7 +71,7 @@ def ArchV6      : SubtargetFeature<"v6", "ARMArchVersion", "V6",
 | 
				
			|||||||
                                   "ARM v6">;
 | 
					                                   "ARM v6">;
 | 
				
			||||||
def ArchV6M     : SubtargetFeature<"v6m", "ARMArchVersion", "V6M",
 | 
					def ArchV6M     : SubtargetFeature<"v6m", "ARMArchVersion", "V6M",
 | 
				
			||||||
                                   "ARM v6m",
 | 
					                                   "ARM v6m",
 | 
				
			||||||
                                   [FeatureDB]>;
 | 
					                                   [FeatureNoARM, FeatureDB]>;
 | 
				
			||||||
def ArchV6T2    : SubtargetFeature<"v6t2", "ARMArchVersion", "V6T2",
 | 
					def ArchV6T2    : SubtargetFeature<"v6t2", "ARMArchVersion", "V6T2",
 | 
				
			||||||
                                   "ARM v6t2",
 | 
					                                   "ARM v6t2",
 | 
				
			||||||
                                   [FeatureThumb2]>;
 | 
					                                   [FeatureThumb2]>;
 | 
				
			||||||
@@ -78,7 +80,8 @@ def ArchV7A     : SubtargetFeature<"v7a", "ARMArchVersion", "V7A",
 | 
				
			|||||||
                                   [FeatureThumb2, FeatureNEON, FeatureDB]>;
 | 
					                                   [FeatureThumb2, FeatureNEON, FeatureDB]>;
 | 
				
			||||||
def ArchV7M     : SubtargetFeature<"v7m", "ARMArchVersion", "V7M",
 | 
					def ArchV7M     : SubtargetFeature<"v7m", "ARMArchVersion", "V7M",
 | 
				
			||||||
                                   "ARM v7M",
 | 
					                                   "ARM v7M",
 | 
				
			||||||
                                   [FeatureThumb2, FeatureDB, FeatureHWDiv]>;
 | 
					                                   [FeatureThumb2, FeatureNoARM, FeatureDB,
 | 
				
			||||||
 | 
					                                    FeatureHWDiv]>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//===----------------------------------------------------------------------===//
 | 
					//===----------------------------------------------------------------------===//
 | 
				
			||||||
// ARM Processors supported.
 | 
					// ARM Processors supported.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,6 +36,7 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
 | 
				
			|||||||
  , SlowFPBrcc(false)
 | 
					  , SlowFPBrcc(false)
 | 
				
			||||||
  , IsThumb(isT)
 | 
					  , IsThumb(isT)
 | 
				
			||||||
  , ThumbMode(Thumb1)
 | 
					  , ThumbMode(Thumb1)
 | 
				
			||||||
 | 
					  , NoARM(false)
 | 
				
			||||||
  , PostRAScheduler(false)
 | 
					  , PostRAScheduler(false)
 | 
				
			||||||
  , IsR9Reserved(ReserveR9)
 | 
					  , IsR9Reserved(ReserveR9)
 | 
				
			||||||
  , UseMovt(UseMOVT)
 | 
					  , UseMovt(UseMOVT)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,9 @@ protected:
 | 
				
			|||||||
  /// ThumbMode - Indicates supported Thumb version.
 | 
					  /// ThumbMode - Indicates supported Thumb version.
 | 
				
			||||||
  ThumbTypeEnum ThumbMode;
 | 
					  ThumbTypeEnum ThumbMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// NoARM - True if subtarget does not support ARM mode execution.
 | 
				
			||||||
 | 
					  bool NoARM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// PostRAScheduler - True if using post-register-allocation scheduler.
 | 
					  /// PostRAScheduler - True if using post-register-allocation scheduler.
 | 
				
			||||||
  bool PostRAScheduler;
 | 
					  bool PostRAScheduler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -136,6 +139,8 @@ protected:
 | 
				
			|||||||
  bool hasV6T2Ops() const { return ARMArchVersion >= V6T2; }
 | 
					  bool hasV6T2Ops() const { return ARMArchVersion >= V6T2; }
 | 
				
			||||||
  bool hasV7Ops()   const { return ARMArchVersion >= V7A;  }
 | 
					  bool hasV7Ops()   const { return ARMArchVersion >= V7A;  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool hasARMOps() const { return !NoARM; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool hasVFP2() const { return ARMFPUType >= VFPv2; }
 | 
					  bool hasVFP2() const { return ARMFPUType >= VFPv2; }
 | 
				
			||||||
  bool hasVFP3() const { return ARMFPUType >= VFPv3; }
 | 
					  bool hasVFP3() const { return ARMFPUType >= VFPv3; }
 | 
				
			||||||
  bool hasNEON() const { return ARMFPUType >= NEON;  }
 | 
					  bool hasNEON() const { return ARMFPUType >= NEON;  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,6 +65,9 @@ ARMTargetMachine::ARMTargetMachine(const Target &T, const std::string &TT,
 | 
				
			|||||||
                           "v128:64:128-v64:64:64-n32")),
 | 
					                           "v128:64:128-v64:64:64-n32")),
 | 
				
			||||||
    TLInfo(*this),
 | 
					    TLInfo(*this),
 | 
				
			||||||
    TSInfo(*this) {
 | 
					    TSInfo(*this) {
 | 
				
			||||||
 | 
					  if (!Subtarget.hasARMOps())
 | 
				
			||||||
 | 
					    report_fatal_error("CPU: '" + Subtarget.getCPUString() + "' does not "
 | 
				
			||||||
 | 
					                       "support ARM mode execution!");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ThumbTargetMachine::ThumbTargetMachine(const Target &T, const std::string &TT,
 | 
					ThumbTargetMachine::ThumbTargetMachine(const Target &T, const std::string &TT,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,9 @@
 | 
				
			|||||||
; RUN: llc < %s -march=arm | FileCheck %s -check-prefix=CHECK-ARM
 | 
					; RUN: llc < %s -march=arm | FileCheck %s -check-prefix=CHECK-ARM
 | 
				
			||||||
; RUN: llc < %s -march=arm -mcpu=cortex-m3 \
 | 
					 | 
				
			||||||
; RUN:    | FileCheck %s -check-prefix=CHECK-ARMV7M
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
define i32 @f1(i32 %a, i32 %b) {
 | 
					define i32 @f1(i32 %a, i32 %b) {
 | 
				
			||||||
entry:
 | 
					entry:
 | 
				
			||||||
; CHECK-ARM: f1
 | 
					; CHECK-ARM: f1
 | 
				
			||||||
; CHECK-ARM: __divsi3
 | 
					; CHECK-ARM: __divsi3
 | 
				
			||||||
; CHECK-ARMV7M: f1
 | 
					 | 
				
			||||||
; CHECK-ARMV7M: sdiv
 | 
					 | 
				
			||||||
        %tmp1 = sdiv i32 %a, %b         ; <i32> [#uses=1]
 | 
					        %tmp1 = sdiv i32 %a, %b         ; <i32> [#uses=1]
 | 
				
			||||||
        ret i32 %tmp1
 | 
					        ret i32 %tmp1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -16,8 +12,6 @@ define i32 @f2(i32 %a, i32 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
; CHECK-ARM: f2
 | 
					; CHECK-ARM: f2
 | 
				
			||||||
; CHECK-ARM: __udivsi3
 | 
					; CHECK-ARM: __udivsi3
 | 
				
			||||||
; CHECK-ARMV7M: f2
 | 
					 | 
				
			||||||
; CHECK-ARMV7M: udiv
 | 
					 | 
				
			||||||
        %tmp1 = udiv i32 %a, %b         ; <i32> [#uses=1]
 | 
					        %tmp1 = udiv i32 %a, %b         ; <i32> [#uses=1]
 | 
				
			||||||
        ret i32 %tmp1
 | 
					        ret i32 %tmp1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -26,8 +20,6 @@ define i32 @f3(i32 %a, i32 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
; CHECK-ARM: f3
 | 
					; CHECK-ARM: f3
 | 
				
			||||||
; CHECK-ARM: __modsi3
 | 
					; CHECK-ARM: __modsi3
 | 
				
			||||||
; CHECK-ARMV7M: f3
 | 
					 | 
				
			||||||
; CHECK-ARMV7M: sdiv
 | 
					 | 
				
			||||||
        %tmp1 = srem i32 %a, %b         ; <i32> [#uses=1]
 | 
					        %tmp1 = srem i32 %a, %b         ; <i32> [#uses=1]
 | 
				
			||||||
        ret i32 %tmp1
 | 
					        ret i32 %tmp1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -36,8 +28,6 @@ define i32 @f4(i32 %a, i32 %b) {
 | 
				
			|||||||
entry:
 | 
					entry:
 | 
				
			||||||
; CHECK-ARM: f4
 | 
					; CHECK-ARM: f4
 | 
				
			||||||
; CHECK-ARM: __umodsi3
 | 
					; CHECK-ARM: __umodsi3
 | 
				
			||||||
; CHECK-ARMV7M: f4
 | 
					 | 
				
			||||||
; CHECK-ARMV7M: udiv
 | 
					 | 
				
			||||||
        %tmp1 = urem i32 %a, %b         ; <i32> [#uses=1]
 | 
					        %tmp1 = urem i32 %a, %b         ; <i32> [#uses=1]
 | 
				
			||||||
        ret i32 %tmp1
 | 
					        ret i32 %tmp1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
; RUN: llc < %s -march=thumb -mattr=+thumb2 \
 | 
					; RUN: llc < %s -march=thumb -mattr=+thumb2 \
 | 
				
			||||||
; RUN:    | FileCheck %s -check-prefix=CHECK-THUMB
 | 
					; RUN:    | FileCheck %s -check-prefix=CHECK-THUMB
 | 
				
			||||||
; RUN: llc < %s -march=arm -mcpu=cortex-m3 -mattr=+thumb2 \
 | 
					; RUN: llc < %s -march=thumb -mcpu=cortex-m3 -mattr=+thumb2 \
 | 
				
			||||||
; RUN:    | FileCheck %s -check-prefix=CHECK-THUMBV7M
 | 
					; RUN:    | FileCheck %s -check-prefix=CHECK-THUMBV7M
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define i32 @f1(i32 %a, i32 %b) {
 | 
					define i32 @f1(i32 %a, i32 %b) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user