From: Matt Turner Date: Thu, 29 Jan 2015 19:15:10 +0000 (-0800) Subject: i965: Add function to negate immediates. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=638beee24ae097633c34261943aeb8b86fd2a5ee;p=mesa.git i965: Add function to negate immediates. Reviewed-by: Jason Ekstrand --- diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 20cbf5bacdb..c5a666cf2cc 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -620,6 +620,45 @@ brw_saturate_immediate(enum brw_reg_type type, struct brw_reg *reg) return false; } +bool +brw_negate_immediate(enum brw_reg_type type, struct brw_reg *reg) +{ + switch (type) { + case BRW_REGISTER_TYPE_D: + reg->dw1.d = -reg->dw1.d; + return true; + case BRW_REGISTER_TYPE_W: + reg->dw1.d = -(int16_t)reg->dw1.ud; + return true; + case BRW_REGISTER_TYPE_F: + reg->dw1.f = -reg->dw1.f; + return true; + case BRW_REGISTER_TYPE_VF: + reg->dw1.ud ^= 0x80808080; + return true; + case BRW_REGISTER_TYPE_UB: + case BRW_REGISTER_TYPE_B: + unreachable("no UB/B immediates"); + case BRW_REGISTER_TYPE_UD: + case BRW_REGISTER_TYPE_UW: + /* Presumably the negate modifier on an unsigned source is the same as + * on a signed source but it would be nice to confirm. + */ + assert(!"unimplemented: negate UD/UW immediate"); + case BRW_REGISTER_TYPE_UV: + case BRW_REGISTER_TYPE_V: + assert(!"unimplemented: negate UV/V immediate"); + case BRW_REGISTER_TYPE_UQ: + case BRW_REGISTER_TYPE_Q: + assert(!"unimplemented: negate UQ/Q immediate"); + case BRW_REGISTER_TYPE_DF: + case BRW_REGISTER_TYPE_HF: + assert(!"unimplemented: negate DF/HF immediate"); + } + + return false; +} + backend_visitor::backend_visitor(struct brw_context *brw, struct gl_shader_program *shader_prog, struct gl_program *prog, diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h index 6fc86e1c549..2b9b72e3ece 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.h +++ b/src/mesa/drivers/dri/i965/brw_shader.h @@ -195,6 +195,7 @@ enum brw_conditional_mod brw_conditional_for_comparison(unsigned int op); uint32_t brw_math_function(enum opcode op); const char *brw_instruction_name(enum opcode op); bool brw_saturate_immediate(enum brw_reg_type type, struct brw_reg *reg); +bool brw_negate_immediate(enum brw_reg_type type, struct brw_reg *reg); #ifdef __cplusplus extern "C" {