diff options
author | oharboe <oharboe> | 2008-01-02 21:52:27 +0000 |
---|---|---|
committer | oharboe <oharboe> | 2008-01-02 21:52:27 +0000 |
commit | f2b214b0dff95d6bb79cbb5b6ff5ba9d90f655c9 (patch) | |
tree | 2f53ff8c86e2708f838d26e3edede86c111b309e /zpu/roadshow/roadshow/codesize | |
download | zpu-f2b214b0dff95d6bb79cbb5b6ff5ba9d90f655c9.zip zpu-f2b214b0dff95d6bb79cbb5b6ff5ba9d90f655c9.tar.gz |
Initial import from www.ecosforge.net
Diffstat (limited to 'zpu/roadshow/roadshow/codesize')
-rw-r--r-- | zpu/roadshow/roadshow/codesize/.cvsignore | 1 | ||||
-rw-r--r-- | zpu/roadshow/roadshow/codesize/crt0_phi.S | 178 | ||||
-rw-r--r-- | zpu/roadshow/roadshow/codesize/hello.c | 9 | ||||
-rw-r--r-- | zpu/roadshow/roadshow/codesize/index.html | 58 | ||||
-rw-r--r-- | zpu/roadshow/roadshow/codesize/small.c | 9 | ||||
-rw-r--r-- | zpu/roadshow/roadshow/codesize/small.elf | bin | 0 -> 1577 bytes | |||
-rw-r--r-- | zpu/roadshow/roadshow/codesize/smallstd.c | 9 |
7 files changed, 264 insertions, 0 deletions
diff --git a/zpu/roadshow/roadshow/codesize/.cvsignore b/zpu/roadshow/roadshow/codesize/.cvsignore new file mode 100644 index 0000000..6559932 --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/.cvsignore @@ -0,0 +1 @@ +smallstd.elf diff --git a/zpu/roadshow/roadshow/codesize/crt0_phi.S b/zpu/roadshow/roadshow/codesize/crt0_phi.S new file mode 100644 index 0000000..4d654e2 --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/crt0_phi.S @@ -0,0 +1,178 @@ +/* Startup code for ZPU + Copyright (C) 2005 Free Software Foundation, Inc. + +This file is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file with other programs, and to distribute +those programs without any restriction coming from the use of this +file. (The General Public License restrictions do apply in other +respects; for example, they cover modification of the file, and +distribution when not linked into another program.) + +This file 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. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + .file "crt0.S" + + + + +; .section ".fixed_vectors","ax" +; KLUDGE!!! we remove the executable bit to avoid relaxation + .section ".fixed_vectors","a" + +; DANGER!!!! +; we need to align these code sections to 32 bytes, which +; means we must not use any assembler instructions that are relaxed +; at linker time +; DANGER!!!! + + .macro fixedim value + im \value + .endm + + .macro jsr address + + im 0 ; save R0 + load + im 4 ; save R1 + load + im 8 ; save R2 + load + + fixedim \address + call + + im 8 + store ; restore R2 + im 4 + store ; restore R1 + im 0 + store ; restore R0 + .endm + + + .macro jmp address + fixedim \address + poppc + .endm + + + .macro fast_neg + not + im 1 + add + .endm + + .macro cimpl funcname + ; save R0 + im 0 + load + + ; save R1 + im 4 + load + + ; save R2 + im 8 + load + + loadsp 20 + loadsp 20 + + fixedim \funcname + call + + ; destroy arguments on stack + storesp 0 + storesp 0 + + im 0 + load + + ; poke the result into the right slot + storesp 24 + + ; restore R2 + im 8 + store + + ; restore R1 + im 4 + store + + ; restore r0 + im 0 + store + + + storesp 4 + poppc + .endm + + .macro mult1bit + ; create mask of lowest bit in A + loadsp 8 ; A + im 1 + and + im -1 + add + not + loadsp 8 ; B + and + add ; accumulate in C + + ; shift B left 1 bit + loadsp 4 ; B + addsp 0 + storesp 8 ; B + + ; shift A right 1 bit + loadsp 8 ; A + flip + addsp 0 + flip + storesp 12 ; A + .endm + + + +/* vectors */ + .balign 32,0 +# offset 0x0000 0000 + .globl _start +_start: + ; intSp must be 0 when we jump to _premain + + im ZPU_ID + loadsp 0 + im _cpu_config + store + config + jmp _premain + + + +/* instruction emulation code */ + + .data + + + .globl _hardware +_hardware: + .long 0 + .globl _cpu_config +_cpu_config: + .long 0 + diff --git a/zpu/roadshow/roadshow/codesize/hello.c b/zpu/roadshow/roadshow/codesize/hello.c new file mode 100644 index 0000000..176275c --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/hello.c @@ -0,0 +1,9 @@ +/* Simple hello world */
+#include <stdio.h>
+
+
+int main(int argc, char **argv)
+{
+ puts("Hello world\n");
+}
+
diff --git a/zpu/roadshow/roadshow/codesize/index.html b/zpu/roadshow/roadshow/codesize/index.html new file mode 100644 index 0000000..3f61b4e --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/index.html @@ -0,0 +1,58 @@ +<html> +<body> +<h1>Compiling hello world program with the ZPU GCC toolchain</h1> +The ZPU comes with a standard GCC toolchain and an instruction set simulator. This allows compiling, running & debugging simple test programs. The Simulator has +some very basic peripherals defined: counter, timer interrupt and a debug output port. +<h1>Installation</h1> +<ol> +<li>Install Cygwin. http://www.cygwin.com +<li>Start Cygwin bash +<li>unzip zputoolchain.zip +<li>Add install/bin from zputoolchain.zip to PATH.<br> +export PATH=$PATH:<unzipdir>/install/bin +</ol> +<h1>Hello world example</h1> +The ZPU toolchain comes with newlib & libstdc++ support which means that many C/C++ programs can be compiled without modification. +<p> +<code> +zpu-elf-gcc -Os -zeta hello.c -o hello.elf -Wl,--relax -Wl,--gc-sections<br> +zpu-elf-size hello.elf<br> +</code> +<h1>Optimizing for size</h1> +The ZPU toolchain produces highly compact code. +<ol> +<li>Since the ZPU GCC toolchain supports standard ANSI C, it is easy to stumble across +functionality that takes up a lot of space. E.g. the standard printf() function is a beast. Some compilers drop e.g. floating point support +from the printf() function and thus boast a "smaller" printf() when in fact they have a non-standard printf(). newlib has a standard printf() function +and an alternative iprintf() function that works only on integers. +<li>The ZPU ships with default startup code that works across various configurations of the ZPU, so be warned that there is some overhead that will +not occurr in the final application(anywhere between 1-4kBytes). +<li>Compilation and linker options matter. The ZPU benefits greatly from the "-Wl,--relax -Wl,--gc-sections" options which is not used by +all architectures(e.g. GCC ARM does not implement/need -Wl,--relax). +</ol> +<h2>Small code example</h2> +<code> +zpu-elf-gcc -Os -abel smallstd.c -o smallstd.elf -Wl,--relax -Wl,--gc-sections<br> +zpu-elf-size small.elf<br> +<br> +$ zpu-elf-size small.elf<br> + text data bss dec hex filename<br> + 2845 952 36 3833 ef9 small.elf<br> +<br> +</code> + +<h2>Even smaller code example</h2> +If the ZPU implements the optional instructions, the RAM overhead can be reduced significantly. +<p> +<code> +zpu-elf-gcc -Os -abel crt0_phi.S small.c -o small.elf -Wl,--relax -Wl,--gc-sections -nostdlib <br> +zpu-elf-size small.elf<br> +<br> +$ zpu-elf-size small.elf<br> + text data bss dec hex filename<br> + 56 8 0 64 40 small.elf<br> + <br> +</code> + +</body> +</html> diff --git a/zpu/roadshow/roadshow/codesize/small.c b/zpu/roadshow/roadshow/codesize/small.c new file mode 100644 index 0000000..0317343 --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/small.c @@ -0,0 +1,9 @@ +void _premain(void) +{ + volatile int *someRegister=(volatile int *)0; + volatile int *otherRegister=(volatile int *)4; + while (*someRegister!=0) + { + *otherRegister++; + } +} diff --git a/zpu/roadshow/roadshow/codesize/small.elf b/zpu/roadshow/roadshow/codesize/small.elf Binary files differnew file mode 100644 index 0000000..4193a53 --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/small.elf diff --git a/zpu/roadshow/roadshow/codesize/smallstd.c b/zpu/roadshow/roadshow/codesize/smallstd.c new file mode 100644 index 0000000..5d4b87a --- /dev/null +++ b/zpu/roadshow/roadshow/codesize/smallstd.c @@ -0,0 +1,9 @@ +int main(int argc, char **argv) +{ + volatile int *someRegister=(volatile int *)0; + volatile int *otherRegister=(volatile int *)4; + while (*someRegister!=0) + { + *otherRegister++; + } +} |