00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027  
00028 
00029 
00030 
00031 
00032 
00033 #include "brw_context.h"
00034 #include "brw_defines.h"
00035 #include "brw_eu.h"
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 static void guess_execution_size( struct brw_instruction *insn,
00045                                   struct brw_reg reg )
00046 {
00047    if (reg.width == BRW_WIDTH_8 &&
00048        insn->header.compression_control == BRW_COMPRESSION_COMPRESSED)
00049       insn->header.execution_size = BRW_EXECUTE_16;
00050    else
00051       insn->header.execution_size = reg.width;  
00052 }
00053 
00054 
00055 static void brw_set_dest( struct brw_instruction *insn,
00056                           struct brw_reg dest )
00057 {
00058    insn->bits1.da1.dest_reg_file = dest.file;
00059    insn->bits1.da1.dest_reg_type = dest.type;
00060    insn->bits1.da1.dest_address_mode = dest.address_mode;
00061 
00062    if (dest.address_mode == BRW_ADDRESS_DIRECT) {
00063       insn->bits1.da1.dest_reg_nr = dest.nr;
00064 
00065       if (insn->header.access_mode == BRW_ALIGN_1) {
00066          insn->bits1.da1.dest_subreg_nr = dest.subnr;
00067          insn->bits1.da1.dest_horiz_stride = BRW_HORIZONTAL_STRIDE_1;
00068       }
00069       else {
00070          insn->bits1.da16.dest_subreg_nr = dest.subnr / 16;
00071          insn->bits1.da16.dest_writemask = dest.dw1.bits.writemask;
00072       }
00073    }
00074    else {
00075       insn->bits1.ia1.dest_subreg_nr = dest.subnr;
00076 
00077       
00078 
00079       if (insn->header.access_mode == BRW_ALIGN_1) {
00080          insn->bits1.ia1.dest_indirect_offset = dest.dw1.bits.indirect_offset;
00081          insn->bits1.ia1.dest_horiz_stride = BRW_HORIZONTAL_STRIDE_1;
00082       }
00083       else {
00084          insn->bits1.ia16.dest_indirect_offset = dest.dw1.bits.indirect_offset;
00085       }
00086    }
00087 
00088    
00089 
00090 
00091    guess_execution_size(insn, dest);
00092 }
00093 
00094 static void brw_set_src0( struct brw_instruction *insn,
00095                       struct brw_reg reg )
00096 {
00097    assert(reg.file != BRW_MESSAGE_REGISTER_FILE);
00098 
00099    insn->bits1.da1.src0_reg_file = reg.file;
00100    insn->bits1.da1.src0_reg_type = reg.type;
00101    insn->bits2.da1.src0_abs = reg.abs;
00102    insn->bits2.da1.src0_negate = reg.negate;
00103    insn->bits2.da1.src0_address_mode = reg.address_mode;
00104 
00105    if (reg.file == BRW_IMMEDIATE_VALUE) {
00106       insn->bits3.ud = reg.dw1.ud;
00107 
00108       
00109 
00110       insn->bits1.da1.src1_reg_file = 0; 
00111       insn->bits1.da1.src1_reg_type = reg.type;
00112    }
00113    else
00114    {
00115       if (reg.address_mode == BRW_ADDRESS_DIRECT) {
00116          if (insn->header.access_mode == BRW_ALIGN_1) {
00117             insn->bits2.da1.src0_subreg_nr = reg.subnr;
00118             insn->bits2.da1.src0_reg_nr = reg.nr;
00119          }
00120          else {
00121             insn->bits2.da16.src0_subreg_nr = reg.subnr / 16;
00122             insn->bits2.da16.src0_reg_nr = reg.nr;
00123          }
00124       }
00125       else {
00126          insn->bits2.ia1.src0_subreg_nr = reg.subnr;
00127 
00128          if (insn->header.access_mode == BRW_ALIGN_1) {
00129             insn->bits2.ia1.src0_indirect_offset = reg.dw1.bits.indirect_offset;
00130          }
00131          else {
00132             insn->bits2.ia16.src0_subreg_nr = reg.dw1.bits.indirect_offset;
00133          }
00134       }
00135 
00136       if (insn->header.access_mode == BRW_ALIGN_1) {
00137          if (reg.width == BRW_WIDTH_1 &&
00138              insn->header.execution_size == BRW_EXECUTE_1) {
00139             insn->bits2.da1.src0_horiz_stride = BRW_HORIZONTAL_STRIDE_0;
00140             insn->bits2.da1.src0_width = BRW_WIDTH_1;
00141             insn->bits2.da1.src0_vert_stride = BRW_VERTICAL_STRIDE_0;
00142          }
00143          else {
00144             insn->bits2.da1.src0_horiz_stride = reg.hstride;
00145             insn->bits2.da1.src0_width = reg.width;
00146             insn->bits2.da1.src0_vert_stride = reg.vstride;
00147          }
00148       }
00149       else {
00150          insn->bits2.da16.src0_swz_x = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_X);
00151          insn->bits2.da16.src0_swz_y = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Y);
00152          insn->bits2.da16.src0_swz_z = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Z);
00153          insn->bits2.da16.src0_swz_w = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_W);
00154 
00155          
00156 
00157 
00158          if (reg.vstride == BRW_VERTICAL_STRIDE_8)
00159             insn->bits2.da16.src0_vert_stride = BRW_VERTICAL_STRIDE_4;
00160          else
00161             insn->bits2.da16.src0_vert_stride = reg.vstride;
00162       }
00163    }
00164 }
00165 
00166 
00167 void brw_set_src1( struct brw_instruction *insn,
00168                           struct brw_reg reg )
00169 {
00170    assert(reg.file != BRW_MESSAGE_REGISTER_FILE);
00171 
00172    insn->bits1.da1.src1_reg_file = reg.file;
00173    insn->bits1.da1.src1_reg_type = reg.type;
00174    insn->bits3.da1.src1_abs = reg.abs;
00175    insn->bits3.da1.src1_negate = reg.negate;
00176 
00177    
00178 
00179    assert(insn->bits1.da1.src0_reg_file != BRW_IMMEDIATE_VALUE);
00180 
00181    if (reg.file == BRW_IMMEDIATE_VALUE) {
00182       insn->bits3.ud = reg.dw1.ud;
00183    }
00184    else {
00185       
00186 
00187 
00188       assert (reg.address_mode == BRW_ADDRESS_DIRECT);
00189       
00190 
00191       if (insn->header.access_mode == BRW_ALIGN_1) {
00192          insn->bits3.da1.src1_subreg_nr = reg.subnr;
00193          insn->bits3.da1.src1_reg_nr = reg.nr;
00194       }
00195       else {
00196          insn->bits3.da16.src1_subreg_nr = reg.subnr / 16;
00197          insn->bits3.da16.src1_reg_nr = reg.nr;
00198       }
00199 
00200       if (insn->header.access_mode == BRW_ALIGN_1) {
00201          if (reg.width == BRW_WIDTH_1 &&
00202              insn->header.execution_size == BRW_EXECUTE_1) {
00203             insn->bits3.da1.src1_horiz_stride = BRW_HORIZONTAL_STRIDE_0;
00204             insn->bits3.da1.src1_width = BRW_WIDTH_1;
00205             insn->bits3.da1.src1_vert_stride = BRW_VERTICAL_STRIDE_0;
00206          }
00207          else {
00208             insn->bits3.da1.src1_horiz_stride = reg.hstride;
00209             insn->bits3.da1.src1_width = reg.width;
00210             insn->bits3.da1.src1_vert_stride = reg.vstride;
00211          }
00212       }
00213       else {
00214          insn->bits3.da16.src1_swz_x = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_X);
00215          insn->bits3.da16.src1_swz_y = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Y);
00216          insn->bits3.da16.src1_swz_z = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_Z);
00217          insn->bits3.da16.src1_swz_w = BRW_GET_SWZ(reg.dw1.bits.swizzle, BRW_CHANNEL_W);
00218 
00219          
00220 
00221 
00222          if (reg.vstride == BRW_VERTICAL_STRIDE_8)
00223             insn->bits3.da16.src1_vert_stride = BRW_VERTICAL_STRIDE_4;
00224          else
00225             insn->bits3.da16.src1_vert_stride = reg.vstride;
00226       }
00227    }
00228 }
00229 
00230 
00231 
00232 static void brw_set_math_message( struct brw_instruction *insn,
00233                                   unsigned msg_length,
00234                                   unsigned response_length,
00235                                   unsigned function,
00236                                   unsigned integer_type,
00237                                   boolean low_precision,
00238                                   boolean saturate,
00239                                   unsigned dataType )
00240 {
00241    brw_set_src1(insn, brw_imm_d(0));
00242 
00243    insn->bits3.math.function = function;
00244    insn->bits3.math.int_type = integer_type;
00245    insn->bits3.math.precision = low_precision;
00246    insn->bits3.math.saturate = saturate;
00247    insn->bits3.math.data_type = dataType;
00248    insn->bits3.math.response_length = response_length;
00249    insn->bits3.math.msg_length = msg_length;
00250    insn->bits3.math.msg_target = BRW_MESSAGE_TARGET_MATH;
00251    insn->bits3.math.end_of_thread = 0;
00252 }
00253 
00254 static void brw_set_urb_message( struct brw_instruction *insn,
00255                                  boolean allocate,
00256                                  boolean used,
00257                                  unsigned msg_length,
00258                                  unsigned response_length,
00259                                  boolean end_of_thread,
00260                                  boolean complete,
00261                                  unsigned offset,
00262                                  unsigned swizzle_control )
00263 {
00264    brw_set_src1(insn, brw_imm_d(0));
00265 
00266    insn->bits3.urb.opcode = 0;  
00267    insn->bits3.urb.offset = offset;
00268    insn->bits3.urb.swizzle_control = swizzle_control;
00269    insn->bits3.urb.allocate = allocate;
00270    insn->bits3.urb.used = used; 
00271    insn->bits3.urb.complete = complete;
00272    insn->bits3.urb.response_length = response_length;
00273    insn->bits3.urb.msg_length = msg_length;
00274    insn->bits3.urb.msg_target = BRW_MESSAGE_TARGET_URB;
00275    insn->bits3.urb.end_of_thread = end_of_thread;
00276 }
00277 
00278 static void brw_set_dp_write_message( struct brw_instruction *insn,
00279                                       unsigned binding_table_index,
00280                                       unsigned msg_control,
00281                                       unsigned msg_type,
00282                                       unsigned msg_length,
00283                                       unsigned pixel_scoreboard_clear,
00284                                       unsigned response_length,
00285                                       unsigned end_of_thread )
00286 {
00287    brw_set_src1(insn, brw_imm_d(0));
00288 
00289    insn->bits3.dp_write.binding_table_index = binding_table_index;
00290    insn->bits3.dp_write.msg_control = msg_control;
00291    insn->bits3.dp_write.pixel_scoreboard_clear = pixel_scoreboard_clear;
00292    insn->bits3.dp_write.msg_type = msg_type;
00293    insn->bits3.dp_write.send_commit_msg = 0;
00294    insn->bits3.dp_write.response_length = response_length;
00295    insn->bits3.dp_write.msg_length = msg_length;
00296    insn->bits3.dp_write.msg_target = BRW_MESSAGE_TARGET_DATAPORT_WRITE;
00297    insn->bits3.urb.end_of_thread = end_of_thread;
00298 }
00299 
00300 static void brw_set_dp_read_message( struct brw_instruction *insn,
00301                                       unsigned binding_table_index,
00302                                       unsigned msg_control,
00303                                       unsigned msg_type,
00304                                       unsigned target_cache,
00305                                       unsigned msg_length,
00306                                       unsigned response_length,
00307                                       unsigned end_of_thread )
00308 {
00309    brw_set_src1(insn, brw_imm_d(0));
00310 
00311    insn->bits3.dp_read.binding_table_index = binding_table_index;
00312    insn->bits3.dp_read.msg_control = msg_control;
00313    insn->bits3.dp_read.msg_type = msg_type;
00314    insn->bits3.dp_read.target_cache = target_cache;
00315    insn->bits3.dp_read.response_length = response_length;
00316    insn->bits3.dp_read.msg_length = msg_length;
00317    insn->bits3.dp_read.msg_target = BRW_MESSAGE_TARGET_DATAPORT_READ;
00318    insn->bits3.dp_read.end_of_thread = end_of_thread;
00319 }
00320 
00321 static void brw_set_sampler_message( struct brw_instruction *insn,
00322                                      unsigned binding_table_index,
00323                                      unsigned sampler,
00324                                      unsigned msg_type,
00325                                      unsigned response_length,
00326                                      unsigned msg_length,
00327                                      boolean eot)
00328 {
00329    brw_set_src1(insn, brw_imm_d(0));
00330 
00331    insn->bits3.sampler.binding_table_index = binding_table_index;
00332    insn->bits3.sampler.sampler = sampler;
00333    insn->bits3.sampler.msg_type = msg_type;
00334    insn->bits3.sampler.return_format = BRW_SAMPLER_RETURN_FORMAT_FLOAT32;
00335    insn->bits3.sampler.response_length = response_length;
00336    insn->bits3.sampler.msg_length = msg_length;
00337    insn->bits3.sampler.end_of_thread = eot;
00338    insn->bits3.sampler.msg_target = BRW_MESSAGE_TARGET_SAMPLER;
00339 }
00340 
00341 
00342 
00343 static struct brw_instruction *next_insn( struct brw_compile *p,
00344                                           unsigned opcode )
00345 {
00346    struct brw_instruction *insn;
00347 
00348    assert(p->nr_insn + 1 < BRW_EU_MAX_INSN);
00349 
00350    insn = &p->store[p->nr_insn++];
00351    memcpy(insn, p->current, sizeof(*insn));
00352 
00353    
00354 
00355 
00356    if (p->current->header.destreg__conditonalmod) {
00357       p->current->header.destreg__conditonalmod = 0;
00358       p->current->header.predicate_control = BRW_PREDICATE_NORMAL;
00359    }
00360 
00361    insn->header.opcode = opcode;
00362    return insn;
00363 }
00364 
00365 
00366 struct brw_instruction *brw_alu1( struct brw_compile *p,
00367                                   unsigned opcode,
00368                                   struct brw_reg dest,
00369                                   struct brw_reg src )
00370 {
00371    struct brw_instruction *insn = next_insn(p, opcode);
00372    brw_set_dest(insn, dest);
00373    brw_set_src0(insn, src);
00374    return insn;
00375 }
00376 
00377 struct brw_instruction *brw_alu2(struct brw_compile *p,
00378                                  unsigned opcode,
00379                                  struct brw_reg dest,
00380                                  struct brw_reg src0,
00381                                  struct brw_reg src1 )
00382 {
00383    struct brw_instruction *insn = next_insn(p, opcode);
00384    brw_set_dest(insn, dest);
00385    brw_set_src0(insn, src0);
00386    brw_set_src1(insn, src1);
00387    return insn;
00388 }
00389 
00390 
00391 
00392 
00393 
00394 #define ALU1(OP)                                        \
00395 struct brw_instruction *brw_##OP(struct brw_compile *p,                 \
00396               struct brw_reg dest,                      \
00397               struct brw_reg src0)                      \
00398 {                                                       \
00399    return brw_alu1(p, BRW_OPCODE_##OP, dest, src0);     \
00400 }
00401 
00402 #define ALU2(OP)                                        \
00403 struct brw_instruction *brw_##OP(struct brw_compile *p,                 \
00404               struct brw_reg dest,                      \
00405               struct brw_reg src0,                      \
00406               struct brw_reg src1)                      \
00407 {                                                       \
00408    return brw_alu2(p, BRW_OPCODE_##OP, dest, src0, src1);       \
00409 }
00410 
00411 
00412 ALU1(MOV)
00413 ALU2(SEL)
00414 ALU1(NOT)
00415 ALU2(AND)
00416 ALU2(OR)
00417 ALU2(XOR)
00418 ALU2(SHR)
00419 ALU2(SHL)
00420 ALU2(RSR)
00421 ALU2(RSL)
00422 ALU2(ASR)
00423 ALU2(ADD)
00424 ALU2(MUL)
00425 ALU1(FRC)
00426 ALU1(RNDD)
00427 ALU2(MAC)
00428 ALU2(MACH)
00429 ALU1(LZD)
00430 ALU2(DP4)
00431 ALU2(DPH)
00432 ALU2(DP3)
00433 ALU2(DP2)
00434 ALU2(LINE)
00435 
00436 
00437 
00438 
00439 void brw_NOP(struct brw_compile *p)
00440 {
00441    struct brw_instruction *insn = next_insn(p, BRW_OPCODE_NOP);
00442    brw_set_dest(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD));
00443    brw_set_src0(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD));
00444    brw_set_src1(insn, brw_imm_ud(0x0));
00445 }
00446 
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 struct brw_instruction *brw_JMPI(struct brw_compile *p,
00456               struct brw_reg dest,
00457               struct brw_reg src0,
00458               struct brw_reg src1)
00459 {
00460    struct brw_instruction *insn = brw_alu2(p, BRW_OPCODE_JMPI, dest, src0, src1);
00461 
00462    p->current->header.predicate_control = BRW_PREDICATE_NONE;
00463 
00464    return insn;
00465 }
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480 
00481 
00482 struct brw_instruction *brw_IF(struct brw_compile *p, unsigned execute_size)
00483 {
00484    struct brw_instruction *insn;
00485 
00486    if (p->single_program_flow) {
00487       assert(execute_size == BRW_EXECUTE_1);
00488 
00489       insn = next_insn(p, BRW_OPCODE_ADD);
00490       insn->header.predicate_inverse = 1;
00491    } else {
00492       insn = next_insn(p, BRW_OPCODE_IF);
00493    }
00494 
00495    
00496 
00497    brw_set_dest(insn, brw_ip_reg());
00498    brw_set_src0(insn, brw_ip_reg());
00499    brw_set_src1(insn, brw_imm_d(0x0));
00500 
00501    insn->header.execution_size = execute_size;
00502    insn->header.compression_control = BRW_COMPRESSION_NONE;
00503    insn->header.predicate_control = BRW_PREDICATE_NORMAL;
00504    insn->header.mask_control = BRW_MASK_ENABLE;
00505 
00506    p->current->header.predicate_control = BRW_PREDICATE_NONE;
00507 
00508    return insn;
00509 }
00510 
00511 
00512 struct brw_instruction *brw_ELSE(struct brw_compile *p,
00513                                  struct brw_instruction *if_insn)
00514 {
00515    struct brw_instruction *insn;
00516 
00517    if (p->single_program_flow) {
00518       insn = next_insn(p, BRW_OPCODE_ADD);
00519    } else {
00520       insn = next_insn(p, BRW_OPCODE_ELSE);
00521    }
00522 
00523    brw_set_dest(insn, brw_ip_reg());
00524    brw_set_src0(insn, brw_ip_reg());
00525    brw_set_src1(insn, brw_imm_d(0x0));
00526 
00527    insn->header.compression_control = BRW_COMPRESSION_NONE;
00528    insn->header.execution_size = if_insn->header.execution_size;
00529    insn->header.mask_control = BRW_MASK_ENABLE;
00530 
00531    
00532 
00533    if (p->single_program_flow) {
00534       assert(if_insn->header.opcode == BRW_OPCODE_ADD);
00535 
00536       if_insn->bits3.ud = (insn - if_insn + 1) * 16;
00537    } else {
00538       assert(if_insn->header.opcode == BRW_OPCODE_IF);
00539 
00540       if_insn->bits3.if_else.jump_count = insn - if_insn;
00541       if_insn->bits3.if_else.pop_count = 1;
00542       if_insn->bits3.if_else.pad0 = 0;
00543    }
00544 
00545    return insn;
00546 }
00547 
00548 void brw_ENDIF(struct brw_compile *p,
00549                struct brw_instruction *patch_insn)
00550 {
00551    if (p->single_program_flow) {
00552       
00553 
00554 
00555 
00556       struct brw_instruction *next = &p->store[p->nr_insn];
00557 
00558       assert(patch_insn->header.opcode == BRW_OPCODE_ADD);
00559 
00560       patch_insn->bits3.ud = (next - patch_insn) * 16;
00561    } else {
00562       struct brw_instruction *insn = next_insn(p, BRW_OPCODE_ENDIF);
00563 
00564       brw_set_dest(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD));
00565       brw_set_src0(insn, retype(brw_vec4_grf(0,0), BRW_REGISTER_TYPE_UD));
00566       brw_set_src1(insn, brw_imm_d(0x0));
00567 
00568       insn->header.compression_control = BRW_COMPRESSION_NONE;
00569       insn->header.execution_size = patch_insn->header.execution_size;
00570       insn->header.mask_control = BRW_MASK_ENABLE;
00571 
00572       assert(patch_insn->bits3.if_else.jump_count == 0);
00573 
00574       
00575 
00576 
00577       if (patch_insn->header.opcode == BRW_OPCODE_IF) {
00578          
00579 
00580          patch_insn->header.opcode = BRW_OPCODE_IFF;
00581          patch_insn->bits3.if_else.jump_count = insn - patch_insn + 1;
00582          patch_insn->bits3.if_else.pop_count = 0;
00583          patch_insn->bits3.if_else.pad0 = 0;
00584       } else if (patch_insn->header.opcode == BRW_OPCODE_ELSE) {
00585          patch_insn->bits3.if_else.jump_count = insn - patch_insn + 1;
00586          patch_insn->bits3.if_else.pop_count = 1;
00587          patch_insn->bits3.if_else.pad0 = 0;
00588       } else {
00589          assert(0);
00590       }
00591 
00592       
00593 
00594       insn->bits3.if_else.jump_count = 0;
00595       insn->bits3.if_else.pop_count = 1;
00596       insn->bits3.if_else.pad0 = 0;
00597    }
00598 }
00599 
00600 struct brw_instruction *brw_BREAK(struct brw_compile *p)
00601 {
00602    struct brw_instruction *insn;
00603    insn = next_insn(p, BRW_OPCODE_BREAK);
00604    brw_set_dest(insn, brw_ip_reg());
00605    brw_set_src0(insn, brw_ip_reg());
00606    brw_set_src1(insn, brw_imm_d(0x0));
00607    insn->header.compression_control = BRW_COMPRESSION_NONE;
00608    insn->header.execution_size = BRW_EXECUTE_8;
00609    insn->header.mask_control = BRW_MASK_DISABLE;
00610    insn->bits3.if_else.pad0 = 0;
00611    return insn;
00612 }
00613 
00614 struct brw_instruction *brw_CONT(struct brw_compile *p)
00615 {
00616    struct brw_instruction *insn;
00617    insn = next_insn(p, BRW_OPCODE_CONTINUE);
00618    brw_set_dest(insn, brw_ip_reg());
00619    brw_set_src0(insn, brw_ip_reg());
00620    brw_set_src1(insn, brw_imm_d(0x0));
00621    insn->header.compression_control = BRW_COMPRESSION_NONE;
00622    insn->header.execution_size = BRW_EXECUTE_8;
00623    insn->header.mask_control = BRW_MASK_DISABLE;
00624    insn->bits3.if_else.pad0 = 0;
00625    return insn;
00626 }
00627 
00628 
00629 
00630 struct brw_instruction *brw_DO(struct brw_compile *p, unsigned execute_size)
00631 {
00632    if (p->single_program_flow) {
00633       return &p->store[p->nr_insn];
00634    } else {
00635       struct brw_instruction *insn = next_insn(p, BRW_OPCODE_DO);
00636 
00637       
00638 
00639       brw_set_dest(insn, brw_null_reg());
00640       brw_set_src0(insn, brw_null_reg());
00641       brw_set_src1(insn, brw_null_reg());
00642 
00643       insn->header.compression_control = BRW_COMPRESSION_NONE;
00644       insn->header.execution_size = execute_size;
00645       insn->header.predicate_control = BRW_PREDICATE_NONE;
00646       
00647       insn->header.mask_control = BRW_MASK_DISABLE;
00648 
00649       return insn;
00650    }
00651 }
00652 
00653 
00654 
00655 struct brw_instruction *brw_WHILE(struct brw_compile *p,
00656                struct brw_instruction *do_insn)
00657 {
00658    struct brw_instruction *insn;
00659 
00660    if (p->single_program_flow)
00661       insn = next_insn(p, BRW_OPCODE_ADD);
00662    else
00663       insn = next_insn(p, BRW_OPCODE_WHILE);
00664 
00665    brw_set_dest(insn, brw_ip_reg());
00666    brw_set_src0(insn, brw_ip_reg());
00667    brw_set_src1(insn, brw_imm_d(0x0));
00668 
00669    insn->header.compression_control = BRW_COMPRESSION_NONE;
00670 
00671    if (p->single_program_flow) {
00672       insn->header.execution_size = BRW_EXECUTE_1;
00673 
00674       insn->bits3.d = (do_insn - insn) * 16;
00675    } else {
00676       insn->header.execution_size = do_insn->header.execution_size;
00677 
00678       assert(do_insn->header.opcode == BRW_OPCODE_DO);
00679       insn->bits3.if_else.jump_count = do_insn - insn;
00680       insn->bits3.if_else.pop_count = 0;
00681       insn->bits3.if_else.pad0 = 0;
00682    }
00683 
00684 
00685 
00686    insn->header.mask_control = BRW_MASK_DISABLE;
00687    p->current->header.predicate_control = BRW_PREDICATE_NONE;
00688    return insn;
00689 }
00690 
00691 
00692 
00693 
00694 void brw_land_fwd_jump(struct brw_compile *p,
00695                        struct brw_instruction *jmp_insn)
00696 {
00697    struct brw_instruction *landing = &p->store[p->nr_insn];
00698 
00699    assert(jmp_insn->header.opcode == BRW_OPCODE_JMPI);
00700    assert(jmp_insn->bits1.da1.src1_reg_file = BRW_IMMEDIATE_VALUE);
00701 
00702    jmp_insn->bits3.ud = (landing - jmp_insn) - 1;
00703 }
00704 
00705 
00706 
00707 
00708 
00709 
00710 
00711 void brw_CMP(struct brw_compile *p,
00712              struct brw_reg dest,
00713              unsigned conditional,
00714              struct brw_reg src0,
00715              struct brw_reg src1)
00716 {
00717    struct brw_instruction *insn = next_insn(p, BRW_OPCODE_CMP);
00718 
00719    insn->header.destreg__conditonalmod = conditional;
00720    brw_set_dest(insn, dest);
00721    brw_set_src0(insn, src0);
00722    brw_set_src1(insn, src1);
00723 
00724 
00725 
00726 
00727    
00728 
00729 
00730 
00731    if (dest.file == BRW_ARCHITECTURE_REGISTER_FILE &&
00732        dest.nr == 0) {
00733       p->current->header.predicate_control = BRW_PREDICATE_NORMAL;
00734       p->flag_value = 0xff;
00735    }
00736 }
00737 
00738 
00739 
00740 
00741 
00742 
00743 
00744 
00745 
00746 void brw_math( struct brw_compile *p,
00747                struct brw_reg dest,
00748                unsigned function,
00749                unsigned saturate,
00750                unsigned msg_reg_nr,
00751                struct brw_reg src,
00752                unsigned data_type,
00753                unsigned precision )
00754 {
00755    struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
00756    unsigned msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1;
00757    unsigned response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1;
00758 
00759    
00760 
00761 
00762    insn->header.predicate_control = 0;
00763    insn->header.destreg__conditonalmod = msg_reg_nr;
00764 
00765    brw_set_dest(insn, dest);
00766    brw_set_src0(insn, src);
00767    brw_set_math_message(insn,
00768                         msg_length, response_length,
00769                         function,
00770                         BRW_MATH_INTEGER_UNSIGNED,
00771                         precision,
00772                         saturate,
00773                         data_type);
00774 }
00775 
00776 
00777 
00778 void brw_math_16( struct brw_compile *p,
00779                   struct brw_reg dest,
00780                   unsigned function,
00781                   unsigned saturate,
00782                   unsigned msg_reg_nr,
00783                   struct brw_reg src,
00784                   unsigned precision )
00785 {
00786    struct brw_instruction *insn;
00787    unsigned msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1;
00788    unsigned response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1;
00789 
00790    
00791 
00792    brw_push_insn_state(p);
00793    brw_set_predicate_control_flag_value(p, 0xff);
00794    brw_set_compression_control(p, BRW_COMPRESSION_NONE);
00795 
00796    insn = next_insn(p, BRW_OPCODE_SEND);
00797    insn->header.destreg__conditonalmod = msg_reg_nr;
00798 
00799    brw_set_dest(insn, dest);
00800    brw_set_src0(insn, src);
00801    brw_set_math_message(insn,
00802                         msg_length, response_length,
00803                         function,
00804                         BRW_MATH_INTEGER_UNSIGNED,
00805                         precision,
00806                         saturate,
00807                         BRW_MATH_DATA_VECTOR);
00808 
00809    
00810 
00811    insn = next_insn(p, BRW_OPCODE_SEND);
00812    insn->header.compression_control = BRW_COMPRESSION_2NDHALF;
00813    insn->header.destreg__conditonalmod = msg_reg_nr+1;
00814 
00815    brw_set_dest(insn, offset(dest,1));
00816    brw_set_src0(insn, src);
00817    brw_set_math_message(insn,
00818                         msg_length, response_length,
00819                         function,
00820                         BRW_MATH_INTEGER_UNSIGNED,
00821                         precision,
00822                         saturate,
00823                         BRW_MATH_DATA_VECTOR);
00824 
00825    brw_pop_insn_state(p);
00826 }
00827 
00828 
00829 
00830 
00831 void brw_dp_WRITE_16( struct brw_compile *p,
00832                       struct brw_reg src,
00833                       unsigned msg_reg_nr,
00834                       unsigned scratch_offset )
00835 {
00836    {
00837       brw_push_insn_state(p);
00838       brw_set_mask_control(p, BRW_MASK_DISABLE);
00839       brw_set_compression_control(p, BRW_COMPRESSION_NONE);
00840 
00841       brw_MOV(p,
00842               retype(brw_vec1_grf(0, 2), BRW_REGISTER_TYPE_D),
00843               brw_imm_d(scratch_offset));
00844 
00845       brw_pop_insn_state(p);
00846    }
00847 
00848    {
00849       unsigned msg_length = 3;
00850       struct brw_reg dest = retype(brw_null_reg(), BRW_REGISTER_TYPE_UW);
00851       struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
00852 
00853       insn->header.predicate_control = 0; 
00854       insn->header.compression_control = BRW_COMPRESSION_NONE;
00855       insn->header.destreg__conditonalmod = msg_reg_nr;
00856 
00857       brw_set_dest(insn, dest);
00858       brw_set_src0(insn, src);
00859 
00860       brw_set_dp_write_message(insn,
00861                                255, 
00862                                BRW_DATAPORT_OWORD_BLOCK_4_OWORDS, 
00863                                BRW_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE, 
00864                                msg_length,
00865                                0, 
00866                                0, 
00867                                0); 
00868    }
00869 
00870 }
00871 
00872 
00873 void brw_dp_READ_16( struct brw_compile *p,
00874                       struct brw_reg dest,
00875                       unsigned msg_reg_nr,
00876                       unsigned scratch_offset )
00877 {
00878    {
00879       brw_push_insn_state(p);
00880       brw_set_compression_control(p, BRW_COMPRESSION_NONE);
00881       brw_set_mask_control(p, BRW_MASK_DISABLE);
00882 
00883       brw_MOV(p,
00884               retype(brw_vec1_grf(0, 2), BRW_REGISTER_TYPE_D),
00885               brw_imm_d(scratch_offset));
00886 
00887       brw_pop_insn_state(p);
00888    }
00889 
00890    {
00891       struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
00892 
00893       insn->header.predicate_control = 0; 
00894       insn->header.compression_control = BRW_COMPRESSION_NONE;
00895       insn->header.destreg__conditonalmod = msg_reg_nr;
00896 
00897       brw_set_dest(insn, dest); 
00898       brw_set_src0(insn, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UW));
00899 
00900       brw_set_dp_read_message(insn,
00901                               255, 
00902                               3,  
00903                               BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, 
00904                               1, 
00905                               1, 
00906                               2, 
00907                               0); 
00908    }
00909 }
00910 
00911 
00912 void brw_fb_WRITE(struct brw_compile *p,
00913                    struct brw_reg dest,
00914                    unsigned msg_reg_nr,
00915                    struct brw_reg src0,
00916                    unsigned binding_table_index,
00917                    unsigned msg_length,
00918                    unsigned response_length,
00919                    boolean eot)
00920 {
00921    struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
00922 
00923    insn->header.predicate_control = 0; 
00924    insn->header.compression_control = BRW_COMPRESSION_NONE;
00925    insn->header.destreg__conditonalmod = msg_reg_nr;
00926 
00927    brw_set_dest(insn, dest);
00928    brw_set_src0(insn, src0);
00929    brw_set_dp_write_message(insn,
00930                             binding_table_index,
00931                             BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE, 
00932                             BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE, 
00933                             msg_length,
00934                             1,  
00935                             response_length,
00936                             eot);
00937 }
00938 
00939 
00940 
00941 void brw_SAMPLE(struct brw_compile *p,
00942                 struct brw_reg dest,
00943                 unsigned msg_reg_nr,
00944                 struct brw_reg src0,
00945                 unsigned binding_table_index,
00946                 unsigned sampler,
00947                 unsigned writemask,
00948                 unsigned msg_type,
00949                 unsigned response_length,
00950                 unsigned msg_length,
00951                 boolean eot)
00952 {
00953    boolean need_stall = 0;
00954 
00955    if(writemask == 0) {
00956 
00957       return;
00958    }
00959 
00960    
00961 
00962 
00963 
00964 
00965 
00966 
00967 
00968 
00969 
00970    if (writemask != TGSI_WRITEMASK_XYZW) {
00971       unsigned dst_offset = 0;
00972       unsigned i, newmask = 0, len = 0;
00973 
00974       for (i = 0; i < 4; i++) {
00975          if (writemask & (1<<i))
00976             break;
00977          dst_offset += 2;
00978       }
00979       for (; i < 4; i++) {
00980          if (!(writemask & (1<<i)))
00981             break;
00982          newmask |= 1<<i;
00983          len++;
00984       }
00985 
00986       if (newmask != writemask) {
00987          need_stall = 1;
00988 
00989       }
00990       else {
00991          struct brw_reg m1 = brw_message_reg(msg_reg_nr);
00992 
00993          newmask = ~newmask & TGSI_WRITEMASK_XYZW;
00994 
00995          brw_push_insn_state(p);
00996 
00997          brw_set_compression_control(p, BRW_COMPRESSION_NONE);
00998          brw_set_mask_control(p, BRW_MASK_DISABLE);
00999 
01000          brw_MOV(p, m1, brw_vec8_grf(0,0));
01001          brw_MOV(p, get_element_ud(m1, 2), brw_imm_ud(newmask << 12));
01002 
01003          brw_pop_insn_state(p);
01004 
01005          src0 = retype(brw_null_reg(), BRW_REGISTER_TYPE_UW);
01006          dest = offset(dest, dst_offset);
01007          response_length = len * 2;
01008       }
01009    }
01010 
01011    {
01012       struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
01013 
01014       insn->header.predicate_control = 0; 
01015       insn->header.compression_control = BRW_COMPRESSION_NONE;
01016       insn->header.destreg__conditonalmod = msg_reg_nr;
01017 
01018       brw_set_dest(insn, dest);
01019       brw_set_src0(insn, src0);
01020       brw_set_sampler_message(insn,
01021                               binding_table_index,
01022                               sampler,
01023                               msg_type,
01024                               response_length,
01025                               msg_length,
01026                               eot);
01027    }
01028 
01029    if (need_stall)
01030    {
01031       struct brw_reg reg = vec8(offset(dest, response_length-1));
01032 
01033       
01034 
01035       brw_push_insn_state(p);
01036       brw_set_compression_control(p, FALSE);
01037       brw_MOV(p, reg, reg);
01038       brw_pop_insn_state(p);
01039    }
01040 
01041 }
01042 
01043 
01044 
01045 
01046 
01047 void brw_urb_WRITE(struct brw_compile *p,
01048                    struct brw_reg dest,
01049                    unsigned msg_reg_nr,
01050                    struct brw_reg src0,
01051                    boolean allocate,
01052                    boolean used,
01053                    unsigned msg_length,
01054                    unsigned response_length,
01055                    boolean eot,
01056                    boolean writes_complete,
01057                    unsigned offset,
01058                    unsigned swizzle)
01059 {
01060    struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
01061 
01062    assert(msg_length < 16);
01063 
01064    brw_set_dest(insn, dest);
01065    brw_set_src0(insn, src0);
01066    brw_set_src1(insn, brw_imm_d(0));
01067 
01068    insn->header.destreg__conditonalmod = msg_reg_nr;
01069 
01070    brw_set_urb_message(insn,
01071                        allocate,
01072                        used,
01073                        msg_length,
01074                        response_length,
01075                        eot,
01076                        writes_complete,
01077                        offset,
01078                        swizzle);
01079 }
01080