• Welcome to Theos PowerBasic Museum 2017.

News:

Attachments are only available to registered users.
Please register using your full, real name.

Main Menu

(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