--- a/QuadFloat.st Fri Jun 07 00:03:48 2019 +0200
+++ b/QuadFloat.st Fri Jun 07 00:48:13 2019 +0200
@@ -854,8 +854,32 @@
} else {
*zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
}
+}
+void
+f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr )
+{
+ const uint64_t *aWPtr, *bWPtr;
+ uint_fast64_t uiA64, uiA0;
+ bool signA;
+ uint_fast64_t uiB64, uiB0;
+ bool signB;
+
+ aWPtr = (const uint64_t *) aPtr;
+ bWPtr = (const uint64_t *) bPtr;
+ uiA64 = aWPtr[indexWord( 2, 1 )];
+ uiA0 = aWPtr[indexWord( 2, 0 )];
+ signA = signF128UI64( uiA64 );
+ uiB64 = bWPtr[indexWord( 2, 1 )];
+ uiB0 = bWPtr[indexWord( 2, 0 )];
+ signB = signF128UI64( uiB64 );
+ if ( signA == signB ) {
+ *zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
+ } else {
+ *zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA );
+ }
}
+
#endif // SUPPORT_QUADFLOAT
%}
@@ -1036,6 +1060,22 @@
#endif // SUPPORT_QUADFLOAT
%}.
self errorUnsupported
+!
+
+differenceFromQuadFloat:aQuadFloat
+%{
+#ifdef SUPPORT_QUADFLOAT
+ OBJ newFloat;
+ float128_t result, myVal, argVal;
+
+ myVal = __quadFloatVal(self);
+ argVal = __quadFloatVal(aQuadFloat);
+ f128M_sub( &myVal, &argVal, &result );
+ __qMKQFLOAT(newFloat, result);
+ RETURN ( newFloat );
+#endif // SUPPORT_QUADFLOAT
+%}.
+ self errorUnsupported
! !
!QuadFloat methodsFor:'arithmetic'!