R600GenRegisterInfo.pl revision a75c6163e605f35b14f26930dd9227e4f337ec9e
1a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#===-- R600GenRegisterInfo.pl - TODO: Add brief description -------===# 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# 8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#===----------------------------------------------------------------------===# 9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard# 10a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard# TODO: Add full description 11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard# 12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#===----------------------------------------------------------------------===# 13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarduse strict; 15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarduse warnings; 16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarduse AMDGPUConstants; 18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $CREG_MAX = CONST_REG_COUNT - 1; 20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $TREG_MAX = TEMP_REG_COUNT - 1; 21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint <<STRING; 23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass R600Reg <string name> : Register<name> { 25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let Namespace = "AMDIL"; 26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass R600Reg_128<string n, list<Register> subregs> : RegisterWithSubRegs<n, subregs> { 29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let Namespace = "AMDIL"; 30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let SubRegIndices = [sel_x, sel_y, sel_z, sel_w]; 31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 33a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING 34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $i; 36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard### REG DEFS ### 38a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 39a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @creg_list = print_reg_defs(CONST_REG_COUNT * 4, "C"); 40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @treg_list = print_reg_defs(TEMP_REG_COUNT * 4, "T"); 41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @t128reg; 43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy @treg_x; 44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor (my $i = 0; $i < TEMP_REG_COUNT; $i++) { 45a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my $name = "T$i\_XYZW"; 46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard print qq{def $name : R600Reg_128 <"T$i.XYZW", [T$i\_X, T$i\_Y, T$i\_Z, T$i\_W] >;\n}; 47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $t128reg[$i] = $name; 48a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $treg_x[$i] = "T$i\_X"; 49a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 50a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 51a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $treg_string = join(",", @treg_list); 52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $creg_list = join(",", @creg_list); 53a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $t128_string = join(",", @t128reg); 54a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy $treg_x_string = join(",", @treg_x); 55a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint <<STRING; 56a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 57a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass RegSet <dag s> { 58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard dag set = s; 59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 61a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ZERO : R600Reg<"0.0">; 62a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef HALF : R600Reg<"0.5">; 63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ONE : R600Reg<"1.0">; 64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ONE_INT : R600Reg<"1">; 65a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef NEG_HALF : R600Reg<"-0.5">; 66a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef NEG_ONE : R600Reg<"-1.0">; 67a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef PV_X : R600Reg<"pv.x">; 68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef ALU_LITERAL_X : R600Reg<"literal.x">; 69a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 70a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef R600_CReg32 : RegisterClass <"AMDIL", [f32, i32], 32, (add 71a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $creg_list)>; 72a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 73a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef R600_TReg32 : RegisterClass <"AMDIL", [f32, i32], 32, (add 74a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $treg_string)>; 75a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef R600_TReg32_X : RegisterClass <"AMDIL", [f32, i32], 32, (add 77a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $treg_x_string)>; 78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 79a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef R600_Reg32 : RegisterClass <"AMDIL", [f32, i32], 32, (add 80a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard R600_TReg32, 81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard R600_CReg32, 82a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard ZERO, HALF, ONE, ONE_INT, PV_X, ALU_LITERAL_X, NEG_ONE, NEG_HALF)>; 83a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 84a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarddef R600_Reg128 : RegisterClass<"AMDIL", [v4f32], 128, (add 85a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $t128_string)> 86a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 87a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let SubRegClasses = [(R600_TReg32 sel_x, sel_y, sel_z, sel_w)]; 88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 89a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 90a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING 91a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 92a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy %index_map; 93a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardmy %chan_map; 94a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 95a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor ($i = 0; $i <= $#creg_list; $i++) { 96a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard push(@{$index_map{get_hw_index($i)}}, $creg_list[$i]); 97a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard push(@{$chan_map{get_chan_str($i)}}, $creg_list[$i]); 98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 99a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 100a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor ($i = 0; $i <= $#treg_list; $i++) { 101a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard push(@{$index_map{get_hw_index($i)}}, $treg_list[$i]); 102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard push(@{$chan_map{get_chan_str($i)}}, $treg_list[$i]); 103a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 104a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardfor ($i = 0; $i <= $#t128reg; $i++) { 106a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard push(@{$index_map{$i}}, $t128reg[$i]); 107a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard push(@{$chan_map{'X'}}, $t128reg[$i]); 108a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 109a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 110a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardopen(OUTFILE, ">", "R600HwRegInfo.include"); 111a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 112a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE <<STRING; 113a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 114a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardunsigned R600RegisterInfo::getHWRegIndexGen(unsigned reg) const 115a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 116a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard switch(reg) { 117a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard default: assert(!"Unknown register"); return 0; 118a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING 119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardforeach my $key (keys(%index_map)) { 120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard foreach my $reg (@{$index_map{$key}}) { 121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard print OUTFILE " case AMDIL::$reg:\n"; 122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 123a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard print OUTFILE " return $key;\n\n"; 124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE " }\n}\n\n"; 127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE <<STRING; 129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardunsigned R600RegisterInfo::getHWRegChanGen(unsigned reg) const 131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{ 132a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard switch(reg) { 133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard default: assert(!"Unknown register"); return 0; 134a75c6163e605f35b14f26930dd9227e4f337ec9eTom StellardSTRING 135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardforeach my $key (keys(%chan_map)) { 137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard foreach my $reg (@{$chan_map{$key}}) { 138a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard print OUTFILE " case AMDIL::$reg:\n"; 139a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 140a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my $val; 141a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard if ($key eq 'X') { 142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $val = 0; 143a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } elsif ($key eq 'Y') { 144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $val = 1; 145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } elsif ($key eq 'Z') { 146a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $val = 2; 147a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } elsif ($key eq 'W') { 148a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $val = 3; 149a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } else { 150a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard die("Unknown chan value; $key"); 151a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 152a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard print OUTFILE " return $val;\n\n"; 153a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 154a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 155a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardprint OUTFILE " }\n}\n\n"; 156a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 157a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardsub print_reg_defs { 158a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my ($count, $prefix) = @_; 159a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 160a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my @reg_list; 161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard for ($i = 0; $i < $count; $i++) { 163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my $hw_index = get_hw_index($i); 164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my $chan= get_chan_str($i); 165a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard my $name = "$prefix$hw_index\_$chan"; 166a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard print qq{def $name : R600Reg <"$prefix$hw_index.$chan">;\n}; 167a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard $reg_list[$i] = $name; 168a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard } 169a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard return @reg_list; 170a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 171a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 172