Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_call_arm32_thumb_armhf.S @ 36:93f315f02a32
- armhf dyncall optimization/cleanup
author | cslag |
---|---|
date | Fri, 18 Dec 2015 01:07:40 +0100 |
parents | 3e629dc19168 |
children | f5577f6bf97a |
comparison
equal
deleted
inserted
replaced
35:61edd9cf8026 | 36:93f315f02a32 |
---|---|
42 .code 16 | 42 .code 16 |
43 #endif | 43 #endif |
44 // .arch armv6 | 44 // .arch armv6 |
45 // .fpu vfp | 45 // .fpu vfp |
46 | 46 |
47 /* | |
48 1st arg / r0 = funptr | |
49 2st arg / r1 = ptr to int args | |
50 3st arg / r2 = size | |
51 4st arg / r3 = ptr to float args | |
52 */ | |
47 GLOBAL_C(dcCall_arm32_armhf) | 53 GLOBAL_C(dcCall_arm32_armhf) |
48 .thumb_func | 54 .thumb_func |
49 ENTRY_C(dcCall_arm32_armhf) | 55 ENTRY_C(dcCall_arm32_armhf) |
50 | 56 |
51 /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ | 57 /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ |
60 | 66 |
61 mov r4 , r0 /* r4 = 'fptr' (1st argument is passed in r0). */ | 67 mov r4 , r0 /* r4 = 'fptr' (1st argument is passed in r0). */ |
62 mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */ | 68 mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */ |
63 | 69 |
64 /* Load 16 single-precision registers (= 8 double-precision registers). */ | 70 /* Load 16 single-precision registers (= 8 double-precision registers). */ |
65 flds s0, [r3,#0 ] | 71 fldmiad r3, {d0-d7} |
66 flds s1, [r3,#4 ] | |
67 flds s2, [r3,#8 ] | |
68 flds s3, [r3,#12] | |
69 flds s4, [r3,#16] | |
70 flds s5, [r3,#20] | |
71 flds s6, [r3,#24] | |
72 flds s7, [r3,#28] | |
73 flds s8, [r3,#32] | |
74 flds s9, [r3,#36] | |
75 flds s10, [r3,#40] | |
76 flds s11, [r3,#44] | |
77 flds s12, [r3,#48] | |
78 flds s13, [r3,#52] | |
79 flds s14, [r3,#56] | |
80 flds s15, [r3,#60] | |
81 | 72 |
82 sub r2 , #16 | 73 sub r2 , #16 |
83 cmp r2, #0 | 74 cmp r2, #0 |
84 ble armhf_call | 75 ble armhf_call |
85 | 76 |