summaryrefslogtreecommitdiff
path: root/assembler/gram.y
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2006-08-30 09:57:20 -0700
committerDamien Lespiau <damien.lespiau@intel.com>2013-03-04 15:54:23 +0000
commit2d298742bfabc799251920c01b3b1db255b13145 (patch)
treeb1c2808401cab6348414e04a92ef99399df130bb /assembler/gram.y
parent3bcf6b29cdef3cde36a55a5dde6d451a8d8e2f4b (diff)
Add support for register-indirect addressing in source operands.
Diffstat (limited to 'assembler/gram.y')
-rw-r--r--assembler/gram.y35
1 files changed, 29 insertions, 6 deletions
diff --git a/assembler/gram.y b/assembler/gram.y
index 544d321c..36fd6366 100644
--- a/assembler/gram.y
+++ b/assembler/gram.y
@@ -115,7 +115,7 @@
%type <integer> urb_swizzle urb_allocate urb_used urb_complete
%type <integer> math_function math_signed math_scalar
%type <integer> predctrl predstate
-%type <region> region region_wh
+%type <region> region region_wh indirectregion
%type <direct_reg> directgenreg directmsgreg addrreg accreg flagreg maskreg
%type <direct_reg> maskstackreg maskstackdepthreg notifyreg
%type <direct_reg> statereg controlreg ipreg nullreg
@@ -125,6 +125,7 @@
%type <imm32> imm32
%type <dst_operand> dst dstoperand dstoperandex dstreg post_dst writemask
%type <src_operand> directsrcoperand srcarchoperandex directsrcaccoperand
+%type <src_operand> indirectsrcoperand
%type <src_operand> src srcimm imm32reg payload srcacc srcaccimm swizzle
%%
@@ -512,8 +513,7 @@ dstreg: directgenreg
srcaccimm: srcacc | imm32reg
;
-/* XXX: indirectsrcaccoperand */
-srcacc: directsrcaccoperand
+srcacc: directsrcaccoperand | indirectsrcoperand
;
srcimm: directsrcoperand | imm32reg
@@ -611,13 +611,13 @@ srcarchoperandex: srcarchoperandex_typed region regtype
srcarchoperandex_typed: flagreg | addrreg | maskreg
;
-/* XXX: indirectsrcoperand */
-src: directsrcoperand
+src: directsrcoperand | indirectsrcoperand
;
directsrcoperand:
negate abs directgenreg region regtype swizzle
{
+ $$.address_mode = BRW_ADDRESS_DIRECT;
$$.reg_file = $3.reg_file;
$$.reg_nr = $3.reg_nr;
$$.subreg_nr = $3.subreg_nr;
@@ -636,6 +636,27 @@ directsrcoperand:
| srcarchoperandex
;
+indirectsrcoperand:
+ negate abs indirectgenreg indirectregion regtype swizzle
+ {
+ $$.address_mode = BRW_ADDRESS_REGISTER_INDIRECT_REGISTER;
+ $$.reg_file = $3.reg_file;
+ $$.address_subreg_nr = $3.address_subreg_nr;
+ $$.indirect_offset = $3.indirect_offset;
+ $$.reg_type = $5;
+ $$.vert_stride = $4.vert_stride;
+ $$.width = $4.width;
+ $$.horiz_stride = $4.horiz_stride;
+ $$.negate = $1;
+ $$.abs = $2;
+ $$.swizzle_set = $6.swizzle_set;
+ $$.swizzle_x = $6.swizzle_x;
+ $$.swizzle_y = $6.swizzle_y;
+ $$.swizzle_z = $6.swizzle_z;
+ $$.swizzle_w = $6.swizzle_w;
+ }
+;
+
/* 1.4.4: Address Registers */
/* Returns a partially-completed indirect_reg consisting of the address
* register fields for register-indirect access.
@@ -893,7 +914,7 @@ region: LANGLE INTEGER COMMA INTEGER COMMA INTEGER RANGLE
/* region_wh is used in specifying indirect operands where rather than having
* a vertical stride, you use subsequent address registers to get a new base
- * offset for the next row. XXX: source indirect addressing not set up yet.
+ * offset for the next row.
*/
region_wh: LANGLE INTEGER COMMA INTEGER RANGLE
{
@@ -903,6 +924,8 @@ region_wh: LANGLE INTEGER COMMA INTEGER RANGLE
}
;
+indirectregion: region | region_wh
+;
/* 1.4.8: Types */