summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2015-01-29 11:15:10 -0800
committerMatt Turner <[email protected]>2015-02-03 12:25:14 -0800
commit638beee24ae097633c34261943aeb8b86fd2a5ee (patch)
tree54dd9762730ca3cbbf7746bd1abcb4c728338fae /src/mesa
parent1f4bdad31607a238944cf7b7ec35085718e6d969 (diff)
i965: Add function to negate immediates.
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_shader.cpp39
-rw-r--r--src/mesa/drivers/dri/i965/brw_shader.h1
2 files changed, 40 insertions, 0 deletions
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" {