From 44f04d39a41382cfd34688187bd1c680e3ea69db Mon Sep 17 00:00:00 2001 From: nickysn Date: Fri, 24 Nov 2017 16:11:18 +0000 Subject: [PATCH] + added asm optimized implementations of StrLower() and StrUpper() for i8086 git-svn-id: trunk@37618 - --- rtl/i8086/strings.inc | 104 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/rtl/i8086/strings.inc b/rtl/i8086/strings.inc index b4d640abae..688a99cd71 100644 --- a/rtl/i8086/strings.inc +++ b/rtl/i8086/strings.inc @@ -76,3 +76,107 @@ asm @@LStrEndNil: end; {$endif FPC_UNIT_HAS_STREND} + + +{$ifndef FPC_UNIT_HAS_STRUPPER} +{$define FPC_UNIT_HAS_STRUPPER} +function strupper(p : pchar) : pchar;assembler;nostackframe; +const +{$ifdef FPC_X86_CODE_FAR} + extra_param_offset = 2; +{$else FPC_X86_CODE_FAR} + extra_param_offset = 0; +{$endif FPC_X86_CODE_FAR} +asm + mov bx, sp + xor ax, ax +{$ifdef FPC_X86_DATA_NEAR} + mov dx, ds + mov es, dx + mov di, ss:[bx + 2 + extra_param_offset] // @p + or di, di + jz @@LStrUpperNil +{$else FPC_X86_DATA_NEAR} + les di, ss:[bx + 2 + extra_param_offset] // @p + mov dx, es + mov cx, dx + or cx, di + jz @@LStrUpperNil + mov cx, ds + mov ds, dx +{$endif FPC_X86_DATA_NEAR} + mov si, di + mov bx, di +{$ifdef FPC_ENABLED_CLD} + cld +{$endif FPC_ENABLED_CLD} +@@LSTRUPPER1: + lodsb + cmp al, 'a' + jb @@LSTRUPPER3 + cmp al, 'z' + ja @@LSTRUPPER3 + sub al, 20h +@@LSTRUPPER3: + stosb + or al, al + jnz @@LSTRUPPER1 + xchg ax, bx { 1 byte shorter than a mov } +{$ifndef FPC_X86_DATA_NEAR} + mov ds, cx +{$endif not FPC_X86_DATA_NEAR} +@@LStrUpperNil: +end; +{$endif FPC_UNIT_HAS_STRUPPER} + + +{$ifndef FPC_UNIT_HAS_STRLOWER} +{$define FPC_UNIT_HAS_STRLOWER} +function strlower(p : pchar) : pchar;assembler;nostackframe; +const +{$ifdef FPC_X86_CODE_FAR} + extra_param_offset = 2; +{$else FPC_X86_CODE_FAR} + extra_param_offset = 0; +{$endif FPC_X86_CODE_FAR} +asm + mov bx, sp + xor ax, ax +{$ifdef FPC_X86_DATA_NEAR} + mov dx, ds + mov es, dx + mov di, ss:[bx + 2 + extra_param_offset] // @p + or di, di + jz @@LStrLowerNil +{$else FPC_X86_DATA_NEAR} + les di, ss:[bx + 2 + extra_param_offset] // @p + mov dx, es + mov cx, dx + or cx, di + jz @@LStrLowerNil + mov cx, ds + mov ds, dx +{$endif FPC_X86_DATA_NEAR} + mov si, di + mov bx, di +{$ifdef FPC_ENABLED_CLD} + cld +{$endif FPC_ENABLED_CLD} +@@LSTRLOWER1: + lodsb + cmp al, 'A' + jb @@LSTRLOWER3 + cmp al, 'Z' + ja @@LSTRLOWER3 + add al, 20h +@@LSTRLOWER3: + stosb + or al, al + jnz @@LSTRLOWER1 + xchg ax, bx { 1 byte shorter than a mov } +{$ifndef FPC_X86_DATA_NEAR} + mov ds, cx +{$endif not FPC_X86_DATA_NEAR} +@@LStrLowerNil: +end; +{$endif FPC_UNIT_HAS_STRLOWER}