summaryrefslogtreecommitdiff
path: root/lib/Target/PTX/generate-register-td.py
blob: 15286908961d73c01832c8ed16ade583a4c6a27d (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/usr/bin/env python
##===- generate-register-td.py --------------------------------*-python-*--===##
##
##                     The LLVM Compiler Infrastructure
##
## This file is distributed under the University of Illinois Open Source
## License. See LICENSE.TXT for details.
##
##===----------------------------------------------------------------------===##
##
## This file describes the PTX register file generator.
##
##===----------------------------------------------------------------------===##

from sys import argv, exit, stdout


if len(argv) != 5:
    print('Usage: generate-register-td.py <num_preds> <num_16> <num_32> <num_64>')
    exit(1)

try:
    num_pred  = int(argv[1])
    num_16bit = int(argv[2])
    num_32bit = int(argv[3])
    num_64bit = int(argv[4])
except:
    print('ERROR: Invalid integer parameter')
    exit(1)

## Print the register definition file
td_file = open('PTXRegisterInfo.td', 'w')

td_file.write('''
//===- PTXRegisterInfo.td - PTX Register defs ----------------*- tblgen -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
//  Declarations that describe the PTX register file
//===----------------------------------------------------------------------===//

class PTXReg<string n> : Register<n> {
  let Namespace = "PTX";
}

//===----------------------------------------------------------------------===//
//  Registers
//===----------------------------------------------------------------------===//
''')


# Print predicate registers
td_file.write('\n///===- Predicate Registers -----------------------------------------------===//\n\n')
for r in range(0, num_pred):
    td_file.write('def P%d : PTXReg<"p%d">;\n' % (r, r))

# Print 16-bit registers
td_file.write('\n///===- 16-Bit Registers --------------------------------------------------===//\n\n')
for r in range(0, num_16bit):
    td_file.write('def RH%d : PTXReg<"rh%d">;\n' % (r, r))

# Print 32-bit registers
td_file.write('\n///===- 32-Bit Registers --------------------------------------------------===//\n\n')
for r in range(0, num_32bit):
    td_file.write('def R%d : PTXReg<"r%d">;\n' % (r, r))

# Print 64-bit registers
td_file.write('\n///===- 64-Bit Registers --------------------------------------------------===//\n\n')
for r in range(0, num_64bit):
    td_file.write('def RD%d : PTXReg<"rd%d">;\n' % (r, r))


td_file.write('''
//===----------------------------------------------------------------------===//
//  Register classes
//===----------------------------------------------------------------------===//
''')


# Print register classes

td_file.write('def RegPred : RegisterClass<"PTX", [i1], 8, (sequence "P%%u", 0, %d)>;\n' % (num_pred-1))
td_file.write('def RegI16 : RegisterClass<"PTX", [i16], 16, (sequence "RH%%u", 0, %d)>;\n' % (num_16bit-1))
td_file.write('def RegI32 : RegisterClass<"PTX", [i32], 32, (sequence "R%%u", 0, %d)>;\n' % (num_32bit-1))
td_file.write('def RegI64 : RegisterClass<"PTX", [i64], 64, (sequence "RD%%u", 0, %d)>;\n' % (num_64bit-1))
td_file.write('def RegF32 : RegisterClass<"PTX", [f32], 32, (sequence "R%%u", 0, %d)>;\n' % (num_32bit-1))
td_file.write('def RegF64 : RegisterClass<"PTX", [f64], 64, (sequence "RD%%u", 0, %d)>;\n' % (num_64bit-1))


td_file.close()

## Now write the PTXCallingConv.td file
td_file = open('PTXCallingConv.td', 'w')

# Reserve 10% of the available registers for return values, and the other 90%
# for parameters
num_ret_pred    = int(0.1 * num_pred)
num_ret_16bit   = int(0.1 * num_16bit)
num_ret_32bit   = int(0.1 * num_32bit)
num_ret_64bit   = int(0.1 * num_64bit)
num_param_pred  = num_pred - num_ret_pred
num_param_16bit = num_16bit - num_ret_16bit
num_param_32bit = num_32bit - num_ret_32bit
num_param_64bit = num_64bit - num_ret_64bit

param_regs_pred  = [('P%d' % (i+num_ret_pred)) for i in range(0, num_param_pred)]
ret_regs_pred    = ['P%d' % i for i in range(0, num_ret_pred)]
param_regs_16bit = [('RH%d' % (i+num_ret_16bit)) for i in range(0, num_param_16bit)]
ret_regs_16bit   = ['RH%d' % i for i in range(0, num_ret_16bit)]
param_regs_32bit = [('R%d' % (i+num_ret_32bit)) for i in range(0, num_param_32bit)]
ret_regs_32bit   = ['R%d' % i for i in range(0, num_ret_32bit)]
param_regs_64bit = [('RD%d' % (i+num_ret_64bit)) for i in range(0, num_param_64bit)]
ret_regs_64bit   = ['RD%d' % i for i in range(0, num_ret_64bit)]

param_list_pred  = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_pred)
ret_list_pred    = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_pred)
param_list_16bit = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_16bit)
ret_list_16bit   = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_16bit)
param_list_32bit = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_32bit)
ret_list_32bit   = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_32bit)
param_list_64bit = reduce(lambda x, y: '%s, %s' % (x, y), param_regs_64bit)
ret_list_64bit   = reduce(lambda x, y: '%s, %s' % (x, y), ret_regs_64bit)

td_file.write('''
//===--- PTXCallingConv.td - Calling Conventions -----------*- tablegen -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This describes the calling conventions for the PTX architecture.
//
//===----------------------------------------------------------------------===//

// PTX Formal Parameter Calling Convention
def CC_PTX : CallingConv<[
  CCIfType<[i1],      CCAssignToReg<[%s]>>,
  CCIfType<[i16],     CCAssignToReg<[%s]>>,
  CCIfType<[i32,f32], CCAssignToReg<[%s]>>,
  CCIfType<[i64,f64], CCAssignToReg<[%s]>>
]>;

// PTX Return Value Calling Convention
def RetCC_PTX : CallingConv<[
  CCIfType<[i1],      CCAssignToReg<[%s]>>,
  CCIfType<[i16],     CCAssignToReg<[%s]>>,
  CCIfType<[i32,f32], CCAssignToReg<[%s]>>,
  CCIfType<[i64,f64], CCAssignToReg<[%s]>>
]>;
''' % (param_list_pred, param_list_16bit, param_list_32bit, param_list_64bit,
       ret_list_pred, ret_list_16bit, ret_list_32bit, ret_list_64bit))


td_file.close()