Support Gen6 CALL instruction.

This commit is contained in:
Homer Hsing 2012-09-27 15:31:56 +08:00 committed by Damien Lespiau
parent b899aba57f
commit 7529682d0a

View File

@ -594,19 +594,37 @@ multibranchinstruction:
subroutineinstruction: subroutineinstruction:
predicate CALL execsize dst relativelocation instoptions predicate CALL execsize dst relativelocation instoptions
{ {
if($3 != 1 /* encoded int 2 */) { /*
fprintf(stderr, "The execution size of CALL should be 2.\n"); Gen6 bspec:
YYERROR; source, dest type should be DWORD.
} dest must be QWord aligned.
if($4.reg_type != BRW_REGISTER_TYPE_UD && $4.reg_type != BRW_REGISTER_TYPE_D) { source0 region control must be <2,2,1>.
fprintf(stderr, "The dest type of CALL should be UD or D.\n"); execution size must be 2.
YYERROR; QtrCtrl is prohibited.
} JIP is an immediate operand, must be of type W.
Gen7 bspec:
source, dest type should be DWORD.
dest must be QWord aligned.
source0 region control must be <2,2,1>.
execution size must be 2.
*/
memset(&$$, 0, sizeof($$)); memset(&$$, 0, sizeof($$));
set_instruction_predicate(&$$, &$1); set_instruction_predicate(&$$, &$1);
$$.header.opcode = $2; $$.header.opcode = $2;
$$.header.execution_size = $3; $$.header.execution_size = 1; /* execution size must be 2. Here 1 is encoded 2. */
$4.reg_type = BRW_REGISTER_TYPE_D; /* dest type should be DWORD */
set_instruction_dest(&$$, &$4); set_instruction_dest(&$$, &$4);
struct src_operand src0;
memset(&src0, 0, sizeof(src0));
src0.reg_type = BRW_REGISTER_TYPE_D; /* source type should be DWORD */
/* source0 region control must be <2,2,1>. */
src0.horiz_stride = 1; /*encoded 1*/
src0.width = 1; /*encoded 2*/
src0.vert_stride = 2; /*encoded 2*/
set_instruction_src0(&$$, &src0);
$$.first_reloc_target = $5.reloc_target; $$.first_reloc_target = $5.reloc_target;
$$.first_reloc_offset = $5.imm32; $$.first_reloc_offset = $5.imm32;
} }