From: José Fonseca Date: Wed, 12 Aug 2009 01:36:35 +0000 (+0100) Subject: llvmpipe: Migrate more SSE2 codegen to LLVM IR. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=90e9a4d4f99e722d8f0f2050e134a3c69863541b;p=mesa.git llvmpipe: Migrate more SSE2 codegen to LLVM IR. --- diff --git a/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c b/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c index 01aa3b8f20a..78adeab0ae4 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c @@ -82,30 +82,6 @@ struct lp_build_tgsi_soa_context }; -/** - * Function call helpers. - */ - -/** - * NOTE: In gcc, if the destination uses the SSE intrinsics, then it must be - * defined with __attribute__((force_align_arg_pointer)), as we do not guarantee - * that the stack pointer is 16 byte aligned, as expected. - */ -static void -emit_func_call( - struct lp_build_tgsi_soa_context *bld, - const LLVMValueRef *args, - unsigned nr_args, - void (PIPE_CDECL *code)() ) -{ -#if 0 - LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, - void* Addr); -#endif - -} - - /** * Register fetch. */ @@ -495,7 +471,9 @@ emit_instruction( struct tgsi_full_instruction *inst ) { unsigned chan_index; - LLVMValueRef tmp; + LLVMValueRef src0, src1, src2; + LLVMValueRef tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + LLVMValueRef dst0; /* we can't handle indirect addressing into temp register file yet */ if (indirect_temp_reference(inst)) @@ -505,10 +483,10 @@ emit_instruction( #if 0 case TGSI_OPCODE_ARL: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_flr(bld, 0, 0); emit_f2it( bld, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; #endif @@ -516,7 +494,8 @@ emit_instruction( case TGSI_OPCODE_MOV: case TGSI_OPCODE_SWZ: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, chan_index, FETCH( bld, *inst, 0, chan_index ) ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; @@ -524,33 +503,24 @@ emit_instruction( case TGSI_OPCODE_LIT: if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W ) ) { - emit_tempf( - bld, - 0, - TEMP_ONE_I, - TEMP_ONE_C); + tmp0 = bld->base.one; if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) ) { - STORE( bld, *inst, 0, 0, CHAN_X ); + STORE( bld, *inst, 0, CHAN_X, tmp0); } if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W ) ) { - STORE( bld, *inst, 0, 0, CHAN_W ); + STORE( bld, *inst, 0, CHAN_W, tmp0); } } if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) ) { if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) ) { - tmp = FETCH( bld, *inst, 0, 0, CHAN_X ); - sse_maxps( - bld, - make_xmm( 0 ), - get_temp( - TGSI_EXEC_TEMP_00000000_I, - TGSI_EXEC_TEMP_00000000_C ) ); - STORE( bld, *inst, 0, 0, CHAN_Y ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_max( &bld->base, tmp0, bld->base.one); + STORE( bld, *inst, 0, CHAN_Y, tmp0); } if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) ) { /* XMM[1] = SrcReg[0].yyyy */ - FETCH( bld, *inst, 1, 0, CHAN_Y ); + tmp1 = FETCH( bld, *inst, 0, CHAN_Y ); /* XMM[1] = max(XMM[1], 0) */ sse_maxps( bld, @@ -559,7 +529,7 @@ emit_instruction( TGSI_EXEC_TEMP_00000000_I, TGSI_EXEC_TEMP_00000000_C ) ); /* XMM[2] = SrcReg[0].wwww */ - FETCH( bld, *inst, 2, 0, CHAN_W ); + tmp2 = FETCH( bld, *inst, 0, CHAN_W ); /* XMM[2] = min(XMM[2], 128.0) */ sse_minps( bld, @@ -574,8 +544,8 @@ emit_instruction( get_temp( TGSI_EXEC_TEMP_MINUS_128_I, TGSI_EXEC_TEMP_MINUS_128_C ) ); - emit_pow( bld, 3, 1, 1, 2 ); - FETCH( bld, *inst, 0, 0, CHAN_X ); + tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); sse_xorps( bld, make_xmm( 2 ), @@ -589,7 +559,7 @@ emit_instruction( bld, make_xmm( 2 ), make_xmm( 1 ) ); - STORE( bld, *inst, 2, 0, CHAN_Z ); + STORE( bld, *inst, 0, CHAN_Z, tmp2); } } break; @@ -597,20 +567,20 @@ emit_instruction( case TGSI_OPCODE_RCP: /* TGSI_OPCODE_RECIP */ - tmp = FETCH( bld, *inst, 0, CHAN_X ); - tmp = lp_build_rcp(&bld->base, tmp); + src0 = FETCH( bld, *inst, 0, CHAN_X ); + dst0 = lp_build_rcp(&bld->base, src0); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, chan_index, tmp ); + STORE( bld, *inst, 0, chan_index, dst0 ); } break; case TGSI_OPCODE_RSQ: /* TGSI_OPCODE_RECIPSQRT */ - tmp = FETCH( bld, *inst, 0, CHAN_X ); - tmp = lp_build_abs(&bld->base, tmp); - tmp = lp_build_rsqrt(&bld->base, tmp); + src0 = FETCH( bld, *inst, 0, CHAN_X ); + src0 = lp_build_abs(&bld->base, src0); + dst0 = lp_build_rsqrt(&bld->base, src0); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, chan_index, tmp ); + STORE( bld, *inst, 0, chan_index, dst0 ); } break; @@ -619,34 +589,34 @@ emit_instruction( if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z )) { - FETCH( bld, *inst, 0, 0, CHAN_X ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y )) { - emit_MOV( bld, 1, 0 ); + tmp1 = tmp0; emit_flr( bld, 2, 1 ); /* dst.x = ex2(floor(src.x)) */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X )) { - emit_MOV( bld, 2, 1 ); - emit_ex2( bld, 3, 2 ); - STORE( bld, *inst, 2, 0, CHAN_X ); + tmp2 = tmp1; + tmp2 = lp_build_exp2( &bld->base, tmp2); + STORE( bld, *inst, 0, CHAN_X, tmp2); } /* dst.y = src.x - floor(src.x) */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y )) { - emit_MOV( bld, 2, 0 ); - emit_sub( bld, 2, 1 ); - STORE( bld, *inst, 2, 0, CHAN_Y ); + tmp2 = tmp0; + tmp2 = lp_build_sub( &bld->base, tmp2, tmp1); + STORE( bld, *inst, 0, CHAN_Y, tmp2); } } /* dst.z = ex2(src.x) */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z )) { - emit_ex2( bld, 3, 0 ); - STORE( bld, *inst, 0, 0, CHAN_Z ); + tmp0 = lp_build_exp2( &bld->base, tmp0); + STORE( bld, *inst, 0, CHAN_Z, tmp0); } } /* dst.w = 1.0 */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W )) { - emit_tempf( bld, 0, TEMP_ONE_I, TEMP_ONE_C ); - STORE( bld, *inst, 0, 0, CHAN_W ); + tmp0 = bld->base.one; + STORE( bld, *inst, 0, CHAN_W, tmp0); } break; #endif @@ -656,97 +626,97 @@ emit_instruction( if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z )) { - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_abs( bld, 0 ); - emit_MOV( bld, 1, 0 ); - emit_lg2( bld, 2, 1 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_abs( &bld->base, tmp0 ); + tmp1 = tmp0; + tmp1 = lp_build_log2( &bld->base, tmp1); /* dst.z = lg2(abs(src.x)) */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z )) { - STORE( bld, *inst, 1, 0, CHAN_Z ); + STORE( bld, *inst, 0, CHAN_Z, tmp1); } if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y )) { emit_flr( bld, 2, 1 ); /* dst.x = floor(lg2(abs(src.x))) */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X )) { - STORE( bld, *inst, 1, 0, CHAN_X ); + STORE( bld, *inst, 0, CHAN_X, tmp1); } /* dst.x = abs(src)/ex2(floor(lg2(abs(src.x)))) */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y )) { - emit_ex2( bld, 2, 1 ); + tmp1 = lp_build_exp2( &bld->base, tmp1); emit_rcp( bld, 1, 1 ); - emit_mul( bld, 0, 1 ); - STORE( bld, *inst, 0, 0, CHAN_Y ); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); + STORE( bld, *inst, 0, CHAN_Y, tmp0); } } } /* dst.w = 1.0 */ if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W )) { emit_tempf( bld, 0, TEMP_ONE_I, TEMP_ONE_C ); - STORE( bld, *inst, 0, 0, CHAN_W ); + STORE( bld, *inst, 0, CHAN_W, tmp0); } break; #endif case TGSI_OPCODE_MUL: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - LLVMValueRef a = FETCH( bld, *inst, 0, chan_index ); - LLVMValueRef b = FETCH( bld, *inst, 1, chan_index ); - tmp = lp_build_mul(&bld->base, a, b); - STORE( bld, *inst, 0, chan_index, tmp ); + src0 = FETCH( bld, *inst, 0, chan_index ); + src1 = FETCH( bld, *inst, 1, chan_index ); + dst0 = lp_build_mul(&bld->base, src0, src1); + STORE( bld, *inst, 0, chan_index, dst0); } break; case TGSI_OPCODE_ADD: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - LLVMValueRef a = FETCH( bld, *inst, 0, chan_index ); - LLVMValueRef b = FETCH( bld, *inst, 1, chan_index ); - tmp = lp_build_add(&bld->base, a, b); - STORE( bld, *inst, 0, chan_index, tmp ); + src0 = FETCH( bld, *inst, 0, chan_index ); + src1 = FETCH( bld, *inst, 1, chan_index ); + dst0 = lp_build_add(&bld->base, src0, src1); + STORE( bld, *inst, 0, chan_index, dst0); } break; -#if 0 case TGSI_OPCODE_DP3: /* TGSI_OPCODE_DOT3 */ - FETCH( bld, *inst, 0, 0, CHAN_X ); - FETCH( bld, *inst, 1, 1, CHAN_X ); - emit_mul( bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_Y ); - FETCH( bld, *inst, 2, 1, CHAN_Y ); - emit_mul( bld, 1, 2 ); - emit_add( bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_Z ); - FETCH( bld, *inst, 2, 1, CHAN_Z ); - emit_mul( bld, 1, 2 ); - emit_add( bld, 0, 1 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp1 = FETCH( bld, *inst, 1, CHAN_X ); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_Y ); + tmp2 = FETCH( bld, *inst, 1, CHAN_Y ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_Z ); + tmp2 = FETCH( bld, *inst, 1, CHAN_Z ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; case TGSI_OPCODE_DP4: /* TGSI_OPCODE_DOT4 */ - FETCH( bld, *inst, 0, 0, CHAN_X ); - FETCH( bld, *inst, 1, 1, CHAN_X ); - emit_mul( bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_Y ); - FETCH( bld, *inst, 2, 1, CHAN_Y ); - emit_mul( bld, 1, 2 ); - emit_add( bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_Z ); - FETCH( bld, *inst, 2, 1, CHAN_Z ); - emit_mul(bld, 1, 2 ); - emit_add(bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_W ); - FETCH( bld, *inst, 2, 1, CHAN_W ); - emit_mul( bld, 1, 2 ); - emit_add( bld, 0, 1 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp1 = FETCH( bld, *inst, 1, CHAN_X ); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_Y ); + tmp2 = FETCH( bld, *inst, 1, CHAN_Y ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_Z ); + tmp2 = FETCH( bld, *inst, 1, CHAN_Z ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_W ); + tmp2 = FETCH( bld, *inst, 1, CHAN_W ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; +#if 0 case TGSI_OPCODE_DST: IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) { emit_tempf( @@ -754,48 +724,44 @@ emit_instruction( 0, TEMP_ONE_I, TEMP_ONE_C ); - STORE( bld, *inst, 0, 0, CHAN_X ); + STORE( bld, *inst, 0, CHAN_X, tmp0); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) { - FETCH( bld, *inst, 0, 0, CHAN_Y ); - FETCH( bld, *inst, 1, 1, CHAN_Y ); - emit_mul( bld, 0, 1 ); - STORE( bld, *inst, 0, 0, CHAN_Y ); + tmp0 = FETCH( bld, *inst, 0, CHAN_Y ); + tmp1 = FETCH( bld, *inst, 1, CHAN_Y ); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); + STORE( bld, *inst, 0, CHAN_Y, tmp0); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) { - FETCH( bld, *inst, 0, 0, CHAN_Z ); - STORE( bld, *inst, 0, 0, CHAN_Z ); + tmp0 = FETCH( bld, *inst, 0, CHAN_Z ); + STORE( bld, *inst, 0, CHAN_Z, tmp0); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W ) { - FETCH( bld, *inst, 0, 1, CHAN_W ); - STORE( bld, *inst, 0, 0, CHAN_W ); + tmp0 = FETCH( bld, *inst, 1, CHAN_W ); + STORE( bld, *inst, 0, CHAN_W, tmp0); } break; +#endif case TGSI_OPCODE_MIN: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); - FETCH( bld, *inst, 1, 1, chan_index ); - sse_minps( - bld, - make_xmm( 0 ), - make_xmm( 1 ) ); - STORE( bld, *inst, 0, 0, chan_index ); + src0 = FETCH( bld, *inst, 0, chan_index ); + src1 = FETCH( bld, *inst, 1, chan_index ); + dst0 = lp_build_min( &bld->base, src0, src1 ); + STORE( bld, *inst, 0, chan_index, dst0); } break; case TGSI_OPCODE_MAX: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); - FETCH( bld, *inst, 1, 1, chan_index ); - sse_maxps( - bld, - make_xmm( 0 ), - make_xmm( 1 ) ); - STORE( bld, *inst, 0, 0, chan_index ); + src0 = FETCH( bld, *inst, 0, chan_index ); + src1 = FETCH( bld, *inst, 1, chan_index ); + dst0 = lp_build_max( &bld->base, src0, src1 ); + STORE( bld, *inst, 0, chan_index, dst0); } break; +#if 0 case TGSI_OPCODE_SLT: /* TGSI_OPCODE_SETLT */ emit_setcc( bld, inst, cc_LessThan ); @@ -809,33 +775,34 @@ emit_instruction( case TGSI_OPCODE_MAD: /* TGSI_OPCODE_MADD */ FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); - FETCH( bld, *inst, 1, 1, chan_index ); - FETCH( bld, *inst, 2, 2, chan_index ); - emit_mul( bld, 0, 1 ); - emit_add( bld, 0, 2 ); - STORE( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); + tmp1 = FETCH( bld, *inst, 1, chan_index ); + tmp2 = FETCH( bld, *inst, 2, chan_index ); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); + tmp0 = lp_build_add( &bld->base, tmp0, tmp2); + STORE( bld, *inst, 0, chan_index, tmp0); } break; case TGSI_OPCODE_SUB: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); - FETCH( bld, *inst, 1, 1, chan_index ); - emit_sub( bld, 0, 1 ); - STORE( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); + tmp1 = FETCH( bld, *inst, 1, chan_index ); + tmp0 = lp_build_sub( &bld->base, tmp0, tmp1); + STORE( bld, *inst, 0, chan_index, tmp0); } break; +#endif case TGSI_OPCODE_LRP: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); - FETCH( bld, *inst, 1, 1, chan_index ); - FETCH( bld, *inst, 2, 2, chan_index ); - emit_sub( bld, 1, 2 ); - emit_mul( bld, 0, 1 ); - emit_add( bld, 0, 2 ); - STORE( bld, *inst, 0, 0, chan_index ); + src0 = FETCH( bld, *inst, 0, chan_index ); + src1 = FETCH( bld, *inst, 1, chan_index ); + src2 = FETCH( bld, *inst, 2, chan_index ); + tmp0 = lp_build_sub( &bld->base, src1, src2 ); + tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); + dst0 = lp_build_add( &bld->base, tmp0, src2 ); + STORE( bld, *inst, 0, chan_index, dst0 ); } break; @@ -848,25 +815,26 @@ emit_instruction( break; case TGSI_OPCODE_DP2A: - FETCH( bld, *inst, 0, 0, CHAN_X ); /* xmm0 = src[0].x */ - FETCH( bld, *inst, 1, 1, CHAN_X ); /* xmm1 = src[1].x */ - emit_mul( bld, 0, 1 ); /* xmm0 = xmm0 * xmm1 */ - FETCH( bld, *inst, 1, 0, CHAN_Y ); /* xmm1 = src[0].y */ - FETCH( bld, *inst, 2, 1, CHAN_Y ); /* xmm2 = src[1].y */ - emit_mul( bld, 1, 2 ); /* xmm1 = xmm1 * xmm2 */ - emit_add( bld, 0, 1 ); /* xmm0 = xmm0 + xmm1 */ - FETCH( bld, *inst, 1, 2, CHAN_X ); /* xmm1 = src[2].x */ - emit_add( bld, 0, 1 ); /* xmm0 = xmm0 + xmm1 */ + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); /* xmm0 = src[0].x */ + tmp1 = FETCH( bld, *inst, 1, CHAN_X ); /* xmm1 = src[1].x */ + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ + tmp1 = FETCH( bld, *inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ + tmp2 = FETCH( bld, *inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ + tmp1 = FETCH( bld, *inst, 2, CHAN_X ); /* xmm1 = src[2].x */ + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); /* dest[ch] = xmm0 */ + STORE( bld, *inst, 0, chan_index, tmp0); /* dest[ch] = xmm0 */ } break; +#if 0 case TGSI_OPCODE_FRC: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_frc( bld, 0, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; @@ -876,97 +844,94 @@ emit_instruction( case TGSI_OPCODE_FLR: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_flr( bld, 0, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; case TGSI_OPCODE_ROUND: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_rnd( bld, 0, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; +#endif - case TGSI_OPCODE_EX2: - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_ex2( bld, 0, 0 ); + case TGSI_OPCODE_EX2: { + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_exp2( &bld->base, tmp0); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; + } case TGSI_OPCODE_LG2: - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_lg2( bld, 0, 0 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_log2( &bld->base, tmp0); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; case TGSI_OPCODE_POW: - FETCH( bld, *inst, 0, 0, CHAN_X ); - FETCH( bld, *inst, 1, 1, CHAN_X ); - emit_pow( bld, 0, 0, 0, 1 ); + src0 = FETCH( bld, *inst, 0, CHAN_X ); + src1 = FETCH( bld, *inst, 1, CHAN_X ); + dst0 = lp_build_pow( &bld->base, src0, src1 ); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, dst0 ); } break; case TGSI_OPCODE_XPD: if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) ) { - FETCH( bld, *inst, 1, 1, CHAN_Z ); - FETCH( bld, *inst, 3, 0, CHAN_Z ); + tmp1 = FETCH( bld, *inst, 1, CHAN_Z ); + tmp3 = FETCH( bld, *inst, 0, CHAN_Z ); } if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) ) { - FETCH( bld, *inst, 0, 0, CHAN_Y ); - FETCH( bld, *inst, 4, 1, CHAN_Y ); + tmp0 = FETCH( bld, *inst, 0, CHAN_Y ); + tmp4 = FETCH( bld, *inst, 1, CHAN_Y ); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) { - emit_MOV( bld, 2, 0 ); - emit_mul( bld, 2, 1 ); - emit_MOV( bld, 5, 3 ); - emit_mul( bld, 5, 4 ); - emit_sub( bld, 2, 5 ); - STORE( bld, *inst, 2, 0, CHAN_X ); + tmp2 = tmp0; + tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); + tmp5 = tmp3; + tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); + tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); + STORE( bld, *inst, 0, CHAN_X, tmp2); } if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) || IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) ) { - FETCH( bld, *inst, 2, 1, CHAN_X ); - FETCH( bld, *inst, 5, 0, CHAN_X ); + tmp2 = FETCH( bld, *inst, 1, CHAN_X ); + tmp5 = FETCH( bld, *inst, 0, CHAN_X ); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) { - emit_mul( bld, 3, 2 ); - emit_mul( bld, 1, 5 ); - emit_sub( bld, 3, 1 ); - STORE( bld, *inst, 3, 0, CHAN_Y ); + tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); + tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); + STORE( bld, *inst, 0, CHAN_Y, tmp3); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) { - emit_mul( bld, 5, 4 ); - emit_mul( bld, 0, 2 ); - emit_sub( bld, 5, 0 ); - STORE( bld, *inst, 5, 0, CHAN_Z ); + tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); + tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); + STORE( bld, *inst, 0, CHAN_Z, tmp5); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W ) { - emit_tempf( - bld, - 0, - TEMP_ONE_I, - TEMP_ONE_C ); - STORE( bld, *inst, 0, 0, CHAN_W ); + tmp0 = bld->base.one; + STORE( bld, *inst, 0, CHAN_W, tmp0); } break; case TGSI_OPCODE_ABS: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); - emit_abs( bld, 0) ; - - STORE( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); + tmp0 = lp_build_abs( &bld->base, tmp0 ) ; + STORE( bld, *inst, 0, chan_index, tmp0); } break; @@ -975,29 +940,29 @@ emit_instruction( break; case TGSI_OPCODE_DPH: - FETCH( bld, *inst, 0, 0, CHAN_X ); - FETCH( bld, *inst, 1, 1, CHAN_X ); - emit_mul( bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_Y ); - FETCH( bld, *inst, 2, 1, CHAN_Y ); - emit_mul( bld, 1, 2 ); - emit_add( bld, 0, 1 ); - FETCH( bld, *inst, 1, 0, CHAN_Z ); - FETCH( bld, *inst, 2, 1, CHAN_Z ); - emit_mul( bld, 1, 2 ); - emit_add( bld, 0, 1 ); - FETCH( bld, *inst, 1, 1, CHAN_W ); - emit_add( bld, 0, 1 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp1 = FETCH( bld, *inst, 1, CHAN_X ); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_Y ); + tmp2 = FETCH( bld, *inst, 1, CHAN_Y ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 0, CHAN_Z ); + tmp2 = FETCH( bld, *inst, 1, CHAN_Z ); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); + tmp1 = FETCH( bld, *inst, 1, CHAN_W ); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; case TGSI_OPCODE_COS: - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_cos( bld, 0, 0 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_cos( &bld->base, tmp0 ); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; @@ -1009,6 +974,7 @@ emit_instruction( return 0; break; +#if 0 case TGSI_OPCODE_KILP: /* predicated kill */ emit_kilp( bld ); @@ -1019,6 +985,7 @@ emit_instruction( /* conditional kill */ emit_kil( bld, &inst->FullSrcRegisters[0] ); break; +#endif case TGSI_OPCODE_PK2H: return 0; @@ -1053,10 +1020,10 @@ emit_instruction( break; case TGSI_OPCODE_SIN: - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_sin( bld, 0, 0 ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_sin( &bld->base, tmp0 ); FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; @@ -1071,13 +1038,11 @@ emit_instruction( case TGSI_OPCODE_STR: return 0; break; -#endif case TGSI_OPCODE_TEX: emit_tex( bld, inst, FALSE, FALSE ); break; -#if 0 case TGSI_OPCODE_TXD: return 0; break; @@ -1106,14 +1071,16 @@ emit_instruction( return 0; break; +#if 0 case TGSI_OPCODE_ARR: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_rnd( bld, 0, 0 ); emit_f2it( bld, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; +#endif case TGSI_OPCODE_BRA: return 0; @@ -1123,6 +1090,7 @@ emit_instruction( return 0; break; +#if 0 case TGSI_OPCODE_RET: emit_ret( bld ); break; @@ -1135,9 +1103,9 @@ emit_instruction( case TGSI_OPCODE_SSG: /* TGSI_OPCODE_SGN */ FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_sgn( bld, 0, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; @@ -1147,14 +1115,14 @@ emit_instruction( case TGSI_OPCODE_SCS: IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) { - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_cos( bld, 0, 0 ); - STORE( bld, *inst, 0, 0, CHAN_X ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_cos( &bld->base, tmp0 ); + STORE( bld, *inst, 0, CHAN_X, tmp0); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) { - FETCH( bld, *inst, 0, 0, CHAN_X ); - emit_sin( bld, 0, 0 ); - STORE( bld, *inst, 0, 0, CHAN_Y ); + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); + tmp0 = lp_build_sin( &bld->base, tmp0 ); + STORE( bld, *inst, 0, CHAN_Y, tmp0); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z ) { emit_tempf( @@ -1162,7 +1130,7 @@ emit_instruction( 0, TGSI_EXEC_TEMP_00000000_I, TGSI_EXEC_TEMP_00000000_C ); - STORE( bld, *inst, 0, 0, CHAN_Z ); + STORE( bld, *inst, 0, CHAN_Z, tmp0); } IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W ) { emit_tempf( @@ -1170,7 +1138,7 @@ emit_instruction( 0, TEMP_ONE_I, TEMP_ONE_C ); - STORE( bld, *inst, 0, 0, CHAN_W ); + STORE( bld, *inst, 0, CHAN_W, tmp0); } break; #endif @@ -1179,7 +1147,6 @@ emit_instruction( emit_tex( bld, inst, TRUE, FALSE ); break; -#if 0 case TGSI_OPCODE_NRM: /* fall-through */ case TGSI_OPCODE_NRM4: @@ -1196,73 +1163,73 @@ emit_instruction( /* xmm4 = src.x */ /* xmm0 = src.x * src.x */ - FETCH(bld, *inst, 0, 0, CHAN_X); + tmp0 = FETCH(bld, *inst, 0, CHAN_X); if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_X)) { - emit_MOV(bld, 4, 0); + tmp4 = tmp0; } - emit_mul(bld, 0, 0); + tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); /* xmm5 = src.y */ /* xmm0 = xmm0 + src.y * src.y */ - FETCH(bld, *inst, 1, 0, CHAN_Y); + tmp1 = FETCH(bld, *inst, 0, CHAN_Y); if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_Y)) { - emit_MOV(bld, 5, 1); + tmp5 = tmp1; } - emit_mul(bld, 1, 1); - emit_add(bld, 0, 1); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm6 = src.z */ /* xmm0 = xmm0 + src.z * src.z */ - FETCH(bld, *inst, 1, 0, CHAN_Z); + tmp1 = FETCH(bld, *inst, 0, CHAN_Z); if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_Z)) { - emit_MOV(bld, 6, 1); + tmp6 = tmp1; } - emit_mul(bld, 1, 1); - emit_add(bld, 0, 1); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); if (dims == 4) { /* xmm7 = src.w */ /* xmm0 = xmm0 + src.w * src.w */ - FETCH(bld, *inst, 1, 0, CHAN_W); + tmp1 = FETCH(bld, *inst, 0, CHAN_W); if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_W)) { - emit_MOV(bld, 7, 1); + tmp7 = tmp1; } - emit_mul(bld, 1, 1); - emit_add(bld, 0, 1); + tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); } /* xmm1 = 1 / sqrt(xmm0) */ - emit_rsqrt(bld, 1, 0); + tmp1 = lp_build_rsqrt( &bld->base, tmp0); /* dst.x = xmm1 * src.x */ if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_X)) { - emit_mul(bld, 4, 1); - STORE(bld, *inst, 4, 0, CHAN_X); + tmp4 = lp_build_mul( &bld->base, tmp4, tmp1); + STORE(bld, *inst, 0, CHAN_X, tmp4); } /* dst.y = xmm1 * src.y */ if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_Y)) { - emit_mul(bld, 5, 1); - STORE(bld, *inst, 5, 0, CHAN_Y); + tmp5 = lp_build_mul( &bld->base, tmp5, tmp1); + STORE(bld, *inst, 0, CHAN_Y, tmp5); } /* dst.z = xmm1 * src.z */ if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_Z)) { - emit_mul(bld, 6, 1); - STORE(bld, *inst, 6, 0, CHAN_Z); + tmp6 = lp_build_mul( &bld->base, tmp6, tmp1); + STORE(bld, *inst, 0, CHAN_Z, tmp6); } /* dst.w = xmm1 * src.w */ if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_X) && dims == 4) { - emit_mul(bld, 7, 1); - STORE(bld, *inst, 7, 0, CHAN_W); + tmp7 = lp_build_mul( &bld->base, tmp7, tmp1); + STORE(bld, *inst, 0, CHAN_W, tmp7); } } /* dst0.w = 1.0 */ if (IS_DST0_CHANNEL_ENABLED(*inst, CHAN_W) && dims == 3) { - emit_tempf(bld, 0, TEMP_ONE_I, TEMP_ONE_C); - STORE(bld, *inst, 0, 0, CHAN_W); + tmp0 = bld->base.one; + STORE(bld, *inst, 0, CHAN_W, tmp0); } } break; @@ -1272,18 +1239,17 @@ emit_instruction( break; case TGSI_OPCODE_DP2: - FETCH( bld, *inst, 0, 0, CHAN_X ); /* xmm0 = src[0].x */ - FETCH( bld, *inst, 1, 1, CHAN_X ); /* xmm1 = src[1].x */ - emit_mul( bld, 0, 1 ); /* xmm0 = xmm0 * xmm1 */ - FETCH( bld, *inst, 1, 0, CHAN_Y ); /* xmm1 = src[0].y */ - FETCH( bld, *inst, 2, 1, CHAN_Y ); /* xmm2 = src[1].y */ - emit_mul( bld, 1, 2 ); /* xmm1 = xmm1 * xmm2 */ - emit_add( bld, 0, 1 ); /* xmm0 = xmm0 + xmm1 */ + tmp0 = FETCH( bld, *inst, 0, CHAN_X ); /* xmm0 = src[0].x */ + tmp1 = FETCH( bld, *inst, 1, CHAN_X ); /* xmm1 = src[1].x */ + tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ + tmp1 = FETCH( bld, *inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ + tmp2 = FETCH( bld, *inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ + tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ + tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - STORE( bld, *inst, 0, 0, chan_index ); /* dest[ch] = xmm0 */ + STORE( bld, *inst, 0, chan_index, tmp0); /* dest[ch] = xmm0 */ } break; -#endif case TGSI_OPCODE_TXL: emit_tex( bld, inst, TRUE, FALSE ); @@ -1293,7 +1259,6 @@ emit_instruction( emit_tex( bld, inst, FALSE, TRUE ); break; -#if 0 case TGSI_OPCODE_BRK: return 0; break; @@ -1346,14 +1311,16 @@ emit_instruction( return 0; break; +#if 0 case TGSI_OPCODE_TRUNC: FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { - FETCH( bld, *inst, 0, 0, chan_index ); + tmp0 = FETCH( bld, *inst, 0, chan_index ); emit_f2it( bld, 0 ); emit_i2f( bld, 0 ); - STORE( bld, *inst, 0, 0, chan_index ); + STORE( bld, *inst, 0, chan_index, tmp0); } break; +#endif case TGSI_OPCODE_SHL: return 0; @@ -1402,7 +1369,6 @@ emit_instruction( case TGSI_OPCODE_ENDPRIM: return 0; break; -#endif default: return 0;