*/
SHADER_OPCODE_BROADCAST,
- /**
- * Pick the byte from its first source register given by the index
- * specified as second source.
- */
- SHADER_OPCODE_EXTRACT_BYTE,
-
- /**
- * Pick the word from its first source register given by the index
- * specified as second source.
- */
- SHADER_OPCODE_EXTRACT_WORD,
-
VEC4_OPCODE_MOV_BYTES,
VEC4_OPCODE_PACK_BYTES,
VEC4_OPCODE_UNPACK_UNIFORM,
brw_broadcast(p, dst, src[0], src[1]);
break;
- case SHADER_OPCODE_EXTRACT_BYTE: {
- assert(src[0].type == BRW_REGISTER_TYPE_D ||
- src[0].type == BRW_REGISTER_TYPE_UD);
-
- enum brw_reg_type type =
- src[0].type == BRW_REGISTER_TYPE_D ? BRW_REGISTER_TYPE_B
- : BRW_REGISTER_TYPE_UB;
- brw_MOV(p, dst, spread(suboffset(retype(src[0], type), src[1].ud), 4));
- break;
- }
-
- case SHADER_OPCODE_EXTRACT_WORD: {
- assert(src[0].type == BRW_REGISTER_TYPE_D ||
- src[0].type == BRW_REGISTER_TYPE_UD);
-
- enum brw_reg_type type =
- src[0].type == BRW_REGISTER_TYPE_D ? BRW_REGISTER_TYPE_W
- : BRW_REGISTER_TYPE_UW;
- brw_MOV(p, dst, spread(suboffset(retype(src[0], type), src[1].ud), 2));
- break;
- }
-
case FS_OPCODE_SET_SAMPLE_ID:
generate_set_sample_id(inst, dst, src[0], src[1]);
break;
nir_const_value *element = nir_src_as_const_value(src0->src[1].src);
assert(element != NULL);
- enum opcode extract_op;
- if (src0->op == nir_op_extract_u16 || src0->op == nir_op_extract_i16) {
- assert(element->u32[0] <= 1);
- extract_op = SHADER_OPCODE_EXTRACT_WORD;
- } else {
- assert(element->u32[0] <= 3);
- extract_op = SHADER_OPCODE_EXTRACT_BYTE;
- }
+ /* Element type to extract.*/
+ const brw_reg_type type = brw_int_type(
+ src0->op == nir_op_extract_u16 || src0->op == nir_op_extract_i16 ? 2 : 1,
+ src0->op == nir_op_extract_i16 || src0->op == nir_op_extract_i8);
fs_reg op0 = get_nir_src(src0->src[0].src);
op0.type = brw_type_for_nir_type(
op0 = offset(op0, bld, src0->src[0].swizzle[0]);
set_saturate(instr->dest.saturate,
- bld.emit(extract_op, result, op0, brw_imm_ud(element->u32[0])));
+ bld.MOV(result, subscript(op0, type, element->u32[0])));
return true;
}
case nir_op_extract_u8:
case nir_op_extract_i8: {
+ const brw_reg_type type = brw_int_type(1, instr->op == nir_op_extract_i8);
nir_const_value *byte = nir_src_as_const_value(instr->src[1].src);
assert(byte != NULL);
- bld.emit(SHADER_OPCODE_EXTRACT_BYTE,
- result, op[0], brw_imm_ud(byte->u32[0]));
+ bld.MOV(result, subscript(op[0], type, byte->u32[0]));
break;
}
case nir_op_extract_u16:
case nir_op_extract_i16: {
+ const brw_reg_type type = brw_int_type(2, instr->op == nir_op_extract_i16);
nir_const_value *word = nir_src_as_const_value(instr->src[1].src);
assert(word != NULL);
- bld.emit(SHADER_OPCODE_EXTRACT_WORD,
- result, op[0], brw_imm_ud(word->u32[0]));
+ bld.MOV(result, subscript(op[0], type, word->u32[0]));
break;
}