1 #===-- R600GenRegisterInfo.pl - TODO: Add brief description -------===#
3 # The LLVM Compiler Infrastructure
5 # This file is distributed under the University of Illinois Open Source
6 # License. See LICENSE.TXT for details.
8 #===----------------------------------------------------------------------===#
10 # TODO: Add full description
12 #===----------------------------------------------------------------------===#
19 my $CREG_MAX = CONST_REG_COUNT - 1;
20 my $TREG_MAX = TEMP_REG_COUNT - 1;
24 class R600Reg <string name> : Register<name> {
25 let Namespace = "AMDIL";
28 class R600Reg_128<string n, list<Register> subregs> : RegisterWithSubRegs<n, subregs> {
29 let Namespace = "AMDIL";
30 let SubRegIndices = [sel_x, sel_y, sel_z, sel_w];
39 my @creg_list = print_reg_defs(CONST_REG_COUNT * 4, "C");
40 my @treg_list = print_reg_defs(TEMP_REG_COUNT * 4, "T");
44 for (my $i = 0; $i < TEMP_REG_COUNT; $i++) {
45 my $name = "T$i\_XYZW";
46 print qq{def $name : R600Reg_128 <"T$i.XYZW", [T$i\_X, T$i\_Y, T$i\_Z, T$i\_W] >;\n};
48 $treg_x[$i] = "T$i\_X";
51 my $treg_string = join(",", @treg_list);
52 my $creg_list = join(",", @creg_list);
53 my $t128_string = join(",", @t128reg);
54 my $treg_x_string = join(",", @treg_x);
57 class RegSet <dag s> {
61 def ZERO : R600Reg<"0.0">;
62 def HALF : R600Reg<"0.5">;
63 def ONE : R600Reg<"1.0">;
64 def ONE_INT : R600Reg<"1">;
65 def NEG_HALF : R600Reg<"-0.5">;
66 def NEG_ONE : R600Reg<"-1.0">;
67 def PV_X : R600Reg<"pv.x">;
68 def ALU_LITERAL_X : R600Reg<"literal.x">;
70 def R600_CReg32 : RegisterClass <"AMDIL", [f32, i32], 32, (add
73 def R600_TReg32 : RegisterClass <"AMDIL", [f32, i32], 32, (add
76 def R600_TReg32_X : RegisterClass <"AMDIL", [f32, i32], 32, (add
79 def R600_Reg32 : RegisterClass <"AMDIL", [f32, i32], 32, (add
82 ZERO, HALF, ONE, ONE_INT, PV_X, ALU_LITERAL_X, NEG_ONE, NEG_HALF)>;
84 def R600_Reg128 : RegisterClass<"AMDIL", [v4f32], 128, (add
87 let SubRegClasses = [(R600_TReg32 sel_x, sel_y, sel_z, sel_w)];
95 for ($i = 0; $i <= $#creg_list; $i++) {
96 push(@{$index_map{get_hw_index($i)}}, $creg_list[$i]);
97 push(@{$chan_map{get_chan_str($i)}}, $creg_list[$i]);
100 for ($i = 0; $i <= $#treg_list; $i++) {
101 push(@{$index_map{get_hw_index($i)}}, $treg_list[$i]);
102 push(@{$chan_map{get_chan_str($i)}}, $treg_list[$i]);
105 for ($i = 0; $i <= $#t128reg; $i++) {
106 push(@{$index_map{$i}}, $t128reg[$i]);
107 push(@{$chan_map{'X'}}, $t128reg[$i]);
110 open(OUTFILE, ">", "R600HwRegInfo.include");
112 print OUTFILE <<STRING;
114 unsigned R600RegisterInfo::getHWRegIndexGen(unsigned reg) const
117 default: assert(!"Unknown register"); return 0;
119 foreach my $key (keys(%index_map)) {
120 foreach my $reg (@{$index_map{$key}}) {
121 print OUTFILE " case AMDIL::$reg:\n";
123 print OUTFILE " return $key;\n\n";
126 print OUTFILE " }\n}\n\n";
128 print OUTFILE <<STRING;
130 unsigned R600RegisterInfo::getHWRegChanGen(unsigned reg) const
133 default: assert(!"Unknown register"); return 0;
136 foreach my $key (keys(%chan_map)) {
137 foreach my $reg (@{$chan_map{$key}}) {
138 print OUTFILE " case AMDIL::$reg:\n";
143 } elsif ($key eq 'Y') {
145 } elsif ($key eq 'Z') {
147 } elsif ($key eq 'W') {
150 die("Unknown chan value; $key");
152 print OUTFILE " return $val;\n\n";
155 print OUTFILE " }\n}\n\n";
158 my ($count, $prefix) = @_;
162 for ($i = 0; $i < $count; $i++) {
163 my $hw_index = get_hw_index($i);
164 my $chan= get_chan_str($i);
165 my $name = "$prefix$hw_index\_$chan";
166 print qq{def $name : R600Reg <"$prefix$hw_index.$chan">;\n};
167 $reg_list[$i] = $name;