/ include / libm / poly.h
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