*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Fri, 07 Jun 2019 00:48:13 +0200
changeset 4999 fd4435d4e583
parent 4998 1ed27f918576
child 5000 608e4912b5cf
*** empty log message ***
QuadFloat.st
--- 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'!