b0 sincos shim was incorrect, causing crash
This commit is contained in:
parent
173d63ef8d
commit
f16af45f9e
@ -677,7 +677,7 @@ double_wrapper_section sincos
|
|||||||
bl sincostan_remainder
|
bl sincostan_remainder
|
||||||
pop {r2}
|
pop {r2}
|
||||||
mov lr, r2
|
mov lr, r2
|
||||||
b 1f
|
b 1f // continue with sincos
|
||||||
|
|
||||||
wrapper_func sincos
|
wrapper_func sincos
|
||||||
push {r2-r5, lr}
|
push {r2-r5, lr}
|
||||||
@ -688,8 +688,7 @@ wrapper_func sincos
|
|||||||
cmp r2, #9
|
cmp r2, #9
|
||||||
bge 2b
|
bge 2b
|
||||||
1:
|
1:
|
||||||
|
bl 2f // call the shim
|
||||||
bl 2f
|
|
||||||
pop {r4-r5}
|
pop {r4-r5}
|
||||||
stmia r4!, {r0, r1}
|
stmia r4!, {r0, r1}
|
||||||
stmia r5!, {r2, r3}
|
stmia r5!, {r2, r3}
|
||||||
@ -697,16 +696,7 @@ wrapper_func sincos
|
|||||||
|
|
||||||
2:
|
2:
|
||||||
shimmable_table_tail_call SF_TABLE_V3_FSINCOS sincos_shim_bootstrap
|
shimmable_table_tail_call SF_TABLE_V3_FSINCOS sincos_shim_bootstrap
|
||||||
#if PICO_DOUBLE_PROPAGATE_NANS
|
|
||||||
.align 2
|
|
||||||
1:
|
|
||||||
pop {r2, r3}
|
|
||||||
stmia r2!, {r0, r1}
|
|
||||||
mov lr, r3
|
|
||||||
pop {r3}
|
|
||||||
stmia r3!, {r0, r1}
|
|
||||||
bx lr
|
|
||||||
#endif
|
|
||||||
.thumb_func
|
.thumb_func
|
||||||
sincos_shim_bootstrap:
|
sincos_shim_bootstrap:
|
||||||
push {r2, r3, r4}
|
push {r2, r3, r4}
|
||||||
|
@ -1630,19 +1630,19 @@ double_section dsin_shim
|
|||||||
pop {r4-r7,r15}
|
pop {r4-r7,r15}
|
||||||
|
|
||||||
double_section dsincos_shim
|
double_section dsincos_shim
|
||||||
|
|
||||||
|
@ Note that this function returns in r0-r3
|
||||||
regular_func dsincos_shim
|
regular_func dsincos_shim
|
||||||
|
|
||||||
push {r4-r7,r14}
|
push {r4-r7,r14}
|
||||||
bl push_r8_r11
|
bl push_r8_r11
|
||||||
push {r2-r3}
|
|
||||||
bl dsincos_internal
|
bl dsincos_internal
|
||||||
mov r12,r0 @ save ε
|
mov r12,r0 @ save ε
|
||||||
bl dcos_finish
|
bl dcos_finish
|
||||||
push {r0,r1}
|
push {r0,r1}
|
||||||
mov r0,r12
|
mov r0,r12
|
||||||
bl dsin_finish
|
bl dsin_finish
|
||||||
pop {r2,r3,r4,r5}
|
pop {r2,r3}
|
||||||
stmia r4!, {r0, r1}
|
|
||||||
stmia r5!, {r2, r3}
|
|
||||||
bl pop_r8_r11
|
bl pop_r8_r11
|
||||||
pop {r4-r7,r15}
|
pop {r4-r7,r15}
|
||||||
|
|
||||||
|
@ -288,6 +288,8 @@ double bb = 1;
|
|||||||
int main() {
|
int main() {
|
||||||
setup_default_uart();
|
setup_default_uart();
|
||||||
|
|
||||||
|
bool fail = false;
|
||||||
|
|
||||||
printf("%d\n", aa < bb);
|
printf("%d\n", aa < bb);
|
||||||
for(double a = -1; a <= 1; a++) {
|
for(double a = -1; a <= 1; a++) {
|
||||||
for(double b = -1; b <= 1; b++) {
|
for(double b = -1; b <= 1; b++) {
|
||||||
@ -314,6 +316,10 @@ int main() {
|
|||||||
double s, c;
|
double s, c;
|
||||||
sincos(x, &s, &c);
|
sincos(x, &s, &c);
|
||||||
printf("SINCOS %10.18f %10.18f\n", s, c);
|
printf("SINCOS %10.18f %10.18f\n", s, c);
|
||||||
|
if (s != sin(x) || c != cos(x)) {
|
||||||
|
printf("SINCOS mismatch\n");
|
||||||
|
fail = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PICO_DOUBLE_PROPAGATE_NANS
|
#if PICO_DOUBLE_PROPAGATE_NANS
|
||||||
@ -412,23 +418,18 @@ int main() {
|
|||||||
printf("%g %10.18g %10.18g, %10.18g, %10.18g %10.18g\n", x, f, x + 0.37777777777777777777777777777,
|
printf("%g %10.18g %10.18g, %10.18g, %10.18g %10.18g\n", x, f, x + 0.37777777777777777777777777777,
|
||||||
x - 0.377777777777777777777777777777, g, 123456789.0 / x);
|
x - 0.377777777777777777777777777777, g, 123456789.0 / x);
|
||||||
}
|
}
|
||||||
if (test_cdcmpeq() || test_cdcmple() ||
|
|
||||||
test_dcmpun() || test_cmple_gt() || test_cmplt_ge()) {
|
if (fail ||
|
||||||
|
test_cdcmpeq() ||
|
||||||
|
test_cdcmple() ||
|
||||||
|
test_dcmpun() ||
|
||||||
|
test_cmple_gt() ||
|
||||||
|
test_cmplt_ge()) {
|
||||||
printf("FAILED\n");
|
printf("FAILED\n");
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
printf("PASSED\n");
|
printf("PASSED\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_cdcmpeq() || test_cdcmple() ||
|
|
||||||
test_dcmpun() || test_cmple_gt() || test_cmplt_ge()) {
|
|
||||||
printf("FAILED\n");
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
printf("PASSED\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user