Voodoo x86-64 recompiler now works correctly with addresses above 4GB.
This commit is contained in:
parent
170cf99ffb
commit
7c9bb73b57
1 changed files with 185 additions and 127 deletions
|
|
@ -157,10 +157,11 @@ static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, v
|
|||
addbyte(0x89); /*MOV state->tex_s, EBX*/
|
||||
addbyte(0x9f);
|
||||
addlong(offsetof(voodoo_state_t, tex_s));
|
||||
addbyte(0x0f); /*MOVZX EAX, logtable[RAX]*/
|
||||
addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xb6);
|
||||
addbyte(0x80);
|
||||
addlong((uint32_t)(uintptr_t)logtable);
|
||||
addbyte(0x04);
|
||||
addbyte(0x01);
|
||||
addbyte(0x09); /*OR EAX, EDX*/
|
||||
addbyte(0xd0);
|
||||
addbyte(0x03); /*ADD EAX, state->lod*/
|
||||
|
|
@ -334,11 +335,10 @@ static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, v
|
|||
addbyte(1);
|
||||
if (state->clamp_t[tmu])
|
||||
{
|
||||
addbyte(0x0f); /*CMOVS EDX, zero*/
|
||||
addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x48);
|
||||
addbyte(0x14);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&zero);
|
||||
addbyte(0x12);
|
||||
addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/
|
||||
addbyte(0x96);
|
||||
addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]));
|
||||
|
|
@ -348,11 +348,10 @@ static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, v
|
|||
addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]));
|
||||
addbyte(0x85); /*TEST EBX,EBX*/
|
||||
addbyte(0xdb);
|
||||
addbyte(0x0f); /*CMOVS EBX, zero*/
|
||||
addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x48);
|
||||
addbyte(0x1c);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&zero);
|
||||
addbyte(0x1a);
|
||||
addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/
|
||||
addbyte(0x9e);
|
||||
addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]));
|
||||
|
|
@ -395,11 +394,10 @@ static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, v
|
|||
addbyte(0x8b); /*MOV ebp_store2, RSI*/
|
||||
addbyte(0xb7);
|
||||
addlong(offsetof(voodoo_state_t, ebp_store));
|
||||
addbyte(0x0f); /*CMOVS EAX, zero*/
|
||||
addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x48);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&zero);
|
||||
addbyte(0x02);
|
||||
addbyte(0x78); /*JS + - clamp on 0*/
|
||||
addbyte(2+3+2+ 5+5+2);
|
||||
addbyte(0x3b); /*CMP EAX, EBP*/
|
||||
|
|
@ -610,11 +608,10 @@ static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, v
|
|||
{
|
||||
addbyte(0x85); /*TEST EAX, EAX*/
|
||||
addbyte(0xc0);
|
||||
addbyte(0x0f); /*CMOVS EAX, zero*/
|
||||
addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x48);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&zero);
|
||||
addbyte(0x02);
|
||||
addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/
|
||||
addbyte(0x84);
|
||||
addbyte(0x8e);
|
||||
|
|
@ -637,11 +634,10 @@ static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, v
|
|||
{
|
||||
addbyte(0x85); /*TEST EBX, EBX*/
|
||||
addbyte(0xdb);
|
||||
addbyte(0x0f); /*CMOVS EBX, zero*/
|
||||
addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x48);
|
||||
addbyte(0x1c);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&zero);
|
||||
addbyte(0x1a);
|
||||
addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/
|
||||
addbyte(0x9c);
|
||||
addbyte(0x8e);
|
||||
|
|
@ -707,11 +703,48 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x57); /*PUSH RDI*/
|
||||
addbyte(0x56); /*PUSH RSI*/
|
||||
addbyte(0x53); /*PUSH RBX*/
|
||||
addbyte(0x41); /*PUSH R12*/
|
||||
addbyte(0x54);
|
||||
addbyte(0x41); /*PUSH R13*/
|
||||
addbyte(0x55);
|
||||
addbyte(0x41); /*PUSH R14*/
|
||||
addbyte(0x56);
|
||||
addbyte(0x41); /*PUSH R15*/
|
||||
addbyte(0x57);
|
||||
|
||||
addbyte(0x49); /*MOV R15, xmm_01_w*/
|
||||
addbyte(0xbf);
|
||||
addquad((uint64_t)(uintptr_t)&xmm_01_w);
|
||||
addbyte(0x66); /*MOVDQA XMM8, [R15]*/
|
||||
addbyte(0x45);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x6f);
|
||||
addbyte(0x07 | (0 << 3));
|
||||
addbyte(0x49); /*MOV R15, xmm_ff_w*/
|
||||
addbyte(0xbf);
|
||||
addquad((uint64_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0x66); /*MOVDQA XMM9, [R15]*/
|
||||
addbyte(0x45);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x6f);
|
||||
addbyte(0x07 | (1 << 3));
|
||||
addbyte(0x49); /*MOV R15, xmm_ff_b*/
|
||||
addbyte(0xbf);
|
||||
addquad((uint64_t)(uintptr_t)&xmm_ff_b);
|
||||
addbyte(0x66); /*MOVDQA XMM10, [R15]*/
|
||||
addbyte(0x45);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x6f);
|
||||
addbyte(0x07 | (2 << 3));
|
||||
addbyte(0x49); /*MOV R15, minus_254*/
|
||||
addbyte(0xbf);
|
||||
addquad((uint64_t)(uintptr_t)&minus_254);
|
||||
addbyte(0x66); /*MOVDQA XMM11, [R15]*/
|
||||
addbyte(0x45);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x6f);
|
||||
addbyte(0x07 | (3 << 3));
|
||||
|
||||
#if WIN64
|
||||
addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/
|
||||
addbyte(0x89);
|
||||
|
|
@ -723,13 +756,30 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x89);
|
||||
addbyte(0xce);
|
||||
#else
|
||||
addbyte(0x49); /*MOV R9, RCX (real_y)*/
|
||||
addbyte(0x49); /*MOV R14, RCX (real_y)*/
|
||||
addbyte(0x89);
|
||||
addbyte(0xc9);
|
||||
addbyte(0xce);
|
||||
addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/
|
||||
addbyte(0x89);
|
||||
addbyte(0xf7);
|
||||
#endif
|
||||
|
||||
addbyte(0x49); /*MOV R9, logtable*/
|
||||
addbyte(0xb8 | (9 & 7));
|
||||
addquad((uint64_t)(uintptr_t)&logtable);
|
||||
addbyte(0x49); /*MOV R10, alookup*/
|
||||
addbyte(0xb8 | (10 & 7));
|
||||
addquad((uint64_t)(uintptr_t)&alookup);
|
||||
addbyte(0x49); /*MOV R11, aminuslookup*/
|
||||
addbyte(0xb8 | (11 & 7));
|
||||
addquad((uint64_t)(uintptr_t)&aminuslookup);
|
||||
addbyte(0x49); /*MOV R12, xmm_00_ff_w*/
|
||||
addbyte(0xb8 | (12 & 7));
|
||||
addquad((uint64_t)(uintptr_t)&xmm_00_ff_w);
|
||||
addbyte(0x49); /*MOV R13, i_00_ff_w*/
|
||||
addbyte(0xb8 | (13 & 7));
|
||||
addquad((uint64_t)(uintptr_t)&i_00_ff_w);
|
||||
|
||||
loop_jump_pos = block_pos;
|
||||
addbyte(0x4c); /*MOV RSI, R15*/
|
||||
addbyte(0x89);
|
||||
|
|
@ -1075,27 +1125,26 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
}
|
||||
if (params->textureMode[1] & TEXTUREMODE_TRILINEAR)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM0, xmm_00_ff_w[EBX]*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0x83);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_00_ff_w[0]);
|
||||
}
|
||||
else if (!tc_reverse_blend_1)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM0, xmm_ff_w*/
|
||||
addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0x1c);
|
||||
}
|
||||
addbyte(0x66); /*PADDW XMM0, xmm_01_w*/
|
||||
else if (!tc_reverse_blend_1)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0xc1);
|
||||
}
|
||||
addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_01_w);
|
||||
addbyte(0xc0);
|
||||
addbyte(0xf3); /*MOVQ XMM1, XMM2*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
|
|
@ -1213,10 +1262,11 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
}
|
||||
if (params->textureMode[1] & TEXTUREMODE_TRILINEAR)
|
||||
{
|
||||
addbyte(0x33); /*XOR EAX, i_00_ff_w[ECX*4]*/
|
||||
addbyte(0x04);
|
||||
addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/
|
||||
addbyte(0x33);
|
||||
addbyte(0x44);
|
||||
addbyte(0x8d);
|
||||
addlong((uint32_t)(uintptr_t)i_00_ff_w);
|
||||
addbyte(0);
|
||||
}
|
||||
else if (!tc_reverse_blend_1)
|
||||
{
|
||||
|
|
@ -1399,27 +1449,26 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
}
|
||||
if (params->textureMode[0] & TEXTUREMODE_TRILINEAR)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM4, xmm_00_ff_w[EBX]*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0xa3);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_00_ff_w[0]);
|
||||
}
|
||||
else if (!tc_reverse_blend)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM4, FF*/
|
||||
addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0x1c);
|
||||
}
|
||||
addbyte(0x66); /*PADDW XMM4, 1*/
|
||||
else if (!tc_reverse_blend)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0xe1);
|
||||
}
|
||||
addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_01_w);
|
||||
addbyte(0xe0);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM1*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
|
|
@ -1483,11 +1532,11 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
}
|
||||
if (tc_invert_output)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM1, FF*/
|
||||
addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0x0d);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0xc9);
|
||||
}
|
||||
|
||||
addbyte(0x66); /*PACKUSWB XMM0, XMM0*/
|
||||
|
|
@ -1581,10 +1630,11 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
}
|
||||
if (params->textureMode[0] & TEXTUREMODE_TRILINEAR)
|
||||
{
|
||||
addbyte(0x33); /*XOR EBX, i_00_ff_w[ECX*4]*/
|
||||
addbyte(0x1c);
|
||||
addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/
|
||||
addbyte(0x33);
|
||||
addbyte(0x5c);
|
||||
addbyte(0x8d);
|
||||
addlong((uint32_t)(uintptr_t)i_00_ff_w);
|
||||
addbyte(0);
|
||||
}
|
||||
else if (!tca_reverse_blend)
|
||||
{
|
||||
|
|
@ -2130,19 +2180,17 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0xe0);
|
||||
if (!cc_reverse_blend)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM3, 0xff*/
|
||||
addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0x1c);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0xd9);
|
||||
}
|
||||
addbyte(0x66); /*PADDW XMM3, 1*/
|
||||
addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x1c);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_01_w);
|
||||
addbyte(0xd8);
|
||||
addbyte(0x66); /*PMULLW XMM0, XMM3*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
|
|
@ -2181,12 +2229,11 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
|
||||
if (cc_invert_output)
|
||||
{
|
||||
addbyte(0x66); /*PXOR XMM0, 0xff*/
|
||||
addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_b);
|
||||
addbyte(0xc2);
|
||||
}
|
||||
|
||||
if (params->fogMode & FOG_ENABLE)
|
||||
|
|
@ -2343,11 +2390,12 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0xc0);
|
||||
|
||||
addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x1c);
|
||||
addbyte(0xc5);
|
||||
addlong(((uintptr_t)alookup) + 16);
|
||||
addbyte(0x5c);
|
||||
addbyte(0xc2);
|
||||
addbyte(16);
|
||||
addbyte(0x66); /*PSRAW XMM3, 7*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2476,22 +2524,23 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0xe4);
|
||||
break;
|
||||
case AFUNC_ASRC_ALPHA:
|
||||
addbyte(0x66); /*PMULLW XMM4, alookup[EDX*8]*/
|
||||
fatal("dest AFUNC_ASRC_ALPHA\n");
|
||||
addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x24);
|
||||
addbyte(0xd5);
|
||||
addlong((uint32_t)(uintptr_t)alookup);
|
||||
addbyte(0xd2);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM4*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/
|
||||
addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x62);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2508,6 +2557,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_A_COLOR:
|
||||
fatal("dest AFUNC_A_COLOR\n");
|
||||
addbyte(0x66); /*PMULLW XMM4, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
|
|
@ -2516,12 +2566,12 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/
|
||||
addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x62);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2542,22 +2592,23 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
case AFUNC_AONE:
|
||||
break;
|
||||
case AFUNC_AOMSRC_ALPHA:
|
||||
addbyte(0x66); /*PMULLW XMM4, aminuslookup[EDX*8]*/
|
||||
//fatal("dest AFUNC_AOMSRC_ALPHA\n");
|
||||
addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x24);
|
||||
addbyte(0xd5);
|
||||
addlong((uint32_t)(uintptr_t)aminuslookup);
|
||||
addbyte(0xd3);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM4*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/
|
||||
addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x62);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2574,12 +2625,12 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_AOM_COLOR:
|
||||
addbyte(0xf3); /*MOVQ XMM5, xmm_ff_w*/
|
||||
fatal("dest AFUNC_AOM_COLOR\n");
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0x2c);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0xe9);
|
||||
addbyte(0x66); /*PSUBW XMM5, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xf9);
|
||||
|
|
@ -2593,11 +2644,11 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x62);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2620,22 +2671,22 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0xe4);
|
||||
break;
|
||||
case AFUNC_ASATURATE:
|
||||
addbyte(0x66); /*PMULLW XMM4, minus_254*/
|
||||
fatal("dest AFUNC_ASATURATE\n");
|
||||
addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x24);
|
||||
addbyte(0xd5);
|
||||
addlong((uint32_t)(uintptr_t)&minus_254);
|
||||
addbyte(0xe3);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM4*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x24);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x62);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2661,22 +2712,23 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0xc0);
|
||||
break;
|
||||
case AFUNC_ASRC_ALPHA:
|
||||
addbyte(0x66); /*PMULLW XMM0, alookup[EDX*8]*/
|
||||
//fatal("src AFUNC_ASRC_ALPHA\n");
|
||||
addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x04);
|
||||
addbyte(0xd5);
|
||||
addlong((uint32_t)(uintptr_t)alookup);
|
||||
addbyte(0xd2);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xe8);
|
||||
addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/
|
||||
addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x42);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2693,6 +2745,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_A_COLOR:
|
||||
//fatal("src AFUNC_A_COLOR\n");
|
||||
addbyte(0x66); /*PMULLW XMM0, XMM6*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
|
|
@ -2701,12 +2754,12 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xe8);
|
||||
addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/
|
||||
addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x42);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2727,22 +2780,23 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
case AFUNC_AONE:
|
||||
break;
|
||||
case AFUNC_AOMSRC_ALPHA:
|
||||
addbyte(0x66); /*PMULLW XMM0, aminuslookup[EDX*8]*/
|
||||
fatal("src AFUNC_AOMSRC_ALPHA\n");
|
||||
addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x04);
|
||||
addbyte(0xd5);
|
||||
addlong((uint32_t)(uintptr_t)aminuslookup);
|
||||
addbyte(0xd3);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xe8);
|
||||
addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x42);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -2759,12 +2813,12 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_AOM_COLOR:
|
||||
addbyte(0xf3); /*MOVQ XMM5, xmm_ff_w*/
|
||||
fatal("src AFUNC_AOM_COLOR\n");
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0x2c);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)&xmm_ff_w);
|
||||
addbyte(0xe9);
|
||||
addbyte(0x66); /*PSUBW XMM5, XMM6*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xf9);
|
||||
|
|
@ -2778,11 +2832,11 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x7e);
|
||||
addbyte(0xe8);
|
||||
addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x04);
|
||||
addbyte(0x25);
|
||||
addlong((uint32_t)(uintptr_t)alookup + 16);
|
||||
addbyte(0x42);
|
||||
addbyte(8*2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
|
|
@ -3233,6 +3287,10 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo
|
|||
addbyte(0x5f);
|
||||
addbyte(0x41); /*POP R14*/
|
||||
addbyte(0x5e);
|
||||
addbyte(0x41); /*POP R13*/
|
||||
addbyte(0x5d);
|
||||
addbyte(0x41); /*POP R12*/
|
||||
addbyte(0x5c);
|
||||
addbyte(0x5b); /*POP RBX*/
|
||||
addbyte(0x5e); /*POP RSI*/
|
||||
addbyte(0x5f); /*POP RDI*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue