| This chapter documents the Backend for the 68hc12 and 6809/6309 microcontroller families. |
| |
| @section Additional options for this version |
| |
| This backend provides the following additional options: |
| |
| @table @option |
| |
| @item -merge-constants |
| Place identical floating point constants at the same |
| memory location. This can reduce program size and increase |
| compilation time. (No fp support yet.) |
| |
| @item -const-in-data |
| By default constant data will be placed in a read-only |
| section. Using this option it will be placed in the |
| data section. |
| |
| @item -no-delayed-popping |
| By default arguments of function calls are not always popped |
| from the stack immediately after the call, so that the |
| arguments of several calls may be popped at once. |
| With this option vbcc can be forced to pop them after every |
| function call. |
| This may simplify debugging and very slightly reduce the |
| stack size needed by the compiled program. |
| |
| @item -no-peephole |
| Do not perform peephole-optimizations. |
| |
| @item -mem-cse |
| Try to hold values loaded from memory in registers and |
| reuse them. Due to the small register-set of the hc12 |
| this is disabled by default as it increases register- |
| pressure and tends to spill to the stack. |
| |
| @item -cpu=<n> |
| Specify the processor family. Currently supported values are: |
| @itemize |
| @item 6812: Generate code for the Motorola 68hc12 series (default). |
| |
| @item 6809: Generate code for the Motorola 6809 series. |
| |
| @item 6309: Generate code for the Hitachi 6309 series (currently identical to 6809). |
| @end itemize |
| |
| |
| @item -acc-glob |
| Make the accumulator available for global register allocation. |
| By default, the accumulator will only be used for register allocation |
| within basic blocks. In many cases, global allocation will result in |
| worse code, because the accumulator has to be pushed/popped many times. |
| |
| @item -pcrel |
| Generate PC-relative code. May not fully work with 68hc12. |
| |
| @item -drel |
| Generate code that accesses data relative to register @code{u}. Does not |
| work with 68hc12. |
| |
| @end table |
| |
| @section ABI |
| |
| The current version generates assembly output for use with vasm6809_std or the GNU |
| assembler using the non-banked model. |
| |
| This backend supports the following registers: |
| |
| @itemize @minus |
| @item @code{d} for the accumulator (also used for byte, i.e. @code{b}) |
| @item @code{x} for index register x |
| @item @code{y} for index register y |
| @item @code{u} for index register u (not on 68hc12) |
| @item @code{sp} for the stack-pointer |
| @end itemize |
| |
| The accumulator and @code{x} are caller-save. The @code{y} register is callee-save. |
| The @code{u} register is used as data-page pointer with @code{-drel}. |
| |
| The first function argument which has integer or pointer type up to 16 bits |
| is passed in the accumulator @code{d}. |
| The remaining arguments are passed on the stack. |
| |
| Integers and pointers are returned in @code{d} or @code{d/x} (@code{x} contains the higher bits). |
| All other types are returned by passing the function the address |
| of the result as a hidden argument - so when you call such a function |
| without a proper declaration in scope you can expect a crash. |
| |
| The elementary data types are represented like: |
| @example |
| type size in bits alignment in bytes |
| |
| char 8 1 |
| short 16 1 |
| int 16 1 |
| long 32 1 |
| near pointers 16 1 |
| far pointers 24 1 (not yet) |
| huge pointers 24 1 (not yet) |
| float 32 1 (not yet) |
| double 64 1 (not yet) |
| long double 64 1 (not yet) |
| @end example |
| |
| |
| @section Target-specific variable-attributes |
| |
| The 6809/hc12-backend offers the following variable attributes: |
| |
| @table @code |
| @item __interrupt |
| Return with @code{rti} rather than @code{rts}. |
| |
| @item __section("name","attr") |
| Place this function/object in section "section" |
| with attributes "attr". |
| |
| @item __dpage |
| Place the variable in section @code{.dpage} and use direct addressing. |
| |
| @end table |
| |
| @section Predefined Macros |
| |
| This backend defines the following macros: |
| |
| @table @code |
| @item __HC12__ |
| If code for 68hc12 is generated. |
| |
| @item __6809__ |
| If code for 6809 is generated. |
| |
| @item __6309__ |
| If code for 6309 is generated. |
| @ |
| @end table |
| |
| @section Stack |
| |
| If the @option{-stack-check} option is used, every function-prologue will |
| call the function @code{__stack_check} with the stacksize needed by this |
| function in register @code{y}. This function has to consider its own |
| stacksize and must restore all registers. |
| |
| |
| @section Stdarg |
| |
| Stdarg is supported by the provided include. |
| |
| @section Known Problems |
| |
| @itemize @minus |
| @item Support for floating point and long long is still missing. |
| @item U register is not really used yet. |
| @item No support for 6309 extensions yet. |
| @item Many optimizations still missing. |
| @item Some code generation bugs to be fixed. |
| |
| @end itemize |
| |
| |