exp() computed for 4 float at once */
| 131 | |
| 132 | /* exp() computed for 4 float at once */ |
| 133 | v4sf GiExpPsFloat32(v4sf x) { |
| 134 | v4sf tmp, fx; |
| 135 | |
| 136 | v4sf one = GiBroadcastFloat32(1); |
| 137 | x = GiMinimumFloat32(x, GiBroadcastFloat32(c_exp_hi)); |
| 138 | x = GiMaximumFloat32(x, GiBroadcastFloat32(c_exp_lo)); |
| 139 | |
| 140 | /* express exp(x) as exp(g + n*log(2)) */ |
| 141 | fx = GiMultiplyAddFloat32( |
| 142 | GiBroadcastFloat32(0.5f), x, GiBroadcastFloat32(c_cephes_LOG2EF)); |
| 143 | |
| 144 | /* perform a floorf */ |
| 145 | tmp = GiCastToFloat32(GiCastToInt32(fx)); |
| 146 | |
| 147 | /* if greater, subtract 1 */ |
| 148 | v4su mask = GiGreaterThanFloat32(tmp, fx); |
| 149 | v4sf mask_float = GiAndFloat32(GiReintUint32ToFloat32(mask), one); |
| 150 | |
| 151 | fx = GiSubtractFloat32(tmp, mask_float); |
| 152 | |
| 153 | tmp = GiMultiplyFloat32(fx, GiBroadcastFloat32(c_cephes_exp_C1)); |
| 154 | v4sf z = GiMultiplyFloat32(fx, GiBroadcastFloat32(c_cephes_exp_C2)); |
| 155 | x = GiSubtractFloat32(x, tmp); |
| 156 | x = GiSubtractFloat32(x, z); |
| 157 | |
| 158 | z = GiMultiplyFloat32(x, x); |
| 159 | |
| 160 | v4sf y = GiBroadcastFloat32(c_cephes_exp_p0); |
| 161 | y = GiMultiplyAddFloat32(GiBroadcastFloat32(c_cephes_exp_p1), y, x); |
| 162 | y = GiMultiplyAddFloat32(GiBroadcastFloat32(c_cephes_exp_p2), y, x); |
| 163 | y = GiMultiplyAddFloat32(GiBroadcastFloat32(c_cephes_exp_p3), y, x); |
| 164 | y = GiMultiplyAddFloat32(GiBroadcastFloat32(c_cephes_exp_p4), y, x); |
| 165 | y = GiMultiplyAddFloat32(GiBroadcastFloat32(c_cephes_exp_p5), y, x); |
| 166 | |
| 167 | y = GiMultiplyAddFloat32(x, y, z); |
| 168 | y = GiAddFloat32(y, one); |
| 169 | |
| 170 | /* build 2^n */ |
| 171 | v4si mm; |
| 172 | mm = GiCastToInt32(fx); |
| 173 | mm = GiAddInt32(mm, GiBroadcastInt32(0x7f)); |
| 174 | mm = GiShiftLeft23Int32(mm); |
| 175 | v4sf pow2n = GiReintInt32ToFloat32(mm); |
| 176 | |
| 177 | y = GiMultiplyFloat32(y, pow2n); |
| 178 | return y; |
| 179 | } |
| 180 | |
| 181 | #define c_minus_cephes_DP1 -0.78515625 |
| 182 | #define c_minus_cephes_DP2 -2.4187564849853515625e-4 |