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