Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed DmTftLibrary
src/escapetime.s@2:e8d2bde86ff9, 2018-12-07 (annotated)
- Committer:
- ofrasier
- Date:
- Fri Dec 07 00:39:38 2018 +0000
- Revision:
- 2:e8d2bde86ff9
- Parent:
- 1:a1d80c69e1f0
- Child:
- 3:835c035b8b1c
Simplified bit shift
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| ofrasier | 1:a1d80c69e1f0 | 1 | AREA drawASM, CODE, READONLY | 
| ofrasier | 1:a1d80c69e1f0 | 2 | EXPORT escapeTime | 
| ofrasier | 1:a1d80c69e1f0 | 3 | |
| ofrasier | 1:a1d80c69e1f0 | 4 | ; ASM subroutine of escape time algorithm | 
| ofrasier | 1:a1d80c69e1f0 | 5 | ; R0 contains cx | 
| ofrasier | 1:a1d80c69e1f0 | 6 | ; R1 contains cy | 
| ofrasier | 1:a1d80c69e1f0 | 7 | ; R2 contains maxiters | 
| ofrasier | 1:a1d80c69e1f0 | 8 | ; R3 contains counter | 
| ofrasier | 1:a1d80c69e1f0 | 9 | ; R4 contains zx | 
| ofrasier | 1:a1d80c69e1f0 | 10 | ; R5 contains zy | 
| ofrasier | 1:a1d80c69e1f0 | 11 | ; R6 contains 4 << 24 = 67108864 escape CMP | 
| ofrasier | 1:a1d80c69e1f0 | 12 | ; R7 Lo | 
| ofrasier | 1:a1d80c69e1f0 | 13 | ; R8 Hi registers for SMULL for zx^2 | 
| ofrasier | 1:a1d80c69e1f0 | 14 | ; R9 Lo | 
| ofrasier | 1:a1d80c69e1f0 | 15 | ; R10 Hi registers for SMULL for zy^2 | 
| ofrasier | 1:a1d80c69e1f0 | 16 | ; R11 Lo | 
| ofrasier | 1:a1d80c69e1f0 | 17 | ; R12 Hi are scratch registers | 
| ofrasier | 1:a1d80c69e1f0 | 18 | escapeTime | 
| ofrasier | 1:a1d80c69e1f0 | 19 | PUSH {R4, R5, R6, R7, R8, R9, R10, R11, R12} | 
| ofrasier | 1:a1d80c69e1f0 | 20 | MOV R3, #0 | 
| ofrasier | 1:a1d80c69e1f0 | 21 | MOV R4, R0 | 
| ofrasier | 1:a1d80c69e1f0 | 22 | MOV R5, R1 | 
| ofrasier | 1:a1d80c69e1f0 | 23 | MOV R6, #67108864 | 
| ofrasier | 1:a1d80c69e1f0 | 24 | iterate_loop_start | 
| ofrasier | 1:a1d80c69e1f0 | 25 | CMP R3, R2 ; Exit loop if counter >= maxiters | 
| ofrasier | 1:a1d80c69e1f0 | 26 | BGE iterate_loop_end | 
| ofrasier | 1:a1d80c69e1f0 | 27 | SMULL R7, R8, R4, R4 ; Compute zx^2 and zy^2 | 
| ofrasier | 1:a1d80c69e1f0 | 28 | SMULL R9, R10, R5, R5 ; R7:R8 = zx^2 R9:R10 = zy^2 | 
| ofrasier | 1:a1d80c69e1f0 | 29 | ADD R12, R8, R10 ; Only check zx^2 + zy^2 < 4 with high-order | 
| ofrasier | 1:a1d80c69e1f0 | 30 | CMP R12, R6 ; bits. Okay to ignore low order sum and carry | 
| ofrasier | 1:a1d80c69e1f0 | 31 | BGE iterate_loop_end ; Escape condition | 
| ofrasier | 1:a1d80c69e1f0 | 32 | SMULL R11, R12, R4, R5 ; Compute zy = 2*zx*zy + cy | 
| ofrasier | 2:e8d2bde86ff9 | 33 | ASR R11, #28 ; Perform right shift by 28 places on R11:R12 | 
| ofrasier | 2:e8d2bde86ff9 | 34 | BFI R11, R12, #4, #28 | 
| ofrasier | 2:e8d2bde86ff9 | 35 | LSL R11, #1 ; Multiply by 2 | 
| ofrasier | 2:e8d2bde86ff9 | 36 | ADD R5, R11, R1 ; Add cy and store in R5 | 
| ofrasier | 1:a1d80c69e1f0 | 37 | SUBS R11, R7, R9 ; Compute zx = zx^2 - zy^2 + cx | 
| ofrasier | 2:e8d2bde86ff9 | 38 | SBC R12, R8, R10 | 
| ofrasier | 2:e8d2bde86ff9 | 39 | ASR R11, #28 ; Perform right shift by 28 places on R11:R12 | 
| ofrasier | 2:e8d2bde86ff9 | 40 | BFI R11, R12, #4, #28 | 
| ofrasier | 2:e8d2bde86ff9 | 41 | ADD R4, R11, R0 ; Add cx and store in R4 | 
| ofrasier | 1:a1d80c69e1f0 | 42 | ADD R3, #1 ; Increment counter and loop | 
| ofrasier | 1:a1d80c69e1f0 | 43 | B iterate_loop_start | 
| ofrasier | 1:a1d80c69e1f0 | 44 | iterate_loop_end | 
| ofrasier | 1:a1d80c69e1f0 | 45 | ; Move counter to R0 as the ret value | 
| ofrasier | 1:a1d80c69e1f0 | 46 | MOV R0, R3 | 
| ofrasier | 1:a1d80c69e1f0 | 47 | POP {R4, R5, R6, R7, R8, R9, R10, R11, R12} | 
| ofrasier | 1:a1d80c69e1f0 | 48 | BX LR | 
| ofrasier | 1:a1d80c69e1f0 | 49 | END |