[fpc-pascal] Conversion from C to Pascal - Left bit shift

Jean SUZINEAU jean.suzineau at wanadoo.fr
Fri Sep 3 14:35:44 CEST 2021


I made a few tests on Ubuntu 64 bits (arch x86_64) with variations on a 
small test program:
var
    E2: Byte= 3;
    E1: LongWord= 1;
    E: QWord;
begin
      E:= (1000*E1) shl E2;
      writeln( 'E2', E2);
      writeln( 'E1', E1);
      writeln( 'E', E);
end.

In the assembly window, shl is computed on 64 bits %rax, I get :

project1.lpr:132 E:= (1000*E1) shl E2;
00000000004011B2 8b05d8f50c00             mov 0xcf5d8(%rip),%eax        
# 0x4d0790 <TC_$P$PROJECT1_$$_E1>
00000000004011B8 4869c0e8030000           imul $0x3e8,%rax,%rax
00000000004011BF 0fb60dbaf50c00           movzbl 
0xcf5ba(%rip),%ecx        # 0x4d0780 <TC_$P$PROJECT1_$$_E2>
00000000004011C6 48d3e0                   shl    %cl,%rax
00000000004011C9 48890580b51000           mov %rax,0x10b580(%rip)        
# 0x50c750 <U_$P$PROJECT1_$$_E>

Changing the formula to E:= E1 shl E2, shl computed on 32 bits %edx, (I 
don't understand the "and    %edx,%edx", may be just to clear the carry ?)
I get :

project1.lpr:132 E:= E1 shl E2;
00000000004011B2 0fb605c7f50c00           movzbl 
0xcf5c7(%rip),%eax        # 0x4d0780 <TC_$P$PROJECT1_$$_E2>
00000000004011B9 8b15d1f50c00             mov 0xcf5d1(%rip),%edx        
# 0x4d0790 <TC_$P$PROJECT1_$$_E1>
00000000004011BF 89c1                     mov    %eax,%ecx
00000000004011C1 d3e2                     shl    %cl,%edx
00000000004011C3 21d2                     and    %edx,%edx
00000000004011C5 48891584b51000           mov %rdx,0x10b584(%rip)        
# 0x50c750 <U_$P$PROJECT1_$$_E>

Changing  E1 to QWord ( E1: QWord= 1; ), shl is computed on 64 bits 
%rax, I get :

project1.lpr:132 E:= E1 shl E2;
00000000004011B2 0fb605c7f50c00           movzbl 
0xcf5c7(%rip),%eax        # 0x4d0780 <TC_$P$PROJECT1_$$_E2>
00000000004011B9 488b15d0f50c00           mov 0xcf5d0(%rip),%rdx        
# 0x4d0790 <TC_$P$PROJECT1_$$_E1>
00000000004011C0 4889c1                   mov    %rax,%rcx
00000000004011C3 48d3e2                   shl    %cl,%rdx
00000000004011C6 48891583b51000           mov %rdx,0x10b583(%rip)        
# 0x50c750 <U_$P$PROJECT1_$$_E>




More information about the fpc-pascal mailing list