Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
This repository contains my work on a new ARM backend for the OCaml native code compiler, currently based on the 3.12.1 release. Compared to the old ARM backend, this one does the following:
- Support for both software and hardware floating-point using VFPv3-D16 or VFPv3(-D32).
- Properly supports interworking with Thumb/Thumb-2 code for both OCaml and C code.
- Supports dynamic linking and large memory models.
- Optional support for position-independent code via a command line option
-fPIC. This is disabled by default and not required for natdynlink.
- Can emit both ARM and Thumb-2 code, with avg. code size savings of 27% for Thumb-2 (quite close the optimal 30% advertised by ARM Ltd.).
- Supports both AAPCS (
armel) as well as extended VFP calling conventions (
- Supports several special ARM instructions to reduce code size and latency.
- Uses standard ARM EABI runtime functions instead of relying on GCC internals.
- Supports exception backtraces.
- Supports profiling using gprof.
Reported upstream as PR#5433.
You can specify the architecture when compiling with
ocamlopt using the
-farch command line option. Currently we support the following ARM architectures:
armv4for ARMv4 / ARMv4T / StrongARM (not supported for armhf)
armv5(not supported for armhf)
armv5te(not supported for armhf)
armv6(not supported for armhf)
armv6t2(not supported for armhf)
You can specify the floating-point unit when compiling with
ocamlopt using the
-ffpu command line option. Currently we support the following FPUs:
softfor software floating-point emulation (currently the only option for armel)
vfpv3-d16for VFPv3-D16 (armhf only)
vfpv3for VFPv3(-D32) (armhf only)
Performance / Code size savings
The new OCaml ARM backend (on armhf) is up to 4x faster in floating-point benchmarks compared to the 3.12.1 ARM backend (on armel), and code size is decreased by up to 28%. See the ocaml-arm 3.12.1+20111218 Benchmark for details.