1fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard#===-- R600GenRegisterInfo.pl - Script for generating register info files --===#
2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#
3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#                     The LLVM Compiler Infrastructure
4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#
5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard# This file is distributed under the University of Illinois Open Source
6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard# License. See LICENSE.TXT for details.
7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#
8fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard#===------------------------------------------------------------------------===#
9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#
10fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard# This perl script prints to stdout .td code to be used as R600RegisterInfo.td
11fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard# it also generates a file called R600HwRegInfo.include, which contains helper
12fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard# functions for determining the hw encoding of registers.
13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#
14fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard#===------------------------------------------------------------------------===#
15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarduse strict;
17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarduse warnings;
18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
19b655f78b25454e00f4300fb5ccd35b3d0ab8a740Vadim Girlinuse constant CONST_REG_COUNT => 1024;
20788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellarduse constant TEMP_REG_COUNT => 128;
21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $CREG_MAX = CONST_REG_COUNT - 1;
23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $TREG_MAX = TEMP_REG_COUNT - 1;
24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint <<STRING;
26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass R600Reg <string name> : Register<name> {
2876b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellard  let Namespace = "AMDGPU";
29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass R600Reg_128<string n, list<Register> subregs> : RegisterWithSubRegs<n, subregs> {
3276b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellard  let Namespace = "AMDGPU";
33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let SubRegIndices = [sel_x, sel_y, sel_z, sel_w];
34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
36a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING
37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
38a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $i;
39a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard### REG DEFS ###
41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @creg_list = print_reg_defs(CONST_REG_COUNT * 4, "C");
43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @treg_list = print_reg_defs(TEMP_REG_COUNT * 4, "T");
44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
45a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @t128reg;
46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @treg_x;
47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor (my $i = 0; $i < TEMP_REG_COUNT; $i++) {
48a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  my $name = "T$i\_XYZW";
49a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  print qq{def $name : R600Reg_128 <"T$i.XYZW", [T$i\_X, T$i\_Y, T$i\_Z, T$i\_W] >;\n};
50a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  $t128reg[$i] = $name;
51a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  $treg_x[$i] = "T$i\_X";
52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
53a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
54a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $treg_string = join(",", @treg_list);
55a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $creg_list = join(",", @creg_list);
56a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $t128_string = join(",", @t128reg);
57a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $treg_x_string = join(",", @treg_x);
58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint <<STRING;
59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass RegSet <dag s> {
61a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  dag set = s;
62a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ZERO : R600Reg<"0.0">;
65a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef HALF : R600Reg<"0.5">;
66a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ONE : R600Reg<"1.0">;
67a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ONE_INT : R600Reg<"1">;
68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef NEG_HALF : R600Reg<"-0.5">;
69a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef NEG_ONE : R600Reg<"-1.0">;
70a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef PV_X : R600Reg<"pv.x">;
71a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ALU_LITERAL_X : R600Reg<"literal.x">;
728263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeunedef PREDICATE_BIT : R600Reg<"PredicateBit">;
738263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeunedef PRED_SEL_OFF: R600Reg<"Pred_sel_off">;
748263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeunedef PRED_SEL_ZERO : R600Reg<"Pred_sel_zero">;
758263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeunedef PRED_SEL_ONE : R600Reg<"Pred_sel_one">;
76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
7776b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellarddef R600_CReg32 : RegisterClass <"AMDGPU", [f32, i32], 32, (add
78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $creg_list)>;
79a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
8076b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellarddef R600_TReg32 : RegisterClass <"AMDGPU", [f32, i32], 32, (add
81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $treg_string)>;
82a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
8376b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellarddef R600_TReg32_X : RegisterClass <"AMDGPU", [f32, i32], 32, (add
84a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $treg_x_string)>;
85a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
8676b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellarddef R600_Reg32 : RegisterClass <"AMDGPU", [f32, i32], 32, (add
87a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R600_TReg32,
88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    R600_CReg32,
89a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    ZERO, HALF, ONE, ONE_INT, PV_X, ALU_LITERAL_X, NEG_ONE, NEG_HALF)>;
90a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
918263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeunedef R600_Predicate : RegisterClass <"AMDGPU", [i32], 32, (add
928263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune    PRED_SEL_OFF, PRED_SEL_ZERO, PRED_SEL_ONE)>;
938263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune
948263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeunedef R600_Predicate_Bit: RegisterClass <"AMDGPU", [i32], 32, (add
958263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune    PREDICATE_BIT)>;
968263408a91b6b3beb5af5de6bdc7e5d13197a268Vincent Lejeune
9776b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellarddef R600_Reg128 : RegisterClass<"AMDGPU", [v4f32, v4i32], 128, (add
98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $t128_string)>
99a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
100a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  let SubRegClasses = [(R600_TReg32 sel_x, sel_y, sel_z, sel_w)];
101b3863eb9a5a7a844f04acde5f15151c898ff3bacTom Stellard  let CopyCost = -1;
102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
103a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
104a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING
105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
106a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy %index_map;
107a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy %chan_map;
108a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
109a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor ($i = 0; $i <= $#creg_list; $i++) {
110a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  push(@{$index_map{get_hw_index($i)}}, $creg_list[$i]);
111a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  push(@{$chan_map{get_chan_str($i)}}, $creg_list[$i]);
112a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
113a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
114a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor ($i = 0; $i <= $#treg_list; $i++) {
115a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  push(@{$index_map{get_hw_index($i)}}, $treg_list[$i]);
116a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  push(@{$chan_map{get_chan_str($i)}}, $treg_list[$i]);
117a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
118a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor ($i = 0; $i <= $#t128reg; $i++) {
120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  push(@{$index_map{$i}}, $t128reg[$i]);
121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  push(@{$chan_map{'X'}}, $t128reg[$i]);
122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
123a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardopen(OUTFILE, ">", "R600HwRegInfo.include");
125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE <<STRING;
127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardunsigned R600RegisterInfo::getHWRegIndexGen(unsigned reg) const
129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  switch(reg) {
131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  default: assert(!"Unknown register"); return 0;
132a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING
133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardforeach my $key (keys(%index_map)) {
134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  foreach my $reg (@{$index_map{$key}}) {
13576b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellard    print OUTFILE "  case AMDGPU::$reg:\n";
136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  print OUTFILE "    return $key;\n\n";
138a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
139a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
140a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE "  }\n}\n\n";
141a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE <<STRING;
143a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardunsigned R600RegisterInfo::getHWRegChanGen(unsigned reg) const
145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
146a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  switch(reg) {
147a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  default: assert(!"Unknown register"); return 0;
148a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING
149a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
150a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardforeach my $key (keys(%chan_map)) {
151a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  foreach my $reg (@{$chan_map{$key}}) {
15276b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellard    print OUTFILE " case AMDGPU::$reg:\n";
153a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
154a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  my $val;
155a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if ($key eq 'X') {
156a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $val = 0;
157a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } elsif ($key eq 'Y') {
158a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $val = 1;
159a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } elsif ($key eq 'Z') {
160a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $val = 2;
161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } elsif ($key eq 'W') {
162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $val = 3;
163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    die("Unknown chan value; $key");
165a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
166a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  print OUTFILE "    return $val;\n\n";
167a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
168a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
169a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE "  }\n}\n\n";
170a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
171a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardsub print_reg_defs {
172a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  my ($count, $prefix) = @_;
173a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
174a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  my @reg_list;
175a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
176a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  for ($i = 0; $i < $count; $i++) {
177a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    my $hw_index = get_hw_index($i);
178a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    my $chan= get_chan_str($i);
179a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    my $name = "$prefix$hw_index\_$chan";
180a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    print qq{def $name : R600Reg <"$prefix$hw_index.$chan">;\n};
181a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    $reg_list[$i] = $name;
182a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
183a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return @reg_list;
184a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
185a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
186788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard#Helper functions
187788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellardsub get_hw_index {
188788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  my ($index) = @_;
189788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  return int($index / 4);
190788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard}
191788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard
192788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellardsub get_chan_str {
193788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  my ($index) = @_;
194788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  my $chan = $index % 4;
195788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  if ($chan == 0 )  {
196788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard    return 'X';
197788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  } elsif ($chan == 1) {
198788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard    return 'Y';
199788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  } elsif ($chan == 2) {
200788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard    return 'Z';
201788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  } elsif ($chan == 3) {
202788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard    return 'W';
203788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  } else {
204788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard    die("Unknown chan value: $chan");
205788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard  }
206788fd04dacb9eb1e32010050c57cd2f49779311bTom Stellard}
207