Goodies added to this version:
PRE-EXISTING FLAG CONDITIONS (dedndave was the godfather to these children)
signed jumps
LESS? JGE skip
!LESS? JL skip
GREATER? JLE skip
!GREATER? JG skip
unsigned missing jumps
ABOVE? JBE skip
!ABOVE? JA skip
;//----------------------------------------------------------------------------------
BUILT IN .FOR AND .ENDFOR C-LIKE HLL LOOP
The first difference is ';' is replaced with '¦' which is character 0A6h or 166
to type it hold ALT down and type 221 and than release ALT
The second difference is that it is highly optimised and runs with the lightning speed
initializers and counters:
=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
condition opperators:
==,!=,> ,< ,>=,<=,&&,||,& ,!,ZERO?,CARRY?,SIGN?,PARITY?,OVERFLOW?,LESS?,GREATER?,ABOVE?
E.G. eax+=10 ebx <<= 16 (shl) ecx >>= 8 (shr)
here is how it can be used:
.for (edx=88,ecx=4¦eax != 24 && hWnd > lParam || ebx <= 20 || ebx >= 3¦eax=23,edx=24,ebx++)
nop
.endfor
.for (¦r8¦r8++,[rcx].RECT.top=eax)
nop
nop
.if (rax)
.continue
.endif
mov[rcx], dl
.endfor
;forever loop
.for (¦¦)
.break .if eax
.endfor
;//----------------------------------------------------------------------------------
HOMING SPACE
Although the first four parameters are passed via registers, there is still space allocated on the stack for these four parameters. This is called the parameter homing space and is used to store parameter values if either the
function accesses the parameters by address instead of by value or if the function is compiled with the homeparams flag. The minimum size of this homing space is 0x20 bytes or four 64-bit slots, even if the function takes less than 4 parameters. When the homing space is not used to store parameter values, the JWasm uses it to save non-volatile registers.
00000000`ff4f34bb mov qword ptr [rax+8],rbx
00000000`ff4f34bf mov qword ptr [rax+10h],rbp
00000000`ff4f34c3 mov qword ptr [rax+18h],rsi
00000000`ff4f34c7 mov qword ptr [rax+20h],rdi
00000000`ff4f34cb push r12
00000000`ff4f34cd sub rsp,70h
Auto save first 4 registers will not save unused register
If a procedure doesn't have invoke it will not unnecessarily allocate the homing space
If a procedure doesn't have locals FRAME will not be created
so you will not need to use:
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
;//----------------------------------------------------------------------------------
INVOKE OPTIMIZATION
If invoke has in first 4 parameters FALSE,NULL or 0 it will not assemble to MOVE REG,0
but XOR REG,REG
;//----------------------------------------------------------------------------------
AVX2 IMPLEMENTED