You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
MCOL-4511 __float128 type is not supported on aarch64
long double is 128 bit on aarch64, even if it is soft supported, not hardware instrunction supported. So, here we just use long double on aarch64.
This commit is contained in:
@ -1344,7 +1344,7 @@ IDB_Decimal Func_cast_decimal::getDecimalVal(Row& row,
|
||||
char *ep = NULL;
|
||||
int128_t max_number_decimal = dataconvert::strtoll128(columnstore_big_precision[max_length - 19].c_str(), dummy, &ep);
|
||||
|
||||
__float128 value = parm[0]->data()->getDoubleVal(row, isNull);
|
||||
float128_t value = parm[0]->data()->getDoubleVal(row, isNull);
|
||||
|
||||
int128_t scaleDivisor;
|
||||
datatypes::getScaleDivisor(scaleDivisor, decimals);
|
||||
@ -1394,7 +1394,7 @@ IDB_Decimal Func_cast_decimal::getDecimalVal(Row& row,
|
||||
char *ep = NULL;
|
||||
int128_t max_number_decimal = dataconvert::strtoll128(columnstore_big_precision[max_length - 19].c_str(), dummy, &ep);
|
||||
|
||||
__float128 value = parm[0]->data()->getLongDoubleVal(row, isNull);
|
||||
float128_t value = parm[0]->data()->getLongDoubleVal(row, isNull);
|
||||
|
||||
int128_t scaleDivisor;
|
||||
datatypes::getScaleDivisor(scaleDivisor, decimals);
|
||||
@ -1461,8 +1461,8 @@ IDB_Decimal Func_cast_decimal::getDecimalVal(Row& row,
|
||||
decimal.s128Value *= scaleDivisor;
|
||||
else
|
||||
decimal.s128Value = (int128_t)(decimal.s128Value > 0 ?
|
||||
(__float128)decimal.s128Value / scaleDivisor + 0.5 :
|
||||
(__float128)decimal.s128Value / scaleDivisor - 0.5);
|
||||
(float128_t)decimal.s128Value / scaleDivisor + 0.5 :
|
||||
(float128_t)decimal.s128Value / scaleDivisor - 0.5);
|
||||
}
|
||||
|
||||
decimal.scale = decimals;
|
||||
@ -1545,7 +1545,7 @@ IDB_Decimal Func_cast_decimal::getDecimalVal(Row& row,
|
||||
|
||||
int128_t scaleDivisor;
|
||||
datatypes::getScaleDivisor(scaleDivisor, decimals);
|
||||
__float128 floatValue = datatypes::TFloat128::fromString(strValue);
|
||||
float128_t floatValue = datatypes::TFloat128::fromString(strValue);
|
||||
|
||||
// If the float value is too large, the saturated result may end up with
|
||||
// the wrong sign, so we just check first.
|
||||
|
@ -88,17 +88,17 @@ IDB_Decimal Func_mod::getDecimalVal(Row& row,
|
||||
int128_t dividendInt = (parm[0]->data()->resultType().colWidth == datatypes::MAXDECIMALWIDTH) ? d.s128Value : d.value;
|
||||
|
||||
|
||||
__float128 divF, dividendF;
|
||||
float128_t divF, dividendF;
|
||||
|
||||
int128_t scaleDivisor;
|
||||
|
||||
datatypes::getScaleDivisor(scaleDivisor, div.scale);
|
||||
divF = (__float128) divInt / scaleDivisor;
|
||||
divF = (float128_t) divInt / scaleDivisor;
|
||||
|
||||
datatypes::getScaleDivisor(scaleDivisor, d.scale);
|
||||
dividendF = (__float128) dividendInt / scaleDivisor;
|
||||
dividendF = (float128_t) dividendInt / scaleDivisor;
|
||||
|
||||
__float128 mod = datatypes::TFloat128::fmodq(dividendF, divF) * scaleDivisor;
|
||||
float128_t mod = datatypes::TFloat128::fmodq(dividendF, divF) * scaleDivisor;
|
||||
|
||||
return IDB_Decimal(datatypes::TSInt128((int128_t) mod),
|
||||
d.scale,
|
||||
|
Reference in New Issue
Block a user