/**
 * generated using metalibm 1.1
 * sha1 git: b'"44931432e12dbbda32ae5520e55557ff367a96bb"'(clean)
 * 
 * INFO: git status was clean when file was generated.
 * 
 * command used for generation:
 *   metalibm_functions/ml_cbrt.py --precision binary64 --target x86_avx2 \
 *     --output /root/s_cbrt_fma3.c
 * 
**/
#include <stdint.h>
#include <xmmintrin.h>
#include <immintrin.h>
#include <ml_support_lib.h>
#include <emmintrin.h>


static const __m128d my_cbrt_cst = {1.0}/*sse*/;
static const __m128i my_cbrt_cst1 = {INT32_C(0)}/*sse*/;
static const __m128i my_cbrt_cst2 = {INT32_C(0)}/*sse*/;
static const __m128d my_cbrt_cst3 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst4 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst5 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst6 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst7 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst8 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst9 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst10 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst11 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst12 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst13 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst14 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst15 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst16 = {0.3333333333333333}/*sse*/;
static const __m128d my_cbrt_cst17 = {1.0}/*sse*/;
static const __m128d my_cbrt_cst18 = {0.3333333333333333}/*sse*/;
static const double my_cbrt_cbrt_mod_table[6][1]  = {
    { 0x1p-1},
    { 0x1.428a2f98d728bp-1},
    { 0x1.965fea53d6e3dp-1},
    { 0x1p0},
    { 0x1.428a2f98d728bp0},
    { 0x1.965fea53d6e3dp0}
};
static const double my_cbrt_cbrt_approx_table[64][1]  = {
    { 0x1p0},
    { 0x1.01539221d4c97p0},
    { 0x1.02a3ad2ef6f48p0},
    { 0x1.03f06771a2e33p0},
    { 0x1.0539d6521256fp0},
    { 0x1.06800e629d672p0},
    { 0x1.07c3236b0a73ap0},
    { 0x1.090328731deb2p0},
    { 0x1.0a402fcc79298p0},
    { 0x1.0b7a4b1bd64acp0},
    { 0x1.0cb18b61ad8cfp0},
    { 0x1.0de601024fb88p0},
    { 0x1.0f17bbcd80046p0},
    { 0x1.1046cb0597001p0},
    { 0x1.11733d66373bdp0},
    { 0x1.129d212a9ba9cp0},
    { 0x1.13c484138704fp0},
    { 0x1.14e9736cdaf39p0},
    { 0x1.160bfc12dd091p0},
    { 0x1.172c2a772f508p0},
    { 0x1.184a0aa58191fp0},
    { 0x1.1965a848001d3p0},
    { 0x1.1a7f0eab8483dp0},
    { 0x1.1b9648c38c55dp0},
    { 0x1.1cab612df9a46p0},
    { 0x1.1dbe6236a0c45p0},
    { 0x1.1ecf55daa68a5p0},
    { 0x1.1fde45cbb1f9fp0},
    { 0x1.20eb3b72f42d5p0},
    { 0x1.21f63ff409043p0},
    { 0x1.22ff5c2fb2fdp0},
    { 0x1.240698c6746e5p0},
    { 0x1.250bfe1b082f5p0},
    { 0x1.260f9454bb99bp0},
    { 0x1.27116361abaeap0},
    { 0x1.281172f8e7074p0},
    { 0x1.290fca9c761f8p0},
    { 0x1.2a0c719b4b6d1p0},
    { 0x1.2b076f131c9d7p0},
    { 0x1.2c00c9f2263edp0},
    { 0x1.2cf888f8db02fp0},
    { 0x1.2deeb2bb7fb79p0},
    { 0x1.2ee34da3b4fe3p0},
    { 0x1.2fd65ff1efbbcp0},
    { 0x1.30c7efbee12adp0},
    { 0x1.31b802fccf6a2p0},
    { 0x1.32a69f78df567p0},
    { 0x1.3393cadc50709p0},
    { 0x1.347f8aadab855p0},
    { 0x1.3569e451e4c2bp0},
    { 0x1.3652dd0d71db1p0},
    { 0x1.373a7a0554cdfp0},
    { 0x1.3820c0401be52p0},
    { 0x1.3905b4a6d76cep0},
    { 0x1.39e95c0605a66p0},
    { 0x1.3acbbb0e756b7p0},
    { 0x1.3bacd6561ff5ep0},
    { 0x1.3c8cb258fa341p0},
    { 0x1.3d6b5379be10cp0},
    { 0x1.3e48be02ac0cfp0},
    { 0x1.3f24f62645865p0},
    { 0x1.4p0},
    { 0x1.40d9df94f1be1p0},
    { 0x1.41b298d47800ep0}
};

