summaryrefslogtreecommitdiff
path: root/lib/Target/R600/SISchedule.td
blob: d42c2e0805724df4141f350fa13c458bf29affef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//===-- SISchedule.td - SI Scheduling definitons -------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// MachineModel definitions for Southern Islands (SI)
//
//===----------------------------------------------------------------------===//

def SI_Itin : ProcessorItineraries <[], [], []>;


def WriteBranch : SchedWrite;
def WriteExport : SchedWrite;
def WriteLDS    : SchedWrite;
def WriteSALU   : SchedWrite;
def WriteSMEM   : SchedWrite;
def WriteVMEM   : SchedWrite;

// Vector ALU instructions
def WriteDouble     : SchedWrite;
def WriteDoubleAdd  : SchedWrite;
def WriteFloat      : SchedWrite;
def WriteFloatFMA   : SchedWrite;
def WriteFloatTrans : SchedWrite;
def WriteInt        : SchedWrite;
def WriteIntMUL     : SchedWrite;
def WriteConversion : SchedWrite;
def WriteI24        : SchedWrite;

def SIModel : SchedMachineModel;



// BufferSize = 0 means the processors are in-order.
let BufferSize = 0 in {

// XXX: Are the resource counts correct?
def HWBranch : ProcResource<1>;
def HWExport : ProcResource<7>;   // Taken from S_WAITCNT
def HWLGKM   : ProcResource<31>;  // Taken from S_WAITCNT
def HWSALU   : ProcResource<1>;
def HWVMEM   : ProcResource<15>;  // Taken from S_WAITCNT
def HWVALU   : ProcResource<1>;

}

let SchedModel = SIModel in {

class HWWriteRes<SchedWrite write, list<ProcResourceKind> resources,
  int latency> : WriteRes<write, resources> {
  let Latency = latency;
}

class HWVALUWriteRes<SchedWrite write, int latency> :
  HWWriteRes<write, [HWVALU], latency>;

// The latency numbers are taken from AMD Accelerated Parallel Processing
// guide.  They may not be acurate.

def : HWWriteRes<WriteBranch,  [HWBranch], 100>; // XXX: Guessed ???
def : HWWriteRes<WriteExport,  [HWExport], 100>; // XXX: Guessed ???
def : HWWriteRes<WriteLDS,     [HWLGKM],    32>; // 2 - 64
def : HWWriteRes<WriteSALU,    [HWSALU],     1>;
def : HWWriteRes<WriteSMEM,    [HWLGKM],    10>; // XXX: Guessed ???
def : HWWriteRes<WriteVMEM,    [HWVMEM],   450>; // 300 - 600

// XXX: These definitions assume full double-precision speed, some devices are
// slower.  These are also taken from the AMD Accelerated Parallel Processing
// guide and may not be accurate.
def : HWVALUWriteRes<WriteDouble,     4>;
def : HWVALUWriteRes<WriteDoubleAdd,  2>;
def : HWVALUWriteRes<WriteFloat,      1>;
def : HWVALUWriteRes<WriteFloatFMA,   1>;
def : HWVALUWriteRes<WriteFloatTrans, 4>;
def : HWVALUWriteRes<WriteInt,        1>;
def : HWVALUWriteRes<WriteIntMUL,     4>;
def : HWVALUWriteRes<WriteConversion, 4>;
def : HWVALUWriteRes<WriteI24,        1>;

} // End SchedModel = SIModel