blob: ca1f490b00180013e07b7257e44410e4f3de8f1c [file] [log] [blame]
Daniel Dunbarc984df82009-07-15 06:35:19 +00001//===-- PowerPCTargetInfo.cpp - PowerPC Target Implementation -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Dunbar4cb1e132009-07-18 23:03:22 +000010#include "PPC.h"
Daniel Dunbarc984df82009-07-15 06:35:19 +000011#include "llvm/Module.h"
12#include "llvm/Target/TargetRegistry.h"
13using namespace llvm;
14
Daniel Dunbar4cb1e132009-07-18 23:03:22 +000015Target llvm::ThePPC32Target;
Daniel Dunbarc984df82009-07-15 06:35:19 +000016
17static unsigned PPC32_JITMatchQuality() {
18#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) || defined(__PPC__)
19 if (sizeof(void*) == 4)
20 return 10;
21#endif
22 return 0;
23}
24
25static unsigned PPC32_TripleMatchQuality(const std::string &TT) {
26 // We strongly match "powerpc-*".
27 if (TT.size() >= 8 && std::string(TT.begin(), TT.begin()+8) == "powerpc-")
28 return 20;
29
30 return 0;
31}
32
33static unsigned PPC32_ModuleMatchQuality(const Module &M) {
34 // Check for a triple match.
35 if (unsigned Q = PPC32_TripleMatchQuality(M.getTargetTriple()))
36 return Q;
37
38 // Otherwise if the target triple is non-empty, we don't match.
39 if (!M.getTargetTriple().empty()) return 0;
40
41 if (M.getEndianness() == Module::BigEndian &&
42 M.getPointerSize() == Module::Pointer64)
43 return 10; // Weak match
44 else if (M.getEndianness() != Module::AnyEndianness ||
45 M.getPointerSize() != Module::AnyPointerSize)
46 return 0; // Match for some other target
47
48 return PPC32_JITMatchQuality()/2;
49}
50
Daniel Dunbar4cb1e132009-07-18 23:03:22 +000051Target llvm::ThePPC64Target;
Daniel Dunbarc984df82009-07-15 06:35:19 +000052
53static unsigned PPC64_JITMatchQuality() {
54#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) || defined(__PPC__)
55 if (sizeof(void*) == 8)
56 return 10;
57#endif
58 return 0;
59}
60
61static unsigned PPC64_TripleMatchQuality(const std::string &TT) {
62 // We strongly match "powerpc64-*".
63 if (TT.size() >= 10 && std::string(TT.begin(), TT.begin()+10) == "powerpc64-")
64 return 20;
65
66 return 0;
67}
68
69static unsigned PPC64_ModuleMatchQuality(const Module &M) {
70 // Check for a triple match.
71 if (unsigned Q = PPC64_TripleMatchQuality(M.getTargetTriple()))
72 return Q;
73
74 // Otherwise if the target triple is non-empty, we don't match.
75 if (!M.getTargetTriple().empty()) return 0;
76
77 if (M.getEndianness() == Module::BigEndian &&
78 M.getPointerSize() == Module::Pointer64)
79 return 10; // Weak match
80 else if (M.getEndianness() != Module::AnyEndianness ||
81 M.getPointerSize() != Module::AnyPointerSize)
82 return 0; // Match for some other target
83
84 return PPC64_JITMatchQuality()/2;
85}
86
87extern "C" void LLVMInitializePowerPCTargetInfo() {
88 TargetRegistry::RegisterTarget(ThePPC32Target, "ppc32",
89 "PowerPC 32",
90 &PPC32_TripleMatchQuality,
91 &PPC32_ModuleMatchQuality,
92 &PPC32_JITMatchQuality);
93
94 TargetRegistry::RegisterTarget(ThePPC64Target, "ppc64",
95 "PowerPC 64",
96 &PPC64_TripleMatchQuality,
97 &PPC64_ModuleMatchQuality,
98 &PPC64_JITMatchQuality);
99}