pdftitle={SDCC Compiler User Guide},
pdfauthor={SDCC development team},
pdfsubject={installation, user manual},
- pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog},
+ pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog},
pdfpagemode=UseOutlines,
colorlinks=true,
linkcolor=blue] {hyperref}
\size normal
-SDCC 2.6.2
+SDCC 2.6.4
\size footnotesize
\newline
}
\newline
-\family default
-
\layout Itemize
...
\newline
-\family default
-
\layout Standard
The pragma's are intended to be used to turn-on or off certain optimizations
\end_inset
- sets the lowest address of the argument passing stack (defaults to a
- suitably large shared databank to reduce BANKSEL overhead)
+ sets the lowest address of the argument passing stack (defaults to a suitably
+ large shared databank to reduce BANKSEL overhead)
\layout List
\labelwidthstring 00.00.0000
whenever possible, especially loop control variables (induction).
\layout Itemize
-Since the compiler does not always do implicit integral promotion, the programme
-r should do an explicit cast when integral promotion is required.
-\layout Itemize
-
-Reducing the size of division, multiplication & modulus operations can reduce
- code size substantially.
- Take the following code for example.
-\begin_deeper
-\layout Verse
-
-
-\family typewriter
-foobar(unsigned int p1, unsigned char ch)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-unsigned char ch1 = p1 % ch ;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-....
-\newline
-}
-\layout Standard
-
-For the modulus operation the variable ch will be promoted to unsigned int
- first then the modulus operation will be performed (this will lead to a
- call to support routine _moduint()), and the result will be casted to a
- char.
- If the code is changed to
-\layout Verse
-
-
-\family typewriter
-foobar(unsigned int p1, unsigned char ch)
-\newline
-{
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-unsigned char ch1 = (unsigned char)p1 % ch ;
-\newline
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-....
-\newline
-}
-\layout Standard
-
-It would substantially reduce the code generated (future versions of the
- compiler will be smart enough to detect such optimization opportunities).
-\end_deeper
-\layout Itemize
-
Have a look at the assembly listing to get a
\begin_inset Quotes sld
\end_inset
\layout Standard
+
+\series bold
Name
\end_inset
</cell>
\layout Standard
+
+\series bold
Purpose
\end_inset
</cell>
\layout Standard
+
+\series bold
Directory
\end_inset
</cell>
\begin_inset Tabular
<lyxtabular version="3" rows="10" columns="2">
<features>
-<column alignment="left" valignment="top" leftline="true" width="0">
-<column alignment="left" valignment="top" leftline="true" rightline="true" width="0pt">
-<row topline="true" bottomline="true">
+<column alignment="block" valignment="top" leftline="true" width="40col%">
+<column alignment="block" valignment="top" leftline="true" rightline="true" width="60col%">
+<row topline="true" bottomline="true" endhead="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\begin_inset Text
\layout Standard
+
+\series bold
Subject / Title
\end_inset
</cell>
\layout Standard
-Where to get / filename
+
+\series bold
+Filename / Where to get
\end_inset
</cell>
</row>
\layout Standard
You're reading it right now
+\emph on
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/sdccman.pdf}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\layout Standard
sdcc/Changelog
+\emph on
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/ChangeLog}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\end_inset
- Assemblers and ASLINK
+ Assemblers and
+\newline
+ASLINK
\begin_inset LatexCommand \index{aslink}
\end_inset
\layout Standard
-sdcc/as/doc/asxhtm.html
+sdcc/as/doc/asxhtm.html
+\emph on
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\layout Standard
-sdcc/doc/test_suite_spec.pdf
+sdcc/doc/test_suite_spec.pdf
+\emph on
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\layout Standard
-sdcc/doc/*
+sdcc/doc/*
+\emph on
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/doc/}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\layout Standard
-sdcc/debugger/README
+sdcc/debugger/README
+\emph on
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at
+\emph default
+:
+\newline
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/debugger/README}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\bar default
\noun default
\color default
-/index.html
+/index.html
+\emph on
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/sim/ucsim/doc/index.html}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\layout Standard
-sdcc/src/pic16/NOTES
+sdcc/src/pic16/NOTES
+\emph on
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\newline
+
+\emph default
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/src/pic16/NOTES}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\noun default
\color default
f
+\emph on
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill
+online at:
+\emph default
+
+\newline
+
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/cdbfileformat.pdf}
+
+\end_inset
+
+
\end_inset
</cell>
</row>
\layout Standard
+
+\series bold
Name
\end_inset
</cell>
\layout Standard
+
+\series bold
Purpose
\end_inset
</cell>
\layout Standard
+
+\series bold
Where to get
\end_inset
</cell>
<lyxtabular version="3" rows="7" columns="3">
<features>
<column alignment="left" valignment="top" leftline="true" width="0pt">
-<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="left" valignment="top" leftline="true" width="0">
<column alignment="left" valignment="top" leftline="true" rightline="true" width="0pt">
<row topline="true" bottomline="true">
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
\layout Standard
+
+\series bold
Name
\end_inset
</cell>
\layout Standard
+
+\series bold
Subject / Title
\end_inset
</cell>
\layout Standard
+
+\series bold
Where to get
\end_inset
</cell>
\layout Standard
+\series bold
\size footnotesize
Vendor
\end_inset
\layout Standard
+\series bold
\size footnotesize
Subject / Title
\end_inset
\layout Standard
+\series bold
\size footnotesize
Where to get
\end_inset
--- /dev/null
+/** various ways to swap nibbles/bytes/words
+*/
+#include <testfwk.h>
+
+#define TEST_VECT_8 0x12
+#define TEST_VECT_16 0x1234
+#define TEST_VECT_32 0x12345678
+
+#define SWAP_4(x) ((unsigned char)((x)<<4)|(unsigned char)((x)>>4))
+
+typedef union {unsigned int i; unsigned char c[2];} WORD;
+typedef union {unsigned long l; unsigned char c[4];} LONG;
+
+static void testSwap_4(void)
+{
+ volatile unsigned char t=TEST_VECT_8;
+ unsigned char tt;
+
+ tt = t;
+ tt = SWAP_4(tt);
+ ASSERT( tt == SWAP_4(TEST_VECT_8));
+}
+
+
+#define SWAP_8(x) (((x)<<8)|((x)>>8))
+
+static void testSwap_8(void)
+{
+ volatile unsigned int t=TEST_VECT_16;
+ unsigned int tt;
+ WORD x;
+
+ tt = t;
+ tt = SWAP_8(tt);
+ ASSERT( tt == SWAP_8(TEST_VECT_16));
+
+ x.i = t;
+ x.i = SWAP_8(x.i);
+ ASSERT( x.i == SWAP_8(TEST_VECT_16));
+
+#if defined (SDCC_mcs51)
+ /* this was filed as bug #1638622 (rejected) */
+ x.i = t;
+ x.i = x.c[1] + 256*x.c[0];
+ ASSERT( x.i == SWAP_8(TEST_VECT_16));
+
+ /* and with OR instead of ADD */
+ x.i = t;
+ x.i = x.c[1] | 256*x.c[0];
+ ASSERT( x.i == SWAP_8(TEST_VECT_16));
+
+ /* swapping union with little register pressure */
+ {
+ unsigned char tmp;
+ x.i = t;
+
+ tmp = x.c[0];
+ x.c[0]=x.c[1];
+ x.c[1]=tmp;
+
+ ASSERT( x.i == SWAP_8(TEST_VECT_16));
+ }
+#endif
+}
+
+
+#define SWAP_16(x) (((x)<<16) | ((x)>>16))
+#define SWAP_16_2(x) ((unsigned int)((SWAP_8((unsigned int)x))<<16) | (SWAP_8(x)>>16))
+
+static void testSwap_16(void)
+{
+ volatile unsigned long t=TEST_VECT_32;
+ unsigned long tt;
+ LONG x;
+
+ tt = t;
+ tt = SWAP_16(tt);
+ ASSERT( tt == SWAP_16(TEST_VECT_32));
+
+ tt = t;
+ tt = SWAP_16_2(tt);
+ ASSERT( tt == SWAP_16_2(TEST_VECT_32));
+
+ /* swapping union with little register pressure */
+ {
+ unsigned char c;
+ x.l = t;
+
+ c = x.c[0];
+ x.c[0]=x.c[2];
+ x.c[2]=c;
+ c = x.c[1];
+ x.c[1]=x.c[3];
+ x.c[3]=c;
+
+ ASSERT( x.l == SWAP_16(TEST_VECT_32));
+ }
+}
+
+/* now for something ugly */
+static void testSwap_16_ptr(void)
+{
+#if defined (SDCC)
+#include <sdcc-lib.h> /* just to get _AUTOMEM or _STATMEM */
+#if defined (SDCC_STACK_AUTO)
+#define MY_STATIC static
+#else
+#define MY_STATIC
+#endif
+ MY_STATIC unsigned long _STATMEM tt=TEST_VECT_32;
+
+ /* swapping with little register pressure */
+ {
+ unsigned char c;
+
+ /* uglyness += 1 */
+ c = *(0+(unsigned char _STATMEM *)&tt);
+ *(0+(unsigned char _STATMEM *)&tt) = *(2+(unsigned char _STATMEM *)&tt);
+ *(2+(unsigned char _STATMEM *)&tt) = c;
+ c = *(1+(unsigned char _STATMEM *)&tt);
+ *(1+(unsigned char _STATMEM *)&tt) = *(3+(unsigned char _STATMEM *)&tt);
+ *(3+(unsigned char _STATMEM *)&tt) = c;
+ /* uglyness -= 1 */
+ }
+ ASSERT( tt == SWAP_16(TEST_VECT_32));
+#endif
+}
+
+
+static void
+testSwap(void)
+{
+ testSwap_4();
+ testSwap_8();
+ testSwap_16();
+ testSwap_16_ptr();
+}