diff options
author | Campbell Barton <ideasman42@gmail.com> | 2016-09-25 04:40:18 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2016-09-25 05:19:42 +0300 |
commit | 05dbd650986717e9c131b06943b38f6d96a4903b (patch) | |
tree | 39e76072d628f1e63ba05ec0bbd1c2eaf3162bd6 /extern | |
parent | d9b242f5fbd1c7cdd3a59663250ac603dfa9ad84 (diff) |
Curve Fitting: inline dot-product (avoid temp vector)
Diffstat (limited to 'extern')
-rw-r--r-- | extern/curve_fit_nd/intern/curve_fit_cubic.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/extern/curve_fit_nd/intern/curve_fit_cubic.c b/extern/curve_fit_nd/intern/curve_fit_cubic.c index 1ca38505e19..ea482a1a012 100644 --- a/extern/curve_fit_nd/intern/curve_fit_cubic.c +++ b/extern/curve_fit_nd/intern/curve_fit_cubic.c @@ -665,13 +665,11 @@ static void cubic_from_points( double alpha_l, alpha_r; #ifdef USE_VLA double a[2][dims]; - double tmp[dims]; #else double *a[2] = { alloca(sizeof(double) * dims), alloca(sizeof(double) * dims), }; - double *tmp = alloca(sizeof(double) * dims); #endif { @@ -682,22 +680,22 @@ static void cubic_from_points( mul_vnvn_fl(a[0], tan_l, B1(u_prime[i]), dims); mul_vnvn_fl(a[1], tan_r, B2(u_prime[i]), dims); - c[0][0] += dot_vnvn(a[0], a[0], dims); - c[0][1] += dot_vnvn(a[0], a[1], dims); - c[1][1] += dot_vnvn(a[1], a[1], dims); + const double b0_plus_b1 = B0plusB1(u_prime[i]); + const double b2_plus_b3 = B2plusB3(u_prime[i]); - c[1][0] = c[0][1]; + /* inline dot product */ + for (uint j = 0; j < dims; j++) { + const double tmp = (pt[j] - (p0[j] * b0_plus_b1)) + (p3[j] * b2_plus_b3); - { - const double b0_plus_b1 = B0plusB1(u_prime[i]); - const double b2_plus_b3 = B2plusB3(u_prime[i]); - for (uint j = 0; j < dims; j++) { - tmp[j] = (pt[j] - (p0[j] * b0_plus_b1)) + (p3[j] * b2_plus_b3); - } + x[0] += a[0][j] * tmp; + x[1] += a[1][j] * tmp; - x[0] += dot_vnvn(a[0], tmp, dims); - x[1] += dot_vnvn(a[1], tmp, dims); + c[0][0] += a[0][j] * a[0][j]; + c[0][1] += a[0][j] * a[1][j]; + c[1][1] += a[1][j] * a[1][j]; } + + c[1][0] = c[0][1]; } double det_C0_C1 = c[0][0] * c[1][1] - c[0][1] * c[1][0]; |