diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-04-28 13:34:38 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-28 13:34:38 -0400 |
| commit | 360ecc1a2f72967f3a3882b3327e130bdc4e18c0 (patch) | |
| tree | c02dfab372e5b79bc2130d666c5e0a0e5cb3af2e /src/stage1/ir.cpp | |
| parent | d5fcb509881e1b022d2bcef303b53b4f67db1c9a (diff) | |
| parent | 11911f55a73a49e2fda85bddd38d1993b93547c9 (diff) | |
| download | zig-360ecc1a2f72967f3a3882b3327e130bdc4e18c0.tar.gz zig-360ecc1a2f72967f3a3882b3327e130bdc4e18c0.zip | |
Merge pull request #11532 from ziglang/compiler-rt-math
compiler-rt math functions reorg
Diffstat (limited to 'src/stage1/ir.cpp')
| -rw-r--r-- | src/stage1/ir.cpp | 106 |
1 files changed, 93 insertions, 13 deletions
diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index b8ae1ea93e..f7ab5e12fa 100644 --- a/src/stage1/ir.cpp +++ b/src/stage1/ir.cpp @@ -24132,6 +24132,9 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ case BuiltinFnIdCos: out_val->data.x_f16 = zig_double_to_f16(cos(zig_f16_to_double(op->data.x_f16))); break; + case BuiltinFnIdTan: + out_val->data.x_f16 = zig_double_to_f16(tan(zig_f16_to_double(op->data.x_f16))); + break; case BuiltinFnIdExp: out_val->data.x_f16 = zig_double_to_f16(exp(zig_f16_to_double(op->data.x_f16))); break; @@ -24181,6 +24184,9 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ case BuiltinFnIdCos: out_val->data.x_f32 = cosf(op->data.x_f32); break; + case BuiltinFnIdTan: + out_val->data.x_f32 = tanf(op->data.x_f32); + break; case BuiltinFnIdExp: out_val->data.x_f32 = expf(op->data.x_f32); break; @@ -24230,6 +24236,9 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ case BuiltinFnIdCos: out_val->data.x_f64 = cos(op->data.x_f64); break; + case BuiltinFnIdTan: + out_val->data.x_f64 = tan(op->data.x_f64); + break; case BuiltinFnIdExp: out_val->data.x_f64 = exp(op->data.x_f64); break; @@ -24293,6 +24302,7 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ case BuiltinFnIdNearbyInt: case BuiltinFnIdSin: case BuiltinFnIdCos: + case BuiltinFnIdTan: case BuiltinFnIdExp: case BuiltinFnIdExp2: case BuiltinFnIdLog: @@ -24300,7 +24310,7 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ case BuiltinFnIdLog2: return ir_add_error_node(ira, source_node, buf_sprintf("compiler bug: TODO: implement '%s' for type '%s'. See https://github.com/ziglang/zig/issues/4026", - float_op_to_name(fop), buf_ptr(&float_type->name))); + float_un_op_to_name(fop), buf_ptr(&float_type->name))); default: zig_unreachable(); } @@ -24327,24 +24337,94 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ break; case BuiltinFnIdCeil: f128M_roundToInt(in, softfloat_round_max, false, out); - break; + break; case BuiltinFnIdTrunc: f128M_trunc(in, out); break; case BuiltinFnIdRound: f128M_roundToInt(in, softfloat_round_near_maxMag, false, out); break; - case BuiltinFnIdNearbyInt: - case BuiltinFnIdSin: - case BuiltinFnIdCos: - case BuiltinFnIdExp: - case BuiltinFnIdExp2: - case BuiltinFnIdLog: - case BuiltinFnIdLog10: - case BuiltinFnIdLog2: - return ir_add_error_node(ira, source_node, - buf_sprintf("compiler bug: TODO: implement '%s' for type '%s'. See https://github.com/ziglang/zig/issues/4026", - float_op_to_name(fop), buf_ptr(&float_type->name))); + case BuiltinFnIdNearbyInt: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = nearbyint(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdSin: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = sin(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdCos: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = cos(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdTan: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = tan(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdExp: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = exp(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdExp2: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = exp2(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdLog: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = log(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdLog10: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = log10(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } + case BuiltinFnIdLog2: { + float64_t f64_value = f128M_to_f64(in); + double double_value; + memcpy(&double_value, &f64_value, sizeof(double)); + double_value = log2(double_value); + memcpy(&f64_value, &double_value, sizeof(double)); + f64_to_f128M(f64_value, out); + break; + } default: zig_unreachable(); } |