double my_cbrt(double);
double my_cbrt(double x){
    int64_t tmp;
    uint64_t _srl_cast;
    int64_t tmp1;
    int64_t tmp2;
    int64_t exp_vx;
    int64_t exp_vx_mod;
    int64_t tmp3;
    int32_t tmp4;
    double cbrt_mod;
    double tmp5;
    int64_t tmp6;
    uint64_t _srl_cast1;
    int64_t tmp7;
    int64_t table_index;
    int32_t tmp8;
    double seed;
    double init_mult;
    int64_t exp_vx_third;
    int64_t tmp9;
    int64_t tmp10;
    double exp_vx_third1;
    double init_approx;
    double tmp11;
    double tmp12;
    __m128d tmp13;
    double tmp14;
    double tmp15;
    __m128d tmp16;
    __m128d tmp17;
    double tmp18;
    double tmp19;
    __m128d tmp20;
    __m128d tmp21;
    __m128d approx_0;
    double tmp22;
    double tmp23;
    double tmp24;
    __m128d tmp25;
    __m128d tmp26;
    double tmp27;
    double tmp28;
    __m128d tmp29;
    __m128d approx_1;
    double tmp30;
    double tmp31;
    double tmp32;
    __m128d tmp33;
    __m128d tmp34;
    double tmp35;
    double tmp36;
    __m128d tmp37;
    __m128d approx_2;
    double tmp38;
    double tmp39;
    double tmp40;
    __m128d tmp41;
    __m128d tmp42;
    double tmp43;
    double tmp44;
    __m128d tmp45;
    __m128d approx_3;
    double tmp46;
    double tmp47;
    double tmp48;
    __m128d tmp49;
    __m128d tmp50;
    double tmp51;
    double tmp52;
    __m128d tmp53;
    __m128d approx_4;
    double tmp54;
    double tmp55;
    double tmp56;
    __m128d tmp57;
    __m128d tmp58;
    double tmp59;
    double tmp60;
    __m128d tmp61;
    __m128d approx_5;
    double tmp62;
    double tmp63;
    double tmp64;
    __m128d tmp65;
    __m128d tmp66;
    double tmp67;
    double tmp68;
    __m128d tmp69;
    __m128d approx_6;
    double tmp70;
    double tmp71;
    double tmp72;
    __m128d tmp73;
    __m128d tmp74;
    double tmp75;
    double tmp76;
    __m128d tmp77;
    __m128d result;
    double tmp78;
    
    tmp = double_to_64b_encoding(x);
    _srl_cast = tmp;
    tmp1 = _srl_cast >> INT64_C(52);
    tmp2 = tmp1 & INT64_C(2047);
    exp_vx = tmp2 + INT64_C(-1023);
    exp_vx_mod = exp_vx % INT64_C(3);
    tmp3 = exp_vx_mod + INT64_C(3);
    tmp4 = _mm_cvtsi128_si32(my_cbrt_cst1);
    cbrt_mod = my_cbrt_cbrt_mod_table[tmp3][tmp4];
    tmp5 = ml_mantissa_extraction_fp64(x);
    tmp6 = double_to_64b_encoding(tmp5);
    _srl_cast1 = tmp6;
    tmp7 = _srl_cast1 >> INT64_C(46);
    table_index = tmp7 & INT64_C(63);
    tmp8 = _mm_cvtsi128_si32(my_cbrt_cst2);
    seed = my_cbrt_cbrt_approx_table[table_index][tmp8];
    init_mult = seed * cbrt_mod;
    exp_vx_third = exp_vx / INT64_C(3);
    tmp9 = exp_vx_third + INT64_C(1023);
    tmp10 = tmp9 << INT64_C(52);
    exp_vx_third1 = double_from_64b_encoding(tmp10);
    init_approx = init_mult * exp_vx_third1;
    tmp11 = init_approx * init_approx;
    tmp12 = init_approx * tmp11;
    tmp13 = _mm_set_sd(tmp12);
    tmp14 = _mm_cvtsd_f64(my_cbrt_cst3);
    tmp15 = tmp14 / x;
    tmp16 = _mm_set_sd(tmp15);
    tmp17 = _mm_fnmadd_sd(tmp13, tmp16, my_cbrt_cst);
    tmp18 = _mm_cvtsd_f64(my_cbrt_cst4);
    tmp19 = init_approx * tmp18;
    tmp20 = _mm_set_sd(tmp19);
    tmp21 = _mm_set_sd(init_approx);
    approx_0 = _mm_fmadd_sd(tmp20, tmp17, tmp21);
    tmp22 = _mm_cvtsd_f64(approx_0);
    tmp23 = tmp22 * tmp22;
    tmp24 = tmp22 * tmp23;
    tmp25 = _mm_set_sd(tmp24);
    tmp26 = _mm_fnmadd_sd(tmp25, tmp16, my_cbrt_cst5);
    tmp27 = _mm_cvtsd_f64(my_cbrt_cst6);
    tmp28 = tmp22 * tmp27;
    tmp29 = _mm_set_sd(tmp28);
    approx_1 = _mm_fmadd_sd(tmp29, tmp26, approx_0);
    tmp30 = _mm_cvtsd_f64(approx_1);
    tmp31 = tmp30 * tmp30;
    tmp32 = tmp30 * tmp31;
    tmp33 = _mm_set_sd(tmp32);
    tmp34 = _mm_fnmadd_sd(tmp33, tmp16, my_cbrt_cst7);
    tmp35 = _mm_cvtsd_f64(my_cbrt_cst8);
    tmp36 = tmp30 * tmp35;
    tmp37 = _mm_set_sd(tmp36);
    approx_2 = _mm_fmadd_sd(tmp37, tmp34, approx_1);
    tmp38 = _mm_cvtsd_f64(approx_2);
    tmp39 = tmp38 * tmp38;
    tmp40 = tmp38 * tmp39;
    tmp41 = _mm_set_sd(tmp40);
    tmp42 = _mm_fnmadd_sd(tmp41, tmp16, my_cbrt_cst9);
    tmp43 = _mm_cvtsd_f64(my_cbrt_cst10);
    tmp44 = tmp38 * tmp43;
    tmp45 = _mm_set_sd(tmp44);
    approx_3 = _mm_fmadd_sd(tmp45, tmp42, approx_2);
    tmp46 = _mm_cvtsd_f64(approx_3);
    tmp47 = tmp46 * tmp46;
    tmp48 = tmp46 * tmp47;
    tmp49 = _mm_set_sd(tmp48);
    tmp50 = _mm_fnmadd_sd(tmp49, tmp16, my_cbrt_cst11);
    tmp51 = _mm_cvtsd_f64(my_cbrt_cst12);
    tmp52 = tmp46 * tmp51;
    tmp53 = _mm_set_sd(tmp52);
    approx_4 = _mm_fmadd_sd(tmp53, tmp50, approx_3);
    tmp54 = _mm_cvtsd_f64(approx_4);
    tmp55 = tmp54 * tmp54;
    tmp56 = tmp54 * tmp55;
    tmp57 = _mm_set_sd(tmp56);
    tmp58 = _mm_fnmadd_sd(tmp57, tmp16, my_cbrt_cst13);
    tmp59 = _mm_cvtsd_f64(my_cbrt_cst14);
    tmp60 = tmp54 * tmp59;
    tmp61 = _mm_set_sd(tmp60);
    approx_5 = _mm_fmadd_sd(tmp61, tmp58, approx_4);
    tmp62 = _mm_cvtsd_f64(approx_5);
    tmp63 = tmp62 * tmp62;
    tmp64 = tmp62 * tmp63;
    tmp65 = _mm_set_sd(tmp64);
    tmp66 = _mm_fnmadd_sd(tmp65, tmp16, my_cbrt_cst15);
    tmp67 = _mm_cvtsd_f64(my_cbrt_cst16);
    tmp68 = tmp62 * tmp67;
    tmp69 = _mm_set_sd(tmp68);
    approx_6 = _mm_fmadd_sd(tmp69, tmp66, approx_5);
    tmp70 = _mm_cvtsd_f64(approx_6);
    tmp71 = tmp70 * tmp70;
    tmp72 = tmp70 * tmp71;
    tmp73 = _mm_set_sd(tmp72);
    tmp74 = _mm_fnmadd_sd(tmp73, tmp16, my_cbrt_cst17);
    tmp75 = _mm_cvtsd_f64(my_cbrt_cst18);
    tmp76 = tmp70 * tmp75;
    tmp77 = _mm_set_sd(tmp76);
    result = _mm_fmadd_sd(tmp77, tmp74, approx_6);
    tmp78 = _mm_cvtsd_f64(result);
    return tmp78;
}
