mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-30 05:24:22 +00:00
[SystemZ] Automatically detect zEC12 and z196 hosts
As on other hosts, the CPU identification instruction is priveleged, so we need to look through /proc/cpuinfo. I copied the PowerPC way of handling "generic". Several tests were implicitly assuming z10 and so failed on z196. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193742 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -535,6 +535,48 @@ std::string sys::getHostCPUName() {
|
|||||||
|
|
||||||
return "generic";
|
return "generic";
|
||||||
}
|
}
|
||||||
|
#elif defined(__linux__) && defined(__s390x__)
|
||||||
|
std::string sys::getHostCPUName() {
|
||||||
|
// STIDP is a privileged operation, so use /proc/cpuinfo instead.
|
||||||
|
// Note: We cannot mmap /proc/cpuinfo here and then process the resulting
|
||||||
|
// memory buffer because the 'file' has 0 size (it can be read from only
|
||||||
|
// as a stream).
|
||||||
|
|
||||||
|
std::string Err;
|
||||||
|
DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err);
|
||||||
|
if (!DS) {
|
||||||
|
DEBUG(dbgs() << "Unable to open /proc/cpuinfo: " << Err << "\n");
|
||||||
|
return "generic";
|
||||||
|
}
|
||||||
|
|
||||||
|
// The "processor 0:" line comes after a fair amount of other information,
|
||||||
|
// including a cache breakdown, but this should be plenty.
|
||||||
|
char buffer[2048];
|
||||||
|
size_t CPUInfoSize = DS->GetBytes((unsigned char*) buffer, sizeof(buffer));
|
||||||
|
delete DS;
|
||||||
|
|
||||||
|
StringRef Str(buffer, CPUInfoSize);
|
||||||
|
SmallVector<StringRef, 32> Lines;
|
||||||
|
Str.split(Lines, "\n");
|
||||||
|
for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
|
||||||
|
if (Lines[I].startswith("processor ")) {
|
||||||
|
size_t Pos = Lines[I].find("machine = ");
|
||||||
|
if (Pos != StringRef::npos) {
|
||||||
|
Pos += sizeof("machine = ") - 1;
|
||||||
|
unsigned int Id;
|
||||||
|
if (!Lines[I].drop_front(Pos).getAsInteger(10, Id)) {
|
||||||
|
if (Id >= 2827)
|
||||||
|
return "zEC12";
|
||||||
|
if (Id >= 2817)
|
||||||
|
return "z196";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "generic";
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
std::string sys::getHostCPUName() {
|
std::string sys::getHostCPUName() {
|
||||||
return "generic";
|
return "generic";
|
||||||
|
@ -36,6 +36,7 @@ def FeatureFPExtension : SystemZFeature<
|
|||||||
"Assume that the floating-point extension facility is installed"
|
"Assume that the floating-point extension facility is installed"
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
def : Processor<"generic", NoItineraries, []>;
|
||||||
def : Processor<"z10", NoItineraries, []>;
|
def : Processor<"z10", NoItineraries, []>;
|
||||||
def : Processor<"z196", NoItineraries,
|
def : Processor<"z196", NoItineraries,
|
||||||
[FeatureDistinctOps, FeatureLoadStoreOnCond, FeatureHighWord,
|
[FeatureDistinctOps, FeatureLoadStoreOnCond, FeatureHighWord,
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "SystemZSubtarget.h"
|
#include "SystemZSubtarget.h"
|
||||||
#include "llvm/IR/GlobalValue.h"
|
#include "llvm/IR/GlobalValue.h"
|
||||||
|
#include "llvm/Support/Host.h"
|
||||||
#include "MCTargetDesc/SystemZMCTargetDesc.h"
|
#include "MCTargetDesc/SystemZMCTargetDesc.h"
|
||||||
|
|
||||||
#define GET_SUBTARGETINFO_TARGET_DESC
|
#define GET_SUBTARGETINFO_TARGET_DESC
|
||||||
@ -25,7 +26,11 @@ SystemZSubtarget::SystemZSubtarget(const std::string &TT,
|
|||||||
TargetTriple(TT) {
|
TargetTriple(TT) {
|
||||||
std::string CPUName = CPU;
|
std::string CPUName = CPU;
|
||||||
if (CPUName.empty())
|
if (CPUName.empty())
|
||||||
CPUName = "z10";
|
CPUName = "generic";
|
||||||
|
#if defined(__linux__) && defined(__s390x__)
|
||||||
|
if (CPUName == "generic")
|
||||||
|
CPUName = sys::getHostCPUName();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Parse features string.
|
// Parse features string.
|
||||||
ParseSubtargetFeatures(CPUName, FS);
|
ParseSubtargetFeatures(CPUName, FS);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 32-bit atomic minimum and maximum.
|
; Test 32-bit atomic minimum and maximum. Here we match the z10 versions,
|
||||||
|
; which can't use LOCR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Check signed minium.
|
; Check signed minium.
|
||||||
define i32 @f1(i32 %dummy, i32 *%src, i32 %b) {
|
define i32 @f1(i32 %dummy, i32 *%src, i32 %b) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 64-bit atomic minimum and maximum.
|
; Test 64-bit atomic minimum and maximum. Here we match the z10 versions,
|
||||||
|
; which can't use LOCGR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Check signed minium.
|
; Check signed minium.
|
||||||
define i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
|
define i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 8-bit conditional stores that are presented as selects.
|
; Test 8-bit conditional stores that are presented as selects. The volatile
|
||||||
|
; tests require z10, which use a branch instead of a LOCR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
declare void @foo(i8 *)
|
declare void @foo(i8 *)
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 16-bit conditional stores that are presented as selects.
|
; Test 16-bit conditional stores that are presented as selects. The volatile
|
||||||
|
; tests require z10, which use a branch instead of a LOCR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
declare void @foo(i16 *)
|
declare void @foo(i16 *)
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 32-bit floating-point comparison.
|
; Test 32-bit floating-point comparison. The tests assume a z10 implementation
|
||||||
|
; of select, using conditional branches rather than LOCGR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
declare float @foo()
|
declare float @foo()
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 64-bit floating-point comparison.
|
; Test 64-bit floating-point comparison. The tests assume a z10 implementation
|
||||||
|
; of select, using conditional branches rather than LOCGR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
declare double @foo()
|
declare double @foo()
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 128-bit floating-point comparison.
|
; Test 128-bit floating-point comparison. The tests assume a z10 implementation
|
||||||
|
; of select, using conditional branches rather than LOCGR.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; There is no memory form of 128-bit comparison.
|
; There is no memory form of 128-bit comparison.
|
||||||
define i64 @f1(i64 %a, i64 %b, fp128 *%ptr, float %f2) {
|
define i64 @f1(i64 %a, i64 %b, fp128 *%ptr, float %f2) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test moves between FPRs and GPRs.
|
; Test moves between FPRs and GPRs. The 32-bit cases test the z10
|
||||||
|
; implementation, which has no high-word support.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
declare i64 @foo()
|
declare i64 @foo()
|
||||||
declare double @bar()
|
declare double @bar()
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
; Test the handling of base + 12-bit displacement addresses for large frames,
|
; Test the handling of base + 12-bit displacement addresses for large frames,
|
||||||
; in cases where no 20-bit form exists.
|
; in cases where no 20-bit form exists. The tests here assume z10 register
|
||||||
|
; pressure, without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefix=CHECK-NOFP %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | \
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu -disable-fp-elim | FileCheck -check-prefix=CHECK-FP %s
|
; RUN: FileCheck -check-prefix=CHECK-NOFP %s
|
||||||
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -disable-fp-elim | \
|
||||||
|
; RUN: FileCheck -check-prefix=CHECK-FP %s
|
||||||
|
|
||||||
; This file tests what happens when a displacement is converted from
|
; This file tests what happens when a displacement is converted from
|
||||||
; being relative to the start of a frame object to being relative to
|
; being relative to the start of a frame object to being relative to
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
; Test the handling of base + displacement addresses for large frames,
|
; Test the handling of base + displacement addresses for large frames,
|
||||||
; in cases where both 12-bit and 20-bit displacements are allowed.
|
; in cases where both 12-bit and 20-bit displacements are allowed.
|
||||||
|
; The tests here assume z10 register pressure, without the high words
|
||||||
|
; being available.
|
||||||
|
;
|
||||||
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | \
|
||||||
|
; RUN: FileCheck -check-prefix=CHECK-NOFP %s
|
||||||
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -disable-fp-elim | \
|
||||||
|
; RUN: FileCheck -check-prefix=CHECK-FP %s
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefix=CHECK-NOFP %s
|
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu -disable-fp-elim | FileCheck -check-prefix=CHECK-FP %s
|
|
||||||
|
|
||||||
; This file tests what happens when a displacement is converted from
|
; This file tests what happens when a displacement is converted from
|
||||||
; being relative to the start of a frame object to being relative to
|
; being relative to the start of a frame object to being relative to
|
||||||
; the frame itself. In some cases the test is only possible if two
|
; the frame itself. In some cases the test is only possible if two
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
; Test the handling of base + index + 12-bit displacement addresses for
|
; Test the handling of base + index + 12-bit displacement addresses for
|
||||||
; large frames, in cases where no 20-bit form exists.
|
; large frames, in cases where no 20-bit form exists. The tests here
|
||||||
|
; assume z10 register pressure, without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefix=CHECK-NOFP %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | \
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu -disable-fp-elim | FileCheck -check-prefix=CHECK-FP %s
|
; RUN: FileCheck -check-prefix=CHECK-NOFP %s
|
||||||
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -disable-fp-elim | \
|
||||||
|
; RUN: FileCheck -check-prefix=CHECK-FP %s
|
||||||
|
|
||||||
declare void @foo(float *%ptr1, float *%ptr2)
|
declare void @foo(float *%ptr1, float *%ptr2)
|
||||||
|
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
; Test the handling of base + index + displacement addresses for large frames,
|
; Test the handling of base + index + displacement addresses for large frames,
|
||||||
; in cases where both 12-bit and 20-bit displacements are allowed.
|
; in cases where both 12-bit and 20-bit displacements are allowed.
|
||||||
|
; The tests here assume z10 register pressure, without the high words
|
||||||
|
; being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -check-prefix=CHECK-NOFP %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | \
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu -disable-fp-elim | FileCheck -check-prefix=CHECK-FP %s
|
; RUN: FileCheck -check-prefix=CHECK-NOFP %s
|
||||||
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -disable-fp-elim | \
|
||||||
|
; RUN: FileCheck -check-prefix=CHECK-FP %s
|
||||||
|
|
||||||
; This file tests what happens when a displacement is converted from
|
; This file tests what happens when a displacement is converted from
|
||||||
; being relative to the start of a frame object to being relative to
|
; being relative to the start of a frame object to being relative to
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test spilling of GPRs.
|
; Test spilling of GPRs. The tests here assume z10 register pressure,
|
||||||
|
; without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; We need to allocate a 4-byte spill slot, rounded to 8 bytes. The frame
|
; We need to allocate a 4-byte spill slot, rounded to 8 bytes. The frame
|
||||||
; size should be exactly 160 + 8 = 168.
|
; size should be exactly 160 + 8 = 168.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test 32-bit additions of constants to memory.
|
; Test 32-bit additions of constants to memory. The tests here
|
||||||
|
; assume z10 register pressure, without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Check additions of 1.
|
; Check additions of 1.
|
||||||
define void @f1(i32 *%ptr) {
|
define void @f1(i32 *%ptr) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test zero extensions from a byte to an i32.
|
; Test zero extensions from a byte to an i32. The tests here
|
||||||
|
; assume z10 register pressure, without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Test register extension, starting with an i32.
|
; Test register extension, starting with an i32.
|
||||||
define i32 @f1(i32 %a) {
|
define i32 @f1(i32 %a) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test zero extensions from a halfword to an i32.
|
; Test zero extensions from a halfword to an i32. The tests here
|
||||||
|
; assume z10 register pressure, without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Test register extension, starting with an i32.
|
; Test register extension, starting with an i32.
|
||||||
define i32 @f1(i32 %a) {
|
define i32 @f1(i32 %a) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test sequences that can use RISBG with a zeroed first operand.
|
; Test sequences that can use RISBG with a zeroed first operand.
|
||||||
|
; The tests here assume that RISBLG isn't available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Test an extraction of bit 0 from a right-shifted value.
|
; Test an extraction of bit 0 from a right-shifted value.
|
||||||
define i32 @f1(i32 %foo) {
|
define i32 @f1(i32 %foo) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test SETCC for every integer condition.
|
; Test SETCC for every integer condition. The tests here assume that
|
||||||
|
; RISBLG isn't available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Test CC in { 0 }, with 3 don't care.
|
; Test CC in { 0 }, with 3 don't care.
|
||||||
define i32 @f1(i32 %a, i32 %b) {
|
define i32 @f1(i32 %a, i32 %b) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test SETCC for every floating-point condition.
|
; Test SETCC for every floating-point condition. The tests here assume that
|
||||||
|
; RISBLG isn't available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
; Test CC in { 0 }
|
; Test CC in { 0 }
|
||||||
define i32 @f1(float %a, float %b) {
|
define i32 @f1(float %a, float %b) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
; Test spilling using MVC.
|
; Test spilling using MVC. The tests here assume z10 register pressure,
|
||||||
|
; without the high words being available.
|
||||||
;
|
;
|
||||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
|
||||||
|
|
||||||
declare void @foo()
|
declare void @foo()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user