Home » Archimedes archive » Archimedes World » AW-1996-03-Disc 2.adf » !AcornAns_AcornAns » September/FastDiv/Generator/s/Generator
September/FastDiv/Generator/s/Generator
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1996-03-Disc 2.adf » !AcornAns_AcornAns |
Filename: | September/FastDiv/Generator/s/Generator |
Read OK: | ✔ |
File size: | 439A bytes |
Load address: | 0000 |
Exec address: | 0000 |
Duplicates
There is 1 duplicate copy of this file in the archive:
- Archimedes archive » Archimedes World » AW-1996-03-Disc 2.adf » !AcornAns_AcornAns » September/FastDiv/Generator/s/Generator
- Archimedes archive » Archimedes World » AW-1995-05-Disc1.adf » AWMay95_1 » InTheMag/AcornAns/Generator/s/Generator
File contents
; ; Name: Generator. ; ; Author: ; Michael Rozdoba, from an algorithm originally based on the work of Samuel K.R. Smith, Michael ; Rozdoba & A F Reysenbach. ; ; Function: ; Compile code to carry out rapid assembler divison by an arbitrary constant. ; ; Arguments: ; r0 divisor constant ; r1 ptr to buffer for code (passing 0 indicates no code to be compiled - allows routine to be called to ; calculate size of buffer required) ; r2 number of numerator register for routine to be compiled ; r3 number of output quotient register ; r4 number of output remainder register ; r5 number of a scratch register - the 'work' register - not needed if divisor is a valid immediate ; constant (nb if work supplied in any case, but not needed, it will be ignored - if caller knows it ; will not be needed, -1 may be passed) ; r6 number of a scratch register - the 'sign preservation' register (of numerator) - if numerator is ; known to always be positive may pass -1 to indicate this, which will save use of signpres register & ; will reduce compiled code size by 6 instructions typically (cf typical code size 20 to 27 ; instructions, when sign preservation is active, thence reduced to 14 to 21 instructions) ; ; NB All supplied register numbers (other than work & signpres when not needed & passed as -1) MUST be ; distinct. ; ; Returns: ; r0 size of compiled code in bytes ; a value of size<0 indicates an error occurred during compilation; code as follows: ; -1 generator called with 0 divisor ; -2 work reg needed but not supplied ; -3 invalid register number ; -4 register number clash (the registers must be distinct) ; -5 program error - internal recursion stack exhausted ; -6 program error - fastdivaid logic 3 ; ; Additional notes: ; Assumes a suitable external r13 stack exists. ; r0 RN 0 r1 RN 1 r2 RN 2 r3 RN 3 r4 RN 4 r5 RN 5 r6 RN 6 r7 RN 7 r8 RN 8 r9 RN 9 r10 RN 10 r11 RN 11 r12 RN 12 r13 RN 13 r14 RN 14 r15 RN 15 sp RN r13 lr RN r14 pc RN r15 const RN r0 cptr RN r1 num RN r2 outq RN r3 outr RN r4 work RN r5 signpres RN r6 t1 RN r12 fn RN r11 ;args/results to/from subrouts t2 RN r10 t3 RN r14 t4 RN r9 ps RN r8 pm RN r9 stk RN r7 stkl RN r8 m_v RN r7 m_i RN r8 m_m RN r9 m_r RN r10 m_mi RN r11 m_ml RN r12 m_li RN r14 CMP const, #0 MVNEQ r0, #0 ;ERROR: 0 divisor MOVEQS pc, lr STMFD sp!, {lr} MOV t1, #1 RSBMI const, const, #0 MOVMI t1, #-1 STR t1, nsignpres STR cptr, initial_cptr MOV fn, const BL powerof2 STR fn, power_of_2 MOV fn, const BL imop2 CMP fn, #-1 LDRNE t1, op1 ORRNE t1, t1, fn ;insert operand 2 ORRNE t1, t1, outr, LSL #12 ; destination reg ORRNE t1, t1, outr, LSL #16 ; operand 1 register STRNE t1, op2 ;note, opcode & condition will be added later (as need many) MOVEQ t1, work MOVNE t1, #-1 ;t1 = const valid ? -1 : work reg CMPEQ work, #-1 MOVEQ r0, #-2 LDMEQFD sp!, {pc}^ ;ERROR: work reg needed but not supplied MOV work, t1 ;either leave work alone, if needed, else reset to -1 CMP outq, #0 CMPGE outr, #0 CMPGE num, #0 CMPGE work, #-1 CMPGE signpres, #-1 MOVLT r0, #-3 LDMLTFD sp!, {pc}^ ;ERROR: invalid register number CMP outq, #14 CMPLE outr, #14 CMPLE num, #14 CMPLE work, #14 CMPLE signpres, #14 MOVGT r0, #-3 LDMGTFD sp!, {pc}^ ;ERROR: invalid register number CMP outq, outr CMPNE outq, num CMPNE outr, num MOVEQ r0, #-4 LDMEQFD sp!, {pc}^ ;ERROR: register clash CMP outq, signpres CMPNE outr, signpres CMPNE num, signpres BNE l1 CMP signpres, #-1 MOVNE r0, #-4 LDMNEFD sp!, {pc}^ ;ERROR: register clash l1 CMP outq, work CMPNE outr, work CMPNE num, work CMPNE signpres, work BNE l2 CMP work, #-1 MOVNE r0, #-4 LDMNEFD sp!, {pc}^ ;ERROR: register clash l2 CMP const, #1 BNE not_one CMP cptr, #0 MOVEQ r0, #8 LDMEQFD sp!, {pc}^ ;return size of code needed to divide by �1 LDR t1, op_mov_0 ORR t1, t1, outr, LSL #12 STR t1, [cptr], #4 ;mov outr, #0 LDR t2, nsignpres CMP t2, #1 LDREQ t1, op_mov_r0 LDRNE t1, op_rsb_0 ORR t1, t1, outq, LSL #12 ORREQ t1, t1, num ;mov outq, num - if const > 0 ORRNE t1, t1, num, LSL #16 ;rsb outq, num, #0 - if const < 0 STR t1, [cptr], #4 MOV r0, #8 LDMFD sp!, {pc}^ ;return after compiling code to divide by �1 not_one CMP signpres, #-1 BEQ not_signpres_1 CMP cptr, #0 ADDEQ cptr, cptr, #8 BEQ not_signpres_1 LDR t1, op_ands_sign ORR t1, t1, signpres, LSL #12 ORR t1, t1, num, LSL #16 STR t1, [cptr], #4 ;ands signpres, num, #&80000000 LDR t1, op_rsbne_0 ORR t1, t1, num, LSL #12 ORR t1, t1, num, LSL #16 STR t1, [cptr], #4 ;rsbne num, num, #0 not_signpres_1 LDR t1, power_of_2 MOV t2, #1 MOV t2, t2, LSL t1 CMP const, t2 BNE not_a_power_of_2 ;have division by a power of 2 LDR t2, initial_cptr CMP t2, #0 ADDEQ cptr, cptr, #8 BEQ now_restore_signs LDR t2, op_mov_r0 ORR t2, t2, outq, LSL #12 ORR t2, t2, num ;mov outq, num, lsl #0 ORR t2, t2, #2_01 << 5 ;changed to lsr #0 (which happens to mean lsr #32) ORR t2, t2, t1, LSL #7 STR t2, [cptr], #4 ;mov outq, num, lsr #power_of_2 (safe as power tween 1 & 31) LDR t2, op_sub_0_0 ORR t2, t2, outr, LSL #12 ORR t2, t2, num, LSL #16 ORR t2, t2, outq ORR t2, t2, t1, LSL #7 STR t2, [cptr], #4 ;sub outr, num, outq, LSL #power_of_2 B now_restore_signs not_a_power_of_2 MOV t1, #0 STR t1, subflag CMP work, #-1 BEQ not_work_1 ;now we have to do megamov work, #const - assuming const<>0 MOV m_v, const MOV m_r, #0 m_l1 TST m_v, #1 MOVEQ m_v, m_v, ROR #31 ADDEQ m_r, m_r, #1 BEQ m_l1 STMFD sp!, {m_r} ;to allow t2 (=m_r) to be used as scratch MOV m_i, #0 MOV m_m, #1 MOV m_ml, #0 m_l2 ADD m_i, m_i, #1 MOV m_m, m_m, LSL #1 TST m_v, m_m CMPNE m_i, #32 BNE m_l2 CMP m_i, #32 BGE m_l3 MOV m_li, m_i m_l4 ADD m_i, m_i, #1 MOV m_m, m_m, LSL #1 TST m_v, m_m BNE m_l5 CMP m_i, #32 BNE m_l4 m_l5 SUB t2, m_i, m_li CMP t2, m_ml MOVGT m_mi, m_li MOVGT m_ml, t2 CMP m_i, #32 BLT m_l2 m_l3 LDMFD sp!, {m_r} ;also note m_li now free so can resume use of t3 (=m_li) CMP m_ml, #0 ADDGT m_i, m_mi, m_ml MOVGT m_v, m_v, ROR m_i RSBGT m_i, m_i, #32 ADDGT m_r, m_r, m_i TST m_r, #1 MOVNE m_v, m_v, ROR #31 ADDNE m_r, m_r, #1 AND m_r, m_r, #31 AND m_i, m_v, #255 LDR t1, initial_cptr CMP t1, #0 ADDEQ cptr, cptr, #4 LDRNE t3, op_mov_0 ORRNE t3, t3, work, LSL #12 ORRNE t3, t3, m_r, LSL #8-1 ORRNE t3, t3, m_i STRNE t3, [cptr], #4 ;mov work, #m_i ror m_r m_l6 MOVS m_v, m_v, LSR #8 BEQ not_work_1 SUB m_r, m_r, #8 AND m_r, m_r, #31 ANDS m_i, m_v, #255 BEQ m_l6 CMP t1, #0 ADDEQ cptr, cptr, #4 LDRNE t3, op_orr_0 ORRNE t3, t3, work, LSL #12 ORRNE t3, t3, work, LSL #16 ORRNE t3, t3, m_r, LSL #8-1 ORRNE t3, t3, m_i STRNE t3, [cptr], #4 ;orr work, work, #m_i ror m_r B m_l6 not_work_1 LDR t2, power_of_2 STR t2, npower_of_2 MOV const, const, LSR t2 MOV t1, #1 MOV ps, #0 ;s% in Basic version MOV pm, #0 ;m% in Basic version calc_repeat CMP t1, const SUBGE t1, t1, const ADDGE ps, ps, #1 CMP t1, #0 BEQ repeat_calcd ADC t1, t1, t1 ;nb above CMP ensures C always set, so this is t1=2*t1+1 MOV ps, ps, LSL #1 ADD pm, pm, #1 CMP pm, #32 BLE calc_repeat repeat_calcd MOV fn, ps BL powerof2 SUB t2, t2, fn MOV ps, ps, LSR fn STR t2, power_of_2 CMP ps, #1 BEQ s_applied STR ps, as STR pm, am MOV fn, ps ADR stk, astk ADR stkl, astk_end LDR t1, op_add_0_0 ;calc intermediate instructions used by fastdivaid ORR t4, num, num, LSL #16 ORR t4, t4, outq, LSL #12 ;data processing args outq, num, num ORR t1, t1, t4 STR t1, op_fd1 ;add outq, num, num LDR t1, op_add_0_0_lsr ORR t4, t1, t4 STR t4, op_fd3 ;add outq, num, num, lsr #32 ORR t4, num, outq, LSL #16 ORR t4, t4, outq, LSL #12 ; args outq, outq, num ORR t1, t1, t4 STR t1, op_fd4 ;add outq, outq, num, lsr #32 LDR t1, op_sub_0_0_lsr ORR t1, t1, t4 STR t1, op_fd2 ;sub outq, outq, num, lsr #32 BL fastdivaid LDR ps, as LDR pm, am s_applied ;nb t2=power_of_2 may no longer be valid, but ps & pm are MOV fn, ps BL bitpatlen ;fn is now ls% ADD t1, pm, #1 LDR t2, initial_cptr CMP t2, #0 BNE do_extend CMP t1, #32 BGE bits_extended CMP ps, #1 MOVEQ ps, #0 pseudo_extend_bits_loop ADD cptr, cptr, #4 MOV t1, t1, LSL #1 CMP t1, #32 BLT pseudo_extend_bits_loop B bits_extended do_extend CMP t1, #32 BGE bits_extended LDR t3, op_add_0_0_lsr ORR t3, t3, outq, LSL #12 CMP ps, #1 MOVEQ ps, #0 ORREQ t2, num, num, LSL #16 ORRNE t2, outq, outq, LSL #16 ORR t2, t2, t1, LSL #7 ORR t2, t3, t2 ;if EQ 'add outq, num, num, lsr #t1%' STR t2, [cptr], #4 ;else 'add outq, outq, outq, lsr #t1%' MOV t1, t1, LSL #1 CMP t1, #32 BGE bits_extended ORR t2, outq, outq, LSL #16 ORR t3, t3, t2 extend_bits_loop ORR t2, t3, t1, LSL #7 STR t2, [cptr], #4 ;add outq, outq, outq, lsr #t1% MOV t1, t1, LSL #1 CMP t1, #32 BLT extend_bits_loop bits_extended LDR t1, initial_cptr CMP ps, #1 BNE large_div_patch_done CMP t1, #0 ADDEQ cptr, cptr, #4 LDRNE t2, op_mov_r0 ORRNE t2, t2, outq, LSL #12 ORRNE t2, t2, num STRNE t2, [cptr], #4 ;mov outq, num large_div_patch_done LDR t3, power_of_2 ADD t3, t3, pm SUB t3, t3, fn ADDS t3, t3, #2 BLE final_shift_done CMP t1, #0 ADDEQ cptr, cptr, #4 LDRNE t2, op_mov_r0_lsr ORRNE t2, t2, outq, LSL #12 ORRNE t2, t2, outq ORRNE t2, t2, t3, LSL #7 STRNE t2, [cptr], #4 ;mov outq, outq, lsr #power_of_2 final_shift_done MOV fn, const ADR stk, astk ADR stkl, astk_end ORR t1, outq, outq, LSL #16 ;calc intermediate instructions used by fastmul ORR t1, t1, outr, LSL #12 ORR t2, outr, outq, LSL #16 ORR t2, t2, outr, LSL #12 LDR t3, op_mov_r0 ORR t4, t3, t1 STR t4, op_fm1 ORR t4, t3, t2 STR t4, op_fm2 LDR t3, op_add_0_0 ORR t4, t3, t1 STR t4, op_fm3 ORR t4, t3, t2 STR t4, op_fm4 LDR t3, op_rsb_0_0 ORR t4, t3, t1 STR t4, op_fm5 ORR t4, t3, t2 STR t4, op_fm6 BL fastmul LDR t4, initial_cptr LDR t3, npower_of_2 MOV const, const, LSL t3 CMP t4, #0 ADDEQ cptr, cptr, #4 LDRNE t1, op_subs_0_0 ORRNE t1, t1, outr, LSL #12 ORRNE t1, t1, num, LSL #16 ORRNE t1, t1, outr ORRNE t1, t1, t3, LSL #7 STRNE t1, [cptr], #4 ;subs outr, num, outr, lsl #npower_of_2 (possibly 0) LDR t1, subflag BNE do_check CMP t1, #0 ADDEQ cptr, cptr, #12 ADDNE cptr, cptr, #20 B now_restore_signs do_check CMP work, #-1 BNE use_work CMP t1, #0 LDRNE t1, op_submi_0_n1 ORRNE t1, t1, outq, LSL #12 ORRNE t1, t1, outq, LSL #16 STRNE t1, [cptr], #4 ;submi outq, outq, #1 LDR t1, op2 ORRNE t2, t1, #2_0100<<28 ;cond mi ORRNE t2, t2, #2_0100<<21 ;opcode add STRNE t2, [cptr], #4 ;addmi outr, outr, #const ORR t2, t1, #2_1110<<28 ;cond al ORR t2, t2, #2_10101<<20 ;opcode cmps STR t2, [cptr], #4 ;cmp outr, #const LDR t2, op_addge_0_n1 ORR t2, t2, outq, LSL #12 ORR t2, t2, outq, LSL #16 STR t2, [cptr], #4 ;addge outq, outq, #1 ORR t2, t1, #2_1010<<28 ;cond ge ORR t2, t2, #2_0010<<21 ;opcode sub STR t2, [cptr], #4 ;subge outr, outr, #const B now_restore_signs use_work CMP t1, #0 LDRNE t1, op_submi_0_n1 ORRNE t1, t1, outq, LSL #12 ORRNE t1, t1, outq, LSL #16 STRNE t1, [cptr], #4 ;submi outq, outq, #1 LDRNE t1, op_addmi_0_0 ORRNE t1, t1, outr, LSL #12 ORRNE t1, t1, outr, LSL #16 ORRNE t1, t1, work STRNE t1, [cptr], #4 ;addmi outr, outr, work LDR t1, op_cmp_0_0 ORR t2, t1, outr, LSL #16 ORR t2, t2, work STR t2, [cptr], #4 ;cmp outr, work LDR t2, op_addge_0_n1 ORR t2, t2, outq, LSL #12 ORR t2, t2, outq, LSL #16 STR t2, [cptr], #4 ;addge outq, outq, #1 LDR t1, op_subge_0_0 ORR t1, t1, outr, LSL #12 ORR t1, t1, outr, LSL #16 ORR t1, t1, work STR t1, [cptr], #4 ;subge outr, outr, work now_restore_signs LDR t4, initial_cptr LDR t3, nsignpres CMP signpres, #-1 BNE signpresd CMP t3, #-1 BNE all_done CMP t4, #0 ADDEQ cptr, cptr, #4 LDRNE t1, op_rsb_0 ORRNE t1, t1, outq, LSL #12 ORRNE t1, t1, outq, LSL #16 STRNE t1, [cptr], #4 ;rsb outq, outq, #0 B all_done signpresd CMP t4, #0 ADDEQ cptr, cptr, #16 BEQ all_done LDR t1, op_teqs_sign ORR t1, t1, signpres, LSL #16 STR t1, [cptr], #4 ;teqs signpres, #&80000000 LDR t2, op_rsbeq_0 ORR t1, t2, num, LSL #12 ORR t1, t1, num, LSL #16 STR t1, [cptr], #4 ;rsbeq num, num, #0 ORR t1, t2, outr, LSL #12 ORR t1, t1, outr, LSL #16 STR t1, [cptr], #4 ;rsbeq outr, outr, #0 ORR t1, t2, outq, LSL #12 ORR t1, t1, outq, LSL #16 CMP t3, #-1 ORREQ t1, t1, #2_0001<<28 ;cond ne STR t1, [cptr], #4 ;if ne 'rsbeq outq, outq, #0', else flip cond to rsbne all_done LDR t1, initial_cptr SUB r0, cptr, t1 LDMFD sp!, {pc}^ initial_cptr DCD 0 nsignpres DCD 0 power_of_2 DCD 0 subflag DCD 0 npower_of_2 DCD 0 as DCD 0 am DCD 0 op1 ANDEQ r0, r0, #0,0 ;used to build op2; note AND, EQ etc chosen as give 0 bits op2 DCD 0 ;will store data processing instruction of form ;<cond><opcode> [outr],[outr],#[const] ;NB outr is r4, [outr] means the register whose number is ;stored in r4 when generator code executed - don't confuse ;this with register r4 itself. op_mov_0 MOV r0, #0,0 op_mov_r0 MOV r0, r0 op_rsb_0 RSB r0, r0, #0,0 op_ands_sign ANDS r0, r0, #&80000000 op_rsbne_0 RSBNE r0, r0, #0,0 op_sub_0_0 SUB r0, r0, r0 op_orr_0 ORR r0, r0, #0,0 op_add_0_0 ADD r0, r0, r0 op_sub_0_0_lsr SUB r0, r0, r0, LSR #32 ;nb LSR #32 represented in bit field by LSR #0 op_add_0_0_lsr ADD r0, r0, r0, LSR #32 op_mov_r0_lsr MOV r0, r0, LSR #32 op_rsb_0_0 RSB r0, r0, r0 op_subs_0_0 SUBS r0, r0, r0 op_submi_0_n1 SUBMI r0, r0, #1 op_addge_0_n1 ADDGE r0, r0, #1 op_addmi_0_0 ADDMI r0, r0, r0 op_cmp_0_0 CMP r0, r0 op_subge_0_0 SUBGE r0, r0, r0 op_teqs_sign TEQS r0, #&80000000 op_rsbeq_0 RSBEQ r0, r0, #0,0 op_fd1 DCD 0 op_fd2 DCD 0 op_fd3 DCD 0 op_fd4 DCD 0 op_fm1 DCD 0 op_fm2 DCD 0 op_fm3 DCD 0 op_fm4 DCD 0 op_fm5 DCD 0 op_fm6 DCD 0 astk % 16*8 ;16 entries of 2 words (an empty ascending stack) astk_end fastdivaid CMP stk, stkl MOVGE r0, #-5 LDMGEFD sp!, {pc}^ MOV t4, fn ;t4 holds local const% MOV t1, lr BL bitpatlen ;fn now holds Basic ls% SUB t3, fn, #1 STMEA stk!, {t3, t1} ;stack ls%-1 above return address ANDS t2, t4, #3 CMPNE t2, #2 MOVEQ r0, #-6 LDMEQFD sp!, {pc}^ CMP t2, #1 SUBEQ t4, t4, #1 ADDNE t4, t4, #1 MOVNE t1, #1 STRNE t1, subflag MOV fn, t4 BL powerof2 MOV t4, t4, LSR fn ;local const = const >>> powerof2(const) CMP t4, #1 BNE fda_constoverone LDR t1, initial_cptr CMP t1, #0 BNE fda_l1 CMP t2, #1 ;EQ implies divinst$="ADD" ADDEQ cptr, cptr, #4 ADDNE cptr, cptr, #8 B fda_exit fda_l1 LDR t3, [stk, #-4] ;get back ls%-1 CMP t2, #1 LDRNE t1, op_fd1 STRNE t1, [cptr], #4 ;add outq, num, num LDRNE t1, op_fd2 LDREQ t1, op_fd3 ORR t1, t1, t3, LSL #7 STR t1, [cptr], #4 ;if NE 'sub outq, outq, num, lsr #ls%-1' B fda_exit ;else 'add outq, num, num, lsr #ls%-1' fda_constoverone CMP t2, #1 BEQ fda_l2 ;const>1 & divinst$="SUB" MOV fn, t4 ;first recurse BL fastdivaid LDR t1, initial_cptr CMP t1, #0 ADDEQ cptr, cptr, #4 BEQ fda_exit LDR fn, [stk, #-4] LDR t1, op_fd2 ORR t1, t1, fn, LSL #7 STR t1, [cptr], #4 B fda_exit fda_l2 ;const>1 & divinst$="ADD" MOV fn, t4 ;first recurse BL fastdivaid LDR t1, initial_cptr CMP t1, #0 ADDEQ cptr, cptr, #4 BEQ fda_exit LDR fn, [stk, #-4] LDR t1, op_fd4 ORR t1, t1, fn, LSL #7 STR t1, [cptr], #4 fda_exit LDMEA stk!, {fn, t2} ;discard ls%-1 & return MOVS pc, t2 fastmul CMP stk, stkl MOVGE r0, #-5 LDMGEFD sp!, {pc}^ STMEA stk!, {lr} ANDS t1, fn, #3 ;fn holds local const CMPNE t1, #2 BNE fm_try_one MOV t4, fn BL powerof2 STMEA stk!, {fn} ;return address & n% (fn) stacked, local const in t4 MOV t4, t4, LSR fn CMP t4, #1 LDREQ t2, op_fm1 BEQ fm_exit MOV fn, t4 BL fastmul ;recurse LDR fn, [stk, #-4] LDR t2, op_fm2 B fm_exit fm_try_one CMP t1, #1 BNE fm_is_three SUB fn, fn, #1 MOV t4, fn BL powerof2 STMEA stk!, {fn} ;return address & n% (fn) stacked, local const in t4 MOV t4, t4, LSR fn CMP t4, #1 LDREQ t2, op_fm3 BEQ fm_exit MOV fn, t4 BL fastmul ;recurse LDR fn, [stk, #-4] LDR t2, op_fm4 B fm_exit fm_is_three ADD fn, fn, #1 MOV t4, fn BL powerof2 STMEA stk!, {fn} ;return address & n% (fn) stacked, local const in t4 MOV t4, t4, LSR fn CMP t4, #1 LDREQ t2, op_fm5 BEQ fm_exit MOV fn, t4 BL fastmul ;recurse LDR fn, [stk, #-4] LDR t2, op_fm6 B fm_exit fm_exit LDR t1, initial_cptr CMP t1, #0 ADDEQ cptr, cptr, #4 ORRNE t2, t2, fn, LSL #7 STRNE t2, [cptr], #4 LDMEA stk!, {fn, t2} ;discard n% & return MOVS pc, t2 GBLA counter bitpatlen MOVS t2, fn MOV fn, #0 counter SETA 31 WHILE counter>0 ADDNE fn, fn, #1 MOVNES t2, t2, LSR #1 MOVEQS pc, lr counter SETA counter-1 WEND ADD fn, fn, #1 MOVS pc, lr imop2 MOV t1, #0 counter SETA 16 WHILE counter>0 BICS t2, fn, #255 BEQ imop2_l1 MOV fn, fn, ROR #30 ADD t1, t1, #256 counter SETA counter-1 WEND MOV fn, #-1 MOVS pc, lr imop2_l1 ORR fn, t1, fn MOVS pc, lr powerof2 MOVS t1, fn MOV fn, #0 MOVEQS pc, lr counter SETA 31 WHILE counter>0 MOVS t1, t1, LSR #1 ADDCC fn, fn, #1 MOVCSS pc, lr counter SETA counter-1 WEND MOVS pc, lr END
00000000 3b 0a 3b 20 4e 61 6d 65 3a 09 47 65 6e 65 72 61 |;.; Name:.Genera| 00000010 74 6f 72 2e 0a 3b 0a 3b 20 41 75 74 68 6f 72 3a |tor..;.; Author:| 00000020 0a 3b 09 4d 69 63 68 61 65 6c 20 52 6f 7a 64 6f |.;.Michael Rozdo| 00000030 62 61 2c 20 66 72 6f 6d 20 61 6e 20 61 6c 67 6f |ba, from an algo| 00000040 72 69 74 68 6d 20 6f 72 69 67 69 6e 61 6c 6c 79 |rithm originally| 00000050 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 77 6f | based on the wo| 00000060 72 6b 20 6f 66 20 53 61 6d 75 65 6c 20 4b 2e 52 |rk of Samuel K.R| 00000070 2e 20 53 6d 69 74 68 2c 20 4d 69 63 68 61 65 6c |. Smith, Michael| 00000080 0a 3b 09 52 6f 7a 64 6f 62 61 20 26 20 41 20 46 |.;.Rozdoba & A F| 00000090 20 52 65 79 73 65 6e 62 61 63 68 2e 0a 3b 0a 3b | Reysenbach..;.;| 000000a0 20 46 75 6e 63 74 69 6f 6e 3a 0a 3b 20 09 43 6f | Function:.; .Co| 000000b0 6d 70 69 6c 65 20 63 6f 64 65 20 74 6f 20 63 61 |mpile code to ca| 000000c0 72 72 79 20 6f 75 74 20 72 61 70 69 64 20 61 73 |rry out rapid as| 000000d0 73 65 6d 62 6c 65 72 20 64 69 76 69 73 6f 6e 20 |sembler divison | 000000e0 62 79 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 |by an arbitrary | 000000f0 63 6f 6e 73 74 61 6e 74 2e 0a 3b 0a 3b 20 41 72 |constant..;.; Ar| 00000100 67 75 6d 65 6e 74 73 3a 0a 3b 20 72 30 09 64 69 |guments:.; r0.di| 00000110 76 69 73 6f 72 20 63 6f 6e 73 74 61 6e 74 0a 3b |visor constant.;| 00000120 20 72 31 09 70 74 72 20 74 6f 20 62 75 66 66 65 | r1.ptr to buffe| 00000130 72 20 66 6f 72 20 63 6f 64 65 20 28 70 61 73 73 |r for code (pass| 00000140 69 6e 67 20 30 20 69 6e 64 69 63 61 74 65 73 20 |ing 0 indicates | 00000150 6e 6f 20 63 6f 64 65 20 74 6f 20 62 65 20 63 6f |no code to be co| 00000160 6d 70 69 6c 65 64 20 2d 20 61 6c 6c 6f 77 73 20 |mpiled - allows | 00000170 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 63 61 |routine to be ca| 00000180 6c 6c 65 64 20 74 6f 0a 3b 09 63 61 6c 63 75 6c |lled to.;.calcul| 00000190 61 74 65 20 73 69 7a 65 20 6f 66 20 62 75 66 66 |ate size of buff| 000001a0 65 72 20 72 65 71 75 69 72 65 64 29 0a 3b 20 72 |er required).; r| 000001b0 32 09 6e 75 6d 62 65 72 20 6f 66 20 6e 75 6d 65 |2.number of nume| 000001c0 72 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66 |rator register f| 000001d0 6f 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 62 65 |or routine to be| 000001e0 20 63 6f 6d 70 69 6c 65 64 0a 3b 20 72 33 09 6e | compiled.; r3.n| 000001f0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 |umber of output | 00000200 71 75 6f 74 69 65 6e 74 20 72 65 67 69 73 74 65 |quotient registe| 00000210 72 0a 3b 20 72 34 09 6e 75 6d 62 65 72 20 6f 66 |r.; r4.number of| 00000220 20 6f 75 74 70 75 74 20 72 65 6d 61 69 6e 64 65 | output remainde| 00000230 72 20 72 65 67 69 73 74 65 72 0a 3b 20 72 35 09 |r register.; r5.| 00000240 6e 75 6d 62 65 72 20 6f 66 20 61 20 73 63 72 61 |number of a scra| 00000250 74 63 68 20 72 65 67 69 73 74 65 72 20 2d 20 74 |tch register - t| 00000260 68 65 20 27 77 6f 72 6b 27 20 72 65 67 69 73 74 |he 'work' regist| 00000270 65 72 20 2d 20 6e 6f 74 20 6e 65 65 64 65 64 20 |er - not needed | 00000280 69 66 20 64 69 76 69 73 6f 72 20 69 73 20 61 20 |if divisor is a | 00000290 76 61 6c 69 64 20 69 6d 6d 65 64 69 61 74 65 0a |valid immediate.| 000002a0 3b 09 63 6f 6e 73 74 61 6e 74 20 28 6e 62 20 69 |;.constant (nb i| 000002b0 66 20 77 6f 72 6b 20 73 75 70 70 6c 69 65 64 20 |f work supplied | 000002c0 69 6e 20 61 6e 79 20 63 61 73 65 2c 20 62 75 74 |in any case, but| 000002d0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 69 74 20 | not needed, it | 000002e0 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 |will be ignored | 000002f0 2d 20 69 66 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 |- if caller know| 00000300 73 20 69 74 0a 3b 09 77 69 6c 6c 20 6e 6f 74 20 |s it.;.will not | 00000310 62 65 20 6e 65 65 64 65 64 2c 20 2d 31 20 6d 61 |be needed, -1 ma| 00000320 79 20 62 65 20 70 61 73 73 65 64 29 0a 3b 20 72 |y be passed).; r| 00000330 36 09 6e 75 6d 62 65 72 20 6f 66 20 61 20 73 63 |6.number of a sc| 00000340 72 61 74 63 68 20 72 65 67 69 73 74 65 72 20 2d |ratch register -| 00000350 20 74 68 65 20 27 73 69 67 6e 20 70 72 65 73 65 | the 'sign prese| 00000360 72 76 61 74 69 6f 6e 27 20 72 65 67 69 73 74 65 |rvation' registe| 00000370 72 20 28 6f 66 20 6e 75 6d 65 72 61 74 6f 72 29 |r (of numerator)| 00000380 20 2d 20 69 66 20 6e 75 6d 65 72 61 74 6f 72 20 | - if numerator | 00000390 69 73 0a 3b 09 6b 6e 6f 77 6e 20 74 6f 20 61 6c |is.;.known to al| 000003a0 77 61 79 73 20 62 65 20 70 6f 73 69 74 69 76 65 |ways be positive| 000003b0 20 6d 61 79 20 70 61 73 73 20 2d 31 20 74 6f 20 | may pass -1 to | 000003c0 69 6e 64 69 63 61 74 65 20 74 68 69 73 2c 20 77 |indicate this, w| 000003d0 68 69 63 68 20 77 69 6c 6c 20 73 61 76 65 20 75 |hich will save u| 000003e0 73 65 20 6f 66 20 73 69 67 6e 70 72 65 73 20 72 |se of signpres r| 000003f0 65 67 69 73 74 65 72 20 26 0a 3b 09 77 69 6c 6c |egister &.;.will| 00000400 20 72 65 64 75 63 65 20 63 6f 6d 70 69 6c 65 64 | reduce compiled| 00000410 20 63 6f 64 65 20 73 69 7a 65 20 62 79 20 36 20 | code size by 6 | 00000420 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 79 70 |instructions typ| 00000430 69 63 61 6c 6c 79 20 28 63 66 20 74 79 70 69 63 |ically (cf typic| 00000440 61 6c 20 63 6f 64 65 20 73 69 7a 65 20 32 30 20 |al code size 20 | 00000450 74 6f 20 32 37 0a 3b 09 69 6e 73 74 72 75 63 74 |to 27.;.instruct| 00000460 69 6f 6e 73 2c 20 77 68 65 6e 20 73 69 67 6e 20 |ions, when sign | 00000470 70 72 65 73 65 72 76 61 74 69 6f 6e 20 69 73 20 |preservation is | 00000480 61 63 74 69 76 65 2c 20 74 68 65 6e 63 65 20 72 |active, thence r| 00000490 65 64 75 63 65 64 20 74 6f 20 31 34 20 74 6f 20 |educed to 14 to | 000004a0 32 31 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 29 |21 instructions)| 000004b0 0a 3b 0a 3b 09 4e 42 20 41 6c 6c 20 73 75 70 70 |.;.;.NB All supp| 000004c0 6c 69 65 64 20 72 65 67 69 73 74 65 72 20 6e 75 |lied register nu| 000004d0 6d 62 65 72 73 20 28 6f 74 68 65 72 20 74 68 61 |mbers (other tha| 000004e0 6e 20 77 6f 72 6b 20 26 20 73 69 67 6e 70 72 65 |n work & signpre| 000004f0 73 20 77 68 65 6e 20 6e 6f 74 20 6e 65 65 64 65 |s when not neede| 00000500 64 20 26 20 70 61 73 73 65 64 20 61 73 20 2d 31 |d & passed as -1| 00000510 29 20 4d 55 53 54 20 62 65 0a 3b 09 20 20 20 64 |) MUST be.;. d| 00000520 69 73 74 69 6e 63 74 2e 0a 3b 0a 3b 20 52 65 74 |istinct..;.; Ret| 00000530 75 72 6e 73 3a 0a 3b 20 72 30 09 73 69 7a 65 20 |urns:.; r0.size | 00000540 6f 66 20 63 6f 6d 70 69 6c 65 64 20 63 6f 64 65 |of compiled code| 00000550 20 69 6e 20 62 79 74 65 73 0a 3b 09 61 20 76 61 | in bytes.;.a va| 00000560 6c 75 65 20 6f 66 20 73 69 7a 65 3c 30 20 69 6e |lue of size<0 in| 00000570 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72 |dicates an error| 00000580 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e 67 | occurred during| 00000590 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 3b 20 63 6f | compilation; co| 000005a0 64 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 3b |de as follows:.;| 000005b0 20 2d 31 09 67 65 6e 65 72 61 74 6f 72 20 63 61 | -1.generator ca| 000005c0 6c 6c 65 64 20 77 69 74 68 20 30 20 64 69 76 69 |lled with 0 divi| 000005d0 73 6f 72 0a 3b 20 2d 32 09 77 6f 72 6b 20 72 65 |sor.; -2.work re| 000005e0 67 20 6e 65 65 64 65 64 20 62 75 74 20 6e 6f 74 |g needed but not| 000005f0 20 73 75 70 70 6c 69 65 64 0a 3b 20 2d 33 09 69 | supplied.; -3.i| 00000600 6e 76 61 6c 69 64 20 72 65 67 69 73 74 65 72 20 |nvalid register | 00000610 6e 75 6d 62 65 72 0a 3b 20 2d 34 09 72 65 67 69 |number.; -4.regi| 00000620 73 74 65 72 20 6e 75 6d 62 65 72 20 63 6c 61 73 |ster number clas| 00000630 68 20 28 74 68 65 20 72 65 67 69 73 74 65 72 73 |h (the registers| 00000640 20 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 | must be distinc| 00000650 74 29 0a 3b 20 2d 35 09 70 72 6f 67 72 61 6d 20 |t).; -5.program | 00000660 65 72 72 6f 72 20 2d 20 69 6e 74 65 72 6e 61 6c |error - internal| 00000670 20 72 65 63 75 72 73 69 6f 6e 20 73 74 61 63 6b | recursion stack| 00000680 20 65 78 68 61 75 73 74 65 64 0a 3b 20 2d 36 09 | exhausted.; -6.| 00000690 70 72 6f 67 72 61 6d 20 65 72 72 6f 72 20 2d 20 |program error - | 000006a0 66 61 73 74 64 69 76 61 69 64 20 6c 6f 67 69 63 |fastdivaid logic| 000006b0 20 33 0a 3b 0a 3b 20 41 64 64 69 74 69 6f 6e 61 | 3.;.; Additiona| 000006c0 6c 20 6e 6f 74 65 73 3a 0a 3b 09 41 73 73 75 6d |l notes:.;.Assum| 000006d0 65 73 20 61 20 73 75 69 74 61 62 6c 65 20 65 78 |es a suitable ex| 000006e0 74 65 72 6e 61 6c 20 72 31 33 20 73 74 61 63 6b |ternal r13 stack| 000006f0 20 65 78 69 73 74 73 2e 0a 3b 0a 0a 72 30 20 20 | exists..;..r0 | 00000700 20 20 20 20 52 4e 20 20 20 20 20 20 30 0a 72 31 | RN 0.r1| 00000710 20 20 20 20 20 20 52 4e 20 20 20 20 20 20 31 0a | RN 1.| 00000720 72 32 20 20 20 20 20 20 52 4e 20 20 20 20 20 20 |r2 RN | 00000730 32 0a 72 33 20 20 20 20 20 20 52 4e 20 20 20 20 |2.r3 RN | 00000740 20 20 33 0a 72 34 20 20 20 20 20 20 52 4e 20 20 | 3.r4 RN | 00000750 20 20 20 20 34 0a 72 35 20 20 20 20 20 20 52 4e | 4.r5 RN| 00000760 20 20 20 20 20 20 35 0a 72 36 20 20 20 20 20 20 | 5.r6 | 00000770 52 4e 20 20 20 20 20 20 36 0a 72 37 20 20 20 20 |RN 6.r7 | 00000780 20 20 52 4e 20 20 20 20 20 20 37 0a 72 38 20 20 | RN 7.r8 | 00000790 20 20 20 20 52 4e 20 20 20 20 20 20 38 0a 72 39 | RN 8.r9| 000007a0 20 20 20 20 20 20 52 4e 20 20 20 20 20 20 39 0a | RN 9.| 000007b0 72 31 30 20 20 20 20 20 52 4e 20 20 20 20 20 20 |r10 RN | 000007c0 31 30 0a 72 31 31 20 20 20 20 20 52 4e 20 20 20 |10.r11 RN | 000007d0 20 20 20 31 31 0a 72 31 32 20 20 20 20 20 52 4e | 11.r12 RN| 000007e0 20 20 20 20 20 20 31 32 0a 72 31 33 20 20 20 20 | 12.r13 | 000007f0 20 52 4e 20 20 20 20 20 20 31 33 0a 72 31 34 20 | RN 13.r14 | 00000800 20 20 20 20 52 4e 20 20 20 20 20 20 31 34 0a 72 | RN 14.r| 00000810 31 35 20 20 20 20 20 52 4e 20 20 20 20 20 20 31 |15 RN 1| 00000820 35 0a 73 70 20 20 20 20 20 20 52 4e 20 20 20 20 |5.sp RN | 00000830 20 20 72 31 33 0a 6c 72 20 20 20 20 20 20 52 4e | r13.lr RN| 00000840 20 20 20 20 20 20 72 31 34 0a 70 63 20 20 20 20 | r14.pc | 00000850 20 20 52 4e 20 20 20 20 20 20 72 31 35 0a 0a 63 | RN r15..c| 00000860 6f 6e 73 74 09 52 4e 09 72 30 0a 63 70 74 72 09 |onst.RN.r0.cptr.| 00000870 52 4e 09 72 31 0a 6e 75 6d 09 52 4e 09 72 32 0a |RN.r1.num.RN.r2.| 00000880 6f 75 74 71 09 52 4e 09 72 33 0a 6f 75 74 72 09 |outq.RN.r3.outr.| 00000890 52 4e 09 72 34 0a 77 6f 72 6b 09 52 4e 09 72 35 |RN.r4.work.RN.r5| 000008a0 0a 73 69 67 6e 70 72 65 73 09 52 4e 09 72 36 0a |.signpres.RN.r6.| 000008b0 74 31 09 52 4e 09 72 31 32 0a 66 6e 09 52 4e 09 |t1.RN.r12.fn.RN.| 000008c0 72 31 31 09 09 09 09 3b 61 72 67 73 2f 72 65 73 |r11....;args/res| 000008d0 75 6c 74 73 20 74 6f 2f 66 72 6f 6d 20 73 75 62 |ults to/from sub| 000008e0 72 6f 75 74 73 0a 74 32 09 52 4e 09 72 31 30 0a |routs.t2.RN.r10.| 000008f0 74 33 09 52 4e 09 72 31 34 0a 74 34 09 52 4e 09 |t3.RN.r14.t4.RN.| 00000900 72 39 0a 0a 70 73 09 52 4e 09 72 38 0a 70 6d 09 |r9..ps.RN.r8.pm.| 00000910 52 4e 09 72 39 0a 0a 73 74 6b 09 52 4e 09 72 37 |RN.r9..stk.RN.r7| 00000920 0a 73 74 6b 6c 09 52 4e 09 72 38 0a 0a 6d 5f 76 |.stkl.RN.r8..m_v| 00000930 09 52 4e 09 72 37 0a 6d 5f 69 09 52 4e 09 72 38 |.RN.r7.m_i.RN.r8| 00000940 0a 6d 5f 6d 09 52 4e 09 72 39 0a 6d 5f 72 09 52 |.m_m.RN.r9.m_r.R| 00000950 4e 09 72 31 30 0a 6d 5f 6d 69 09 52 4e 09 72 31 |N.r10.m_mi.RN.r1| 00000960 31 0a 6d 5f 6d 6c 09 52 4e 09 72 31 32 0a 6d 5f |1.m_ml.RN.r12.m_| 00000970 6c 69 09 52 4e 09 72 31 34 0a 0a 09 43 4d 50 09 |li.RN.r14...CMP.| 00000980 63 6f 6e 73 74 2c 20 23 30 0a 09 4d 56 4e 45 51 |const, #0..MVNEQ| 00000990 09 72 30 2c 20 23 30 09 09 09 09 3b 45 52 52 4f |.r0, #0....;ERRO| 000009a0 52 3a 20 30 20 64 69 76 69 73 6f 72 0a 09 4d 4f |R: 0 divisor..MO| 000009b0 56 45 51 53 09 70 63 2c 20 6c 72 0a 0a 09 53 54 |VEQS.pc, lr...ST| 000009c0 4d 46 44 09 73 70 21 2c 20 7b 6c 72 7d 0a 0a 09 |MFD.sp!, {lr}...| 000009d0 4d 4f 56 09 74 31 2c 20 23 31 0a 09 52 53 42 4d |MOV.t1, #1..RSBM| 000009e0 49 09 63 6f 6e 73 74 2c 20 63 6f 6e 73 74 2c 20 |I.const, const, | 000009f0 23 30 0a 09 4d 4f 56 4d 49 09 74 31 2c 20 23 2d |#0..MOVMI.t1, #-| 00000a00 31 0a 09 53 54 52 09 74 31 2c 20 6e 73 69 67 6e |1..STR.t1, nsign| 00000a10 70 72 65 73 0a 0a 09 53 54 52 09 63 70 74 72 2c |pres...STR.cptr,| 00000a20 20 69 6e 69 74 69 61 6c 5f 63 70 74 72 0a 0a 09 | initial_cptr...| 00000a30 4d 4f 56 09 66 6e 2c 20 63 6f 6e 73 74 0a 09 42 |MOV.fn, const..B| 00000a40 4c 09 70 6f 77 65 72 6f 66 32 0a 09 53 54 52 09 |L.powerof2..STR.| 00000a50 66 6e 2c 20 70 6f 77 65 72 5f 6f 66 5f 32 0a 0a |fn, power_of_2..| 00000a60 09 4d 4f 56 09 66 6e 2c 20 63 6f 6e 73 74 0a 09 |.MOV.fn, const..| 00000a70 42 4c 09 69 6d 6f 70 32 0a 09 43 4d 50 09 66 6e |BL.imop2..CMP.fn| 00000a80 2c 20 23 2d 31 0a 09 4c 44 52 4e 45 09 74 31 2c |, #-1..LDRNE.t1,| 00000a90 20 6f 70 31 0a 09 4f 52 52 4e 45 09 74 31 2c 20 | op1..ORRNE.t1, | 00000aa0 74 31 2c 20 66 6e 09 09 09 3b 69 6e 73 65 72 74 |t1, fn...;insert| 00000ab0 20 6f 70 65 72 61 6e 64 20 32 0a 09 4f 52 52 4e | operand 2..ORRN| 00000ac0 45 09 74 31 2c 20 74 31 2c 20 6f 75 74 72 2c 20 |E.t1, t1, outr, | 00000ad0 4c 53 4c 20 23 31 32 09 09 3b 20 20 20 20 20 20 |LSL #12..; | 00000ae0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 72 65 67 | destination reg| 00000af0 0a 09 4f 52 52 4e 45 09 74 31 2c 20 74 31 2c 20 |..ORRNE.t1, t1, | 00000b00 6f 75 74 72 2c 20 4c 53 4c 20 23 31 36 09 09 3b |outr, LSL #16..;| 00000b10 20 20 20 20 20 20 20 6f 70 65 72 61 6e 64 20 31 | operand 1| 00000b20 20 72 65 67 69 73 74 65 72 0a 09 53 54 52 4e 45 | register..STRNE| 00000b30 09 74 31 2c 20 6f 70 32 09 09 09 09 3b 6e 6f 74 |.t1, op2....;not| 00000b40 65 2c 20 6f 70 63 6f 64 65 20 26 20 63 6f 6e 64 |e, opcode & cond| 00000b50 69 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 64 |ition will be ad| 00000b60 64 65 64 20 6c 61 74 65 72 20 28 61 73 20 6e 65 |ded later (as ne| 00000b70 65 64 20 6d 61 6e 79 29 0a 09 4d 4f 56 45 51 09 |ed many)..MOVEQ.| 00000b80 74 31 2c 20 77 6f 72 6b 0a 09 4d 4f 56 4e 45 09 |t1, work..MOVNE.| 00000b90 74 31 2c 20 23 2d 31 09 09 09 09 3b 74 31 20 3d |t1, #-1....;t1 =| 00000ba0 20 63 6f 6e 73 74 20 76 61 6c 69 64 20 3f 20 2d | const valid ? -| 00000bb0 31 20 3a 20 77 6f 72 6b 20 72 65 67 0a 09 43 4d |1 : work reg..CM| 00000bc0 50 45 51 09 77 6f 72 6b 2c 20 23 2d 31 0a 09 4d |PEQ.work, #-1..M| 00000bd0 4f 56 45 51 09 72 30 2c 20 23 2d 32 0a 09 4c 44 |OVEQ.r0, #-2..LD| 00000be0 4d 45 51 46 44 09 73 70 21 2c 20 7b 70 63 7d 5e |MEQFD.sp!, {pc}^| 00000bf0 09 09 09 3b 45 52 52 4f 52 3a 20 77 6f 72 6b 20 |...;ERROR: work | 00000c00 72 65 67 20 6e 65 65 64 65 64 20 62 75 74 20 6e |reg needed but n| 00000c10 6f 74 20 73 75 70 70 6c 69 65 64 0a 09 4d 4f 56 |ot supplied..MOV| 00000c20 09 77 6f 72 6b 2c 20 74 31 09 09 09 3b 65 69 74 |.work, t1...;eit| 00000c30 68 65 72 20 6c 65 61 76 65 20 77 6f 72 6b 20 61 |her leave work a| 00000c40 6c 6f 6e 65 2c 20 69 66 20 6e 65 65 64 65 64 2c |lone, if needed,| 00000c50 20 65 6c 73 65 20 72 65 73 65 74 20 74 6f 20 2d | else reset to -| 00000c60 31 0a 0a 09 43 4d 50 09 6f 75 74 71 2c 20 23 30 |1...CMP.outq, #0| 00000c70 0a 09 43 4d 50 47 45 09 6f 75 74 72 2c 20 23 30 |..CMPGE.outr, #0| 00000c80 0a 09 43 4d 50 47 45 09 6e 75 6d 2c 20 23 30 0a |..CMPGE.num, #0.| 00000c90 09 43 4d 50 47 45 09 77 6f 72 6b 2c 20 23 2d 31 |.CMPGE.work, #-1| 00000ca0 0a 09 43 4d 50 47 45 09 73 69 67 6e 70 72 65 73 |..CMPGE.signpres| 00000cb0 2c 20 23 2d 31 0a 09 4d 4f 56 4c 54 09 72 30 2c |, #-1..MOVLT.r0,| 00000cc0 20 23 2d 33 0a 09 4c 44 4d 4c 54 46 44 09 73 70 | #-3..LDMLTFD.sp| 00000cd0 21 2c 20 7b 70 63 7d 5e 09 09 09 3b 45 52 52 4f |!, {pc}^...;ERRO| 00000ce0 52 3a 20 69 6e 76 61 6c 69 64 20 72 65 67 69 73 |R: invalid regis| 00000cf0 74 65 72 20 6e 75 6d 62 65 72 0a 09 43 4d 50 09 |ter number..CMP.| 00000d00 6f 75 74 71 2c 20 23 31 34 0a 09 43 4d 50 4c 45 |outq, #14..CMPLE| 00000d10 09 6f 75 74 72 2c 20 23 31 34 0a 09 43 4d 50 4c |.outr, #14..CMPL| 00000d20 45 09 6e 75 6d 2c 20 23 31 34 0a 09 43 4d 50 4c |E.num, #14..CMPL| 00000d30 45 09 77 6f 72 6b 2c 20 23 31 34 0a 09 43 4d 50 |E.work, #14..CMP| 00000d40 4c 45 09 73 69 67 6e 70 72 65 73 2c 20 23 31 34 |LE.signpres, #14| 00000d50 0a 09 4d 4f 56 47 54 09 72 30 2c 20 23 2d 33 0a |..MOVGT.r0, #-3.| 00000d60 09 4c 44 4d 47 54 46 44 09 73 70 21 2c 20 7b 70 |.LDMGTFD.sp!, {p| 00000d70 63 7d 5e 09 09 09 3b 45 52 52 4f 52 3a 20 69 6e |c}^...;ERROR: in| 00000d80 76 61 6c 69 64 20 72 65 67 69 73 74 65 72 20 6e |valid register n| 00000d90 75 6d 62 65 72 0a 09 43 4d 50 09 6f 75 74 71 2c |umber..CMP.outq,| 00000da0 20 6f 75 74 72 0a 09 43 4d 50 4e 45 09 6f 75 74 | outr..CMPNE.out| 00000db0 71 2c 20 6e 75 6d 0a 09 43 4d 50 4e 45 09 6f 75 |q, num..CMPNE.ou| 00000dc0 74 72 2c 20 6e 75 6d 0a 09 4d 4f 56 45 51 09 72 |tr, num..MOVEQ.r| 00000dd0 30 2c 20 23 2d 34 0a 09 4c 44 4d 45 51 46 44 09 |0, #-4..LDMEQFD.| 00000de0 73 70 21 2c 20 7b 70 63 7d 5e 09 09 09 3b 45 52 |sp!, {pc}^...;ER| 00000df0 52 4f 52 3a 20 72 65 67 69 73 74 65 72 20 63 6c |ROR: register cl| 00000e00 61 73 68 0a 09 43 4d 50 09 6f 75 74 71 2c 20 73 |ash..CMP.outq, s| 00000e10 69 67 6e 70 72 65 73 0a 09 43 4d 50 4e 45 09 6f |ignpres..CMPNE.o| 00000e20 75 74 72 2c 20 73 69 67 6e 70 72 65 73 0a 09 43 |utr, signpres..C| 00000e30 4d 50 4e 45 09 6e 75 6d 2c 20 73 69 67 6e 70 72 |MPNE.num, signpr| 00000e40 65 73 0a 09 42 4e 45 09 6c 31 0a 09 43 4d 50 09 |es..BNE.l1..CMP.| 00000e50 73 69 67 6e 70 72 65 73 2c 20 23 2d 31 0a 09 4d |signpres, #-1..M| 00000e60 4f 56 4e 45 09 72 30 2c 20 23 2d 34 0a 09 4c 44 |OVNE.r0, #-4..LD| 00000e70 4d 4e 45 46 44 09 73 70 21 2c 20 7b 70 63 7d 5e |MNEFD.sp!, {pc}^| 00000e80 09 09 09 3b 45 52 52 4f 52 3a 20 72 65 67 69 73 |...;ERROR: regis| 00000e90 74 65 72 20 63 6c 61 73 68 0a 6c 31 09 43 4d 50 |ter clash.l1.CMP| 00000ea0 09 6f 75 74 71 2c 20 77 6f 72 6b 0a 09 43 4d 50 |.outq, work..CMP| 00000eb0 4e 45 09 6f 75 74 72 2c 20 77 6f 72 6b 0a 09 43 |NE.outr, work..C| 00000ec0 4d 50 4e 45 09 6e 75 6d 2c 20 77 6f 72 6b 0a 09 |MPNE.num, work..| 00000ed0 43 4d 50 4e 45 09 73 69 67 6e 70 72 65 73 2c 20 |CMPNE.signpres, | 00000ee0 77 6f 72 6b 0a 09 42 4e 45 09 6c 32 0a 09 43 4d |work..BNE.l2..CM| 00000ef0 50 09 77 6f 72 6b 2c 20 23 2d 31 0a 09 4d 4f 56 |P.work, #-1..MOV| 00000f00 4e 45 09 72 30 2c 20 23 2d 34 0a 09 4c 44 4d 4e |NE.r0, #-4..LDMN| 00000f10 45 46 44 09 73 70 21 2c 20 7b 70 63 7d 5e 09 09 |EFD.sp!, {pc}^..| 00000f20 09 3b 45 52 52 4f 52 3a 20 72 65 67 69 73 74 65 |.;ERROR: registe| 00000f30 72 20 63 6c 61 73 68 0a 6c 32 0a 09 43 4d 50 09 |r clash.l2..CMP.| 00000f40 63 6f 6e 73 74 2c 20 23 31 0a 09 42 4e 45 09 6e |const, #1..BNE.n| 00000f50 6f 74 5f 6f 6e 65 0a 09 43 4d 50 09 63 70 74 72 |ot_one..CMP.cptr| 00000f60 2c 20 23 30 0a 09 4d 4f 56 45 51 09 72 30 2c 20 |, #0..MOVEQ.r0, | 00000f70 23 38 0a 09 4c 44 4d 45 51 46 44 09 73 70 21 2c |#8..LDMEQFD.sp!,| 00000f80 20 7b 70 63 7d 5e 09 09 09 3b 72 65 74 75 72 6e | {pc}^...;return| 00000f90 20 73 69 7a 65 20 6f 66 20 63 6f 64 65 20 6e 65 | size of code ne| 00000fa0 65 64 65 64 20 74 6f 20 64 69 76 69 64 65 20 62 |eded to divide b| 00000fb0 79 20 b1 31 0a 09 4c 44 52 09 74 31 2c 20 6f 70 |y .1..LDR.t1, op| 00000fc0 5f 6d 6f 76 5f 30 0a 09 4f 52 52 09 74 31 2c 20 |_mov_0..ORR.t1, | 00000fd0 74 31 2c 20 6f 75 74 72 2c 20 4c 53 4c 20 23 31 |t1, outr, LSL #1| 00000fe0 32 0a 09 53 54 52 09 74 31 2c 20 5b 63 70 74 72 |2..STR.t1, [cptr| 00000ff0 5d 2c 20 23 34 09 09 09 3b 6d 6f 76 20 6f 75 74 |], #4...;mov out| 00001000 72 2c 20 23 30 0a 09 4c 44 52 09 74 32 2c 20 6e |r, #0..LDR.t2, n| 00001010 73 69 67 6e 70 72 65 73 0a 09 43 4d 50 09 74 32 |signpres..CMP.t2| 00001020 2c 20 23 31 0a 09 4c 44 52 45 51 09 74 31 2c 20 |, #1..LDREQ.t1, | 00001030 6f 70 5f 6d 6f 76 5f 72 30 0a 09 4c 44 52 4e 45 |op_mov_r0..LDRNE| 00001040 09 74 31 2c 20 6f 70 5f 72 73 62 5f 30 0a 09 4f |.t1, op_rsb_0..O| 00001050 52 52 09 74 31 2c 20 74 31 2c 20 6f 75 74 71 2c |RR.t1, t1, outq,| 00001060 20 4c 53 4c 20 23 31 32 0a 09 4f 52 52 45 51 09 | LSL #12..ORREQ.| 00001070 74 31 2c 20 74 31 2c 20 6e 75 6d 09 09 09 3b 6d |t1, t1, num...;m| 00001080 6f 76 20 6f 75 74 71 2c 20 6e 75 6d 09 09 2d 20 |ov outq, num..- | 00001090 69 66 20 63 6f 6e 73 74 20 3e 20 30 0a 09 4f 52 |if const > 0..OR| 000010a0 52 4e 45 09 74 31 2c 20 74 31 2c 20 6e 75 6d 2c |RNE.t1, t1, num,| 000010b0 20 4c 53 4c 20 23 31 36 09 09 3b 72 73 62 20 6f | LSL #16..;rsb o| 000010c0 75 74 71 2c 20 6e 75 6d 2c 20 23 30 09 2d 20 69 |utq, num, #0.- i| 000010d0 66 20 63 6f 6e 73 74 20 3c 20 30 0a 09 53 54 52 |f const < 0..STR| 000010e0 09 74 31 2c 20 5b 63 70 74 72 5d 2c 20 23 34 0a |.t1, [cptr], #4.| 000010f0 09 4d 4f 56 09 72 30 2c 20 23 38 0a 09 4c 44 4d |.MOV.r0, #8..LDM| 00001100 46 44 09 73 70 21 2c 20 7b 70 63 7d 5e 09 09 09 |FD.sp!, {pc}^...| 00001110 3b 72 65 74 75 72 6e 20 61 66 74 65 72 20 63 6f |;return after co| 00001120 6d 70 69 6c 69 6e 67 20 63 6f 64 65 20 74 6f 20 |mpiling code to | 00001130 64 69 76 69 64 65 20 62 79 20 b1 31 0a 6e 6f 74 |divide by .1.not| 00001140 5f 6f 6e 65 0a 09 43 4d 50 09 73 69 67 6e 70 72 |_one..CMP.signpr| 00001150 65 73 2c 20 23 2d 31 0a 09 42 45 51 09 6e 6f 74 |es, #-1..BEQ.not| 00001160 5f 73 69 67 6e 70 72 65 73 5f 31 0a 09 43 4d 50 |_signpres_1..CMP| 00001170 09 63 70 74 72 2c 20 23 30 0a 09 41 44 44 45 51 |.cptr, #0..ADDEQ| 00001180 09 63 70 74 72 2c 20 63 70 74 72 2c 20 23 38 0a |.cptr, cptr, #8.| 00001190 09 42 45 51 09 6e 6f 74 5f 73 69 67 6e 70 72 65 |.BEQ.not_signpre| 000011a0 73 5f 31 0a 09 4c 44 52 09 74 31 2c 20 6f 70 5f |s_1..LDR.t1, op_| 000011b0 61 6e 64 73 5f 73 69 67 6e 0a 09 4f 52 52 09 74 |ands_sign..ORR.t| 000011c0 31 2c 20 74 31 2c 20 73 69 67 6e 70 72 65 73 2c |1, t1, signpres,| 000011d0 20 4c 53 4c 20 23 31 32 0a 09 4f 52 52 09 74 31 | LSL #12..ORR.t1| 000011e0 2c 20 74 31 2c 20 6e 75 6d 2c 20 4c 53 4c 20 23 |, t1, num, LSL #| 000011f0 31 36 0a 09 53 54 52 09 74 31 2c 20 5b 63 70 74 |16..STR.t1, [cpt| 00001200 72 5d 2c 20 23 34 09 09 09 3b 61 6e 64 73 20 73 |r], #4...;ands s| 00001210 69 67 6e 70 72 65 73 2c 20 6e 75 6d 2c 20 23 26 |ignpres, num, #&| 00001220 38 30 30 30 30 30 30 30 0a 09 4c 44 52 09 74 31 |80000000..LDR.t1| 00001230 2c 20 6f 70 5f 72 73 62 6e 65 5f 30 0a 09 4f 52 |, op_rsbne_0..OR| 00001240 52 09 74 31 2c 20 74 31 2c 20 6e 75 6d 2c 20 4c |R.t1, t1, num, L| 00001250 53 4c 20 23 31 32 0a 09 4f 52 52 09 74 31 2c 20 |SL #12..ORR.t1, | 00001260 74 31 2c 20 6e 75 6d 2c 20 4c 53 4c 20 23 31 36 |t1, num, LSL #16| 00001270 0a 09 53 54 52 09 74 31 2c 20 5b 63 70 74 72 5d |..STR.t1, [cptr]| 00001280 2c 20 23 34 09 09 09 3b 72 73 62 6e 65 20 6e 75 |, #4...;rsbne nu| 00001290 6d 2c 20 6e 75 6d 2c 20 23 30 0a 6e 6f 74 5f 73 |m, num, #0.not_s| 000012a0 69 67 6e 70 72 65 73 5f 31 0a 09 4c 44 52 09 74 |ignpres_1..LDR.t| 000012b0 31 2c 20 70 6f 77 65 72 5f 6f 66 5f 32 0a 09 4d |1, power_of_2..M| 000012c0 4f 56 09 74 32 2c 20 23 31 0a 09 4d 4f 56 09 74 |OV.t2, #1..MOV.t| 000012d0 32 2c 20 74 32 2c 20 4c 53 4c 20 74 31 0a 09 43 |2, t2, LSL t1..C| 000012e0 4d 50 09 63 6f 6e 73 74 2c 20 74 32 0a 09 42 4e |MP.const, t2..BN| 000012f0 45 09 6e 6f 74 5f 61 5f 70 6f 77 65 72 5f 6f 66 |E.not_a_power_of| 00001300 5f 32 0a 09 09 09 09 09 09 3b 68 61 76 65 20 64 |_2.......;have d| 00001310 69 76 69 73 69 6f 6e 20 62 79 20 61 20 70 6f 77 |ivision by a pow| 00001320 65 72 20 6f 66 20 32 0a 09 4c 44 52 09 74 32 2c |er of 2..LDR.t2,| 00001330 20 69 6e 69 74 69 61 6c 5f 63 70 74 72 0a 09 43 | initial_cptr..C| 00001340 4d 50 09 74 32 2c 20 23 30 0a 09 41 44 44 45 51 |MP.t2, #0..ADDEQ| 00001350 09 63 70 74 72 2c 20 63 70 74 72 2c 20 23 38 0a |.cptr, cptr, #8.| 00001360 09 42 45 51 09 6e 6f 77 5f 72 65 73 74 6f 72 65 |.BEQ.now_restore| 00001370 5f 73 69 67 6e 73 0a 09 4c 44 52 09 74 32 2c 20 |_signs..LDR.t2, | 00001380 6f 70 5f 6d 6f 76 5f 72 30 0a 09 4f 52 52 09 74 |op_mov_r0..ORR.t| 00001390 32 2c 20 74 32 2c 20 6f 75 74 71 2c 20 4c 53 4c |2, t2, outq, LSL| 000013a0 20 23 31 32 0a 09 4f 52 52 09 74 32 2c 20 74 32 | #12..ORR.t2, t2| 000013b0 2c 20 6e 75 6d 09 09 09 3b 6d 6f 76 20 6f 75 74 |, num...;mov out| 000013c0 71 2c 20 6e 75 6d 2c 20 6c 73 6c 20 23 30 0a 09 |q, num, lsl #0..| 000013d0 4f 52 52 09 74 32 2c 20 74 32 2c 20 23 32 5f 30 |ORR.t2, t2, #2_0| 000013e0 31 20 3c 3c 20 35 09 09 3b 63 68 61 6e 67 65 64 |1 << 5..;changed| 000013f0 20 74 6f 20 6c 73 72 20 23 30 20 28 77 68 69 63 | to lsr #0 (whic| 00001400 68 20 68 61 70 70 65 6e 73 20 74 6f 20 6d 65 61 |h happens to mea| 00001410 6e 20 6c 73 72 20 23 33 32 29 0a 09 4f 52 52 09 |n lsr #32)..ORR.| 00001420 74 32 2c 20 74 32 2c 20 74 31 2c 20 4c 53 4c 20 |t2, t2, t1, LSL | 00001430 23 37 0a 09 53 54 52 09 74 32 2c 20 5b 63 70 74 |#7..STR.t2, [cpt| 00001440 72 5d 2c 20 23 34 09 09 09 3b 6d 6f 76 20 6f 75 |r], #4...;mov ou| 00001450 74 71 2c 20 6e 75 6d 2c 20 6c 73 72 20 23 70 6f |tq, num, lsr #po| 00001460 77 65 72 5f 6f 66 5f 32 20 28 73 61 66 65 20 61 |wer_of_2 (safe a| 00001470 73 20 70 6f 77 65 72 20 74 77 65 65 6e 20 31 20 |s power tween 1 | 00001480 26 20 33 31 29 0a 09 4c 44 52 09 74 32 2c 20 6f |& 31)..LDR.t2, o| 00001490 70 5f 73 75 62 5f 30 5f 30 0a 09 4f 52 52 09 74 |p_sub_0_0..ORR.t| 000014a0 32 2c 20 74 32 2c 20 6f 75 74 72 2c 20 4c 53 4c |2, t2, outr, LSL| 000014b0 20 23 31 32 0a 09 4f 52 52 09 74 32 2c 20 74 32 | #12..ORR.t2, t2| 000014c0 2c 20 6e 75 6d 2c 20 4c 53 4c 20 23 31 36 0a 09 |, num, LSL #16..| 000014d0 4f 52 52 09 74 32 2c 20 74 32 2c 20 6f 75 74 71 |ORR.t2, t2, outq| 000014e0 0a 09 4f 52 52 09 74 32 2c 20 74 32 2c 20 74 31 |..ORR.t2, t2, t1| 000014f0 2c 20 4c 53 4c 20 23 37 0a 09 53 54 52 09 74 32 |, LSL #7..STR.t2| 00001500 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 3b |, [cptr], #4...;| 00001510 73 75 62 20 6f 75 74 72 2c 20 6e 75 6d 2c 20 6f |sub outr, num, o| 00001520 75 74 71 2c 20 4c 53 4c 20 23 70 6f 77 65 72 5f |utq, LSL #power_| 00001530 6f 66 5f 32 0a 09 42 09 6e 6f 77 5f 72 65 73 74 |of_2..B.now_rest| 00001540 6f 72 65 5f 73 69 67 6e 73 0a 6e 6f 74 5f 61 5f |ore_signs.not_a_| 00001550 70 6f 77 65 72 5f 6f 66 5f 32 0a 09 4d 4f 56 09 |power_of_2..MOV.| 00001560 74 31 2c 20 23 30 0a 09 53 54 52 09 74 31 2c 20 |t1, #0..STR.t1, | 00001570 73 75 62 66 6c 61 67 0a 09 43 4d 50 09 77 6f 72 |subflag..CMP.wor| 00001580 6b 2c 20 23 2d 31 0a 09 42 45 51 09 6e 6f 74 5f |k, #-1..BEQ.not_| 00001590 77 6f 72 6b 5f 31 0a 09 09 09 09 09 09 3b 6e 6f |work_1.......;no| 000015a0 77 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f 20 |w we have to do | 000015b0 6d 65 67 61 6d 6f 76 20 77 6f 72 6b 2c 20 23 63 |megamov work, #c| 000015c0 6f 6e 73 74 20 20 20 2d 20 61 73 73 75 6d 69 6e |onst - assumin| 000015d0 67 20 63 6f 6e 73 74 3c 3e 30 0a 09 4d 4f 56 09 |g const<>0..MOV.| 000015e0 6d 5f 76 2c 20 63 6f 6e 73 74 0a 09 4d 4f 56 09 |m_v, const..MOV.| 000015f0 6d 5f 72 2c 20 23 30 0a 6d 5f 6c 31 09 54 53 54 |m_r, #0.m_l1.TST| 00001600 09 6d 5f 76 2c 20 23 31 0a 09 4d 4f 56 45 51 09 |.m_v, #1..MOVEQ.| 00001610 6d 5f 76 2c 20 6d 5f 76 2c 20 52 4f 52 20 23 33 |m_v, m_v, ROR #3| 00001620 31 0a 09 41 44 44 45 51 09 6d 5f 72 2c 20 6d 5f |1..ADDEQ.m_r, m_| 00001630 72 2c 20 23 31 0a 09 42 45 51 09 6d 5f 6c 31 0a |r, #1..BEQ.m_l1.| 00001640 09 53 54 4d 46 44 09 73 70 21 2c 20 7b 6d 5f 72 |.STMFD.sp!, {m_r| 00001650 7d 09 09 09 3b 74 6f 20 61 6c 6c 6f 77 20 74 32 |}...;to allow t2| 00001660 20 28 3d 6d 5f 72 29 20 74 6f 20 62 65 20 75 73 | (=m_r) to be us| 00001670 65 64 20 61 73 20 73 63 72 61 74 63 68 0a 09 4d |ed as scratch..M| 00001680 4f 56 09 6d 5f 69 2c 20 23 30 0a 09 4d 4f 56 09 |OV.m_i, #0..MOV.| 00001690 6d 5f 6d 2c 20 23 31 0a 09 4d 4f 56 09 6d 5f 6d |m_m, #1..MOV.m_m| 000016a0 6c 2c 20 23 30 0a 6d 5f 6c 32 09 41 44 44 09 6d |l, #0.m_l2.ADD.m| 000016b0 5f 69 2c 20 6d 5f 69 2c 20 23 31 0a 09 4d 4f 56 |_i, m_i, #1..MOV| 000016c0 09 6d 5f 6d 2c 20 6d 5f 6d 2c 20 4c 53 4c 20 23 |.m_m, m_m, LSL #| 000016d0 31 0a 09 54 53 54 09 6d 5f 76 2c 20 6d 5f 6d 0a |1..TST.m_v, m_m.| 000016e0 09 43 4d 50 4e 45 09 6d 5f 69 2c 20 23 33 32 0a |.CMPNE.m_i, #32.| 000016f0 09 42 4e 45 09 6d 5f 6c 32 0a 09 43 4d 50 09 6d |.BNE.m_l2..CMP.m| 00001700 5f 69 2c 20 23 33 32 0a 09 42 47 45 09 6d 5f 6c |_i, #32..BGE.m_l| 00001710 33 0a 09 4d 4f 56 09 6d 5f 6c 69 2c 20 6d 5f 69 |3..MOV.m_li, m_i| 00001720 0a 6d 5f 6c 34 09 41 44 44 09 6d 5f 69 2c 20 6d |.m_l4.ADD.m_i, m| 00001730 5f 69 2c 20 23 31 0a 09 4d 4f 56 09 6d 5f 6d 2c |_i, #1..MOV.m_m,| 00001740 20 6d 5f 6d 2c 20 4c 53 4c 20 23 31 0a 09 54 53 | m_m, LSL #1..TS| 00001750 54 09 6d 5f 76 2c 20 6d 5f 6d 0a 09 42 4e 45 09 |T.m_v, m_m..BNE.| 00001760 6d 5f 6c 35 0a 09 43 4d 50 09 6d 5f 69 2c 20 23 |m_l5..CMP.m_i, #| 00001770 33 32 0a 09 42 4e 45 09 6d 5f 6c 34 0a 6d 5f 6c |32..BNE.m_l4.m_l| 00001780 35 09 53 55 42 09 74 32 2c 20 6d 5f 69 2c 20 6d |5.SUB.t2, m_i, m| 00001790 5f 6c 69 0a 09 43 4d 50 09 74 32 2c 20 6d 5f 6d |_li..CMP.t2, m_m| 000017a0 6c 0a 09 4d 4f 56 47 54 09 6d 5f 6d 69 2c 20 6d |l..MOVGT.m_mi, m| 000017b0 5f 6c 69 0a 09 4d 4f 56 47 54 09 6d 5f 6d 6c 2c |_li..MOVGT.m_ml,| 000017c0 20 74 32 0a 09 43 4d 50 09 6d 5f 69 2c 20 23 33 | t2..CMP.m_i, #3| 000017d0 32 0a 09 42 4c 54 09 6d 5f 6c 32 0a 6d 5f 6c 33 |2..BLT.m_l2.m_l3| 000017e0 09 4c 44 4d 46 44 09 73 70 21 2c 20 7b 6d 5f 72 |.LDMFD.sp!, {m_r| 000017f0 7d 09 09 09 3b 61 6c 73 6f 20 6e 6f 74 65 20 6d |}...;also note m| 00001800 5f 6c 69 20 6e 6f 77 20 66 72 65 65 20 73 6f 20 |_li now free so | 00001810 63 61 6e 20 72 65 73 75 6d 65 20 75 73 65 20 6f |can resume use o| 00001820 66 20 74 33 20 28 3d 6d 5f 6c 69 29 0a 09 43 4d |f t3 (=m_li)..CM| 00001830 50 09 6d 5f 6d 6c 2c 20 23 30 0a 09 41 44 44 47 |P.m_ml, #0..ADDG| 00001840 54 09 6d 5f 69 2c 20 6d 5f 6d 69 2c 20 6d 5f 6d |T.m_i, m_mi, m_m| 00001850 6c 0a 09 4d 4f 56 47 54 09 6d 5f 76 2c 20 6d 5f |l..MOVGT.m_v, m_| 00001860 76 2c 20 52 4f 52 20 6d 5f 69 0a 09 52 53 42 47 |v, ROR m_i..RSBG| 00001870 54 09 6d 5f 69 2c 20 6d 5f 69 2c 20 23 33 32 0a |T.m_i, m_i, #32.| 00001880 09 41 44 44 47 54 09 6d 5f 72 2c 20 6d 5f 72 2c |.ADDGT.m_r, m_r,| 00001890 20 6d 5f 69 0a 09 54 53 54 09 6d 5f 72 2c 20 23 | m_i..TST.m_r, #| 000018a0 31 0a 09 4d 4f 56 4e 45 09 6d 5f 76 2c 20 6d 5f |1..MOVNE.m_v, m_| 000018b0 76 2c 20 52 4f 52 20 23 33 31 0a 09 41 44 44 4e |v, ROR #31..ADDN| 000018c0 45 09 6d 5f 72 2c 20 6d 5f 72 2c 20 23 31 0a 0a |E.m_r, m_r, #1..| 000018d0 09 41 4e 44 09 6d 5f 72 2c 20 6d 5f 72 2c 20 23 |.AND.m_r, m_r, #| 000018e0 33 31 0a 09 41 4e 44 09 6d 5f 69 2c 20 6d 5f 76 |31..AND.m_i, m_v| 000018f0 2c 20 23 32 35 35 0a 09 4c 44 52 09 74 31 2c 20 |, #255..LDR.t1, | 00001900 69 6e 69 74 69 61 6c 5f 63 70 74 72 0a 09 43 4d |initial_cptr..CM| 00001910 50 09 74 31 2c 20 23 30 0a 09 41 44 44 45 51 09 |P.t1, #0..ADDEQ.| 00001920 63 70 74 72 2c 20 63 70 74 72 2c 20 23 34 0a 09 |cptr, cptr, #4..| 00001930 4c 44 52 4e 45 09 74 33 2c 20 6f 70 5f 6d 6f 76 |LDRNE.t3, op_mov| 00001940 5f 30 0a 09 4f 52 52 4e 45 09 74 33 2c 20 74 33 |_0..ORRNE.t3, t3| 00001950 2c 20 77 6f 72 6b 2c 20 4c 53 4c 20 23 31 32 0a |, work, LSL #12.| 00001960 09 4f 52 52 4e 45 09 74 33 2c 20 74 33 2c 20 6d |.ORRNE.t3, t3, m| 00001970 5f 72 2c 20 4c 53 4c 20 23 38 2d 31 0a 09 4f 52 |_r, LSL #8-1..OR| 00001980 52 4e 45 09 74 33 2c 20 74 33 2c 20 6d 5f 69 0a |RNE.t3, t3, m_i.| 00001990 09 53 54 52 4e 45 09 74 33 2c 20 5b 63 70 74 72 |.STRNE.t3, [cptr| 000019a0 5d 2c 20 23 34 09 09 09 3b 6d 6f 76 20 77 6f 72 |], #4...;mov wor| 000019b0 6b 2c 20 23 6d 5f 69 20 72 6f 72 20 6d 5f 72 0a |k, #m_i ror m_r.| 000019c0 6d 5f 6c 36 0a 09 4d 4f 56 53 09 6d 5f 76 2c 20 |m_l6..MOVS.m_v, | 000019d0 6d 5f 76 2c 20 4c 53 52 20 23 38 0a 09 42 45 51 |m_v, LSR #8..BEQ| 000019e0 09 6e 6f 74 5f 77 6f 72 6b 5f 31 0a 09 53 55 42 |.not_work_1..SUB| 000019f0 09 6d 5f 72 2c 20 6d 5f 72 2c 20 23 38 0a 09 41 |.m_r, m_r, #8..A| 00001a00 4e 44 09 6d 5f 72 2c 20 6d 5f 72 2c 20 23 33 31 |ND.m_r, m_r, #31| 00001a10 0a 09 41 4e 44 53 09 6d 5f 69 2c 20 6d 5f 76 2c |..ANDS.m_i, m_v,| 00001a20 20 23 32 35 35 0a 09 42 45 51 09 6d 5f 6c 36 0a | #255..BEQ.m_l6.| 00001a30 09 43 4d 50 09 74 31 2c 20 23 30 0a 09 41 44 44 |.CMP.t1, #0..ADD| 00001a40 45 51 09 63 70 74 72 2c 20 63 70 74 72 2c 20 23 |EQ.cptr, cptr, #| 00001a50 34 0a 09 4c 44 52 4e 45 09 74 33 2c 20 6f 70 5f |4..LDRNE.t3, op_| 00001a60 6f 72 72 5f 30 0a 09 4f 52 52 4e 45 09 74 33 2c |orr_0..ORRNE.t3,| 00001a70 20 74 33 2c 20 77 6f 72 6b 2c 20 4c 53 4c 20 23 | t3, work, LSL #| 00001a80 31 32 0a 09 4f 52 52 4e 45 09 74 33 2c 20 74 33 |12..ORRNE.t3, t3| 00001a90 2c 20 77 6f 72 6b 2c 20 4c 53 4c 20 23 31 36 0a |, work, LSL #16.| 00001aa0 09 4f 52 52 4e 45 09 74 33 2c 20 74 33 2c 20 6d |.ORRNE.t3, t3, m| 00001ab0 5f 72 2c 20 4c 53 4c 20 23 38 2d 31 0a 09 4f 52 |_r, LSL #8-1..OR| 00001ac0 52 4e 45 09 74 33 2c 20 74 33 2c 20 6d 5f 69 0a |RNE.t3, t3, m_i.| 00001ad0 09 53 54 52 4e 45 09 74 33 2c 20 5b 63 70 74 72 |.STRNE.t3, [cptr| 00001ae0 5d 2c 20 23 34 09 09 09 3b 6f 72 72 20 77 6f 72 |], #4...;orr wor| 00001af0 6b 2c 20 77 6f 72 6b 2c 20 23 6d 5f 69 20 72 6f |k, work, #m_i ro| 00001b00 72 20 6d 5f 72 0a 09 42 09 6d 5f 6c 36 0a 6e 6f |r m_r..B.m_l6.no| 00001b10 74 5f 77 6f 72 6b 5f 31 0a 09 4c 44 52 09 74 32 |t_work_1..LDR.t2| 00001b20 2c 20 70 6f 77 65 72 5f 6f 66 5f 32 0a 09 53 54 |, power_of_2..ST| 00001b30 52 09 74 32 2c 20 6e 70 6f 77 65 72 5f 6f 66 5f |R.t2, npower_of_| 00001b40 32 0a 09 4d 4f 56 09 63 6f 6e 73 74 2c 20 63 6f |2..MOV.const, co| 00001b50 6e 73 74 2c 20 4c 53 52 20 74 32 0a 0a 09 4d 4f |nst, LSR t2...MO| 00001b60 56 09 74 31 2c 20 23 31 0a 09 4d 4f 56 09 70 73 |V.t1, #1..MOV.ps| 00001b70 2c 20 23 30 09 09 09 09 3b 73 25 20 69 6e 20 42 |, #0....;s% in B| 00001b80 61 73 69 63 20 76 65 72 73 69 6f 6e 0a 09 4d 4f |asic version..MO| 00001b90 56 09 70 6d 2c 20 23 30 09 09 09 09 3b 6d 25 20 |V.pm, #0....;m% | 00001ba0 69 6e 20 42 61 73 69 63 20 76 65 72 73 69 6f 6e |in Basic version| 00001bb0 0a 63 61 6c 63 5f 72 65 70 65 61 74 0a 09 43 4d |.calc_repeat..CM| 00001bc0 50 09 74 31 2c 20 63 6f 6e 73 74 0a 09 53 55 42 |P.t1, const..SUB| 00001bd0 47 45 09 74 31 2c 20 74 31 2c 20 63 6f 6e 73 74 |GE.t1, t1, const| 00001be0 0a 09 41 44 44 47 45 09 70 73 2c 20 70 73 2c 20 |..ADDGE.ps, ps, | 00001bf0 23 31 0a 09 43 4d 50 09 74 31 2c 20 23 30 0a 09 |#1..CMP.t1, #0..| 00001c00 42 45 51 09 72 65 70 65 61 74 5f 63 61 6c 63 64 |BEQ.repeat_calcd| 00001c10 0a 09 41 44 43 09 74 31 2c 20 74 31 2c 20 74 31 |..ADC.t1, t1, t1| 00001c20 09 09 09 3b 6e 62 20 61 62 6f 76 65 20 43 4d 50 |...;nb above CMP| 00001c30 20 65 6e 73 75 72 65 73 20 43 20 61 6c 77 61 79 | ensures C alway| 00001c40 73 20 73 65 74 2c 20 73 6f 20 74 68 69 73 20 69 |s set, so this i| 00001c50 73 20 74 31 3d 32 2a 74 31 2b 31 0a 09 4d 4f 56 |s t1=2*t1+1..MOV| 00001c60 09 70 73 2c 20 70 73 2c 20 4c 53 4c 20 23 31 0a |.ps, ps, LSL #1.| 00001c70 09 41 44 44 09 70 6d 2c 20 70 6d 2c 20 23 31 0a |.ADD.pm, pm, #1.| 00001c80 09 43 4d 50 09 70 6d 2c 20 23 33 32 0a 09 42 4c |.CMP.pm, #32..BL| 00001c90 45 09 63 61 6c 63 5f 72 65 70 65 61 74 0a 72 65 |E.calc_repeat.re| 00001ca0 70 65 61 74 5f 63 61 6c 63 64 0a 09 4d 4f 56 09 |peat_calcd..MOV.| 00001cb0 66 6e 2c 20 70 73 0a 09 42 4c 09 70 6f 77 65 72 |fn, ps..BL.power| 00001cc0 6f 66 32 0a 09 53 55 42 09 74 32 2c 20 74 32 2c |of2..SUB.t2, t2,| 00001cd0 20 66 6e 0a 09 4d 4f 56 09 70 73 2c 20 70 73 2c | fn..MOV.ps, ps,| 00001ce0 20 4c 53 52 20 66 6e 0a 09 53 54 52 09 74 32 2c | LSR fn..STR.t2,| 00001cf0 20 70 6f 77 65 72 5f 6f 66 5f 32 0a 09 43 4d 50 | power_of_2..CMP| 00001d00 09 70 73 2c 20 23 31 0a 09 42 45 51 09 73 5f 61 |.ps, #1..BEQ.s_a| 00001d10 70 70 6c 69 65 64 0a 09 53 54 52 09 70 73 2c 20 |pplied..STR.ps, | 00001d20 61 73 0a 09 53 54 52 09 70 6d 2c 20 61 6d 0a 09 |as..STR.pm, am..| 00001d30 4d 4f 56 09 66 6e 2c 20 70 73 0a 09 41 44 52 09 |MOV.fn, ps..ADR.| 00001d40 73 74 6b 2c 20 61 73 74 6b 0a 09 41 44 52 09 73 |stk, astk..ADR.s| 00001d50 74 6b 6c 2c 20 61 73 74 6b 5f 65 6e 64 0a 09 4c |tkl, astk_end..L| 00001d60 44 52 09 74 31 2c 20 6f 70 5f 61 64 64 5f 30 5f |DR.t1, op_add_0_| 00001d70 30 09 09 09 3b 63 61 6c 63 20 69 6e 74 65 72 6d |0...;calc interm| 00001d80 65 64 69 61 74 65 20 69 6e 73 74 72 75 63 74 69 |ediate instructi| 00001d90 6f 6e 73 20 75 73 65 64 20 62 79 20 66 61 73 74 |ons used by fast| 00001da0 64 69 76 61 69 64 0a 09 4f 52 52 09 74 34 2c 20 |divaid..ORR.t4, | 00001db0 6e 75 6d 2c 20 6e 75 6d 2c 20 4c 53 4c 20 23 31 |num, num, LSL #1| 00001dc0 36 0a 09 4f 52 52 09 74 34 2c 20 74 34 2c 20 6f |6..ORR.t4, t4, o| 00001dd0 75 74 71 2c 20 4c 53 4c 20 23 31 32 09 09 3b 64 |utq, LSL #12..;d| 00001de0 61 74 61 20 70 72 6f 63 65 73 73 69 6e 67 20 61 |ata processing a| 00001df0 72 67 73 20 6f 75 74 71 2c 20 6e 75 6d 2c 20 6e |rgs outq, num, n| 00001e00 75 6d 0a 09 4f 52 52 09 74 31 2c 20 74 31 2c 20 |um..ORR.t1, t1, | 00001e10 74 34 0a 09 53 54 52 09 74 31 2c 20 6f 70 5f 66 |t4..STR.t1, op_f| 00001e20 64 31 09 09 09 3b 61 64 64 20 6f 75 74 71 2c 20 |d1...;add outq, | 00001e30 6e 75 6d 2c 20 6e 75 6d 0a 09 4c 44 52 09 74 31 |num, num..LDR.t1| 00001e40 2c 20 6f 70 5f 61 64 64 5f 30 5f 30 5f 6c 73 72 |, op_add_0_0_lsr| 00001e50 0a 09 4f 52 52 09 74 34 2c 20 74 31 2c 20 74 34 |..ORR.t4, t1, t4| 00001e60 0a 09 53 54 52 09 74 34 2c 20 6f 70 5f 66 64 33 |..STR.t4, op_fd3| 00001e70 09 09 09 3b 61 64 64 20 6f 75 74 71 2c 20 6e 75 |...;add outq, nu| 00001e80 6d 2c 20 6e 75 6d 2c 20 6c 73 72 20 23 33 32 0a |m, num, lsr #32.| 00001e90 09 4f 52 52 09 74 34 2c 20 6e 75 6d 2c 20 6f 75 |.ORR.t4, num, ou| 00001ea0 74 71 2c 20 4c 53 4c 20 23 31 36 0a 09 4f 52 52 |tq, LSL #16..ORR| 00001eb0 09 74 34 2c 20 74 34 2c 20 6f 75 74 71 2c 20 4c |.t4, t4, outq, L| 00001ec0 53 4c 20 23 31 32 09 09 3b 20 20 20 20 20 20 20 |SL #12..; | 00001ed0 20 20 20 20 20 20 20 20 20 61 72 67 73 20 6f 75 | args ou| 00001ee0 74 71 2c 20 6f 75 74 71 2c 20 6e 75 6d 0a 09 4f |tq, outq, num..O| 00001ef0 52 52 09 74 31 2c 20 74 31 2c 20 74 34 0a 09 53 |RR.t1, t1, t4..S| 00001f00 54 52 09 74 31 2c 20 6f 70 5f 66 64 34 09 09 09 |TR.t1, op_fd4...| 00001f10 3b 61 64 64 20 6f 75 74 71 2c 20 6f 75 74 71 2c |;add outq, outq,| 00001f20 20 6e 75 6d 2c 20 6c 73 72 20 23 33 32 0a 09 4c | num, lsr #32..L| 00001f30 44 52 09 74 31 2c 20 6f 70 5f 73 75 62 5f 30 5f |DR.t1, op_sub_0_| 00001f40 30 5f 6c 73 72 0a 09 4f 52 52 09 74 31 2c 20 74 |0_lsr..ORR.t1, t| 00001f50 31 2c 20 74 34 0a 09 53 54 52 09 74 31 2c 20 6f |1, t4..STR.t1, o| 00001f60 70 5f 66 64 32 09 09 09 3b 73 75 62 20 6f 75 74 |p_fd2...;sub out| 00001f70 71 2c 20 6f 75 74 71 2c 20 6e 75 6d 2c 20 6c 73 |q, outq, num, ls| 00001f80 72 20 23 33 32 0a 09 42 4c 09 66 61 73 74 64 69 |r #32..BL.fastdi| 00001f90 76 61 69 64 0a 09 4c 44 52 09 70 73 2c 20 61 73 |vaid..LDR.ps, as| 00001fa0 0a 09 4c 44 52 09 70 6d 2c 20 61 6d 0a 73 5f 61 |..LDR.pm, am.s_a| 00001fb0 70 70 6c 69 65 64 09 09 09 09 09 3b 6e 62 20 74 |pplied.....;nb t| 00001fc0 32 3d 70 6f 77 65 72 5f 6f 66 5f 32 20 6d 61 79 |2=power_of_2 may| 00001fd0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 76 61 | no longer be va| 00001fe0 6c 69 64 2c 20 62 75 74 20 70 73 20 26 20 70 6d |lid, but ps & pm| 00001ff0 20 61 72 65 0a 09 4d 4f 56 09 66 6e 2c 20 70 73 | are..MOV.fn, ps| 00002000 0a 09 42 4c 09 62 69 74 70 61 74 6c 65 6e 09 09 |..BL.bitpatlen..| 00002010 09 3b 66 6e 20 69 73 20 6e 6f 77 20 6c 73 25 0a |.;fn is now ls%.| 00002020 09 41 44 44 09 74 31 2c 20 70 6d 2c 20 23 31 0a |.ADD.t1, pm, #1.| 00002030 09 4c 44 52 09 74 32 2c 20 69 6e 69 74 69 61 6c |.LDR.t2, initial| 00002040 5f 63 70 74 72 0a 09 43 4d 50 09 74 32 2c 20 23 |_cptr..CMP.t2, #| 00002050 30 0a 09 42 4e 45 09 64 6f 5f 65 78 74 65 6e 64 |0..BNE.do_extend| 00002060 0a 09 43 4d 50 09 74 31 2c 20 23 33 32 0a 09 42 |..CMP.t1, #32..B| 00002070 47 45 09 62 69 74 73 5f 65 78 74 65 6e 64 65 64 |GE.bits_extended| 00002080 0a 09 43 4d 50 09 70 73 2c 20 23 31 0a 09 4d 4f |..CMP.ps, #1..MO| 00002090 56 45 51 09 70 73 2c 20 23 30 0a 70 73 65 75 64 |VEQ.ps, #0.pseud| 000020a0 6f 5f 65 78 74 65 6e 64 5f 62 69 74 73 5f 6c 6f |o_extend_bits_lo| 000020b0 6f 70 0a 09 41 44 44 09 63 70 74 72 2c 20 63 70 |op..ADD.cptr, cp| 000020c0 74 72 2c 20 23 34 0a 09 4d 4f 56 09 74 31 2c 20 |tr, #4..MOV.t1, | 000020d0 74 31 2c 20 4c 53 4c 20 23 31 0a 09 43 4d 50 09 |t1, LSL #1..CMP.| 000020e0 74 31 2c 20 23 33 32 0a 09 42 4c 54 09 70 73 65 |t1, #32..BLT.pse| 000020f0 75 64 6f 5f 65 78 74 65 6e 64 5f 62 69 74 73 5f |udo_extend_bits_| 00002100 6c 6f 6f 70 0a 09 42 09 62 69 74 73 5f 65 78 74 |loop..B.bits_ext| 00002110 65 6e 64 65 64 0a 64 6f 5f 65 78 74 65 6e 64 0a |ended.do_extend.| 00002120 09 43 4d 50 09 74 31 2c 20 23 33 32 0a 09 42 47 |.CMP.t1, #32..BG| 00002130 45 09 62 69 74 73 5f 65 78 74 65 6e 64 65 64 0a |E.bits_extended.| 00002140 09 4c 44 52 09 74 33 2c 20 6f 70 5f 61 64 64 5f |.LDR.t3, op_add_| 00002150 30 5f 30 5f 6c 73 72 0a 09 4f 52 52 09 74 33 2c |0_0_lsr..ORR.t3,| 00002160 20 74 33 2c 20 6f 75 74 71 2c 20 4c 53 4c 20 23 | t3, outq, LSL #| 00002170 31 32 0a 09 43 4d 50 09 70 73 2c 20 23 31 0a 09 |12..CMP.ps, #1..| 00002180 4d 4f 56 45 51 09 70 73 2c 20 23 30 0a 09 4f 52 |MOVEQ.ps, #0..OR| 00002190 52 45 51 09 74 32 2c 20 6e 75 6d 2c 20 6e 75 6d |REQ.t2, num, num| 000021a0 2c 20 4c 53 4c 20 23 31 36 0a 09 4f 52 52 4e 45 |, LSL #16..ORRNE| 000021b0 09 74 32 2c 20 6f 75 74 71 2c 20 6f 75 74 71 2c |.t2, outq, outq,| 000021c0 20 4c 53 4c 20 23 31 36 0a 09 4f 52 52 09 74 32 | LSL #16..ORR.t2| 000021d0 2c 20 74 32 2c 20 74 31 2c 20 4c 53 4c 20 23 37 |, t2, t1, LSL #7| 000021e0 0a 09 4f 52 52 09 74 32 2c 20 74 33 2c 20 74 32 |..ORR.t2, t3, t2| 000021f0 09 09 09 3b 69 66 20 45 51 20 27 61 64 64 20 6f |...;if EQ 'add o| 00002200 75 74 71 2c 20 6e 75 6d 2c 20 6e 75 6d 2c 20 6c |utq, num, num, l| 00002210 73 72 20 23 74 31 25 27 0a 09 53 54 52 09 74 32 |sr #t1%'..STR.t2| 00002220 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 3b |, [cptr], #4...;| 00002230 65 6c 73 65 20 20 27 61 64 64 20 6f 75 74 71 2c |else 'add outq,| 00002240 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 6c 73 72 | outq, outq, lsr| 00002250 20 23 74 31 25 27 0a 09 4d 4f 56 09 74 31 2c 20 | #t1%'..MOV.t1, | 00002260 74 31 2c 20 4c 53 4c 20 23 31 0a 09 43 4d 50 09 |t1, LSL #1..CMP.| 00002270 74 31 2c 20 23 33 32 0a 09 42 47 45 09 62 69 74 |t1, #32..BGE.bit| 00002280 73 5f 65 78 74 65 6e 64 65 64 0a 09 4f 52 52 09 |s_extended..ORR.| 00002290 74 32 2c 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 |t2, outq, outq, | 000022a0 4c 53 4c 20 23 31 36 0a 09 4f 52 52 09 74 33 2c |LSL #16..ORR.t3,| 000022b0 20 74 33 2c 20 74 32 0a 65 78 74 65 6e 64 5f 62 | t3, t2.extend_b| 000022c0 69 74 73 5f 6c 6f 6f 70 0a 09 4f 52 52 09 74 32 |its_loop..ORR.t2| 000022d0 2c 20 74 33 2c 20 74 31 2c 20 4c 53 4c 20 23 37 |, t3, t1, LSL #7| 000022e0 0a 09 53 54 52 09 74 32 2c 20 5b 63 70 74 72 5d |..STR.t2, [cptr]| 000022f0 2c 20 23 34 09 09 09 3b 61 64 64 20 6f 75 74 71 |, #4...;add outq| 00002300 2c 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 6c 73 |, outq, outq, ls| 00002310 72 20 23 74 31 25 0a 09 4d 4f 56 09 74 31 2c 20 |r #t1%..MOV.t1, | 00002320 74 31 2c 20 4c 53 4c 20 23 31 0a 09 43 4d 50 09 |t1, LSL #1..CMP.| 00002330 74 31 2c 20 23 33 32 0a 09 42 4c 54 09 65 78 74 |t1, #32..BLT.ext| 00002340 65 6e 64 5f 62 69 74 73 5f 6c 6f 6f 70 0a 62 69 |end_bits_loop.bi| 00002350 74 73 5f 65 78 74 65 6e 64 65 64 0a 09 4c 44 52 |ts_extended..LDR| 00002360 09 74 31 2c 20 69 6e 69 74 69 61 6c 5f 63 70 74 |.t1, initial_cpt| 00002370 72 0a 09 43 4d 50 09 70 73 2c 20 23 31 0a 09 42 |r..CMP.ps, #1..B| 00002380 4e 45 09 6c 61 72 67 65 5f 64 69 76 5f 70 61 74 |NE.large_div_pat| 00002390 63 68 5f 64 6f 6e 65 0a 09 43 4d 50 09 74 31 2c |ch_done..CMP.t1,| 000023a0 20 23 30 0a 09 41 44 44 45 51 09 63 70 74 72 2c | #0..ADDEQ.cptr,| 000023b0 20 63 70 74 72 2c 20 23 34 0a 09 4c 44 52 4e 45 | cptr, #4..LDRNE| 000023c0 09 74 32 2c 20 6f 70 5f 6d 6f 76 5f 72 30 0a 09 |.t2, op_mov_r0..| 000023d0 4f 52 52 4e 45 09 74 32 2c 20 74 32 2c 20 6f 75 |ORRNE.t2, t2, ou| 000023e0 74 71 2c 20 4c 53 4c 20 23 31 32 0a 09 4f 52 52 |tq, LSL #12..ORR| 000023f0 4e 45 09 74 32 2c 20 74 32 2c 20 6e 75 6d 0a 09 |NE.t2, t2, num..| 00002400 53 54 52 4e 45 09 74 32 2c 20 5b 63 70 74 72 5d |STRNE.t2, [cptr]| 00002410 2c 20 23 34 09 09 09 3b 6d 6f 76 20 6f 75 74 71 |, #4...;mov outq| 00002420 2c 20 6e 75 6d 0a 6c 61 72 67 65 5f 64 69 76 5f |, num.large_div_| 00002430 70 61 74 63 68 5f 64 6f 6e 65 0a 09 4c 44 52 09 |patch_done..LDR.| 00002440 74 33 2c 20 70 6f 77 65 72 5f 6f 66 5f 32 0a 09 |t3, power_of_2..| 00002450 41 44 44 09 74 33 2c 20 74 33 2c 20 70 6d 0a 09 |ADD.t3, t3, pm..| 00002460 53 55 42 09 74 33 2c 20 74 33 2c 20 66 6e 0a 09 |SUB.t3, t3, fn..| 00002470 41 44 44 53 09 74 33 2c 20 74 33 2c 20 23 32 0a |ADDS.t3, t3, #2.| 00002480 09 42 4c 45 09 66 69 6e 61 6c 5f 73 68 69 66 74 |.BLE.final_shift| 00002490 5f 64 6f 6e 65 0a 09 43 4d 50 09 74 31 2c 20 23 |_done..CMP.t1, #| 000024a0 30 0a 09 41 44 44 45 51 09 63 70 74 72 2c 20 63 |0..ADDEQ.cptr, c| 000024b0 70 74 72 2c 20 23 34 0a 09 4c 44 52 4e 45 09 74 |ptr, #4..LDRNE.t| 000024c0 32 2c 20 6f 70 5f 6d 6f 76 5f 72 30 5f 6c 73 72 |2, op_mov_r0_lsr| 000024d0 0a 09 4f 52 52 4e 45 09 74 32 2c 20 74 32 2c 20 |..ORRNE.t2, t2, | 000024e0 6f 75 74 71 2c 20 4c 53 4c 20 23 31 32 0a 09 4f |outq, LSL #12..O| 000024f0 52 52 4e 45 09 74 32 2c 20 74 32 2c 20 6f 75 74 |RRNE.t2, t2, out| 00002500 71 0a 09 4f 52 52 4e 45 09 74 32 2c 20 74 32 2c |q..ORRNE.t2, t2,| 00002510 20 74 33 2c 20 4c 53 4c 20 23 37 0a 09 53 54 52 | t3, LSL #7..STR| 00002520 4e 45 09 74 32 2c 20 5b 63 70 74 72 5d 2c 20 23 |NE.t2, [cptr], #| 00002530 34 09 09 09 3b 6d 6f 76 20 6f 75 74 71 2c 20 6f |4...;mov outq, o| 00002540 75 74 71 2c 20 6c 73 72 20 23 70 6f 77 65 72 5f |utq, lsr #power_| 00002550 6f 66 5f 32 0a 66 69 6e 61 6c 5f 73 68 69 66 74 |of_2.final_shift| 00002560 5f 64 6f 6e 65 0a 09 4d 4f 56 09 66 6e 2c 20 63 |_done..MOV.fn, c| 00002570 6f 6e 73 74 0a 09 41 44 52 09 73 74 6b 2c 20 61 |onst..ADR.stk, a| 00002580 73 74 6b 0a 09 41 44 52 09 73 74 6b 6c 2c 20 61 |stk..ADR.stkl, a| 00002590 73 74 6b 5f 65 6e 64 0a 09 4f 52 52 09 74 31 2c |stk_end..ORR.t1,| 000025a0 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 4c 53 4c | outq, outq, LSL| 000025b0 20 23 31 36 09 09 3b 63 61 6c 63 20 69 6e 74 65 | #16..;calc inte| 000025c0 72 6d 65 64 69 61 74 65 20 69 6e 73 74 72 75 63 |rmediate instruc| 000025d0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 66 61 |tions used by fa| 000025e0 73 74 6d 75 6c 0a 09 4f 52 52 09 74 31 2c 20 74 |stmul..ORR.t1, t| 000025f0 31 2c 20 6f 75 74 72 2c 20 4c 53 4c 20 23 31 32 |1, outr, LSL #12| 00002600 0a 09 4f 52 52 09 74 32 2c 20 6f 75 74 72 2c 20 |..ORR.t2, outr, | 00002610 6f 75 74 71 2c 20 4c 53 4c 20 23 31 36 0a 09 4f |outq, LSL #16..O| 00002620 52 52 09 74 32 2c 20 74 32 2c 20 6f 75 74 72 2c |RR.t2, t2, outr,| 00002630 20 4c 53 4c 20 23 31 32 0a 09 4c 44 52 09 74 33 | LSL #12..LDR.t3| 00002640 2c 20 6f 70 5f 6d 6f 76 5f 72 30 0a 09 4f 52 52 |, op_mov_r0..ORR| 00002650 09 74 34 2c 20 74 33 2c 20 74 31 0a 09 53 54 52 |.t4, t3, t1..STR| 00002660 09 74 34 2c 20 6f 70 5f 66 6d 31 0a 09 4f 52 52 |.t4, op_fm1..ORR| 00002670 09 74 34 2c 20 74 33 2c 20 74 32 0a 09 53 54 52 |.t4, t3, t2..STR| 00002680 09 74 34 2c 20 6f 70 5f 66 6d 32 0a 09 4c 44 52 |.t4, op_fm2..LDR| 00002690 09 74 33 2c 20 6f 70 5f 61 64 64 5f 30 5f 30 0a |.t3, op_add_0_0.| 000026a0 09 4f 52 52 09 74 34 2c 20 74 33 2c 20 74 31 0a |.ORR.t4, t3, t1.| 000026b0 09 53 54 52 09 74 34 2c 20 6f 70 5f 66 6d 33 0a |.STR.t4, op_fm3.| 000026c0 09 4f 52 52 09 74 34 2c 20 74 33 2c 20 74 32 0a |.ORR.t4, t3, t2.| 000026d0 09 53 54 52 09 74 34 2c 20 6f 70 5f 66 6d 34 0a |.STR.t4, op_fm4.| 000026e0 09 4c 44 52 09 74 33 2c 20 6f 70 5f 72 73 62 5f |.LDR.t3, op_rsb_| 000026f0 30 5f 30 0a 09 4f 52 52 09 74 34 2c 20 74 33 2c |0_0..ORR.t4, t3,| 00002700 20 74 31 0a 09 53 54 52 09 74 34 2c 20 6f 70 5f | t1..STR.t4, op_| 00002710 66 6d 35 0a 09 4f 52 52 09 74 34 2c 20 74 33 2c |fm5..ORR.t4, t3,| 00002720 20 74 32 0a 09 53 54 52 09 74 34 2c 20 6f 70 5f | t2..STR.t4, op_| 00002730 66 6d 36 0a 09 42 4c 09 66 61 73 74 6d 75 6c 0a |fm6..BL.fastmul.| 00002740 09 4c 44 52 09 74 34 2c 20 69 6e 69 74 69 61 6c |.LDR.t4, initial| 00002750 5f 63 70 74 72 0a 09 4c 44 52 09 74 33 2c 20 6e |_cptr..LDR.t3, n| 00002760 70 6f 77 65 72 5f 6f 66 5f 32 0a 09 4d 4f 56 09 |power_of_2..MOV.| 00002770 63 6f 6e 73 74 2c 20 63 6f 6e 73 74 2c 20 4c 53 |const, const, LS| 00002780 4c 20 74 33 0a 09 43 4d 50 09 74 34 2c 20 23 30 |L t3..CMP.t4, #0| 00002790 0a 09 41 44 44 45 51 09 63 70 74 72 2c 20 63 70 |..ADDEQ.cptr, cp| 000027a0 74 72 2c 20 23 34 0a 09 4c 44 52 4e 45 09 74 31 |tr, #4..LDRNE.t1| 000027b0 2c 20 6f 70 5f 73 75 62 73 5f 30 5f 30 0a 09 4f |, op_subs_0_0..O| 000027c0 52 52 4e 45 09 74 31 2c 20 74 31 2c 20 6f 75 74 |RRNE.t1, t1, out| 000027d0 72 2c 20 4c 53 4c 20 23 31 32 0a 09 4f 52 52 4e |r, LSL #12..ORRN| 000027e0 45 09 74 31 2c 20 74 31 2c 20 6e 75 6d 2c 20 4c |E.t1, t1, num, L| 000027f0 53 4c 20 23 31 36 0a 09 4f 52 52 4e 45 09 74 31 |SL #16..ORRNE.t1| 00002800 2c 20 74 31 2c 20 6f 75 74 72 0a 09 4f 52 52 4e |, t1, outr..ORRN| 00002810 45 09 74 31 2c 20 74 31 2c 20 74 33 2c 20 4c 53 |E.t1, t1, t3, LS| 00002820 4c 20 23 37 0a 09 53 54 52 4e 45 09 74 31 2c 20 |L #7..STRNE.t1, | 00002830 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 3b 73 75 |[cptr], #4...;su| 00002840 62 73 20 6f 75 74 72 2c 20 6e 75 6d 2c 20 6f 75 |bs outr, num, ou| 00002850 74 72 2c 20 6c 73 6c 20 23 6e 70 6f 77 65 72 5f |tr, lsl #npower_| 00002860 6f 66 5f 32 20 28 70 6f 73 73 69 62 6c 79 20 30 |of_2 (possibly 0| 00002870 29 0a 09 4c 44 52 09 74 31 2c 20 73 75 62 66 6c |)..LDR.t1, subfl| 00002880 61 67 0a 09 42 4e 45 09 64 6f 5f 63 68 65 63 6b |ag..BNE.do_check| 00002890 0a 09 43 4d 50 09 74 31 2c 20 23 30 0a 09 41 44 |..CMP.t1, #0..AD| 000028a0 44 45 51 09 63 70 74 72 2c 20 63 70 74 72 2c 20 |DEQ.cptr, cptr, | 000028b0 23 31 32 0a 09 41 44 44 4e 45 09 63 70 74 72 2c |#12..ADDNE.cptr,| 000028c0 20 63 70 74 72 2c 20 23 32 30 0a 09 42 09 6e 6f | cptr, #20..B.no| 000028d0 77 5f 72 65 73 74 6f 72 65 5f 73 69 67 6e 73 0a |w_restore_signs.| 000028e0 64 6f 5f 63 68 65 63 6b 0a 09 43 4d 50 09 77 6f |do_check..CMP.wo| 000028f0 72 6b 2c 20 23 2d 31 0a 09 42 4e 45 09 75 73 65 |rk, #-1..BNE.use| 00002900 5f 77 6f 72 6b 0a 09 43 4d 50 09 74 31 2c 20 23 |_work..CMP.t1, #| 00002910 30 0a 09 4c 44 52 4e 45 09 74 31 2c 20 6f 70 5f |0..LDRNE.t1, op_| 00002920 73 75 62 6d 69 5f 30 5f 6e 31 0a 09 4f 52 52 4e |submi_0_n1..ORRN| 00002930 45 09 74 31 2c 20 74 31 2c 20 6f 75 74 71 2c 20 |E.t1, t1, outq, | 00002940 4c 53 4c 20 23 31 32 0a 09 4f 52 52 4e 45 09 74 |LSL #12..ORRNE.t| 00002950 31 2c 20 74 31 2c 20 6f 75 74 71 2c 20 4c 53 4c |1, t1, outq, LSL| 00002960 20 23 31 36 0a 09 53 54 52 4e 45 09 74 31 2c 20 | #16..STRNE.t1, | 00002970 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 3b 73 75 |[cptr], #4...;su| 00002980 62 6d 69 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 |bmi outq, outq, | 00002990 23 31 0a 09 4c 44 52 09 74 31 2c 20 6f 70 32 0a |#1..LDR.t1, op2.| 000029a0 09 4f 52 52 4e 45 09 74 32 2c 20 74 31 2c 20 23 |.ORRNE.t2, t1, #| 000029b0 32 5f 30 31 30 30 3c 3c 32 38 09 09 3b 63 6f 6e |2_0100<<28..;con| 000029c0 64 20 6d 69 0a 09 4f 52 52 4e 45 09 74 32 2c 20 |d mi..ORRNE.t2, | 000029d0 74 32 2c 20 23 32 5f 30 31 30 30 3c 3c 32 31 09 |t2, #2_0100<<21.| 000029e0 09 3b 6f 70 63 6f 64 65 20 61 64 64 0a 09 53 54 |.;opcode add..ST| 000029f0 52 4e 45 09 74 32 2c 20 5b 63 70 74 72 5d 2c 20 |RNE.t2, [cptr], | 00002a00 23 34 09 09 09 3b 61 64 64 6d 69 20 6f 75 74 72 |#4...;addmi outr| 00002a10 2c 20 6f 75 74 72 2c 20 23 63 6f 6e 73 74 0a 09 |, outr, #const..| 00002a20 4f 52 52 09 74 32 2c 20 74 31 2c 20 23 32 5f 31 |ORR.t2, t1, #2_1| 00002a30 31 31 30 3c 3c 32 38 09 09 3b 63 6f 6e 64 20 61 |110<<28..;cond a| 00002a40 6c 0a 09 4f 52 52 09 74 32 2c 20 74 32 2c 20 23 |l..ORR.t2, t2, #| 00002a50 32 5f 31 30 31 30 31 3c 3c 32 30 09 09 3b 6f 70 |2_10101<<20..;op| 00002a60 63 6f 64 65 20 63 6d 70 73 0a 09 53 54 52 09 74 |code cmps..STR.t| 00002a70 32 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 |2, [cptr], #4...| 00002a80 3b 63 6d 70 20 6f 75 74 72 2c 20 23 63 6f 6e 73 |;cmp outr, #cons| 00002a90 74 0a 09 4c 44 52 09 74 32 2c 20 6f 70 5f 61 64 |t..LDR.t2, op_ad| 00002aa0 64 67 65 5f 30 5f 6e 31 0a 09 4f 52 52 09 74 32 |dge_0_n1..ORR.t2| 00002ab0 2c 20 74 32 2c 20 6f 75 74 71 2c 20 4c 53 4c 20 |, t2, outq, LSL | 00002ac0 23 31 32 0a 09 4f 52 52 09 74 32 2c 20 74 32 2c |#12..ORR.t2, t2,| 00002ad0 20 6f 75 74 71 2c 20 4c 53 4c 20 23 31 36 0a 09 | outq, LSL #16..| 00002ae0 53 54 52 09 74 32 2c 20 5b 63 70 74 72 5d 2c 20 |STR.t2, [cptr], | 00002af0 23 34 09 09 09 3b 61 64 64 67 65 20 6f 75 74 71 |#4...;addge outq| 00002b00 2c 20 6f 75 74 71 2c 20 23 31 0a 09 4f 52 52 09 |, outq, #1..ORR.| 00002b10 74 32 2c 20 74 31 2c 20 23 32 5f 31 30 31 30 3c |t2, t1, #2_1010<| 00002b20 3c 32 38 09 09 3b 63 6f 6e 64 20 67 65 0a 09 4f |<28..;cond ge..O| 00002b30 52 52 09 74 32 2c 20 74 32 2c 20 23 32 5f 30 30 |RR.t2, t2, #2_00| 00002b40 31 30 3c 3c 32 31 09 09 3b 6f 70 63 6f 64 65 20 |10<<21..;opcode | 00002b50 73 75 62 0a 09 53 54 52 09 74 32 2c 20 5b 63 70 |sub..STR.t2, [cp| 00002b60 74 72 5d 2c 20 23 34 09 09 09 3b 73 75 62 67 65 |tr], #4...;subge| 00002b70 20 6f 75 74 72 2c 20 6f 75 74 72 2c 20 23 63 6f | outr, outr, #co| 00002b80 6e 73 74 0a 09 42 09 6e 6f 77 5f 72 65 73 74 6f |nst..B.now_resto| 00002b90 72 65 5f 73 69 67 6e 73 0a 75 73 65 5f 77 6f 72 |re_signs.use_wor| 00002ba0 6b 0a 09 43 4d 50 09 74 31 2c 20 23 30 0a 09 4c |k..CMP.t1, #0..L| 00002bb0 44 52 4e 45 09 74 31 2c 20 6f 70 5f 73 75 62 6d |DRNE.t1, op_subm| 00002bc0 69 5f 30 5f 6e 31 0a 09 4f 52 52 4e 45 09 74 31 |i_0_n1..ORRNE.t1| 00002bd0 2c 20 74 31 2c 20 6f 75 74 71 2c 20 4c 53 4c 20 |, t1, outq, LSL | 00002be0 23 31 32 0a 09 4f 52 52 4e 45 09 74 31 2c 20 74 |#12..ORRNE.t1, t| 00002bf0 31 2c 20 6f 75 74 71 2c 20 4c 53 4c 20 23 31 36 |1, outq, LSL #16| 00002c00 0a 09 53 54 52 4e 45 09 74 31 2c 20 5b 63 70 74 |..STRNE.t1, [cpt| 00002c10 72 5d 2c 20 23 34 09 09 09 3b 73 75 62 6d 69 20 |r], #4...;submi | 00002c20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 23 31 0a 09 |outq, outq, #1..| 00002c30 4c 44 52 4e 45 09 74 31 2c 20 6f 70 5f 61 64 64 |LDRNE.t1, op_add| 00002c40 6d 69 5f 30 5f 30 0a 09 4f 52 52 4e 45 09 74 31 |mi_0_0..ORRNE.t1| 00002c50 2c 20 74 31 2c 20 6f 75 74 72 2c 20 4c 53 4c 20 |, t1, outr, LSL | 00002c60 23 31 32 0a 09 4f 52 52 4e 45 09 74 31 2c 20 74 |#12..ORRNE.t1, t| 00002c70 31 2c 20 6f 75 74 72 2c 20 4c 53 4c 20 23 31 36 |1, outr, LSL #16| 00002c80 0a 09 4f 52 52 4e 45 09 74 31 2c 20 74 31 2c 20 |..ORRNE.t1, t1, | 00002c90 77 6f 72 6b 0a 09 53 54 52 4e 45 09 74 31 2c 20 |work..STRNE.t1, | 00002ca0 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 3b 61 64 |[cptr], #4...;ad| 00002cb0 64 6d 69 20 6f 75 74 72 2c 20 6f 75 74 72 2c 20 |dmi outr, outr, | 00002cc0 77 6f 72 6b 0a 09 4c 44 52 09 74 31 2c 20 6f 70 |work..LDR.t1, op| 00002cd0 5f 63 6d 70 5f 30 5f 30 0a 09 4f 52 52 09 74 32 |_cmp_0_0..ORR.t2| 00002ce0 2c 20 74 31 2c 20 6f 75 74 72 2c 20 4c 53 4c 20 |, t1, outr, LSL | 00002cf0 23 31 36 0a 09 4f 52 52 09 74 32 2c 20 74 32 2c |#16..ORR.t2, t2,| 00002d00 20 77 6f 72 6b 0a 09 53 54 52 09 74 32 2c 20 5b | work..STR.t2, [| 00002d10 63 70 74 72 5d 2c 20 23 34 09 09 09 3b 63 6d 70 |cptr], #4...;cmp| 00002d20 20 6f 75 74 72 2c 20 77 6f 72 6b 0a 09 4c 44 52 | outr, work..LDR| 00002d30 09 74 32 2c 20 6f 70 5f 61 64 64 67 65 5f 30 5f |.t2, op_addge_0_| 00002d40 6e 31 0a 09 4f 52 52 09 74 32 2c 20 74 32 2c 20 |n1..ORR.t2, t2, | 00002d50 6f 75 74 71 2c 20 4c 53 4c 20 23 31 32 0a 09 4f |outq, LSL #12..O| 00002d60 52 52 09 74 32 2c 20 74 32 2c 20 6f 75 74 71 2c |RR.t2, t2, outq,| 00002d70 20 4c 53 4c 20 23 31 36 0a 09 53 54 52 09 74 32 | LSL #16..STR.t2| 00002d80 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 3b |, [cptr], #4...;| 00002d90 61 64 64 67 65 20 6f 75 74 71 2c 20 6f 75 74 71 |addge outq, outq| 00002da0 2c 20 23 31 0a 09 4c 44 52 09 74 31 2c 20 6f 70 |, #1..LDR.t1, op| 00002db0 5f 73 75 62 67 65 5f 30 5f 30 0a 09 4f 52 52 09 |_subge_0_0..ORR.| 00002dc0 74 31 2c 20 74 31 2c 20 6f 75 74 72 2c 20 4c 53 |t1, t1, outr, LS| 00002dd0 4c 20 23 31 32 0a 09 4f 52 52 09 74 31 2c 20 74 |L #12..ORR.t1, t| 00002de0 31 2c 20 6f 75 74 72 2c 20 4c 53 4c 20 23 31 36 |1, outr, LSL #16| 00002df0 0a 09 4f 52 52 09 74 31 2c 20 74 31 2c 20 77 6f |..ORR.t1, t1, wo| 00002e00 72 6b 0a 09 53 54 52 09 74 31 2c 20 5b 63 70 74 |rk..STR.t1, [cpt| 00002e10 72 5d 2c 20 23 34 09 09 09 3b 73 75 62 67 65 20 |r], #4...;subge | 00002e20 6f 75 74 72 2c 20 6f 75 74 72 2c 20 77 6f 72 6b |outr, outr, work| 00002e30 0a 6e 6f 77 5f 72 65 73 74 6f 72 65 5f 73 69 67 |.now_restore_sig| 00002e40 6e 73 0a 09 4c 44 52 09 74 34 2c 20 69 6e 69 74 |ns..LDR.t4, init| 00002e50 69 61 6c 5f 63 70 74 72 0a 09 4c 44 52 09 74 33 |ial_cptr..LDR.t3| 00002e60 2c 20 6e 73 69 67 6e 70 72 65 73 0a 09 43 4d 50 |, nsignpres..CMP| 00002e70 09 73 69 67 6e 70 72 65 73 2c 20 23 2d 31 0a 09 |.signpres, #-1..| 00002e80 42 4e 45 09 73 69 67 6e 70 72 65 73 64 0a 09 43 |BNE.signpresd..C| 00002e90 4d 50 09 74 33 2c 20 23 2d 31 0a 09 42 4e 45 09 |MP.t3, #-1..BNE.| 00002ea0 61 6c 6c 5f 64 6f 6e 65 0a 09 43 4d 50 09 74 34 |all_done..CMP.t4| 00002eb0 2c 20 23 30 0a 09 41 44 44 45 51 09 63 70 74 72 |, #0..ADDEQ.cptr| 00002ec0 2c 20 63 70 74 72 2c 20 23 34 0a 09 4c 44 52 4e |, cptr, #4..LDRN| 00002ed0 45 09 74 31 2c 20 6f 70 5f 72 73 62 5f 30 0a 09 |E.t1, op_rsb_0..| 00002ee0 4f 52 52 4e 45 09 74 31 2c 20 74 31 2c 20 6f 75 |ORRNE.t1, t1, ou| 00002ef0 74 71 2c 20 4c 53 4c 20 23 31 32 0a 09 4f 52 52 |tq, LSL #12..ORR| 00002f00 4e 45 09 74 31 2c 20 74 31 2c 20 6f 75 74 71 2c |NE.t1, t1, outq,| 00002f10 20 4c 53 4c 20 23 31 36 0a 09 53 54 52 4e 45 09 | LSL #16..STRNE.| 00002f20 74 31 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 |t1, [cptr], #4..| 00002f30 09 3b 72 73 62 20 6f 75 74 71 2c 20 6f 75 74 71 |.;rsb outq, outq| 00002f40 2c 20 23 30 0a 09 42 09 61 6c 6c 5f 64 6f 6e 65 |, #0..B.all_done| 00002f50 0a 73 69 67 6e 70 72 65 73 64 0a 09 43 4d 50 09 |.signpresd..CMP.| 00002f60 74 34 2c 20 23 30 0a 09 41 44 44 45 51 09 63 70 |t4, #0..ADDEQ.cp| 00002f70 74 72 2c 20 63 70 74 72 2c 20 23 31 36 0a 09 42 |tr, cptr, #16..B| 00002f80 45 51 09 61 6c 6c 5f 64 6f 6e 65 0a 09 4c 44 52 |EQ.all_done..LDR| 00002f90 09 74 31 2c 20 6f 70 5f 74 65 71 73 5f 73 69 67 |.t1, op_teqs_sig| 00002fa0 6e 0a 09 4f 52 52 09 74 31 2c 20 74 31 2c 20 73 |n..ORR.t1, t1, s| 00002fb0 69 67 6e 70 72 65 73 2c 20 4c 53 4c 20 23 31 36 |ignpres, LSL #16| 00002fc0 0a 09 53 54 52 09 74 31 2c 20 5b 63 70 74 72 5d |..STR.t1, [cptr]| 00002fd0 2c 20 23 34 09 09 09 3b 74 65 71 73 20 73 69 67 |, #4...;teqs sig| 00002fe0 6e 70 72 65 73 2c 20 23 26 38 30 30 30 30 30 30 |npres, #&8000000| 00002ff0 30 0a 09 4c 44 52 09 74 32 2c 20 6f 70 5f 72 73 |0..LDR.t2, op_rs| 00003000 62 65 71 5f 30 0a 09 4f 52 52 09 74 31 2c 20 74 |beq_0..ORR.t1, t| 00003010 32 2c 20 6e 75 6d 2c 20 4c 53 4c 20 23 31 32 0a |2, num, LSL #12.| 00003020 09 4f 52 52 09 74 31 2c 20 74 31 2c 20 6e 75 6d |.ORR.t1, t1, num| 00003030 2c 20 4c 53 4c 20 23 31 36 0a 09 53 54 52 09 74 |, LSL #16..STR.t| 00003040 31 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 |1, [cptr], #4...| 00003050 3b 72 73 62 65 71 20 6e 75 6d 2c 20 6e 75 6d 2c |;rsbeq num, num,| 00003060 20 23 30 0a 09 4f 52 52 09 74 31 2c 20 74 32 2c | #0..ORR.t1, t2,| 00003070 20 6f 75 74 72 2c 20 4c 53 4c 20 23 31 32 0a 09 | outr, LSL #12..| 00003080 4f 52 52 09 74 31 2c 20 74 31 2c 20 6f 75 74 72 |ORR.t1, t1, outr| 00003090 2c 20 4c 53 4c 20 23 31 36 0a 09 53 54 52 09 74 |, LSL #16..STR.t| 000030a0 31 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 |1, [cptr], #4...| 000030b0 3b 72 73 62 65 71 20 6f 75 74 72 2c 20 6f 75 74 |;rsbeq outr, out| 000030c0 72 2c 20 23 30 0a 09 4f 52 52 09 74 31 2c 20 74 |r, #0..ORR.t1, t| 000030d0 32 2c 20 6f 75 74 71 2c 20 4c 53 4c 20 23 31 32 |2, outq, LSL #12| 000030e0 0a 09 4f 52 52 09 74 31 2c 20 74 31 2c 20 6f 75 |..ORR.t1, t1, ou| 000030f0 74 71 2c 20 4c 53 4c 20 23 31 36 0a 09 43 4d 50 |tq, LSL #16..CMP| 00003100 09 74 33 2c 20 23 2d 31 0a 09 4f 52 52 45 51 09 |.t3, #-1..ORREQ.| 00003110 74 31 2c 20 74 31 2c 20 23 32 5f 30 30 30 31 3c |t1, t1, #2_0001<| 00003120 3c 32 38 09 09 3b 63 6f 6e 64 20 6e 65 0a 09 53 |<28..;cond ne..S| 00003130 54 52 09 74 31 2c 20 5b 63 70 74 72 5d 2c 20 23 |TR.t1, [cptr], #| 00003140 34 09 09 09 3b 69 66 20 6e 65 20 27 72 73 62 65 |4...;if ne 'rsbe| 00003150 71 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 23 30 |q outq, outq, #0| 00003160 27 2c 20 65 6c 73 65 20 66 6c 69 70 20 63 6f 6e |', else flip con| 00003170 64 20 74 6f 20 72 73 62 6e 65 0a 61 6c 6c 5f 64 |d to rsbne.all_d| 00003180 6f 6e 65 0a 09 4c 44 52 09 74 31 2c 20 69 6e 69 |one..LDR.t1, ini| 00003190 74 69 61 6c 5f 63 70 74 72 0a 09 53 55 42 09 72 |tial_cptr..SUB.r| 000031a0 30 2c 20 63 70 74 72 2c 20 74 31 0a 09 4c 44 4d |0, cptr, t1..LDM| 000031b0 46 44 09 73 70 21 2c 20 7b 70 63 7d 5e 0a 0a 69 |FD.sp!, {pc}^..i| 000031c0 6e 69 74 69 61 6c 5f 63 70 74 72 09 44 43 44 09 |nitial_cptr.DCD.| 000031d0 30 0a 6e 73 69 67 6e 70 72 65 73 09 44 43 44 09 |0.nsignpres.DCD.| 000031e0 30 0a 70 6f 77 65 72 5f 6f 66 5f 32 09 44 43 44 |0.power_of_2.DCD| 000031f0 09 30 0a 73 75 62 66 6c 61 67 09 09 44 43 44 09 |.0.subflag..DCD.| 00003200 30 0a 6e 70 6f 77 65 72 5f 6f 66 5f 32 09 44 43 |0.npower_of_2.DC| 00003210 44 09 30 0a 61 73 09 09 44 43 44 09 30 0a 61 6d |D.0.as..DCD.0.am| 00003220 09 09 44 43 44 09 30 0a 0a 6f 70 31 09 41 4e 44 |..DCD.0..op1.AND| 00003230 45 51 09 72 30 2c 20 72 30 2c 20 23 30 2c 30 09 |EQ.r0, r0, #0,0.| 00003240 09 09 3b 75 73 65 64 20 74 6f 20 62 75 69 6c 64 |..;used to build| 00003250 20 6f 70 32 3b 20 6e 6f 74 65 20 41 4e 44 2c 20 | op2; note AND, | 00003260 45 51 20 65 74 63 20 63 68 6f 73 65 6e 20 61 73 |EQ etc chosen as| 00003270 20 67 69 76 65 20 30 20 62 69 74 73 0a 6f 70 32 | give 0 bits.op2| 00003280 09 44 43 44 09 30 09 09 09 09 3b 77 69 6c 6c 20 |.DCD.0....;will | 00003290 73 74 6f 72 65 20 64 61 74 61 20 70 72 6f 63 65 |store data proce| 000032a0 73 73 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f |ssing instructio| 000032b0 6e 20 6f 66 20 66 6f 72 6d 0a 09 09 09 09 09 09 |n of form.......| 000032c0 3b 3c 63 6f 6e 64 3e 3c 6f 70 63 6f 64 65 3e 20 |;<cond><opcode> | 000032d0 5b 6f 75 74 72 5d 2c 5b 6f 75 74 72 5d 2c 23 5b |[outr],[outr],#[| 000032e0 63 6f 6e 73 74 5d 0a 09 09 09 09 09 09 3b 4e 42 |const].......;NB| 000032f0 20 6f 75 74 72 20 69 73 20 72 34 2c 20 5b 6f 75 | outr is r4, [ou| 00003300 74 72 5d 20 6d 65 61 6e 73 20 74 68 65 20 72 65 |tr] means the re| 00003310 67 69 73 74 65 72 20 77 68 6f 73 65 20 6e 75 6d |gister whose num| 00003320 62 65 72 20 69 73 0a 09 09 09 09 09 09 3b 73 74 |ber is.......;st| 00003330 6f 72 65 64 20 69 6e 20 72 34 20 77 68 65 6e 20 |ored in r4 when | 00003340 67 65 6e 65 72 61 74 6f 72 20 63 6f 64 65 20 65 |generator code e| 00003350 78 65 63 75 74 65 64 20 2d 20 64 6f 6e 27 74 20 |xecuted - don't | 00003360 63 6f 6e 66 75 73 65 0a 09 09 09 09 09 09 3b 74 |confuse.......;t| 00003370 68 69 73 20 77 69 74 68 20 72 65 67 69 73 74 65 |his with registe| 00003380 72 20 72 34 20 69 74 73 65 6c 66 2e 0a 6f 70 5f |r r4 itself..op_| 00003390 6d 6f 76 5f 30 09 4d 4f 56 09 72 30 2c 20 23 30 |mov_0.MOV.r0, #0| 000033a0 2c 30 0a 6f 70 5f 6d 6f 76 5f 72 30 09 4d 4f 56 |,0.op_mov_r0.MOV| 000033b0 09 72 30 2c 20 72 30 0a 6f 70 5f 72 73 62 5f 30 |.r0, r0.op_rsb_0| 000033c0 09 52 53 42 09 72 30 2c 20 72 30 2c 20 23 30 2c |.RSB.r0, r0, #0,| 000033d0 30 0a 6f 70 5f 61 6e 64 73 5f 73 69 67 6e 09 41 |0.op_ands_sign.A| 000033e0 4e 44 53 09 72 30 2c 20 72 30 2c 20 23 26 38 30 |NDS.r0, r0, #&80| 000033f0 30 30 30 30 30 30 0a 6f 70 5f 72 73 62 6e 65 5f |000000.op_rsbne_| 00003400 30 09 52 53 42 4e 45 09 72 30 2c 20 72 30 2c 20 |0.RSBNE.r0, r0, | 00003410 23 30 2c 30 0a 6f 70 5f 73 75 62 5f 30 5f 30 09 |#0,0.op_sub_0_0.| 00003420 53 55 42 09 72 30 2c 20 72 30 2c 20 72 30 0a 6f |SUB.r0, r0, r0.o| 00003430 70 5f 6f 72 72 5f 30 09 4f 52 52 09 72 30 2c 20 |p_orr_0.ORR.r0, | 00003440 72 30 2c 20 23 30 2c 30 0a 6f 70 5f 61 64 64 5f |r0, #0,0.op_add_| 00003450 30 5f 30 09 41 44 44 09 72 30 2c 20 72 30 2c 20 |0_0.ADD.r0, r0, | 00003460 72 30 0a 6f 70 5f 73 75 62 5f 30 5f 30 5f 6c 73 |r0.op_sub_0_0_ls| 00003470 72 09 53 55 42 09 72 30 2c 20 72 30 2c 20 72 30 |r.SUB.r0, r0, r0| 00003480 2c 20 4c 53 52 20 23 33 32 09 3b 6e 62 20 4c 53 |, LSR #32.;nb LS| 00003490 52 20 23 33 32 20 72 65 70 72 65 73 65 6e 74 65 |R #32 represente| 000034a0 64 20 69 6e 20 62 69 74 20 66 69 65 6c 64 20 62 |d in bit field b| 000034b0 79 20 4c 53 52 20 23 30 0a 6f 70 5f 61 64 64 5f |y LSR #0.op_add_| 000034c0 30 5f 30 5f 6c 73 72 09 41 44 44 09 72 30 2c 20 |0_0_lsr.ADD.r0, | 000034d0 72 30 2c 20 72 30 2c 20 4c 53 52 20 23 33 32 0a |r0, r0, LSR #32.| 000034e0 6f 70 5f 6d 6f 76 5f 72 30 5f 6c 73 72 09 4d 4f |op_mov_r0_lsr.MO| 000034f0 56 09 72 30 2c 20 72 30 2c 20 4c 53 52 20 23 33 |V.r0, r0, LSR #3| 00003500 32 0a 6f 70 5f 72 73 62 5f 30 5f 30 09 52 53 42 |2.op_rsb_0_0.RSB| 00003510 09 72 30 2c 20 72 30 2c 20 72 30 0a 6f 70 5f 73 |.r0, r0, r0.op_s| 00003520 75 62 73 5f 30 5f 30 09 53 55 42 53 09 72 30 2c |ubs_0_0.SUBS.r0,| 00003530 20 72 30 2c 20 72 30 0a 6f 70 5f 73 75 62 6d 69 | r0, r0.op_submi| 00003540 5f 30 5f 6e 31 09 53 55 42 4d 49 09 72 30 2c 20 |_0_n1.SUBMI.r0, | 00003550 72 30 2c 20 23 31 0a 6f 70 5f 61 64 64 67 65 5f |r0, #1.op_addge_| 00003560 30 5f 6e 31 09 41 44 44 47 45 09 72 30 2c 20 72 |0_n1.ADDGE.r0, r| 00003570 30 2c 20 23 31 0a 6f 70 5f 61 64 64 6d 69 5f 30 |0, #1.op_addmi_0| 00003580 5f 30 09 41 44 44 4d 49 09 72 30 2c 20 72 30 2c |_0.ADDMI.r0, r0,| 00003590 20 72 30 0a 6f 70 5f 63 6d 70 5f 30 5f 30 09 43 | r0.op_cmp_0_0.C| 000035a0 4d 50 09 72 30 2c 20 72 30 0a 6f 70 5f 73 75 62 |MP.r0, r0.op_sub| 000035b0 67 65 5f 30 5f 30 09 53 55 42 47 45 09 72 30 2c |ge_0_0.SUBGE.r0,| 000035c0 20 72 30 2c 20 72 30 0a 6f 70 5f 74 65 71 73 5f | r0, r0.op_teqs_| 000035d0 73 69 67 6e 09 54 45 51 53 09 72 30 2c 20 23 26 |sign.TEQS.r0, #&| 000035e0 38 30 30 30 30 30 30 30 0a 6f 70 5f 72 73 62 65 |80000000.op_rsbe| 000035f0 71 5f 30 09 52 53 42 45 51 09 72 30 2c 20 72 30 |q_0.RSBEQ.r0, r0| 00003600 2c 20 23 30 2c 30 0a 0a 6f 70 5f 66 64 31 09 09 |, #0,0..op_fd1..| 00003610 44 43 44 09 30 0a 6f 70 5f 66 64 32 09 09 44 43 |DCD.0.op_fd2..DC| 00003620 44 09 30 0a 6f 70 5f 66 64 33 09 09 44 43 44 09 |D.0.op_fd3..DCD.| 00003630 30 0a 6f 70 5f 66 64 34 09 09 44 43 44 09 30 0a |0.op_fd4..DCD.0.| 00003640 6f 70 5f 66 6d 31 09 09 44 43 44 09 30 0a 6f 70 |op_fm1..DCD.0.op| 00003650 5f 66 6d 32 09 09 44 43 44 09 30 0a 6f 70 5f 66 |_fm2..DCD.0.op_f| 00003660 6d 33 09 09 44 43 44 09 30 0a 6f 70 5f 66 6d 34 |m3..DCD.0.op_fm4| 00003670 09 09 44 43 44 09 30 0a 6f 70 5f 66 6d 35 09 09 |..DCD.0.op_fm5..| 00003680 44 43 44 09 30 0a 6f 70 5f 66 6d 36 09 09 44 43 |DCD.0.op_fm6..DC| 00003690 44 09 30 0a 0a 61 73 74 6b 09 25 09 31 36 2a 38 |D.0..astk.%.16*8| 000036a0 09 09 09 09 3b 31 36 20 65 6e 74 72 69 65 73 20 |....;16 entries | 000036b0 6f 66 20 32 20 77 6f 72 64 73 20 28 61 6e 20 65 |of 2 words (an e| 000036c0 6d 70 74 79 20 61 73 63 65 6e 64 69 6e 67 20 73 |mpty ascending s| 000036d0 74 61 63 6b 29 0a 61 73 74 6b 5f 65 6e 64 0a 0a |tack).astk_end..| 000036e0 66 61 73 74 64 69 76 61 69 64 0a 09 43 4d 50 09 |fastdivaid..CMP.| 000036f0 73 74 6b 2c 20 73 74 6b 6c 0a 09 4d 4f 56 47 45 |stk, stkl..MOVGE| 00003700 09 72 30 2c 20 23 2d 35 0a 09 4c 44 4d 47 45 46 |.r0, #-5..LDMGEF| 00003710 44 09 73 70 21 2c 20 7b 70 63 7d 5e 0a 09 4d 4f |D.sp!, {pc}^..MO| 00003720 56 09 74 34 2c 20 66 6e 09 09 09 09 3b 74 34 20 |V.t4, fn....;t4 | 00003730 68 6f 6c 64 73 20 6c 6f 63 61 6c 20 63 6f 6e 73 |holds local cons| 00003740 74 25 0a 09 4d 4f 56 09 74 31 2c 20 6c 72 0a 09 |t%..MOV.t1, lr..| 00003750 42 4c 09 62 69 74 70 61 74 6c 65 6e 09 09 09 3b |BL.bitpatlen...;| 00003760 66 6e 20 6e 6f 77 20 68 6f 6c 64 73 20 42 61 73 |fn now holds Bas| 00003770 69 63 20 6c 73 25 0a 09 53 55 42 09 74 33 2c 20 |ic ls%..SUB.t3, | 00003780 66 6e 2c 20 23 31 0a 09 53 54 4d 45 41 09 73 74 |fn, #1..STMEA.st| 00003790 6b 21 2c 20 7b 74 33 2c 20 74 31 7d 09 09 09 3b |k!, {t3, t1}...;| 000037a0 73 74 61 63 6b 20 6c 73 25 2d 31 20 61 62 6f 76 |stack ls%-1 abov| 000037b0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 |e return address| 000037c0 0a 09 41 4e 44 53 09 74 32 2c 20 74 34 2c 20 23 |..ANDS.t2, t4, #| 000037d0 33 0a 09 43 4d 50 4e 45 09 74 32 2c 20 23 32 0a |3..CMPNE.t2, #2.| 000037e0 09 4d 4f 56 45 51 09 72 30 2c 20 23 2d 36 0a 09 |.MOVEQ.r0, #-6..| 000037f0 4c 44 4d 45 51 46 44 09 73 70 21 2c 20 7b 70 63 |LDMEQFD.sp!, {pc| 00003800 7d 5e 0a 09 43 4d 50 09 74 32 2c 20 23 31 0a 09 |}^..CMP.t2, #1..| 00003810 53 55 42 45 51 09 74 34 2c 20 74 34 2c 20 23 31 |SUBEQ.t4, t4, #1| 00003820 0a 09 41 44 44 4e 45 09 74 34 2c 20 74 34 2c 20 |..ADDNE.t4, t4, | 00003830 23 31 0a 09 4d 4f 56 4e 45 09 74 31 2c 20 23 31 |#1..MOVNE.t1, #1| 00003840 0a 09 53 54 52 4e 45 09 74 31 2c 20 73 75 62 66 |..STRNE.t1, subf| 00003850 6c 61 67 0a 09 4d 4f 56 09 66 6e 2c 20 74 34 0a |lag..MOV.fn, t4.| 00003860 09 42 4c 09 70 6f 77 65 72 6f 66 32 0a 09 4d 4f |.BL.powerof2..MO| 00003870 56 09 74 34 2c 20 74 34 2c 20 4c 53 52 20 66 6e |V.t4, t4, LSR fn| 00003880 09 09 09 3b 6c 6f 63 61 6c 20 63 6f 6e 73 74 20 |...;local const | 00003890 3d 20 63 6f 6e 73 74 20 3e 3e 3e 20 70 6f 77 65 |= const >>> powe| 000038a0 72 6f 66 32 28 63 6f 6e 73 74 29 0a 09 43 4d 50 |rof2(const)..CMP| 000038b0 09 74 34 2c 20 23 31 0a 09 42 4e 45 09 66 64 61 |.t4, #1..BNE.fda| 000038c0 5f 63 6f 6e 73 74 6f 76 65 72 6f 6e 65 0a 09 4c |_constoverone..L| 000038d0 44 52 09 74 31 2c 20 69 6e 69 74 69 61 6c 5f 63 |DR.t1, initial_c| 000038e0 70 74 72 0a 09 43 4d 50 09 74 31 2c 20 23 30 0a |ptr..CMP.t1, #0.| 000038f0 09 42 4e 45 09 66 64 61 5f 6c 31 0a 09 43 4d 50 |.BNE.fda_l1..CMP| 00003900 09 74 32 2c 20 23 31 09 09 09 09 3b 45 51 20 69 |.t2, #1....;EQ i| 00003910 6d 70 6c 69 65 73 20 64 69 76 69 6e 73 74 24 3d |mplies divinst$=| 00003920 22 41 44 44 22 0a 09 41 44 44 45 51 09 63 70 74 |"ADD"..ADDEQ.cpt| 00003930 72 2c 20 63 70 74 72 2c 20 23 34 0a 09 41 44 44 |r, cptr, #4..ADD| 00003940 4e 45 09 63 70 74 72 2c 20 63 70 74 72 2c 20 23 |NE.cptr, cptr, #| 00003950 38 0a 09 42 09 66 64 61 5f 65 78 69 74 0a 66 64 |8..B.fda_exit.fd| 00003960 61 5f 6c 31 09 4c 44 52 09 74 33 2c 20 5b 73 74 |a_l1.LDR.t3, [st| 00003970 6b 2c 20 23 2d 34 5d 09 09 09 3b 67 65 74 20 62 |k, #-4]...;get b| 00003980 61 63 6b 20 6c 73 25 2d 31 0a 09 43 4d 50 09 74 |ack ls%-1..CMP.t| 00003990 32 2c 20 23 31 0a 09 4c 44 52 4e 45 09 74 31 2c |2, #1..LDRNE.t1,| 000039a0 20 6f 70 5f 66 64 31 0a 09 53 54 52 4e 45 09 74 | op_fd1..STRNE.t| 000039b0 31 2c 20 5b 63 70 74 72 5d 2c 20 23 34 09 09 09 |1, [cptr], #4...| 000039c0 3b 61 64 64 20 6f 75 74 71 2c 20 6e 75 6d 2c 20 |;add outq, num, | 000039d0 6e 75 6d 0a 09 4c 44 52 4e 45 09 74 31 2c 20 6f |num..LDRNE.t1, o| 000039e0 70 5f 66 64 32 0a 09 4c 44 52 45 51 09 74 31 2c |p_fd2..LDREQ.t1,| 000039f0 20 6f 70 5f 66 64 33 0a 09 4f 52 52 09 74 31 2c | op_fd3..ORR.t1,| 00003a00 20 74 31 2c 20 74 33 2c 20 4c 53 4c 20 23 37 0a | t1, t3, LSL #7.| 00003a10 09 53 54 52 09 74 31 2c 20 5b 63 70 74 72 5d 2c |.STR.t1, [cptr],| 00003a20 20 23 34 09 09 09 3b 69 66 20 4e 45 20 27 73 75 | #4...;if NE 'su| 00003a30 62 20 6f 75 74 71 2c 20 6f 75 74 71 2c 20 6e 75 |b outq, outq, nu| 00003a40 6d 2c 20 6c 73 72 20 23 6c 73 25 2d 31 27 0a 09 |m, lsr #ls%-1'..| 00003a50 42 09 66 64 61 5f 65 78 69 74 09 09 09 3b 65 6c |B.fda_exit...;el| 00003a60 73 65 20 20 27 61 64 64 20 6f 75 74 71 2c 20 6e |se 'add outq, n| 00003a70 75 6d 2c 20 6e 75 6d 2c 20 6c 73 72 20 23 6c 73 |um, num, lsr #ls| 00003a80 25 2d 31 27 0a 66 64 61 5f 63 6f 6e 73 74 6f 76 |%-1'.fda_constov| 00003a90 65 72 6f 6e 65 0a 09 43 4d 50 09 74 32 2c 20 23 |erone..CMP.t2, #| 00003aa0 31 0a 09 42 45 51 09 66 64 61 5f 6c 32 0a 09 09 |1..BEQ.fda_l2...| 00003ab0 09 09 09 09 3b 63 6f 6e 73 74 3e 31 20 26 20 64 |....;const>1 & d| 00003ac0 69 76 69 6e 73 74 24 3d 22 53 55 42 22 0a 09 4d |ivinst$="SUB"..M| 00003ad0 4f 56 09 66 6e 2c 20 74 34 09 09 09 09 3b 66 69 |OV.fn, t4....;fi| 00003ae0 72 73 74 20 72 65 63 75 72 73 65 0a 09 42 4c 09 |rst recurse..BL.| 00003af0 66 61 73 74 64 69 76 61 69 64 0a 09 4c 44 52 09 |fastdivaid..LDR.| 00003b00 74 31 2c 20 69 6e 69 74 69 61 6c 5f 63 70 74 72 |t1, initial_cptr| 00003b10 0a 09 43 4d 50 09 74 31 2c 20 23 30 0a 09 41 44 |..CMP.t1, #0..AD| 00003b20 44 45 51 09 63 70 74 72 2c 20 63 70 74 72 2c 20 |DEQ.cptr, cptr, | 00003b30 23 34 0a 09 42 45 51 09 66 64 61 5f 65 78 69 74 |#4..BEQ.fda_exit| 00003b40 0a 09 4c 44 52 09 66 6e 2c 20 5b 73 74 6b 2c 20 |..LDR.fn, [stk, | 00003b50 23 2d 34 5d 0a 09 4c 44 52 09 74 31 2c 20 6f 70 |#-4]..LDR.t1, op| 00003b60 5f 66 64 32 0a 09 4f 52 52 09 74 31 2c 20 74 31 |_fd2..ORR.t1, t1| 00003b70 2c 20 66 6e 2c 20 4c 53 4c 20 23 37 0a 09 53 54 |, fn, LSL #7..ST| 00003b80 52 09 74 31 2c 20 5b 63 70 74 72 5d 2c 20 23 34 |R.t1, [cptr], #4| 00003b90 0a 09 42 09 66 64 61 5f 65 78 69 74 0a 66 64 61 |..B.fda_exit.fda| 00003ba0 5f 6c 32 09 09 09 09 09 09 3b 63 6f 6e 73 74 3e |_l2......;const>| 00003bb0 31 20 26 20 64 69 76 69 6e 73 74 24 3d 22 41 44 |1 & divinst$="AD| 00003bc0 44 22 0a 09 4d 4f 56 09 66 6e 2c 20 74 34 09 09 |D"..MOV.fn, t4..| 00003bd0 09 09 3b 66 69 72 73 74 20 72 65 63 75 72 73 65 |..;first recurse| 00003be0 0a 09 42 4c 09 66 61 73 74 64 69 76 61 69 64 0a |..BL.fastdivaid.| 00003bf0 09 4c 44 52 09 74 31 2c 20 69 6e 69 74 69 61 6c |.LDR.t1, initial| 00003c00 5f 63 70 74 72 0a 09 43 4d 50 09 74 31 2c 20 23 |_cptr..CMP.t1, #| 00003c10 30 0a 09 41 44 44 45 51 09 63 70 74 72 2c 20 63 |0..ADDEQ.cptr, c| 00003c20 70 74 72 2c 20 23 34 0a 09 42 45 51 09 66 64 61 |ptr, #4..BEQ.fda| 00003c30 5f 65 78 69 74 0a 09 4c 44 52 09 66 6e 2c 20 5b |_exit..LDR.fn, [| 00003c40 73 74 6b 2c 20 23 2d 34 5d 0a 09 4c 44 52 09 74 |stk, #-4]..LDR.t| 00003c50 31 2c 20 6f 70 5f 66 64 34 0a 09 4f 52 52 09 74 |1, op_fd4..ORR.t| 00003c60 31 2c 20 74 31 2c 20 66 6e 2c 20 4c 53 4c 20 23 |1, t1, fn, LSL #| 00003c70 37 0a 09 53 54 52 09 74 31 2c 20 5b 63 70 74 72 |7..STR.t1, [cptr| 00003c80 5d 2c 20 23 34 0a 66 64 61 5f 65 78 69 74 0a 09 |], #4.fda_exit..| 00003c90 4c 44 4d 45 41 09 73 74 6b 21 2c 20 7b 66 6e 2c |LDMEA.stk!, {fn,| 00003ca0 20 74 32 7d 09 09 09 3b 64 69 73 63 61 72 64 20 | t2}...;discard | 00003cb0 6c 73 25 2d 31 20 26 20 72 65 74 75 72 6e 0a 09 |ls%-1 & return..| 00003cc0 4d 4f 56 53 09 70 63 2c 20 74 32 0a 0a 66 61 73 |MOVS.pc, t2..fas| 00003cd0 74 6d 75 6c 0a 09 43 4d 50 09 73 74 6b 2c 20 73 |tmul..CMP.stk, s| 00003ce0 74 6b 6c 0a 09 4d 4f 56 47 45 09 72 30 2c 20 23 |tkl..MOVGE.r0, #| 00003cf0 2d 35 0a 09 4c 44 4d 47 45 46 44 09 73 70 21 2c |-5..LDMGEFD.sp!,| 00003d00 20 7b 70 63 7d 5e 0a 09 53 54 4d 45 41 09 73 74 | {pc}^..STMEA.st| 00003d10 6b 21 2c 20 7b 6c 72 7d 0a 09 41 4e 44 53 09 74 |k!, {lr}..ANDS.t| 00003d20 31 2c 20 66 6e 2c 20 23 33 09 09 09 3b 66 6e 20 |1, fn, #3...;fn | 00003d30 68 6f 6c 64 73 20 6c 6f 63 61 6c 20 63 6f 6e 73 |holds local cons| 00003d40 74 0a 09 43 4d 50 4e 45 09 74 31 2c 20 23 32 0a |t..CMPNE.t1, #2.| 00003d50 09 42 4e 45 09 66 6d 5f 74 72 79 5f 6f 6e 65 0a |.BNE.fm_try_one.| 00003d60 09 4d 4f 56 09 74 34 2c 20 66 6e 0a 09 42 4c 09 |.MOV.t4, fn..BL.| 00003d70 70 6f 77 65 72 6f 66 32 0a 09 53 54 4d 45 41 09 |powerof2..STMEA.| 00003d80 73 74 6b 21 2c 20 7b 66 6e 7d 09 09 09 3b 72 65 |stk!, {fn}...;re| 00003d90 74 75 72 6e 20 61 64 64 72 65 73 73 20 26 20 6e |turn address & n| 00003da0 25 20 28 66 6e 29 20 20 73 74 61 63 6b 65 64 2c |% (fn) stacked,| 00003db0 20 6c 6f 63 61 6c 20 63 6f 6e 73 74 20 69 6e 20 | local const in | 00003dc0 74 34 0a 09 4d 4f 56 09 74 34 2c 20 74 34 2c 20 |t4..MOV.t4, t4, | 00003dd0 4c 53 52 20 66 6e 0a 09 43 4d 50 09 74 34 2c 20 |LSR fn..CMP.t4, | 00003de0 23 31 0a 09 4c 44 52 45 51 09 74 32 2c 20 6f 70 |#1..LDREQ.t2, op| 00003df0 5f 66 6d 31 0a 09 42 45 51 09 66 6d 5f 65 78 69 |_fm1..BEQ.fm_exi| 00003e00 74 0a 09 4d 4f 56 09 66 6e 2c 20 74 34 0a 09 42 |t..MOV.fn, t4..B| 00003e10 4c 09 66 61 73 74 6d 75 6c 09 09 09 09 3b 72 65 |L.fastmul....;re| 00003e20 63 75 72 73 65 0a 09 4c 44 52 09 66 6e 2c 20 5b |curse..LDR.fn, [| 00003e30 73 74 6b 2c 20 23 2d 34 5d 0a 09 4c 44 52 09 74 |stk, #-4]..LDR.t| 00003e40 32 2c 20 6f 70 5f 66 6d 32 0a 09 42 09 66 6d 5f |2, op_fm2..B.fm_| 00003e50 65 78 69 74 0a 66 6d 5f 74 72 79 5f 6f 6e 65 0a |exit.fm_try_one.| 00003e60 09 43 4d 50 09 74 31 2c 20 23 31 0a 09 42 4e 45 |.CMP.t1, #1..BNE| 00003e70 09 66 6d 5f 69 73 5f 74 68 72 65 65 0a 09 53 55 |.fm_is_three..SU| 00003e80 42 09 66 6e 2c 20 66 6e 2c 20 23 31 0a 09 4d 4f |B.fn, fn, #1..MO| 00003e90 56 09 74 34 2c 20 66 6e 0a 09 42 4c 09 70 6f 77 |V.t4, fn..BL.pow| 00003ea0 65 72 6f 66 32 0a 09 53 54 4d 45 41 09 73 74 6b |erof2..STMEA.stk| 00003eb0 21 2c 20 7b 66 6e 7d 09 09 09 3b 72 65 74 75 72 |!, {fn}...;retur| 00003ec0 6e 20 61 64 64 72 65 73 73 20 26 20 6e 25 20 28 |n address & n% (| 00003ed0 66 6e 29 20 20 73 74 61 63 6b 65 64 2c 20 6c 6f |fn) stacked, lo| 00003ee0 63 61 6c 20 63 6f 6e 73 74 20 69 6e 20 74 34 0a |cal const in t4.| 00003ef0 09 4d 4f 56 09 74 34 2c 20 74 34 2c 20 4c 53 52 |.MOV.t4, t4, LSR| 00003f00 20 66 6e 0a 09 43 4d 50 09 74 34 2c 20 23 31 0a | fn..CMP.t4, #1.| 00003f10 09 4c 44 52 45 51 09 74 32 2c 20 6f 70 5f 66 6d |.LDREQ.t2, op_fm| 00003f20 33 0a 09 42 45 51 09 66 6d 5f 65 78 69 74 0a 09 |3..BEQ.fm_exit..| 00003f30 4d 4f 56 09 66 6e 2c 20 74 34 0a 09 42 4c 09 66 |MOV.fn, t4..BL.f| 00003f40 61 73 74 6d 75 6c 09 09 09 09 3b 72 65 63 75 72 |astmul....;recur| 00003f50 73 65 0a 09 4c 44 52 09 66 6e 2c 20 5b 73 74 6b |se..LDR.fn, [stk| 00003f60 2c 20 23 2d 34 5d 0a 09 4c 44 52 09 74 32 2c 20 |, #-4]..LDR.t2, | 00003f70 6f 70 5f 66 6d 34 0a 09 42 09 66 6d 5f 65 78 69 |op_fm4..B.fm_exi| 00003f80 74 0a 66 6d 5f 69 73 5f 74 68 72 65 65 0a 09 41 |t.fm_is_three..A| 00003f90 44 44 09 66 6e 2c 20 66 6e 2c 20 23 31 0a 09 4d |DD.fn, fn, #1..M| 00003fa0 4f 56 09 74 34 2c 20 66 6e 0a 09 42 4c 09 70 6f |OV.t4, fn..BL.po| 00003fb0 77 65 72 6f 66 32 0a 09 53 54 4d 45 41 09 73 74 |werof2..STMEA.st| 00003fc0 6b 21 2c 20 7b 66 6e 7d 09 09 09 3b 72 65 74 75 |k!, {fn}...;retu| 00003fd0 72 6e 20 61 64 64 72 65 73 73 20 26 20 6e 25 20 |rn address & n% | 00003fe0 28 66 6e 29 20 20 73 74 61 63 6b 65 64 2c 20 6c |(fn) stacked, l| 00003ff0 6f 63 61 6c 20 63 6f 6e 73 74 20 69 6e 20 74 34 |ocal const in t4| 00004000 0a 09 4d 4f 56 09 74 34 2c 20 74 34 2c 20 4c 53 |..MOV.t4, t4, LS| 00004010 52 20 66 6e 0a 09 43 4d 50 09 74 34 2c 20 23 31 |R fn..CMP.t4, #1| 00004020 0a 09 4c 44 52 45 51 09 74 32 2c 20 6f 70 5f 66 |..LDREQ.t2, op_f| 00004030 6d 35 0a 09 42 45 51 09 66 6d 5f 65 78 69 74 0a |m5..BEQ.fm_exit.| 00004040 09 4d 4f 56 09 66 6e 2c 20 74 34 0a 09 42 4c 09 |.MOV.fn, t4..BL.| 00004050 66 61 73 74 6d 75 6c 09 09 09 09 3b 72 65 63 75 |fastmul....;recu| 00004060 72 73 65 0a 09 4c 44 52 09 66 6e 2c 20 5b 73 74 |rse..LDR.fn, [st| 00004070 6b 2c 20 23 2d 34 5d 0a 09 4c 44 52 09 74 32 2c |k, #-4]..LDR.t2,| 00004080 20 6f 70 5f 66 6d 36 0a 09 42 09 66 6d 5f 65 78 | op_fm6..B.fm_ex| 00004090 69 74 0a 66 6d 5f 65 78 69 74 0a 09 4c 44 52 09 |it.fm_exit..LDR.| 000040a0 74 31 2c 20 69 6e 69 74 69 61 6c 5f 63 70 74 72 |t1, initial_cptr| 000040b0 0a 09 43 4d 50 09 74 31 2c 20 23 30 0a 09 41 44 |..CMP.t1, #0..AD| 000040c0 44 45 51 09 63 70 74 72 2c 20 63 70 74 72 2c 20 |DEQ.cptr, cptr, | 000040d0 23 34 0a 09 4f 52 52 4e 45 09 74 32 2c 20 74 32 |#4..ORRNE.t2, t2| 000040e0 2c 20 66 6e 2c 20 4c 53 4c 20 23 37 0a 09 53 54 |, fn, LSL #7..ST| 000040f0 52 4e 45 09 74 32 2c 20 5b 63 70 74 72 5d 2c 20 |RNE.t2, [cptr], | 00004100 23 34 0a 09 4c 44 4d 45 41 09 73 74 6b 21 2c 20 |#4..LDMEA.stk!, | 00004110 7b 66 6e 2c 20 74 32 7d 09 09 09 3b 64 69 73 63 |{fn, t2}...;disc| 00004120 61 72 64 20 6e 25 20 26 20 72 65 74 75 72 6e 0a |ard n% & return.| 00004130 09 4d 4f 56 53 09 70 63 2c 20 74 32 0a 0a 0a 09 |.MOVS.pc, t2....| 00004140 47 42 4c 41 09 63 6f 75 6e 74 65 72 0a 0a 62 69 |GBLA.counter..bi| 00004150 74 70 61 74 6c 65 6e 0a 09 4d 4f 56 53 09 74 32 |tpatlen..MOVS.t2| 00004160 2c 20 66 6e 0a 09 4d 4f 56 09 66 6e 2c 20 23 30 |, fn..MOV.fn, #0| 00004170 0a 63 6f 75 6e 74 65 72 09 53 45 54 41 09 33 31 |.counter.SETA.31| 00004180 0a 09 57 48 49 4c 45 09 63 6f 75 6e 74 65 72 3e |..WHILE.counter>| 00004190 30 0a 09 41 44 44 4e 45 09 66 6e 2c 20 66 6e 2c |0..ADDNE.fn, fn,| 000041a0 20 23 31 0a 09 4d 4f 56 4e 45 53 09 74 32 2c 20 | #1..MOVNES.t2, | 000041b0 74 32 2c 20 4c 53 52 20 23 31 0a 09 4d 4f 56 45 |t2, LSR #1..MOVE| 000041c0 51 53 09 70 63 2c 20 6c 72 0a 63 6f 75 6e 74 65 |QS.pc, lr.counte| 000041d0 72 09 53 45 54 41 09 63 6f 75 6e 74 65 72 2d 31 |r.SETA.counter-1| 000041e0 0a 09 57 45 4e 44 0a 09 41 44 44 09 66 6e 2c 20 |..WEND..ADD.fn, | 000041f0 66 6e 2c 20 23 31 0a 09 4d 4f 56 53 09 70 63 2c |fn, #1..MOVS.pc,| 00004200 20 6c 72 0a 0a 69 6d 6f 70 32 0a 09 4d 4f 56 09 | lr..imop2..MOV.| 00004210 74 31 2c 20 23 30 0a 63 6f 75 6e 74 65 72 09 53 |t1, #0.counter.S| 00004220 45 54 41 09 31 36 0a 09 57 48 49 4c 45 09 63 6f |ETA.16..WHILE.co| 00004230 75 6e 74 65 72 3e 30 0a 09 42 49 43 53 09 74 32 |unter>0..BICS.t2| 00004240 2c 20 66 6e 2c 20 23 32 35 35 0a 09 42 45 51 09 |, fn, #255..BEQ.| 00004250 69 6d 6f 70 32 5f 6c 31 0a 09 4d 4f 56 09 66 6e |imop2_l1..MOV.fn| 00004260 2c 20 66 6e 2c 20 52 4f 52 20 23 33 30 0a 09 41 |, fn, ROR #30..A| 00004270 44 44 09 74 31 2c 20 74 31 2c 20 23 32 35 36 0a |DD.t1, t1, #256.| 00004280 63 6f 75 6e 74 65 72 09 53 45 54 41 09 63 6f 75 |counter.SETA.cou| 00004290 6e 74 65 72 2d 31 0a 09 57 45 4e 44 0a 09 4d 4f |nter-1..WEND..MO| 000042a0 56 09 66 6e 2c 20 23 2d 31 0a 09 4d 4f 56 53 09 |V.fn, #-1..MOVS.| 000042b0 70 63 2c 20 6c 72 0a 69 6d 6f 70 32 5f 6c 31 0a |pc, lr.imop2_l1.| 000042c0 09 4f 52 52 09 66 6e 2c 20 74 31 2c 20 66 6e 0a |.ORR.fn, t1, fn.| 000042d0 09 4d 4f 56 53 09 70 63 2c 20 6c 72 0a 0a 70 6f |.MOVS.pc, lr..po| 000042e0 77 65 72 6f 66 32 0a 09 4d 4f 56 53 09 74 31 2c |werof2..MOVS.t1,| 000042f0 20 66 6e 0a 09 4d 4f 56 09 66 6e 2c 20 23 30 0a | fn..MOV.fn, #0.| 00004300 09 4d 4f 56 45 51 53 09 70 63 2c 20 6c 72 0a 63 |.MOVEQS.pc, lr.c| 00004310 6f 75 6e 74 65 72 09 53 45 54 41 09 33 31 0a 09 |ounter.SETA.31..| 00004320 57 48 49 4c 45 20 20 20 63 6f 75 6e 74 65 72 3e |WHILE counter>| 00004330 30 0a 09 4d 4f 56 53 09 74 31 2c 20 74 31 2c 20 |0..MOVS.t1, t1, | 00004340 4c 53 52 20 23 31 0a 09 41 44 44 43 43 09 66 6e |LSR #1..ADDCC.fn| 00004350 2c 20 66 6e 2c 20 23 31 0a 09 4d 4f 56 43 53 53 |, fn, #1..MOVCSS| 00004360 09 70 63 2c 20 6c 72 0a 63 6f 75 6e 74 65 72 09 |.pc, lr.counter.| 00004370 53 45 54 41 09 63 6f 75 6e 74 65 72 2d 31 0a 09 |SETA.counter-1..| 00004380 57 45 4e 44 0a 09 4d 4f 56 53 09 70 63 2c 20 6c |WEND..MOVS.pc, l| 00004390 72 0a 0a 0a 0a 09 45 4e 44 0a |r.....END.| 0000439a