fix rev 6100 and optimize

git-svn-id: svn://kolibrios.org@6101 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2016-01-26 19:28:56 +00:00
parent 2cff28512d
commit b096a68434
2 changed files with 26 additions and 19 deletions

View File

@ -685,17 +685,15 @@ pushad
stdcall specbuf_get_buffer, edx, dword[ecx+offs_mate_shininess_i], dword[ecx+offs_mate_shininess] stdcall specbuf_get_buffer, edx, dword[ecx+offs_mate_shininess_i], dword[ecx+offs_mate_shininess]
mov edi,eax ;edi = specbuf mov edi,eax ;edi = specbuf
mov dword[idx],SPECULAR_BUFFER_SIZE ;idx = SPECULAR_BUFFER_SIZE mov dword[idx],SPECULAR_BUFFER_SIZE ;idx = SPECULAR_BUFFER_SIZE
fld1
fcomp ;idx = (int)(dot_spec*SPECULAR_BUFFER_SIZE)
fstsw ax fimul dword[idx]
fild dword[idx] fistp dword[idx]
sahf ;if (idx > SPECULAR_BUFFER_SIZE) idx = SPECULAR_BUFFER_SIZE
jbe @f ;if(dot_spec < 1.0) st0=1 st1=dot_spec cmp dword[idx],SPECULAR_BUFFER_SIZE
fmul st0,st1 ;idx *= dot_spec jle @f
mov dword[idx],SPECULAR_BUFFER_SIZE
@@: @@:
fistp dword[idx]
ffree st0 ;dot_spec
fincstp
shl dword[idx],2 shl dword[idx],2
add edi,dword[idx] add edi,dword[idx]
fld dword[edi+offs_spec_buf] ;dot_spec = specbuf.buf[idx] fld dword[edi+offs_spec_buf] ;dot_spec = specbuf.buf[idx]

View File

@ -8,21 +8,23 @@ locals
val dd ? ;float val dd ? ;float
f_inc dd ? ;float f_inc dd ? ;float
endl endl
mov dword[val],0.0f
mov dword[f_inc],SPECULAR_BUFFER_SIZE mov dword[f_inc],SPECULAR_BUFFER_SIZE
fld1
fidiv dword[f_inc]
fstp dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE
mov ebx,[buf] mov ebx,[buf]
add ebx,offs_spec_buf add ebx,offs_spec_buf
mov dword[ebx],0.0 ;buf.buf[0] = 0.0
xor ecx,ecx xor ecx,ecx
inc ecx
fld dword[shininess] ;сначала берем y
fld1
fidiv dword[f_inc]
fst dword[f_inc] ;f_inc = 1.0f/SPECULAR_BUFFER_SIZE
fst dword[val]
align 4 align 4
.cycle_0: ;for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++) .cycle_0: ;for (i = 1; i <= SPECULAR_BUFFER_SIZE; i++)
cmp ecx,SPECULAR_BUFFER_SIZE cmp ecx,SPECULAR_BUFFER_SIZE
jg @f jg @f
;Вычисляем x^y ;Вычисляем x^y
fld dword[val] ;сначала берем y
fld dword[shininess] ;а потом x
fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x): fyl2x ;Стек FPU теперь содержит: st0=z=y*log2(x):
;Теперь считаем 2**z: ;Теперь считаем 2**z:
fld st0 ;Создаем еще одну копию z fld st0 ;Создаем еще одну копию z
@ -35,15 +37,22 @@ align 4
fxch st1 fxch st1
fstp st ;Результат остается на вершине стека st0 fstp st ;Результат остается на вершине стека st0
fstp dword[ebx] ;buf.buf[i] = pow(val, shininess)
add ebx,4 add ebx,4
fstp dword[ebx] ;buf.buf[i] = pow(val, shininess)
ffree st0 ;испорченный shininess
fincstp
fld dword[shininess] ;сначала берем y
fld dword[val] fld dword[val]
fadd dword[f_inc] fadd dword[f_inc]
fstp dword[val] ;val += f_inc fst dword[val] ;val += f_inc
inc ecx inc ecx
jmp .cycle_0 jmp .cycle_0
@@: @@:
ffree st0 ;val
fincstp
ffree st0 ;shininess
fincstp
ret ret
endp endp