306 {
308
309 return gen->createFunction(
312 auto* x = args[0];
313
314 auto* min_norm_pos = gen->getInt32Constant(0x00800000);
315 auto* inv_mant_mask = gen->getInt32Constant(~0x7F800000);
316 auto* sqrt_1_2 = gen->getConstant(0.707106781186547524F);
317 auto* log_p0 = gen->getConstant(7.0376836292E-2F);
318 auto* log_p1 = gen->getConstant(-1.1514610310E-1F);
319 auto* log_p2 = gen->getConstant(1.1676998740E-1F);
320 auto* log_p3 = gen->getConstant(-1.2420140846E-1F);
321 auto* log_p4 = gen->getConstant(1.4249322787E-1F);
322 auto* log_p5 = gen->getConstant(-1.6668057665E-1F);
323 auto* log_p6 = gen->getConstant(2.0000714765E-1F);
324 auto* log_p7 = gen->getConstant(-2.4999993993E-1F);
325 auto* log_p8 = gen->getConstant(3.3333331174E-1F);
326 auto* log_q2 = gen->getConstant(0.693359375F);
327 auto* log_q1 = gen->getConstant(-2.12194440e-4F);
328 auto* one = gen->getConstant(1.0F);
329 auto* neg_half = gen->getConstant(-0.5F);
330 auto* const_0x7f = gen->getInt32Constant(0x7F);
331 auto* const_23 = gen->getInt32Constant(23);
332
333 auto* is_one = gen->builder.CreateFCmpOEQ(x, one);
334 auto* min_norm_pos_float = gen->builder.CreateBitCast(
335 min_norm_pos, gen->getFloatType());
336 x = gen->createIntrinsicCall(llvm::Intrinsic::maxnum,
337 {x, min_norm_pos_float});
339 gen->builder.CreateBitCast(
x,
gen->getInt32Type());
345 0.5F),
346 gen->getInt32Type());
351 gen->builder.CreateSIToFP(
emm0i,
gen->getFloatType());
355 gen->builder.CreateSExt(
mask,
gen->getInt32Type());
359 gen->getFloatType());
360 x =
gen->builder.CreateFSub(
x,
one);
362 gen->builder.CreateBitCast(
one,
gen->getInt32Type());
366 gen->getFloatType());
369 auto*
z =
gen->builder.CreateFMul(
x,
x);
387 y =
gen->builder.CreateFMul(
y,
x);
388 y =
gen->builder.CreateFMul(
y,
z);
393 x =
gen->builder.CreateFAdd(
x,
y);
403 gen->getFloatType());
405 });
406 }
constexpr MathopInfo get_math_op_info(MathOp op)