intel/tools: Make swizzle an integer
[mesa.git] / src / intel / tools / i965_gram.y
index 82b3d2f5119047797ad786ea0583be691f07c19d..89b3601135352dde31103bba6132e6f4b2ea5f8b 100644 (file)
@@ -321,6 +321,7 @@ i965_asm_set_dst_nr(struct brw_codegen *p,
        int integer;
        unsigned long long int llint;
        struct brw_reg reg;
+       enum brw_reg_type reg_type;
        struct brw_codegen *program;
        struct predicate predicate;
        struct condition condition;
@@ -469,8 +470,7 @@ i965_asm_set_dst_nr(struct brw_codegen *p,
 %type <reg> writemask
 
 /* dst operand */
-%type <reg> dst dstoperand dstoperandex dstoperandex_typed dstreg dsttype
-%type <reg> dstoperandex_ud_typed
+%type <reg> dst dstoperand dstoperandex dstoperandex_typed dstreg
 %type <integer> dstregion
 
 %type <integer> saturate relativelocation rellocation
@@ -478,16 +478,20 @@ i965_asm_set_dst_nr(struct brw_codegen *p,
 
 /* src operand */
 %type <reg> directsrcoperand directsrcaccoperand indirectsrcoperand srcacc
-%type <reg> srcarcoperandex srcaccimm srcarcoperandex_typed srctype srcimm
-%type <reg> srcarcoperandex_ud_typed srcimmtype indirectgenreg indirectregion
+%type <reg> srcarcoperandex srcaccimm srcarcoperandex_typed srcimm
+%type <reg> indirectgenreg indirectregion
 %type <reg> immreg src reg32 payload directgenreg_list addrparam region
-%type <reg> region_wh swizzle directgenreg directmsgreg indirectmsgreg
+%type <reg> region_wh directgenreg directmsgreg indirectmsgreg
+%type <integer> swizzle
 
 /* registers */
 %type <reg> accreg addrreg channelenablereg controlreg flagreg ipreg
 %type <reg> notifyreg nullreg performancereg threadcontrolreg statereg maskreg
 %type <integer> subregnum
 
+/* register types */
+%type <reg_type> reg_type imm_type
+
 /* immediate values */
 %type <llint> immval
 
@@ -775,7 +779,6 @@ binaryaccinstruction:
                if (p->devinfo->gen >= 7)
                        brw_inst_set_nib_control(p->devinfo, brw_last_inst,
                                                 $9.nib_ctrl);
-
        }
        ;
 
@@ -1420,7 +1423,7 @@ dst:
        ;
 
 dstoperand:
-       dstreg dstregion writemask dsttype
+       dstreg dstregion writemask reg_type
        {
                $$ = $1;
 
@@ -1431,33 +1434,27 @@ dstoperand:
                } else {
                        $$.hstride = $2;
                }
-               $$.type = $4.type;
+               $$.type = $4;
                $$.writemask = $3.writemask;
                $$.swizzle = BRW_SWIZZLE_NOOP;
-               $$.subnr = $$.subnr * brw_reg_type_to_size($4.type);
+               $$.subnr = $$.subnr * brw_reg_type_to_size($4);
        }
        ;
 
 dstoperandex:
-       dstoperandex_typed dstregion writemask dsttype
+       dstoperandex_typed dstregion writemask reg_type
        {
                $$ = $1;
                $$.hstride = $2;
-               $$.type = $4.type;
+               $$.type = $4;
                $$.writemask = $3.writemask;
-               $$.subnr = $$.subnr * brw_reg_type_to_size($4.type);
-       }
-       | dstoperandex_ud_typed
-       {
-               $$ = $1;
-               $$.hstride = 1;
-               $$.type = BRW_REGISTER_TYPE_UD;
+               $$.subnr = $$.subnr * brw_reg_type_to_size($4);
        }
        /* BSpec says "When the conditional modifier is present, updates
         * to the selected flag register also occur. In this case, the
         * register region fields of the ‘null’ operand are valid."
         */
-       | nullreg dstregion writemask dsttype
+       | nullreg dstregion writemask reg_type
        {
                $$ = $1;
                if ($2 == -1) {
@@ -1468,7 +1465,7 @@ dstoperandex:
                        $$.hstride = $2;
                }
                $$.writemask = $3.writemask;
-               $$.type = $4.type;
+               $$.type = $4;
        }
        | threadcontrolreg
        {
@@ -1478,18 +1475,15 @@ dstoperandex:
        }
        ;
 
-dstoperandex_ud_typed:
-       controlreg
-       | ipreg
-       | channelenablereg
-       | performancereg
-       ;
-
 dstoperandex_typed:
        accreg
-       | flagreg
        | addrreg
+       | channelenablereg
+       | controlreg
+       | flagreg
+       | ipreg
        | maskreg
+       | performancereg
        | statereg
        ;
 
@@ -1523,11 +1517,11 @@ srcaccimm:
        ;
 
 immreg:
-       immval srcimmtype
+       immval imm_type
        {
                uint32_t u32;
                uint64_t u64;
-               switch ($2.type) {
+               switch ($2) {
                case BRW_REGISTER_TYPE_UD:
                        u32 = $1;
                        $$ = brw_imm_ud(u32);
@@ -1571,16 +1565,16 @@ immreg:
                        $$.d64 = $1;
                        break;
                default:
-                       error(&@2, "Unkown immdediate type %s\n",
-                             brw_reg_type_to_letters($2.type));
+                       error(&@2, "Unknown immediate type %s\n",
+                             brw_reg_type_to_letters($2));
                }
        }
        ;
 
 reg32:
-       directgenreg region srctype
+       directgenreg region reg_type
        {
-               $$ = set_direct_src_operand(&$1, $3.type);
+               $$ = set_direct_src_operand(&$1, $3);
                $$ = stride($$, $2.vstride, $2.width, $2.hstride);
        }
        ;
@@ -1607,9 +1601,9 @@ srcimm:
 
 directsrcaccoperand:
        directsrcoperand
-       | accreg region srctype
+       | accreg region reg_type
        {
-               $$ = set_direct_src_operand(&$1, $3.type);
+               $$ = set_direct_src_operand(&$1, $3);
                $$.vstride = $2.vstride;
                $$.width = $2.width;
                $$.hstride = $2.hstride;
@@ -1617,27 +1611,23 @@ directsrcaccoperand:
        ;
 
 srcarcoperandex:
-       srcarcoperandex_typed region srctype
+       srcarcoperandex_typed region reg_type
        {
                $$ = brw_reg($1.file,
                             $1.nr,
                             $1.subnr,
                             0,
                             0,
-                            $3.type,
+                            $3,
                             $2.vstride,
                             $2.width,
                             $2.hstride,
                             BRW_SWIZZLE_NOOP,
                             WRITEMASK_XYZW);
        }
-       | srcarcoperandex_ud_typed
-       {
-               $$ = set_direct_src_operand(&$1, BRW_REGISTER_TYPE_UD);
-       }
-       | nullreg region srctype
+       | nullreg region reg_type
        {
-               $$ = set_direct_src_operand(&$1, $3.type);
+               $$ = set_direct_src_operand(&$1, $3);
                $$.vstride = $2.vstride;
                $$.width = $2.width;
                $$.hstride = $2.hstride;
@@ -1648,32 +1638,28 @@ srcarcoperandex:
        }
        ;
 
-srcarcoperandex_ud_typed:
-       controlreg
-       | statereg
-       | ipreg
-       | channelenablereg
-       ;
-
 srcarcoperandex_typed:
-       flagreg
+       channelenablereg
+       | controlreg
+       | flagreg
+       | ipreg
        | maskreg
        | statereg
        ;
 
 indirectsrcoperand:
-       negate abs indirectgenreg indirectregion swizzle srctype
+       negate abs indirectgenreg indirectregion swizzle reg_type
        {
                $$ = brw_reg($3.file,
                             0,
                             $3.subnr,
                             $1,  // negate
                             $2,  // abs
-                            $6.type,
+                            $6,
                             $4.vstride,
                             $4.width,
                             $4.hstride,
-                            $5.swizzle,
+                            $5,
                             WRITEMASK_X);
 
                $$.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
@@ -1691,18 +1677,18 @@ directgenreg_list:
        ;
 
 directsrcoperand:
-       negate abs directgenreg_list region swizzle srctype
+       negate abs directgenreg_list region swizzle reg_type
        {
                $$ = brw_reg($3.file,
                             $3.nr,
                             $3.subnr,
                             $1,
                             $2,
-                            $6.type,
+                            $6,
                             $4.vstride,
                             $4.width,
                             $4.hstride,
-                            $5.swizzle,
+                            $5,
                             WRITEMASK_X);
        }
        | srcarcoperandex
@@ -1771,17 +1757,15 @@ indirectmsgreg:
 addrreg:
        ADDRREG subregnum
        {
-               if ($1 != 0)
-                       error(&@1, "Address register number %d"
-                                  "out of range\n", $1);
-
                int subnr = (p->devinfo->gen >= 8) ? 16 : 8;
 
                if ($2 > subnr)
-                       error(&@2, "Address sub resgister number %d"
+                       error(&@2, "Address sub register number %d"
                                   "out of range\n", $2);
 
-               $$ = brw_address_reg($2);
+               $$.file = BRW_ARCHITECTURE_REGISTER_FILE;
+               $$.nr = BRW_ARF_ADDRESS;
+               $$.subnr = $2;
        }
        ;
 
@@ -1873,21 +1857,16 @@ statereg:
 controlreg:
        CONTROLREG subregnum
        {
-               if ($1 > 0)
-                       error(&@1, "Control register number %d"
-                                  " out of range\n", $1);
-
-               if ($2 > 4)
+               if ($2 > 3)
                        error(&@2, "control sub register number %d"
                                   " out of range\n", $2);
 
                $$ = brw_cr0_reg($2);
-               $$.nr = $1;
        }
        ;
 
 ipreg:
-       IPREG srctype   { $$ = brw_ip_reg(); }
+       IPREG           { $$ = brw_ip_reg(); }
        ;
 
 nullreg:
@@ -2038,31 +2017,26 @@ region_wh:
        }
        ;
 
-srctype:
-       %empty          { $$ = retype($$, BRW_REGISTER_TYPE_F); }
-       | TYPE_F        { $$ = retype($$, BRW_REGISTER_TYPE_F); }
-       | TYPE_UD       { $$ = retype($$, BRW_REGISTER_TYPE_UD); }
-       | TYPE_D        { $$ = retype($$, BRW_REGISTER_TYPE_D); }
-       | TYPE_UW       { $$ = retype($$, BRW_REGISTER_TYPE_UW); }
-       | TYPE_W        { $$ = retype($$, BRW_REGISTER_TYPE_W); }
-       | TYPE_UB       { $$ = retype($$, BRW_REGISTER_TYPE_UB); }
-       | TYPE_B        { $$ = retype($$, BRW_REGISTER_TYPE_B); }
-       | TYPE_DF       { $$ = retype($$, BRW_REGISTER_TYPE_DF); }
-       | TYPE_UQ       { $$ = retype($$, BRW_REGISTER_TYPE_UQ); }
-       | TYPE_Q        { $$ = retype($$, BRW_REGISTER_TYPE_Q); }
-       | TYPE_HF       { $$ = retype($$, BRW_REGISTER_TYPE_HF); }
-       | TYPE_NF       { $$ = retype($$, BRW_REGISTER_TYPE_NF); }
-       ;
-
-srcimmtype:
-       srctype         { $$ = $1; }
-       | TYPE_V        { $$ = retype($$, BRW_REGISTER_TYPE_V); }
-       | TYPE_VF       { $$ = retype($$, BRW_REGISTER_TYPE_VF); }
-       | TYPE_UV       { $$ = retype($$, BRW_REGISTER_TYPE_UV); }
+reg_type:
+         TYPE_F        { $$ = BRW_REGISTER_TYPE_F;  }
+       | TYPE_UD       { $$ = BRW_REGISTER_TYPE_UD; }
+       | TYPE_D        { $$ = BRW_REGISTER_TYPE_D;  }
+       | TYPE_UW       { $$ = BRW_REGISTER_TYPE_UW; }
+       | TYPE_W        { $$ = BRW_REGISTER_TYPE_W;  }
+       | TYPE_UB       { $$ = BRW_REGISTER_TYPE_UB; }
+       | TYPE_B        { $$ = BRW_REGISTER_TYPE_B;  }
+       | TYPE_DF       { $$ = BRW_REGISTER_TYPE_DF; }
+       | TYPE_UQ       { $$ = BRW_REGISTER_TYPE_UQ; }
+       | TYPE_Q        { $$ = BRW_REGISTER_TYPE_Q;  }
+       | TYPE_HF       { $$ = BRW_REGISTER_TYPE_HF; }
+       | TYPE_NF       { $$ = BRW_REGISTER_TYPE_NF; }
        ;
 
-dsttype:
-       srctype         { $$ = $1; }
+imm_type:
+       reg_type        { $$ = $1; }
+       | TYPE_V        { $$ = BRW_REGISTER_TYPE_V;  }
+       | TYPE_VF       { $$ = BRW_REGISTER_TYPE_VF; }
+       | TYPE_UV       { $$ = BRW_REGISTER_TYPE_UV; }
        ;
 
 writemask:
@@ -2099,15 +2073,15 @@ writemask_w:
 swizzle:
        %empty
        {
-               $$.swizzle = BRW_SWIZZLE_NOOP;
+               $$ = BRW_SWIZZLE_NOOP;
        }
        | DOT chansel
        {
-               $$.swizzle = BRW_SWIZZLE4($2, $2, $2, $2);
+               $$ = BRW_SWIZZLE4($2, $2, $2, $2);
        }
        | DOT chansel chansel chansel chansel
        {
-               $$.swizzle = BRW_SWIZZLE4($2, $3, $4, $5);
+               $$ = BRW_SWIZZLE4($2, $3, $4, $5);
        }
        ;