OSDN Git Service

radeonsi: initial WIP SI code
[android-x86/external-mesa.git] / src / gallium / drivers / radeon / AMDGPUGenInstrEnums.pl
1 #===-- AMDGPUGenInstrEnums.pl - TODO: Add brief description -------===#
2 #
3 #                     The LLVM Compiler Infrastructure
4 #
5 # This file is distributed under the University of Illinois Open Source
6 # License. See LICENSE.TXT for details.
7 #
8 #===----------------------------------------------------------------------===#
9 #
10 # TODO: Add full description
11 #
12 #===----------------------------------------------------------------------===#
13
14 use warnings;
15 use strict;
16
17 my @F32_MULTICLASSES = qw {
18   UnaryIntrinsicFloat
19   UnaryIntrinsicFloatScalar
20   BinaryIntrinsicFloat
21   TernaryIntrinsicFloat
22   BinaryOpMCFloat
23 };
24
25 my @I32_MULTICLASSES = qw {
26   BinaryOpMCInt
27   BinaryOpMCi32
28   BinaryOpMCi32Const
29 };
30
31 my @GENERATION_ENUM = qw {
32   R600_CAYMAN
33   R600
34   EG
35   EG_CAYMAN
36   CAYMAN
37   SI
38 };
39
40 my $FILE_TYPE = $ARGV[0];
41
42 open AMDIL, '<', 'AMDILInstructions.td';
43
44 my @INST_ENUMS = ('NONE', 'FEQ', 'FGE', 'FLT', 'FNE', 'MOVE_f32', 'MOVE_i32', 'FTOI', 'ITOF', 'CMOVLOG_f32', 'UGT', 'IGE', 'INE', 'UGE', 'IEQ');
45
46 while (<AMDIL>) {
47   if ($_ =~ /defm\s+([A-Z_]+)\s+:\s+([A-Za-z0-9]+)</) {
48     if (grep {$_ eq $2} @F32_MULTICLASSES) {
49       push @INST_ENUMS, "$1\_f32";
50
51     } elsif (grep {$_ eq $2} @I32_MULTICLASSES) {
52       push @INST_ENUMS, "$1\_i32";
53     }
54   } elsif ($_ =~ /def\s+([A-Z_]+)(_[fi]32)/) {
55     push @INST_ENUMS, "$1$2";
56   }
57 }
58
59 if ($FILE_TYPE eq 'td') {
60
61   print_td_enum('AMDILInst', 'AMDILInstEnums', 'field bits<16>', @INST_ENUMS);
62
63   print_td_enum('AMDGPUGen', 'AMDGPUGenEnums', 'field bits<3>', @GENERATION_ENUM);
64
65   my %constants = (
66     'PI' =>      '0x40490fdb',
67     'TWO_PI' =>     '0x40c90fdb',
68     'TWO_PI_INV' => '0x3e22f983'
69   );
70
71   print "class Constants {\n";
72   foreach (keys(%constants)) {
73     print "int $_ = $constants{$_};\n";
74   }
75   print "}\n";
76   print "def CONST : Constants;\n";
77
78 } elsif ($FILE_TYPE eq 'h') {
79
80   print "unsigned GetRealAMDILOpcode(unsigned internalOpcode) const;\n";
81
82   print_h_enum('AMDILTblgenOpcode', @INST_ENUMS);
83
84   print_h_enum('AMDGPUGen', @GENERATION_ENUM);
85
86 } elsif ($FILE_TYPE eq 'inc') {
87   print "unsigned AMDGPUInstrInfo::GetRealAMDILOpcode(unsigned internalOpcode) const\n{\n";
88   print "  switch(internalOpcode) {\n";
89   #Start at 1 so we skip NONE
90   for (my $i = 1; $i < scalar(@INST_ENUMS); $i++) {
91     my $inst = $INST_ENUMS[$i];
92     print "  case AMDGPUInstrInfo::$inst: return AMDIL::$inst;\n";
93   }
94   print "  default: abort();\n";
95   print "  }\n}\n";
96 }
97
98
99 sub print_td_enum {
100   my ($instance, $class, $field, @values) = @_;
101
102   print "class $class {\n";
103
104   for (my $i = 0; $i < scalar(@values); $i++) {
105     print "  $field $values[$i] = $i;\n";
106   }
107   print "}\n";
108
109   print "def $instance : $class;\n";
110 }
111
112 sub print_h_enum {
113
114   my ($enum, @list) = @_;
115   print "enum $enum {\n";
116
117   for (my $i = 0; $i < scalar(@list); $i++) {
118     print "  $list[$i] = $i";
119     if ($i != $#list) {
120       print ',';
121     }
122     print "\n";
123   }
124   print "};\n";
125 }
126