diff --git a/.gitattributes b/.gitattributes index c69d093d72..e9940c9ca3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12071,11 +12071,14 @@ rtl/x86_64/strings.inc svneol=native#text/plain rtl/x86_64/stringss.inc svneol=native#text/plain rtl/x86_64/x86_64.inc svneol=native#text/plain rtl/xtensa/cpuh.inc svneol=native#text/plain +rtl/xtensa/int64p.inc svneol=native#text/plain rtl/xtensa/makefile.cpu svneol=native#text/plain rtl/xtensa/math.inc svneol=native#text/plain rtl/xtensa/set.inc svneol=native#text/plain rtl/xtensa/setjump.inc svneol=native#text/plain rtl/xtensa/setjumph.inc svneol=native#text/plain +rtl/xtensa/strings.inc svneol=native#text/plain +rtl/xtensa/stringss.inc svneol=native#text/plain rtl/xtensa/xtensa.inc svneol=native#text/plain tests/MPWMake -text tests/Makefile svneol=native#text/plain diff --git a/rtl/embedded/system.cfg b/rtl/embedded/system.cfg index 46fc62d231..f8d98b1e31 100644 --- a/rtl/embedded/system.cfg +++ b/rtl/embedded/system.cfg @@ -245,4 +245,22 @@ -SfCOMMANDARGS -SfRANDOM -SfRESOURCES -#endif CPURISCV64 \ No newline at end of file +#endif CPURISCV64 + +# Xtensa is powerful enough to handle most object pascal constructs +# it is only a matter of size +#ifdef CPUXTENSA +-SfSOFTFPU +-SfCLASSES +-SfEXCEPTIONS +-SfANSISTRINGS +-SfRTTI +-SfWIDESTRINGS +-SfDYNARRAYS +-SfTHREADING +-SfVARIANTS +-SfOBJECTS +-SfCOMMANDARGS +-SfRANDOM +-SfRESOURCES +#endif CPUXTENSA diff --git a/rtl/embedded/system.pp b/rtl/embedded/system.pp index 7489b38cff..c33079e1d0 100644 --- a/rtl/embedded/system.pp +++ b/rtl/embedded/system.pp @@ -142,6 +142,7 @@ var {$undef fpc_softfpu_interface} {$endif FPC_HAS_FEATURE_SOFTFPU} + {$endif FPUNONE} {$ifdef CPUI8086} diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc index efa6882989..eead6ba3c8 100644 --- a/rtl/inc/systemh.inc +++ b/rtl/inc/systemh.inc @@ -351,6 +351,10 @@ Type {$ifdef CPUXTENSA} {$define DEFAULT_DOUBLE} + {$define FPC_INCLUDE_SOFTWARE_MOD_DIV} + {$define FPC_INCLUDE_SOFTWARE_MUL} + {$define FPC_INCLUDE_SOFTWARE_SHIFT_INT64} + {$ifndef FPUNONE} {$define SUPPORT_SINGLE} {$define SUPPORT_DOUBLE} diff --git a/rtl/xtensa/int64p.inc b/rtl/xtensa/int64p.inc new file mode 100644 index 0000000000..731e8e22bc --- /dev/null +++ b/rtl/xtensa/int64p.inc @@ -0,0 +1,15 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 2008 by the Free Pascal development team + + This file contains some helper routines for int64 and qword + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + diff --git a/rtl/xtensa/strings.inc b/rtl/xtensa/strings.inc new file mode 100644 index 0000000000..0d10cd5002 --- /dev/null +++ b/rtl/xtensa/strings.inc @@ -0,0 +1,18 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 2000 by Jonas Maebe, member of the + Free Pascal development team + + Processor dependent part of strings.pp, that can be shared with + sysutils unit. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + + diff --git a/rtl/xtensa/stringss.inc b/rtl/xtensa/stringss.inc new file mode 100644 index 0000000000..b30572827e --- /dev/null +++ b/rtl/xtensa/stringss.inc @@ -0,0 +1,18 @@ +{ + This file is part of the Free Pascal run time library. + Copyright (c) 1999-2000 by Jonas Maebe, member of the + Free Pascal development team + + Processor dependent part of strings.pp, not shared with + sysutils unit. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + + diff --git a/rtl/xtensa/xtensa.inc b/rtl/xtensa/xtensa.inc index aecf9fd714..1d7f07af0b 100644 --- a/rtl/xtensa/xtensa.inc +++ b/rtl/xtensa/xtensa.inc @@ -14,3 +14,139 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} +{$define FPC_SYSTEM_HAS_SYSRESETFPU} +Procedure SysResetFPU;{$ifdef SYSTEMINLINE}inline;{$endif} +begin +end; + +{$define FPC_SYSTEM_HAS_SYSINITFPU} +Procedure SysInitFPU;{$ifdef SYSTEMINLINE}inline;{$endif} +begin +end; + +procedure fpc_cpuinit; +begin + { don't let libraries influence the FPU cw set by the host program } + if not IsLibrary then + SysInitFPU; +end; + + +{$IFNDEF INTERNAL_BACKTRACE} +{$define FPC_SYSTEM_HAS_GET_FRAME} +function get_frame:pointer;assembler;nostackframe; + asm + end; +{$ENDIF not INTERNAL_BACKTRACE} + + +{$define FPC_SYSTEM_HAS_GET_CALLER_ADDR} +function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;assembler;nostackframe; + asm + end; + + +{$define FPC_SYSTEM_HAS_GET_CALLER_FRAME} +function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;assembler;nostackframe; + asm + end; + + +{$define FPC_SYSTEM_HAS_SPTR} +Function Sptr : pointer;assembler;nostackframe; + asm + end; + + +function InterLockedDecrement (var Target: longint) : longint; + var + temp_sreg : byte; + begin + Result:=Target-1; + Target:=Result; + end; + + +function InterLockedIncrement (var Target: longint) : longint; + var + temp_sreg : byte; + begin + Result:=Target+1; + Target:=Result; + end; + + +function InterLockedExchange (var Target: longint;Source : longint) : longint; + var + temp_sreg : byte; + begin + Result:=Target; + Target:=Source; + end; + + +function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; + var + temp_sreg : byte; + begin + Result:=Target; + if Result=Comperand then + Target:=NewValue; + end; + + +function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; + var + temp_sreg : byte; + begin + Result:=Target; + Target:=Result+Source; + end; + + +function InterLockedDecrement (var Target: smallint) : smallint; + var + temp_sreg : byte; + begin + Result:=Target-1; + Target:=Result; + end; + + +function InterLockedIncrement (var Target: smallint) : smallint; + var + temp_sreg : byte; + begin + Result:=Target+1; + Target:=Result; + end; + + +function InterLockedExchange (var Target: smallint;Source : smallint) : smallint; + var + temp_sreg : byte; + begin + Result:=Target; + Target:=Source; + end; + + +function InterlockedCompareExchange(var Target: smallint; NewValue: smallint; Comperand: smallint): smallint; + var + temp_sreg : byte; + begin + Result:=Target; + if Result=Comperand then + Target:=NewValue; + end; + + +function InterLockedExchangeAdd (var Target: smallint;Source : smallint) : smallint; + var + temp_sreg : byte; + begin + Result:=Target; + Target:=Result+Source; + end; + +