draw: shortcircuit shuffle in aos_sse when possible
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 22 May 2008 12:48:07 +0000 (13:48 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Fri, 23 May 2008 08:16:58 +0000 (09:16 +0100)
src/gallium/auxiliary/draw/draw_vs_aos.c

index d60940bb7a139f1792cf8138ef782b2ead864d21..b8fad231ca145f889b747c171be7e2c7cba2ccd7 100644 (file)
@@ -809,7 +809,9 @@ static boolean emit_DP3( struct aos_compilation *cp, const struct tgsi_full_inst
    sse_addss(cp->func, dst, tmp); /* a*x+c*z, b*y, ?, ? */
    emit_pshufd(cp, tmp, dst, SHUF(Y,X,W,Z));
    sse_addss(cp->func, dst, tmp);
-   sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
+   
+   if (op->FullDstRegisters[0].DstRegister.WriteMask != 0x1)
+      sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
 
    aos_release_xmm_reg(cp, tmp.idx);
    store_dest(cp, &op->FullDstRegisters[0], dst);
@@ -833,7 +835,9 @@ static boolean emit_DP4( struct aos_compilation *cp, const struct tgsi_full_inst
    sse_addps(cp->func, dst, tmp); /* a*x+c*z, b*y+d*w, a*x+c*z, b*y+d*w */
    emit_pshufd(cp, tmp, dst, SHUF(Y,X,W,Z));
    sse_addss(cp->func, dst, tmp);
-   sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
+
+   if (op->FullDstRegisters[0].DstRegister.WriteMask != 0x1)
+      sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
 
    aos_release_xmm_reg(cp, tmp.idx);
    store_dest(cp, &op->FullDstRegisters[0], dst);
@@ -857,7 +861,9 @@ static boolean emit_DPH( struct aos_compilation *cp, const struct tgsi_full_inst
    sse_addss(cp->func, dst, tmp);
    emit_pshufd(cp, tmp, arg1, SHUF(W,W,W,W));
    sse_addss(cp->func, dst, tmp);
-   sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
+
+   if (op->FullDstRegisters[0].DstRegister.WriteMask != 0x1)
+      sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
 
    aos_release_xmm_reg(cp, tmp.idx);
    store_dest(cp, &op->FullDstRegisters[0], dst);
@@ -1233,7 +1239,8 @@ static boolean emit_RCP( struct aos_compilation *cp, const struct tgsi_full_inst
       sse_divss(cp->func, dst, arg0);
    }
 
-   sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
+   if (op->FullDstRegisters[0].DstRegister.WriteMask != 0x1)
+      sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
 
    store_dest(cp, &op->FullDstRegisters[0], dst);
    return TRUE;
@@ -1249,7 +1256,8 @@ static boolean emit_RSQ( struct aos_compilation *cp, const struct tgsi_full_inst
    /* Extend precision here...
     */
 
-   sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
+   if (op->FullDstRegisters[0].DstRegister.WriteMask != 0x1)
+      sse_shufps(cp->func, dst, dst, SHUF(X, X, X, X));
 
    store_dest(cp, &op->FullDstRegisters[0], dst);
    return TRUE;