[Mesa-dev] [PATCH 2/9] radeonsi: use V_BFE for extracting a sample index

Marek Olšák maraeo at gmail.com
Mon Mar 2 03:54:16 PST 2015


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_shader.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index b0417ed..f125483 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -192,6 +192,20 @@ static int get_param_index(unsigned semantic_name, unsigned index,
 }
 
 /**
+ * BitField Extract: ((value >> rshift) & ((1 << bitwidth) - 1))
+ */
+static LLVMValueRef build_bfe(struct gallivm_state *gallivm,
+			      LLVMValueRef value, LLVMValueRef rshift,
+			      LLVMValueRef bitwidth)
+{
+	LLVMValueRef args[3] = {value, rshift, bitwidth};
+
+	return build_intrinsic(gallivm->builder, "llvm.AMDGPU.bfe.u32",
+			       LLVMInt32TypeInContext(gallivm->context),
+			       args, Elements(args), LLVMReadNoneAttribute);
+}
+
+/**
  * Build an LLVM bytecode indexed load using LLVMBuildGEP + LLVMBuildLoad.
  * It's equivalent to doing a load from &base_ptr[index].
  *
@@ -1721,7 +1735,6 @@ static void tex_fetch_args(
 
 		/* Initialize some constants. */
 		LLVMValueRef four = LLVMConstInt(uint_bld->elem_type, 4, 0);
-		LLVMValueRef F = LLVMConstInt(uint_bld->elem_type, 0xF, 0);
 
 		/* Apply the formula. */
 		LLVMValueRef fmask =
@@ -1734,11 +1747,8 @@ static void tex_fetch_args(
 		LLVMValueRef sample_index4 =
 			LLVMBuildMul(gallivm->builder, address[sample_chan], four, "");
 
-		LLVMValueRef shifted_fmask =
-			LLVMBuildLShr(gallivm->builder, fmask, sample_index4, "");
-
-		LLVMValueRef final_sample =
-			LLVMBuildAnd(gallivm->builder, shifted_fmask, F, "");
+		LLVMValueRef final_sample = build_bfe(gallivm, fmask,
+						      sample_index4, four);
 
 		/* Don't rewrite the sample index if WORD1.DATA_FORMAT of the FMASK
 		 * resource descriptor is 0 (invalid),
-- 
2.1.0



More information about the mesa-dev mailing list