Code : Tout sélectionner
Global Dim exposure(#screenSize2)
Procedure findMaxExposure()
maxexposure = 0
For i = 0 To #screenSize2
If (exposure(i) > maxexposure)
maxexposure = exposure(i)
EndIf
Next i
EndProcedure
Qui genere le code asm suivant (option : CPU with SSE2)
Code : Tout sélectionner
; Procedure findMaxExposure()
macro {MP4
_Procedure4:
PUSH rbp
PUSH r15
PS4=80
XOR rax,rax
PUSH rax
PUSH rax
SUB rsp,40
; maxexposure = 0
MOV qword [v_maxexposure],0
; For i = 0 To #screenSize2
MOV qword [rsp+40],0
_For15:
MOV rax,1000000
CMP rax,qword [rsp+40]
JL _Next16
; If (exposure(i) > maxexposure)
MOV r15,qword [rsp+40]
MOV rbp,qword [a_exposure]
SAL r15,3
MOV r15,qword [rbp+r15]
CMP r15,qword [v_maxexposure]
JLE _EndIf18
; maxexposure = exposure(i)
MOV r15,qword [rsp+40]
MOV rbp,qword [a_exposure]
SAL r15,3
PUSH qword [rbp+r15]
POP rax
MOV qword [v_maxexposure],rax
; EndIf
_EndIf18:
; Next i
_NextContinue16:
INC qword [rsp+40]
JNO _For15
_Next16:
; EndProcedure
XOR rax,rax
_EndProcedure5:
ADD rsp,56
POP r15
POP rbp
RET
}
En purebasic, je vois difficillement comment faire mieux.
En asm... je trouve que cela a un peu trop d'instruction a mon gout.
Cette partie du code n'est pas la plus critique de mon application, mais il me semblai qu'elle serai la plus simple a transformer en InlineASM ... jusqu'a que je vois le code genéré ...
Une idée ?