poly.h
1 /* 2 * Copyright (C) 2018-2020, Advanced Micro Devices, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without modification, 5 * are permitted provided that the following conditions are met: 6 * 1. Redistributions of source code must retain the above copyright notice, 7 * this list of conditions and the following disclaimer. 8 * 2. Redistributions in binary form must reproduce the above copyright notice, 9 * this list of conditions and the following disclaimer in the documentation 10 * and/or other materials provided with the distribution. 11 * 3. Neither the name of the copyright holder nor the names of its contributors 12 * may be used to endorse or promote products derived from this software without 13 * specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 21 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 * POSSIBILITY OF SUCH DAMAGE. 25 * 26 */ 27 28 #ifndef __LIBM_POLY_H__ 29 #define __LIBM_POLY_H__ 30 31 /* 32 * poly = C1 + C2*r + C3*r^2 + C4*r^3 + C5 *r^4 33 * = (C1 + C2*r) + r^2(C3 + C4*r) + r^4*C5 34 */ 35 #define POLY_EVAL_5(r, c0, c1, c2, c3, c4) ({ \ 36 __typeof(r) t1, t2, r2, q; \ 37 t1 = c0 + c1*r; \ 38 t2 = c2 + c3*r; \ 39 r2 = r * r; \ 40 q = t1 + r2 * t2; \ 41 q = q + r2 * r2 * c4; \ 42 q; \ 43 }) 44 45 /* 46 * poly = C1 + C2*r + C3*r^2 + C4*r^3 + C5 *r^4 + C6*r^5 47 * = (C1 + C2*r) + r^2(C3 + C4*r) + r^4(C5 + C6*r) 48 */ 49 #define POLY_EVAL_6(r, c0, c1, c2, c3, c4, c5) ({ \ 50 __typeof(r) t1, t2, t3, r2, q; \ 51 t1 = c0 + c1*r; \ 52 t2 = c2 + c3*r; \ 53 r2 = r * r; \ 54 t3 = c4 + c5*r; \ 55 q = t1 + r2 * t2; \ 56 q = q + r2 * r2 * t3; \ 57 q; \ 58 }) 59 60 /* 61 * poly = C1 + C2*r + C3*r^2 + C4*r^3 + C5 *r^4 + C6*r^5 \ 62 * + C7*r^6 + C8*r^7 + C9*r^8 63 * 64 * = ((C6+C7*x)*x2 + (C4+C5*x))*x4 + 65 * (C8+C9*x)*x8) + 66 * ((C2+C3*x)*x2 + (C0+C1*x)); 67 */ 68 #define POLY_EVAL_9(r, c0, c1, c2, c3, c4, c5, c6, c7, c8) ({ \ 69 __typeof(r) a1, a2, a3, a4, b1, b2, q; \ 70 __typeof(r) r2, r4; \ 71 a1 = c2*r + c1; \ 72 a2 = c4*r + c3; \ 73 r2 = r * r; \ 74 a3 = c6*r + c5; \ 75 r4 = r2 * r2; \ 76 a4 = c8*r + c7; \ 77 \ 78 b1 = a4*r4 + a3*r2 + a2; \ 79 b2 = a1*r2 + c0*r; \ 80 q = b1*r4 + b2; \ 81 q; \ 82 }) 83 84 85 /* 86 * poly = x * (C1 + C2*x^2 + C3*x^4 + C4*x^6 + C5*x^8 + \ 87 * C6*x^10 + C7*x^12 + C8*x^14) 88 * 15 degree polynomial with only even terms 89 */ 90 #define POLY_EVAL_EVEN_15(r, c1, c2, c3, c4, c5, c6, c7, c8) ({ \ 91 __typeof(r) a1, a2, a3, a4, b1, b2 ,q; \ 92 __typeof(r) r2, r4, r8, r12; \ 93 r2 = r * r; \ 94 r4 = r2 * r2; \ 95 r8 = r4 * r4; \ 96 r12 = r8 * r4; \ 97 a1 = c1 + c2*r2; \ 98 a2 = c3 + c4*r2; \ 99 a3 = c5 + c6*r2; \ 100 a4 = c7 + c8*r2; \ 101 \ 102 b1 = a1 + a2*r4; \ 103 b2 = r8*a3 + r12*a4; \ 104 \ 105 q = r*(b1 + b2); \ 106 q; \ 107 }) 108 109 110 #define POLY_EVAL_ODD_17(r, c1, c2, c3, c4, c5, c6, c7, c8) ({ \ 111 __typeof(r) a1, a2, a3, a4, b1, b2 ,q; \ 112 __typeof(r) r2, r4, r6, r10, r14; \ 113 r2 = r * r; \ 114 r4 = r2 * r2; \ 115 r6 = r4 * r2; \ 116 r10 = r6 * r4; \ 117 r14 = r10 * r4; \ 118 a1 = c1 + c2*r2; \ 119 a2 = c3 + c4*r2; \ 120 a3 = c5 + c6*r2; \ 121 a4 = c7 + c8*r2; \ 122 \ 123 b1 = a1*r2 + a2*r6; \ 124 b2 = r10*a3 + r14*a4; \ 125 \ 126 q = r*(b1 + b2); \ 127 q; \ 128 }) 129 130 /* 131 * poly = x + (C1*x^3 + C2*x^5 + C3*x^7 + C4*x^9 + C5*x^11 + \ 132 * C6*x^13 + C7*x^15) 133 * = x + x3*(C1 + C2*x^2 + C3*x^4 + C4*x^6 + C5*x^8 + \ 134 * C6*x^10 + C7*x^12) 135 * 15 degree polynomial with only odd terms 136 */ 137 #define POLY_EVAL_ODD_15(r, c1, c2, c3, c4, c5, c6, c7) ({ \ 138 __typeof(r) a1, a2, a3, b1, b2 ,q; \ 139 __typeof(r) r2, r4, r8, r12; \ 140 r2 = r * r; \ 141 r4 = r2 * r2; \ 142 r8 = r4 * r4; \ 143 r12 = r8 * r4; \ 144 a1 = c1 + c2*r2; \ 145 a2 = c3 + c4*r2; \ 146 a3 = c5 + c6*r2; \ 147 \ 148 b1 = a1 + a2*r4; \ 149 b2 = r8*a3 + r12*c7; \ 150 \ 151 q = r + r * r2 * (b1 + b2); \ 152 q; \ 153 }) 154 155 156 /* 157 * poly = C0 + C1*r^3 + C2*r^5 + C3*r^7+ C4 *r^9 \ 158 * 159 * = C0 + r^2*(C1 + C2*r^2) + r^4*(C3*r^2+C4*r^4) 160 * 161 */ 162 #define POLY_EVAL_ODD_9(r, c0, c1, c2, c3, c4) ({ \ 163 __typeof(r) a0, a1, a2, q; \ 164 __typeof(r) r2, r4; \ 165 r2 = r * r; \ 166 r4 = r2 * r2; \ 167 a0 = c2*r2 + c1; \ 168 a1 = a0*r2 + c0; \ 169 a2 = (c3*r2 + c4*r4)*r4; \ 170 q = r*(a1 + a2); \ 171 q; \ 172 }) 173 174 #endif /* LIBM_POLY_H */ 175