arm64: Implement TOK_NEG for floats natively

This commit is contained in:
Aleksi Hannula
2026-02-01 21:55:33 +02:00
parent 1cb0a3d52a
commit c39eaf10cf
4 changed files with 44 additions and 1 deletions

View File

@@ -1849,6 +1849,37 @@ ST_FUNC void gen_opf(int op)
{ {
uint32_t x, a, b, dbl; uint32_t x, a, b, dbl;
if (op == TOK_NEG) {
switch (vtop[0].type.t & VT_BTYPE) {
case VT_LDOUBLE:
vpush_helper_func(TOK___negtf2);
vrott(2);
gfunc_call(1);
vpushi(0);
vtop->type.t = VT_LDOUBLE;
vtop->r = REG_FRET;
break;
case VT_FLOAT:
case VT_DOUBLE:
gv(RC_FLOAT);
dbl = vtop[0].type.t == VT_DOUBLE;
a = fltr(vtop[0].r);
vtop--;
x = get_reg(RC_FLOAT);
vtop++;
vtop[0].r = x;
x = fltr(x);
o(0x1e214000 | dbl << 22 | x | a << 5);
break;
default:
assert(0);
}
return;
}
if (vtop[0].type.t == VT_LDOUBLE) { if (vtop[0].type.t == VT_LDOUBLE) {
CType type = vtop[0].type; CType type = vtop[0].type;
int func = 0; int func = 0;

View File

@@ -373,6 +373,17 @@ long double __divtf3(long double fa, long double fb)
return f3_round(x_sgn, x_exp, x); return f3_round(x_sgn, x_exp, x);
} }
long double __negtf2(long double f)
{
u128_t a;
memcpy(&a, &f, 16);
a.x1 ^= 1UL << 63;
memcpy(&f, &a, 16);
return f;
}
long double __extendsftf2(float f) long double __extendsftf2(float f)
{ {
long double fx; long double fx;

View File

@@ -2504,7 +2504,7 @@ static void gen_opic(int op)
} }
} }
#if defined TCC_TARGET_X86_64 || defined TCC_TARGET_I386 #if defined TCC_TARGET_X86_64 || defined TCC_TARGET_I386 || defined TCC_TARGET_ARM64
# define gen_negf gen_opf # define gen_negf gen_opf
#elif defined TCC_TARGET_ARM #elif defined TCC_TARGET_ARM
void gen_negf(int op) void gen_negf(int op)

View File

@@ -316,6 +316,7 @@
DEF(TOK___extenddftf2, "__extenddftf2") DEF(TOK___extenddftf2, "__extenddftf2")
DEF(TOK___trunctfsf2, "__trunctfsf2") DEF(TOK___trunctfsf2, "__trunctfsf2")
DEF(TOK___trunctfdf2, "__trunctfdf2") DEF(TOK___trunctfdf2, "__trunctfdf2")
DEF(TOK___negtf2, "__negtf2")
DEF(TOK___fixtfsi, "__fixtfsi") DEF(TOK___fixtfsi, "__fixtfsi")
DEF(TOK___fixtfdi, "__fixtfdi") DEF(TOK___fixtfdi, "__fixtfdi")
DEF(TOK___fixunstfsi, "__fixunstfsi") DEF(TOK___fixunstfsi, "__fixunstfsi")