diff options
author | karoly <karoly@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-10-02 12:33:52 +0000 |
---|---|---|
committer | karoly <karoly@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-10-02 12:33:52 +0000 |
commit | c4ada71f42eaa2ea1534e72e4308baccc268a26b (patch) | |
tree | 4e6526de41562f192d269f9fac38cef9a1394352 /rtl/m68k | |
parent | 3b940dc8d09e16e7ed2311d003f5efefe3f38270 (diff) | |
download | fpc-c4ada71f42eaa2ea1534e72e4308baccc268a26b.tar.gz |
really fixed FillChar and fixed FillWord. fixes 8 tests.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@25621 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'rtl/m68k')
-rw-r--r-- | rtl/m68k/m68k.inc | 85 |
1 files changed, 43 insertions, 42 deletions
diff --git a/rtl/m68k/m68k.inc b/rtl/m68k/m68k.inc index 1cbbde2c23..06c1f1ab9d 100644 --- a/rtl/m68k/m68k.inc +++ b/rtl/m68k/m68k.inc @@ -87,34 +87,36 @@ end; {$define FPC_SYSTEM_HAS_FILLCHAR} -procedure FillChar(var x;count:longint;value:byte); assembler; - asm - move.l x, a0 { destination } - move.l count, d1 { number of bytes to fill } - move.b value, d0 { fill data } - tst.l d1 { anything to fill at all? } - beq @LMEMSET5 +procedure FillChar(var x; count : longint; value : byte); assembler; +asm + move.l x, a0 { destination } + move.l count, d1 { number of bytes to fill } +{ FIXME: this should be move.b, but everything is pushed as long on + the stack ATM (KB) } + move.l value, d0 { fill data } + tst.l d1 { anything to fill at all? } + beq @LMEMSET5 {$ifdef CPUM68K_HAS_DBRA} - cmpi.l #65535, d1 { check, if this is a word move } - ble @LMEMSET3 { use fast dbra mode } +{ FIXME: Any reason why not always just use DBRA mode on + CPUs which support it? (KB) } + cmpi.l #65535, d1 { check, if this is a word move } + ble @LMEMSET3 { use fast dbra mode } {$endif CPUM68K_HAS_DBRA} - bra @LMEMSET2 - @LMEMSET1: - move.b d0,(a0)+ - @LMEMSET2: - subq.l #1,d1 - bpl @LMEMSET1 - bra @LMEMSET5 { finished slow mode , exit } - + bra @LMEMSET2 +@LMEMSET1: + move.b d0,(a0)+ +@LMEMSET2: + subq.l #1,d1 + bpl @LMEMSET1 + bra @LMEMSET5 { finished slow mode , exit } {$ifdef CPUM68K_HAS_DBRA} - @LMEMSET4: { fast loop mode section 68010+ } - move.b d0,(a0)+ - @LMEMSET3: - dbra d1,@LMEMSET4 +@LMEMSET4: { fast loop mode section 68010+ } + move.b d0,(a0)+ +@LMEMSET3: + dbra d1,@LMEMSET4 {$endif CPUM68K_HAS_DBRA} - - @LMEMSET5: - end ['d0','d1','a0']; +@LMEMSET5: +end; {$ifdef dummy} @@ -315,24 +317,23 @@ end; {$define FPC_SYSTEM_HAS_FILLWORD} -procedure fillword(var x;count : longint;value : word); - begin - asm - move.l x, a0 { destination } - move.l count, d1 { number of bytes to fill } - move.w value, d0 { fill data } - tst.l d1 { anything to fill at all? } - beq @LMEMSET3 - bra @LMEMSET21 - @LMEMSET11: - move.w d0,(a0)+ - @LMEMSET21: - subq.l #1,d1 - cmp.b #-1,d1 - bne @LMEMSET11 - @LMEMSET3: - end ['d0','d1','a0']; - end; +procedure FillWord(var x; count : longint; value : word); assembler; +asm + move.l x, a0 { destination } + move.l count, d1 { number of bytes to fill } +{ FIXME: this should be move.w, but everything is pushed as long on + the stack ATM (KB) } + move.l value, d0 { fill data } + tst.l d1 { anything to fill at all? } + beq @LMEMSET3 + bra @LMEMSET21 +@LMEMSET11: + move.w d0,(a0)+ +@LMEMSET21: + subq.l #1,d1 + bpl @LMEMSET11 +@LMEMSET3: +end; {$define FPC_SYSTEM_HAS_ABS_LONGINT} |