Commit Graph

498 Commits (fe8d893a6b713edda0707b5b535270ebe0678b5f)

Author SHA1 Message Date
Alex Crichton 5a39eed988 Update compiler-rt submodule
Needed to pull in some recent changes with rust-lang/rust
2017-07-01 00:31:53 -07:00
bors b0300b16ed Auto merge of #164 - rust-lang-nursery:memclr, r=alexcrichton
optimize memset and memclr for ARM

This commit optimizes those routines by rewriting them in assembly and
performing the memory copying in 32-bit chunks, rather than in 8-bit chunks
as it was done before this commit. This assembly implementation is
compatible with the ARMv6 and ARMv7 architectures.

This change results in a reduction of runtime of about 40-70% in all cases
that matter (the compiler will never use these intrinsics for sizes smaller
than 4 bytes). See data below:

| Bytes | HEAD | this PR | diff       |
| ----- | ---- | ------- | ---------- |
| 0     | 6    | 14      | +133.3333% |
| 1     | 10   | 13      | +30%       |
| 2     | 14   | 13      | -7.1429%   |
| 3     | 18   | 13      | -27.77%    |
| 4     | 24   | 21      | -12.5%     |
| 16    | 70   | 36      | -48.5714%  |
| 64    | 263  | 97      | -63.1179%  |
| 256   | 1031 | 337     | -67.3133%  |
| 1024  | 4103 | 1297    | -68.389%   |

All times are in clock cycles. The measurements were done on a Cortex-M3
processor running at 8 MHz using the technique described [here].

[here]: http://blog.japaric.io/rtfm-overhead

---

For relevance all pure Rust programs for Cortex-M microcontrollers use memclr to
zero the .bss during startup so this change results in a quicker boot time.

Some questions / comments:

- ~~the original code (it had a bug) comes from this [repo] and it's licensed
  under the ICS license. I have preserved the copyright and license text in the
  source code. IANAL, is that OK?~~ no longer applies. The intrinsics are written in Rust now.

- ~~I don't know whether this ARM implementation works for ARMv4 or ARMv5.
  @FenrirWolf and @Uvekilledkenny may want to take look at it first.~~ no longer applies. The intrinsics are written in Rust now.

- ~~No idea whether this implementation works on processors that have no thumb
  instruction set. The current implementation uses 16-bit thumb instructions.~~ no longer applies. The intrinsics are written in Rust now.

- ~~The loop code can be rewritten in less instructions but using 32-bit thumb
  instructions. That 32-bit version would only work on ARMv7 though. I have yet
  to check whether that makes any difference in the runtime of the intrinsic.~~ no longer applies. The intrinsics are written in Rust now.

- ~~I'll look into memcpy4 next.~~ done

[repo]: https://github.com/bobbl/libaeabi-cortexm0
2017-07-01 07:27:55 +00:00
Jorge Aparicio b8a662040e no aeabi_mem* symbols on iOS, weak symbols on thumb, normal symbols elsewhere 2017-06-30 18:06:25 -05:00
Jorge Aparicio 75c6ccca71 optimize 32-bit aligned mem{cpy,clr,set} intrinsics for ARM
this reduces the execution time of all these routines by 40-70%
2017-06-29 22:40:58 -05:00
bors c311deeb76 Auto merge of #171 - rust-lang-nursery:gh150, r=japaric
enable tests now that #150 has been fixed

