mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
x86, x86-64: оптимизации RTL
This commit is contained in:
1 parent
3e5c968b59
commit
8b8d42e0fb
11 files changed
+516
-242
No files matched your search
Binary file not shown.
+107
-47
@@ -35,6 +35,7 @@ VAR
|
||||
|
||||
name: INTEGER;
|
||||
types: INTEGER;
|
||||
bits: INTEGER;
|
||||
|
||||
dll: RECORD
|
||||
process_detach,
|
||||
@@ -158,6 +159,17 @@ PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER;
|
||||
END _set2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
IF ASR(a, 5) = 0 THEN
|
||||
SYSTEM.GET(bits + a * SIZE_OF_DWORD, a)
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
RETURN a
|
||||
END _set1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
@@ -286,49 +298,89 @@ BEGIN
|
||||
END _lengthw;
|
||||
|
||||
|
||||
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: CHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a);
|
||||
SYSTEM.GET(b, B); INC(b);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 017H, (* jle L3 *)
|
||||
08AH, 00EH, (* mov cl, byte[esi] *)
|
||||
08AH, 017H, (* mov dl, byte[edi] *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E7H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmp;
|
||||
|
||||
|
||||
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: WCHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a, 2);
|
||||
SYSTEM.GET(b, B); INC(b, 2);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 01BH, (* jle L3 *)
|
||||
066H, 08BH, 00EH, (* mov cx, word[esi] *)
|
||||
066H, 08BH, 017H, (* mov dx, word[edi] *)
|
||||
046H, (* inc esi *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E3H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmpw;
|
||||
|
||||
|
||||
@@ -567,14 +619,6 @@ BEGIN
|
||||
END _dllentry;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _exit* (code: INTEGER);
|
||||
BEGIN
|
||||
API.exit(code)
|
||||
@@ -603,7 +647,15 @@ BEGIN
|
||||
END
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
bits := API._NEW((MAX_SET + 1) * SIZE_OF_DWORD);
|
||||
ASSERT(bits # 0);
|
||||
j := 1;
|
||||
FOR i := 0 TO MAX_SET DO
|
||||
SYSTEM.PUT(bits + i * SIZE_OF_DWORD, j);
|
||||
j := j * 2
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
|
||||
dll.process_detach := NIL;
|
||||
dll.thread_detach := NIL;
|
||||
@@ -621,6 +673,14 @@ BEGIN
|
||||
END _sofinit;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE SetFini* (ProcFini: PROC);
|
||||
BEGIN
|
||||
fini := ProcFini
|
||||
|
||||
+107
-47
@@ -35,6 +35,7 @@ VAR
|
||||
|
||||
name: INTEGER;
|
||||
types: INTEGER;
|
||||
bits: INTEGER;
|
||||
|
||||
dll: RECORD
|
||||
process_detach,
|
||||
@@ -158,6 +159,17 @@ PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER;
|
||||
END _set2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
IF ASR(a, 5) = 0 THEN
|
||||
SYSTEM.GET(bits + a * SIZE_OF_DWORD, a)
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
RETURN a
|
||||
END _set1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
@@ -286,49 +298,89 @@ BEGIN
|
||||
END _lengthw;
|
||||
|
||||
|
||||
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: CHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a);
|
||||
SYSTEM.GET(b, B); INC(b);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 017H, (* jle L3 *)
|
||||
08AH, 00EH, (* mov cl, byte[esi] *)
|
||||
08AH, 017H, (* mov dl, byte[edi] *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E7H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmp;
|
||||
|
||||
|
||||
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: WCHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a, 2);
|
||||
SYSTEM.GET(b, B); INC(b, 2);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 01BH, (* jle L3 *)
|
||||
066H, 08BH, 00EH, (* mov cx, word[esi] *)
|
||||
066H, 08BH, 017H, (* mov dx, word[edi] *)
|
||||
046H, (* inc esi *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E3H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmpw;
|
||||
|
||||
|
||||
@@ -567,14 +619,6 @@ BEGIN
|
||||
END _dllentry;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _exit* (code: INTEGER);
|
||||
BEGIN
|
||||
API.exit(code)
|
||||
@@ -603,7 +647,15 @@ BEGIN
|
||||
END
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
bits := API._NEW((MAX_SET + 1) * SIZE_OF_DWORD);
|
||||
ASSERT(bits # 0);
|
||||
j := 1;
|
||||
FOR i := 0 TO MAX_SET DO
|
||||
SYSTEM.PUT(bits + i * SIZE_OF_DWORD, j);
|
||||
j := j * 2
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
|
||||
dll.process_detach := NIL;
|
||||
dll.thread_detach := NIL;
|
||||
@@ -621,6 +673,14 @@ BEGIN
|
||||
END _sofinit;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE SetFini* (ProcFini: PROC);
|
||||
BEGIN
|
||||
fini := ProcFini
|
||||
|
||||
+95
-47
@@ -36,6 +36,7 @@ VAR
|
||||
name: INTEGER;
|
||||
types: INTEGER;
|
||||
sets: INTEGER;
|
||||
bits: INTEGER;
|
||||
|
||||
dll: RECORD
|
||||
process_detach,
|
||||
@@ -164,6 +165,17 @@ PROCEDURE [stdcall64] _set2* (a, b: INTEGER): INTEGER;
|
||||
END _set2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall64] _set1* (a: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
IF ASR(a, 6) = 0 THEN
|
||||
SYSTEM.GET(bits + a * SIZE_OF_QWORD, a)
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
RETURN a
|
||||
END _set1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall64] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
@@ -288,49 +300,77 @@ BEGIN
|
||||
END _lengthw;
|
||||
|
||||
|
||||
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: CHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall64] strncmp (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a);
|
||||
SYSTEM.GET(b, B); INC(b);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
048H, 08BH, 04DH, 010H, (* mov rcx, qword[rbp + 16]; rcx <- a *)
|
||||
048H, 08BH, 055H, 018H, (* mov rdx, qword[rbp + 24]; rdx <- b *)
|
||||
04CH, 08BH, 045H, 020H, (* mov r8, qword[rbp + 32]; r8 <- n *)
|
||||
04DH, 031H, 0C9H, (* xor r9, r9 *)
|
||||
04DH, 031H, 0D2H, (* xor r10, r10 *)
|
||||
048H, 0B8H, 000H, 000H,
|
||||
000H, 000H, 000H, 000H,
|
||||
000H, 080H, (* movabs rax, minint *)
|
||||
(* L1: *)
|
||||
04DH, 085H, 0C0H, (* test r8, r8 *)
|
||||
07EH, 024H, (* jle L3 *)
|
||||
044H, 08AH, 009H, (* mov r9b, byte[rcx] *)
|
||||
044H, 08AH, 012H, (* mov r10b, byte[rdx] *)
|
||||
048H, 0FFH, 0C1H, (* inc rcx *)
|
||||
048H, 0FFH, 0C2H, (* inc rdx *)
|
||||
049H, 0FFH, 0C8H, (* dec r8 *)
|
||||
04DH, 039H, 0D1H, (* cmp r9, r10 *)
|
||||
074H, 008H, (* je L2 *)
|
||||
04CH, 089H, 0C8H, (* mov rax, r9 *)
|
||||
04CH, 029H, 0D0H, (* sub rax, r10 *)
|
||||
0EBH, 008H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
04DH, 085H, 0C9H, (* test r9, r9 *)
|
||||
075H, 0DAH, (* jne L1 *)
|
||||
048H, 031H, 0C0H, (* xor rax, rax *)
|
||||
(* L3: *)
|
||||
05DH, (* pop rbp *)
|
||||
0C2H, 018H, 000H (* ret 24 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmp;
|
||||
|
||||
|
||||
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: WCHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall64] strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a, 2);
|
||||
SYSTEM.GET(b, B); INC(b, 2);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
048H, 08BH, 04DH, 010H, (* mov rcx, qword[rbp + 16]; rcx <- a *)
|
||||
048H, 08BH, 055H, 018H, (* mov rdx, qword[rbp + 24]; rdx <- b *)
|
||||
04CH, 08BH, 045H, 020H, (* mov r8, qword[rbp + 32]; r8 <- n *)
|
||||
04DH, 031H, 0C9H, (* xor r9, r9 *)
|
||||
04DH, 031H, 0D2H, (* xor r10, r10 *)
|
||||
048H, 0B8H, 000H, 000H,
|
||||
000H, 000H, 000H, 000H,
|
||||
000H, 080H, (* movabs rax, minint *)
|
||||
(* L1: *)
|
||||
04DH, 085H, 0C0H, (* test r8, r8 *)
|
||||
07EH, 028H, (* jle L3 *)
|
||||
066H, 044H, 08BH, 009H, (* mov r9w, word[rcx] *)
|
||||
066H, 044H, 08BH, 012H, (* mov r10w, word[rdx] *)
|
||||
048H, 083H, 0C1H, 002H, (* add rcx, 2 *)
|
||||
048H, 083H, 0C2H, 002H, (* add rdx, 2 *)
|
||||
049H, 0FFH, 0C8H, (* dec r8 *)
|
||||
04DH, 039H, 0D1H, (* cmp r9, r10 *)
|
||||
074H, 008H, (* je L2 *)
|
||||
04CH, 089H, 0C8H, (* mov rax, r9 *)
|
||||
04CH, 029H, 0D0H, (* sub rax, r10 *)
|
||||
0EBH, 008H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
04DH, 085H, 0C9H, (* test r9, r9 *)
|
||||
075H, 0D6H, (* jne L1 *)
|
||||
048H, 031H, 0C0H, (* xor rax, rax *)
|
||||
(* L3: *)
|
||||
05DH, (* pop rbp *)
|
||||
0C2H, 018H, 000H (* ret 24 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmpw;
|
||||
|
||||
|
||||
@@ -569,14 +609,6 @@ BEGIN
|
||||
END _dllentry;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE [stdcall64] _exit* (code: INTEGER);
|
||||
BEGIN
|
||||
API.exit(code)
|
||||
@@ -612,7 +644,15 @@ BEGIN
|
||||
END
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
bits := API._NEW((MAX_SET + 1) * SIZE_OF_QWORD);
|
||||
ASSERT(bits # 0);
|
||||
j := 1;
|
||||
FOR i := 0 TO MAX_SET DO
|
||||
SYSTEM.PUT(bits + i * SIZE_OF_QWORD, j);
|
||||
j := j * 2
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
|
||||
dll.process_detach := NIL;
|
||||
dll.thread_detach := NIL;
|
||||
@@ -630,6 +670,14 @@ BEGIN
|
||||
END _sofinit;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE SetFini* (ProcFini: PROC);
|
||||
BEGIN
|
||||
fini := ProcFini
|
||||
|
||||
+107
-47
@@ -35,6 +35,7 @@ VAR
|
||||
|
||||
name: INTEGER;
|
||||
types: INTEGER;
|
||||
bits: INTEGER;
|
||||
|
||||
dll: RECORD
|
||||
process_detach,
|
||||
@@ -158,6 +159,17 @@ PROCEDURE [stdcall] _set2* (a, b: INTEGER): INTEGER;
|
||||
END _set2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _set1* (a: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
IF ASR(a, 5) = 0 THEN
|
||||
SYSTEM.GET(bits + a * SIZE_OF_DWORD, a)
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
RETURN a
|
||||
END _set1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
@@ -286,49 +298,89 @@ BEGIN
|
||||
END _lengthw;
|
||||
|
||||
|
||||
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: CHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall] strncmp (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a);
|
||||
SYSTEM.GET(b, B); INC(b);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 017H, (* jle L3 *)
|
||||
08AH, 00EH, (* mov cl, byte[esi] *)
|
||||
08AH, 017H, (* mov dl, byte[edi] *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E7H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmp;
|
||||
|
||||
|
||||
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: WCHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall] strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a, 2);
|
||||
SYSTEM.GET(b, B); INC(b, 2);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
056H, (* push esi *)
|
||||
057H, (* push edi *)
|
||||
053H, (* push ebx *)
|
||||
08BH, 075H, 008H, (* mov esi, dword[ebp + 8]; esi <- a *)
|
||||
08BH, 07DH, 00CH, (* mov edi, dword[ebp + 12]; edi <- b *)
|
||||
08BH, 05DH, 010H, (* mov ebx, dword[ebp + 16]; ebx <- n *)
|
||||
031H, 0C9H, (* xor ecx, ecx *)
|
||||
031H, 0D2H, (* xor edx, edx *)
|
||||
0B8H,
|
||||
000H, 000H, 000H, 080H, (* mov eax, minint *)
|
||||
(* L1: *)
|
||||
085H, 0DBH, (* test ebx, ebx *)
|
||||
07EH, 01BH, (* jle L3 *)
|
||||
066H, 08BH, 00EH, (* mov cx, word[esi] *)
|
||||
066H, 08BH, 017H, (* mov dx, word[edi] *)
|
||||
046H, (* inc esi *)
|
||||
046H, (* inc esi *)
|
||||
047H, (* inc edi *)
|
||||
047H, (* inc edi *)
|
||||
04BH, (* dec ebx *)
|
||||
039H, 0D1H, (* cmp ecx, edx *)
|
||||
074H, 006H, (* je L2 *)
|
||||
089H, 0C8H, (* mov eax, ecx *)
|
||||
029H, 0D0H, (* sub eax, edx *)
|
||||
0EBH, 006H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
085H, 0C9H, (* test ecx, ecx *)
|
||||
075H, 0E3H, (* jne L1 *)
|
||||
031H, 0C0H, (* xor eax, eax *)
|
||||
(* L3: *)
|
||||
05BH, (* pop ebx *)
|
||||
05FH, (* pop edi *)
|
||||
05EH, (* pop esi *)
|
||||
05DH, (* pop ebp *)
|
||||
0C2H, 00CH, 000H (* ret 12 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmpw;
|
||||
|
||||
|
||||
@@ -567,14 +619,6 @@ BEGIN
|
||||
END _dllentry;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE [stdcall] _exit* (code: INTEGER);
|
||||
BEGIN
|
||||
API.exit(code)
|
||||
@@ -603,7 +647,15 @@ BEGIN
|
||||
END
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
bits := API._NEW((MAX_SET + 1) * SIZE_OF_DWORD);
|
||||
ASSERT(bits # 0);
|
||||
j := 1;
|
||||
FOR i := 0 TO MAX_SET DO
|
||||
SYSTEM.PUT(bits + i * SIZE_OF_DWORD, j);
|
||||
j := j * 2
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
|
||||
dll.process_detach := NIL;
|
||||
dll.thread_detach := NIL;
|
||||
@@ -621,6 +673,14 @@ BEGIN
|
||||
END _sofinit;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE SetFini* (ProcFini: PROC);
|
||||
BEGIN
|
||||
fini := ProcFini
|
||||
|
||||
+95
-47
@@ -36,6 +36,7 @@ VAR
|
||||
name: INTEGER;
|
||||
types: INTEGER;
|
||||
sets: INTEGER;
|
||||
bits: INTEGER;
|
||||
|
||||
dll: RECORD
|
||||
process_detach,
|
||||
@@ -164,6 +165,17 @@ PROCEDURE [stdcall64] _set2* (a, b: INTEGER): INTEGER;
|
||||
END _set2;
|
||||
|
||||
|
||||
PROCEDURE [stdcall64] _set1* (a: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
IF ASR(a, 6) = 0 THEN
|
||||
SYSTEM.GET(bits + a * SIZE_OF_QWORD, a)
|
||||
ELSE
|
||||
a := 0
|
||||
END
|
||||
RETURN a
|
||||
END _set1;
|
||||
|
||||
|
||||
PROCEDURE [stdcall64] divmod (a, b: INTEGER; VAR mod: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
SYSTEM.CODE(
|
||||
@@ -288,49 +300,77 @@ BEGIN
|
||||
END _lengthw;
|
||||
|
||||
|
||||
PROCEDURE strncmp (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: CHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall64] strncmp (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a);
|
||||
SYSTEM.GET(b, B); INC(b);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
048H, 08BH, 04DH, 010H, (* mov rcx, qword[rbp + 16]; rcx <- a *)
|
||||
048H, 08BH, 055H, 018H, (* mov rdx, qword[rbp + 24]; rdx <- b *)
|
||||
04CH, 08BH, 045H, 020H, (* mov r8, qword[rbp + 32]; r8 <- n *)
|
||||
04DH, 031H, 0C9H, (* xor r9, r9 *)
|
||||
04DH, 031H, 0D2H, (* xor r10, r10 *)
|
||||
048H, 0B8H, 000H, 000H,
|
||||
000H, 000H, 000H, 000H,
|
||||
000H, 080H, (* movabs rax, minint *)
|
||||
(* L1: *)
|
||||
04DH, 085H, 0C0H, (* test r8, r8 *)
|
||||
07EH, 024H, (* jle L3 *)
|
||||
044H, 08AH, 009H, (* mov r9b, byte[rcx] *)
|
||||
044H, 08AH, 012H, (* mov r10b, byte[rdx] *)
|
||||
048H, 0FFH, 0C1H, (* inc rcx *)
|
||||
048H, 0FFH, 0C2H, (* inc rdx *)
|
||||
049H, 0FFH, 0C8H, (* dec r8 *)
|
||||
04DH, 039H, 0D1H, (* cmp r9, r10 *)
|
||||
074H, 008H, (* je L2 *)
|
||||
04CH, 089H, 0C8H, (* mov rax, r9 *)
|
||||
04CH, 029H, 0D0H, (* sub rax, r10 *)
|
||||
0EBH, 008H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
04DH, 085H, 0C9H, (* test r9, r9 *)
|
||||
075H, 0DAH, (* jne L1 *)
|
||||
048H, 031H, 0C0H, (* xor rax, rax *)
|
||||
(* L3: *)
|
||||
05DH, (* pop rbp *)
|
||||
0C2H, 018H, 000H (* ret 24 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmp;
|
||||
|
||||
|
||||
PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
VAR
|
||||
A, B: WCHAR;
|
||||
res: INTEGER;
|
||||
|
||||
PROCEDURE [stdcall64] strncmpw (a, b, n: INTEGER): INTEGER;
|
||||
BEGIN
|
||||
res := minint;
|
||||
WHILE n > 0 DO
|
||||
SYSTEM.GET(a, A); INC(a, 2);
|
||||
SYSTEM.GET(b, B); INC(b, 2);
|
||||
DEC(n);
|
||||
IF A # B THEN
|
||||
res := ORD(A) - ORD(B);
|
||||
n := 0
|
||||
ELSIF A = 0X THEN
|
||||
res := 0;
|
||||
n := 0
|
||||
END
|
||||
END
|
||||
RETURN res
|
||||
SYSTEM.CODE(
|
||||
048H, 08BH, 04DH, 010H, (* mov rcx, qword[rbp + 16]; rcx <- a *)
|
||||
048H, 08BH, 055H, 018H, (* mov rdx, qword[rbp + 24]; rdx <- b *)
|
||||
04CH, 08BH, 045H, 020H, (* mov r8, qword[rbp + 32]; r8 <- n *)
|
||||
04DH, 031H, 0C9H, (* xor r9, r9 *)
|
||||
04DH, 031H, 0D2H, (* xor r10, r10 *)
|
||||
048H, 0B8H, 000H, 000H,
|
||||
000H, 000H, 000H, 000H,
|
||||
000H, 080H, (* movabs rax, minint *)
|
||||
(* L1: *)
|
||||
04DH, 085H, 0C0H, (* test r8, r8 *)
|
||||
07EH, 028H, (* jle L3 *)
|
||||
066H, 044H, 08BH, 009H, (* mov r9w, word[rcx] *)
|
||||
066H, 044H, 08BH, 012H, (* mov r10w, word[rdx] *)
|
||||
048H, 083H, 0C1H, 002H, (* add rcx, 2 *)
|
||||
048H, 083H, 0C2H, 002H, (* add rdx, 2 *)
|
||||
049H, 0FFH, 0C8H, (* dec r8 *)
|
||||
04DH, 039H, 0D1H, (* cmp r9, r10 *)
|
||||
074H, 008H, (* je L2 *)
|
||||
04CH, 089H, 0C8H, (* mov rax, r9 *)
|
||||
04CH, 029H, 0D0H, (* sub rax, r10 *)
|
||||
0EBH, 008H, (* jmp L3 *)
|
||||
(* L2: *)
|
||||
04DH, 085H, 0C9H, (* test r9, r9 *)
|
||||
075H, 0D6H, (* jne L1 *)
|
||||
048H, 031H, 0C0H, (* xor rax, rax *)
|
||||
(* L3: *)
|
||||
05DH, (* pop rbp *)
|
||||
0C2H, 018H, 000H (* ret 24 *)
|
||||
)
|
||||
|
||||
RETURN 0
|
||||
END strncmpw;
|
||||
|
||||
|
||||
@@ -569,14 +609,6 @@ BEGIN
|
||||
END _dllentry;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE [stdcall64] _exit* (code: INTEGER);
|
||||
BEGIN
|
||||
API.exit(code)
|
||||
@@ -612,7 +644,15 @@ BEGIN
|
||||
END
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
bits := API._NEW((MAX_SET + 1) * SIZE_OF_QWORD);
|
||||
ASSERT(bits # 0);
|
||||
j := 1;
|
||||
FOR i := 0 TO MAX_SET DO
|
||||
SYSTEM.PUT(bits + i * SIZE_OF_QWORD, j);
|
||||
j := j * 2
|
||||
END;
|
||||
|
||||
name := modname;
|
||||
|
||||
dll.process_detach := NIL;
|
||||
dll.thread_detach := NIL;
|
||||
@@ -630,6 +670,14 @@ BEGIN
|
||||
END _sofinit;
|
||||
|
||||
|
||||
PROCEDURE SetDll* (process_detach, thread_detach, thread_attach: DLL_ENTRY);
|
||||
BEGIN
|
||||
dll.process_detach := process_detach;
|
||||
dll.thread_detach := thread_detach;
|
||||
dll.thread_attach := thread_attach
|
||||
END SetDll;
|
||||
|
||||
|
||||
PROCEDURE SetFini* (ProcFini: PROC);
|
||||
BEGIN
|
||||
fini := ProcFini
|
||||
|
||||
+1
-3
@@ -1333,10 +1333,8 @@ BEGIN
|
||||
GetRegA
|
||||
|
||||
|IL.opRSET1:
|
||||
UnOp(reg1);
|
||||
PushAll(1);
|
||||
push(reg1);
|
||||
CallRTL(IL._set);
|
||||
CallRTL(IL._set1);
|
||||
GetRegA
|
||||
|
||||
|IL.opINCL, IL.opEXCL:
|
||||
|
||||
+2
-1
@@ -122,6 +122,7 @@ CONST
|
||||
_init *= 23;
|
||||
_dllentry *= 24;
|
||||
_sofinit *= 25;
|
||||
_set1 *= 26;
|
||||
|
||||
|
||||
TYPE
|
||||
@@ -188,7 +189,7 @@ TYPE
|
||||
dmin*: INTEGER;
|
||||
lcount*: INTEGER;
|
||||
bss*: INTEGER;
|
||||
rtl*: ARRAY 26 OF INTEGER;
|
||||
rtl*: ARRAY 27 OF INTEGER;
|
||||
errlabels*: ARRAY 12 OF INTEGER;
|
||||
|
||||
charoffs: ARRAY 256 OF INTEGER;
|
||||
|
||||
@@ -3291,6 +3291,7 @@ BEGIN
|
||||
getproc(rtl, "_mod", IL._mod);
|
||||
getproc(rtl, "_set", IL._set);
|
||||
getproc(rtl, "_set2", IL._set2);
|
||||
getproc(rtl, "_set1", IL._set1);
|
||||
getproc(rtl, "_isrec", IL._isrec);
|
||||
getproc(rtl, "_lengthw", IL._lengthw);
|
||||
getproc(rtl, "_strcmpw", IL._strcmpw);
|
||||
|
||||
+1
-3
@@ -1464,10 +1464,8 @@ BEGIN
|
||||
GetRegA
|
||||
|
||||
|IL.opRSET1:
|
||||
UnOp(reg1);
|
||||
PushAll(1);
|
||||
push(reg1);
|
||||
CallRTL(pic, IL._set);
|
||||
CallRTL(pic, IL._set1);
|
||||
GetRegA
|
||||
|
||||
|IL.opINCL, IL.opEXCL:
|
||||
|
||||
Reference in new issue
Block a user