• Welcome to Theos PowerBasic Museum 2017.

(Optimization) Use SELECT CASE AS LONG instead of SELECT CASE

Started by Theo Gottwald, August 02, 2007, 09:09:23 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Theo Gottwald

I'll show the difference between the both on the low level.

The normal SELECT CASE statement is been compiled using FLOATING-POINT statements.
FILD,FSTP, FCOMP. Also the operators for the comparison are taken from temporary memory locations, while the values in the "AS LONG" are beeing compiled into the code.

Example:
MOV EAX, DWORD 00000001 ' from the CASE / AS LONG
FLD EXT (TBYTE) PTR [EBP-40] ' from the standard SELECT CASE

Therefore its advisable to prefer SELECT CASE AS LONG where possible.



REGISTER R01 AS LONG,R02 AS LONG
!NOP
R01=100
SELECT CASE R01
' SELECT CASE AS LONG R01
    !NOP
    CASE 1: REM
               !NOP
    CASE 2: REM
               !NOP
    CASE ELSE
               !NOP
    END SELECT
   !NOP
   FOR R02=0 TO R01+5
    !NOP
   NEXT
   !NOP   


----------------------------------------------------------
SELECT CASE AS LONG
----------------------------------------------------------

4023D0 90                     NOP
4023D1 C7C664000000           MOV ESI, DWORD 00000064
4023D7 8975C0                 MOV DWORD PTR [EBP-40], ESI
4023DA 90                     NOP

' ----------------------------  CASE 1: REM
4023DB B801000000             MOV EAX, DWORD 00000001
4023E0 3B45C0                 CMP EAX, DWORD PTR [EBP-40]
4023E3 0F8506000000           JNZ L4023EF
4023E9 90                     NOP
4023EA E916000000             JMP L402405
'----------------------------

' ----------------------------  CASE 2: REM
4023EF B802000000             MOV EAX, DWORD 00000002
4023F4 3B45C0                 CMP EAX, DWORD PTR [EBP-40]
4023F7 0F8506000000           JNZ L402403
4023FD 90                     NOP
4023FE E902000000             JMP L402405
'----------------------------

402403 90                     NOP
402404 90                     NOP
402405 90                     NOP
402406 B805000000             MOV EAX, DWORD 00000005
40240B 03C6                   ADD EAX, ESI
40240D 89856CFFFFFF           MOV DWORD PTR [EBP+FFFFFF6C], EAX
402413 C7C700000000           MOV EDI, DWORD 00000000
402419 E903000000             JMP L402421
40241E 90                     NOP
40241F FFC7                   INC EDI
402421 8BC7                   MOV EAX, EDI
402423 3B856CFFFFFF           CMP EAX, DWORD PTR [EBP+FFFFFF6C]
402429 7EF3                   JLE SHORT L40241E
40242B 90                     NOP


----------------------------------------------------------
SELECT CASE
----------------------------------------------------------

4023D0 90                     NOP
4023D1 C7C664000000           MOV ESI, DWORD 00000064
4023D7 8975A4                 MOV DWORD PTR [EBP-5C], ESI
4023DA DB45A4                 FILD LONG PTR [EBP-5C]
4023DD DB7DC0                 FSTP EXT (TBYTE) PTR [EBP-40]
4023E0 90                     NOP

' ----------------------------  CASE 1: REM
4023E1 D9E8                   FLD1
4023E3 DB6DC0                 FLD EXT (TBYTE) PTR [EBP-40]
4023E6 DED9                   FCOMPP
4023E8 DFE0                   FNSTSW AX
4023EA 9E                     SAHF
4023EB 0F8506000000           JNZ L4023F7
4023F1 90                     NOP
4023F2 E91C000000             JMP L402413
' ----------------------------

' ----------------------------  CASE 2: REM
4023F7 DF0534674000           FILD INTEGER PTR [00406734]
4023FD DB6DC0                 FLD EXT (TBYTE) PTR [EBP-40]
402400 DED9                   FCOMPP
402402 DFE0                   FNSTSW AX
402404 9E                     SAHF
402405 0F8506000000           JNZ L402411
40240B 90                     NOP
40240C E902000000             JMP L402413
' ----------------------------

402411 90                     NOP
402412 90                     NOP
402413 90                     NOP
402414 B805000000             MOV EAX, DWORD 00000005
402419 03C6                   ADD EAX, ESI
40241B 89856CFFFFFF           MOV DWORD PTR [EBP+FFFFFF6C], EAX
402421 C7C700000000           MOV EDI, DWORD 00000000
402427 E903000000             JMP L40242F
40242C 90                     NOP
40242D FFC7                   INC EDI
40242F 8BC7                   MOV EAX, EDI
402431 3B856CFFFFFF           CMP EAX, DWORD PTR [EBP+FFFFFF6C]
402437 7EF3                   JLE SHORT L40242C
402439 90                     NOP