cc @parched
2017-06-28 03:49:35 +00:00
Jorge Aparicio f3350c5499 enable tests now that #150 has been fixed 2017-06-27 22:48:57 -05:00
bors 6024080570 Auto merge of #166 - alexcrichton:test-c, r=japaric
Test with the 'c' feature enabled on CI
2017-06-25 17:10:13 +00:00
Alex Crichton 0ebbcaede4 Enable the `intrinsics` program on thumb 2017-06-25 10:09:50 -07:00
Alex Crichton afe5c717a9 Address review comments 2017-06-24 21:51:34 -07:00
Alex Crichton c193113721 Don't test mangled names on thumb
We are both the "real compiler-rt" and the "to be tested one".
2017-06-24 12:54:35 -07:00
Alex Crichton 5c74fb13d9 Enable 128-bit integer tests on Windows
Closes #158
2017-06-24 12:23:28 -07:00
Alex Crichton acaa2f071a Don't check for references to panics with debug assertions 2017-06-24 11:44:50 -07:00
Alex Crichton 4859aba5f4 Don't build gcc_personality_v0 2017-06-24 11:36:05 -07:00
Alex Crichton d051480eff Don't generate unmangled aeabi with gen-tests
The symbols they delgate to also don't exist...
2017-06-24 11:34:10 -07:00
Alex Crichton 91b1291dc5 Don't try to work with `cargo test` 2017-06-24 10:22:49 -07:00
Alex Crichton 5d6d3fde6a Add a FIXME for Windows 2017-06-24 10:12:17 -07:00
Alex Crichton 734ec3d31c Tweak testing and such:
* Don't run `intrinsics` tests on thumb
* Disable `compiler_builtins` attribute on `feature = "gen-tests"`
* Disable mangling on `feature = "gen-tests"` instead of `cfg(test)`
2017-06-24 10:10:04 -07:00
Alex Crichton 76430488e6 Fix appveyor PATH 2017-06-23 21:38:55 -07:00
Alex Crichton 5e28b7e2b1 Try to fix run.sh on AppVeyor 2017-06-23 21:36:36 -07:00
Alex Crichton 2147753559 Remove usage of unwrap_or_else 2017-06-23 21:31:54 -07:00
Alex Crichton a2bdb4b379 Use the same CI script on AppVeyor 2017-06-23 21:23:52 -07:00
Alex Crichton 4dac0be751 Don't derive Debug for Sign 2017-06-23 21:11:31 -07:00
Alex Crichton b42d267065 Don't compile assembly on x86_64 Windows
They've all got the wrong ABI...
2017-06-23 21:09:24 -07:00
Alex Crichton 94bc9953a1 Don't build chkstk on x86_64 2017-06-23 20:43:51 -07:00
Alex Crichton d513c92b01 Try testing MinGW targets 2017-06-23 20:35:25 -07:00
Alex Crichton 635e519b86 Remove the travis cache 2017-06-23 20:20:42 -07:00
Alex Crichton eabb6fab4a Shore up docs in the macros module 2017-06-23 16:28:50 -07:00
Alex Crichton 7de57cd4f9 Handle aeabi aliasing
Objects in compiler-rt may have two symbols, so this makes sure that we don't
bring in those objects by accident by defining the aliases ourselves.
2017-06-23 15:55:11 -07:00
Alex Crichton a839d53a02 Deal with floatdidf on x86_64
Apparently LLVM will lower this down to just an instruction
2017-06-23 13:28:24 -07:00
Alex Crichton 5172f8c218 Tweak usage of C shims on MSVC 2017-06-23 12:03:33 -07:00
Alex Crichton a16ebb0dcb Use `nm` to weed out panics 2017-06-23 11:52:22 -07:00
Alex Crichton 5a444d58f2 Remove unused rust file 2017-06-23 11:21:36 -07:00
Alex Crichton 7c4745061a Remove executable bit on arm.rs 2017-06-23 11:21:15 -07:00
Alex Crichton ac3715de0f Remove defined intrinsics from build.rs
No need to load these from C!
2017-06-23 11:14:50 -07:00
Alex Crichton 83d63eaa9b Convert float intrinsics to the `intrinsics!` macro 2017-06-23 11:05:25 -07:00
Alex Crichton 93fed264c1 Remove executable bit from conv.rs 2017-06-23 10:44:59 -07:00
Alex Crichton 560018cc83 Less verbose output on symbol check 2017-06-23 10:44:29 -07:00
Alex Crichton 696b821bb7 Enable `mem` for intrinsics on linux 2017-06-23 09:59:49 -07:00
Alex Crichton 0be8b20cb7 Fix features needed for the intrinsics example 2017-06-23 08:35:24 -07:00
Alex Crichton 4540bd4314 Fix travis intrinsics builds 2017-06-23 08:19:11 -07:00
Alex Crichton 4c41b5649f Fix use_c_shim_if 2017-06-23 07:54:31 -07:00
Alex Crichton 47ff81325c Use more intrinsics on msvc 2017-06-23 07:53:34 -07:00
Alex Crichton 8abb0ab826 Build tweaks 2017-06-23 07:36:08 -07:00
Alex Crichton f0e58591b3 Build the intrinsics example separately 2017-06-23 07:01:18 -07:00
Alex Crichton 1b78d79bf5 Require the `compiler-builtins` target for the example 2017-06-23 06:58:05 -07:00
Alex Crichton 215fa06fb6 More windows linkage guesses 2017-06-23 06:53:09 -07:00
Alex Crichton 7f90c48a7a Test 64-bit linux 2017-06-22 23:44:27 -07:00
Alex Crichton a4120adc69 Try to fix linkage on windows 2017-06-22 23:41:28 -07:00
Alex Crichton 12a0038250 Fix the abi hack on windows 2017-06-22 23:36:50 -07:00
Alex Crichton d17042106f Port udiv to the `intrinsics!` macro 2017-06-22 23:23:36 -07:00