Revision: 3400 Author: eliot Date: 2015-07-08 11:28:29 -0700 (Wed, 08 Jul 2015) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.1408
ThreadedFFIPlugin: Allow ffiCreateIntegralResultOop:ofAtomicType:in: to be inlined. Reduce the number of tests leading to the common case of an integral return in ffiCalloutTo:SpecOnStack:in: etc.
Refactor the remapOop:in: idiom up into InterpreterPlugin and use it in the ThreadedFFIPlugin.
Use an official version of MiscPrimitivePlugin.c in Newspeak (no change).
Modified Paths: -------------- branches/Cog/nsspursrc/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c branches/Cog/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c branches/Cog/src/plugins/SqueakFFIPrims/IA32FFIPlugin.c
Property Changed: ---------------- branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nsspursrc/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c =================================================================== --- branches/Cog/nsspursrc/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c 2015-07-07 20:53:26 UTC (rev 3399) +++ branches/Cog/nsspursrc/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c 2015-07-08 18:28:29 UTC (rev 3400) @@ -1,16 +1,16 @@ /* Automatically generated by - VMPluginCodeGenerator * VMMaker.oscog-cb.1379 uuid: cc44db6e-5fe4-4aee-9a1b-e6de870b83a8 + VMPluginCodeGenerator VMMaker.oscog-eem.1325 uuid: a0bb0f7f-5e6e-48a7-bf73-fa5d135e06c0 from - MiscPrimitivePlugin * VMMaker.oscog-cb.1379 uuid: cc44db6e-5fe4-4aee-9a1b-e6de870b83a8 + MiscPrimitivePlugin VMMaker.oscog-eem.1325 uuid: a0bb0f7f-5e6e-48a7-bf73-fa5d135e06c0 Bitmap * Graphics-mt.313 uuid: 99af1adc-65b3-5549-8d10-ab452e0c59e5 - ByteArray * Collections.spur-eem.636 uuid: b341b330-e1ef-455e-9880-7b782cc4f014 - ByteString * Collections.spur-eem.636 uuid: b341b330-e1ef-455e-9880-7b782cc4f014 + ByteArray * Collections.spur-ul.610, Collections.spur-ul.627, Collections.spur-mt.631, Collections.spur-mt.635 uuid: 3448b17a-1361-47a8-af38-4c26b42dc028 + ByteString * Collections.spur-ul.610, Collections.spur-ul.627, Collections.spur-mt.631, Collections.spur-mt.635 uuid: 3448b17a-1361-47a8-af38-4c26b42dc028 SampledSound Sound-topa.43 uuid: c1c2b948-6c86-4cf8-877d-1620433f558e */ -static char __buildInfo[] = "MiscPrimitivePlugin * VMMaker.oscog-cb.1379 uuid: cc44db6e-5fe4-4aee-9a1b-e6de870b83a8\n\ +static char __buildInfo[] = "MiscPrimitivePlugin VMMaker.oscog-eem.1325 uuid: a0bb0f7f-5e6e-48a7-bf73-fa5d135e06c0\n\ Bitmap * Graphics-mt.313 uuid: 99af1adc-65b3-5549-8d10-ab452e0c59e5\n\ -ByteArray * Collections.spur-eem.636 uuid: b341b330-e1ef-455e-9880-7b782cc4f014\n\ -ByteString * Collections.spur-eem.636 uuid: b341b330-e1ef-455e-9880-7b782cc4f014\n\ +ByteArray * Collections.spur-ul.610, Collections.spur-ul.627, Collections.spur-mt.631, Collections.spur-mt.635 uuid: 3448b17a-1361-47a8-af38-4c26b42dc028\n\ +ByteString * Collections.spur-ul.610, Collections.spur-ul.627, Collections.spur-mt.631, Collections.spur-mt.635 uuid: 3448b17a-1361-47a8-af38-4c26b42dc028\n\ SampledSound Sound-topa.43 uuid: c1c2b948-6c86-4cf8-877d-1620433f558e " __DATE__ ;
@@ -90,9 +90,9 @@ struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "MiscPrimitivePlugin * VMMaker.oscog-cb.1379 (i)" + "MiscPrimitivePlugin VMMaker.oscog-eem.1325 (i)" #else - "MiscPrimitivePlugin * VMMaker.oscog-cb.1379 (e)" + "MiscPrimitivePlugin VMMaker.oscog-eem.1325 (e)" #endif ;
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h ___________________________________________________________________ Modified: checkindate - Tue Jul 7 13:52:43 PDT 2015 + Wed Jul 8 11:27:26 PDT 2015
Modified: branches/Cog/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c =================================================================== --- branches/Cog/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c 2015-07-07 20:53:26 UTC (rev 3399) +++ branches/Cog/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c 2015-07-08 18:28:29 UTC (rev 3400) @@ -1,9 +1,9 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.1359 uuid: 0e62a222-6136-430f-9bc2-8e7cee245076 + VMPluginCodeGenerator VMMaker.oscog-eem.1408 uuid: 51bc4e0f-a338-4394-8c6a-22b4b3e07c61 from - ThreadedARMFFIPlugin VMMaker.oscog-eem.1359 uuid: 0e62a222-6136-430f-9bc2-8e7cee245076 + ThreadedARMFFIPlugin VMMaker.oscog-eem.1408 uuid: 51bc4e0f-a338-4394-8c6a-22b4b3e07c61 */ -static char __buildInfo[] = "ThreadedARMFFIPlugin VMMaker.oscog-eem.1359 uuid: 0e62a222-6136-430f-9bc2-8e7cee245076 " __DATE__ ; +static char __buildInfo[] = "ThreadedARMFFIPlugin VMMaker.oscog-eem.1408 uuid: 51bc4e0f-a338-4394-8c6a-22b4b3e07c61 " __DATE__ ;
@@ -454,9 +454,9 @@ struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "ARM32FFIPlugin VMMaker.oscog-eem.1359 (i)" + "ARM32FFIPlugin VMMaker.oscog-eem.1408 (i)" #else - "ARM32FFIPlugin VMMaker.oscog-eem.1359 (e)" + "ARM32FFIPlugin VMMaker.oscog-eem.1408 (e)" #endif ;
@@ -1567,6 +1567,7 @@ sqInt argTypes1; sqInt atomicType; sqInt atomicType1; + sqInt byteSize; sqInt classOop; sqInt cPointer; char *cString; @@ -1574,15 +1575,19 @@ double floatRet; sqInt i; usqLong intRet; + extern void loadFloatRegs(double, double, double, double, double, double, double, double); + sqInt mask; sqInt myThreadIndex; sqInt oop; sqInt oop1; + sqInt oop2; sqInt *ptr; sqInt retClass; sqInt retClass1; sqInt retOop; sqInt retOop1; sqInt retType; + sqInt shift; sqInt specLiteral; sqInt specLiteral1; sqInt strLen; @@ -1590,11 +1595,13 @@ char *strPtr; sqInt typeSpec; sqInt typeSpec1; + usqLong value;
floatRet = 0; intRet = 0; myThreadIndex = 0; + # if COGMTVM if (((calloutState->callFlags)) & FFICallFlagThreaded) { myThreadIndex = disownVM(0); @@ -1611,12 +1618,17 @@ /* begin atomicTypeOf: */ typeSpec = (calloutState->ffiRetHeader); atomicType = ((usqInt) (typeSpec & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if (atomicType == FFITypeSingleFloat) { - floatRet = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) procAddr), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + if ((((usqInt) atomicType) >> 1) == (FFITypeSingleFloat > 1)) { + if (atomicType == FFITypeSingleFloat) { + floatRet = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) procAddr), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + } + else { + + /* atomicType = FFITypeDoubleFloat */ + + floatRet = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) procAddr), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + } } - if (atomicType == FFITypeDoubleFloat) { - floatRet = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) procAddr), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); - } else { intRet = dispatchFunctionPointerwithwithwithwith(((usqLong (*)(int, int, int, int)) procAddr), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); } @@ -1631,108 +1643,198 @@
# endif /* COGMTVM */
- if (((calloutState->ffiRetHeader)) & FFIFlagPointer) { - /* begin ffiReturnPointer:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral1 = (specOnStack - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes1 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral1); - retType = fetchPointerofObject(0, argTypes1); - retClass1 = fetchPointerofObject(1, retType); - if (retClass1 == (nilObject())) { + if (((calloutState->ffiRetHeader)) & (FFIFlagPointer + FFIFlagStructure)) {
- /* Create ExternalData upon return */ + /* Note: Order is important here since FFIFlagPointer + FFIFlagStructure is used to represent + 'typedef void* VoidPointer' and VoidPointer must be returned as pointer *not* as struct. */
- /* begin atomicTypeOf: */ - typeSpec1 = (calloutState->ffiRetHeader); - atomicType1 = ((usqInt) (typeSpec1 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if ((((usqInt) atomicType1) >> 1) == (((usqInt) FFITypeSignedChar) >> 1)) { + return (((calloutState->ffiRetHeader)) & FFIFlagPointer + ? (/* begin ffiReturnPointer:ofType:in: */ + /* begin ffiReturnType: */ + (specLiteral1 = (specOnStack + ? stackValue(1) + : literalofMethod(0, primitiveMethod()))), + (argTypes1 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral1)), + (retType = fetchPointerofObject(0, argTypes1)), + (retClass1 = fetchPointerofObject(1, retType)), + (retClass1 == (nilObject()) + ? (/* begin atomicTypeOf: */ + (typeSpec1 = (calloutState->ffiRetHeader)), + (atomicType1 = ((usqInt) (typeSpec1 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift), + ((((usqInt) atomicType1) >> 1) == (((usqInt) FFITypeSignedChar) >> 1) + ? (/* begin ffiReturnCStringFrom: */ + (cPointer = ((usqInt) intRet)), + (cPointer == null + ? (methodReturnValue(nilObject()), + goto l2) + : 0), + (cString = ((char *) cPointer)), + (strLen = 0), + while (!((cString[strLen]) == 0)) { + strLen += 1; + } + (strOop = instantiateClassindexableSize(classString(), strLen)), + (strPtr = firstIndexableField(strOop)), + for (i = 0; i < strLen; i += 1) { + strPtr[i] = (cString[i]); + } + methodReturnValue(strOop), + goto l2) + : 0), + +#if SPURVM + oop2 = instantiateClassindexableSize(classExternalAddress(), 4); + ptr = firstIndexableField(oop2); + ptr[0] = (((sqInt) intRet)); + +#if SPURVM + retOop1 = instantiateClassindexableSize(classExternalData(), 0);
- /* String return */ +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2);
- /* begin ffiReturnCStringFrom: */ - cPointer = ((usqInt) intRet); - if (cPointer == null) { - return methodReturnValue(nilObject()); - } - cString = ((char *) cPointer); - strLen = 0; - while (!((cString[strLen]) == 0)) { - strLen += 1; - } - strOop = instantiateClassindexableSize(classString(), strLen); - strPtr = firstIndexableField(strOop); - for (i = 0; i < strLen; i += 1) { - strPtr[i] = (cString[i]); - } - return methodReturnValue(strOop); - } - pushRemappableOop(retType); - oop1 = instantiateClassindexableSize(classExternalAddress(), 4); - ptr = firstIndexableField(oop1); - ptr[0] = (((sqInt) intRet)); - pushRemappableOop(oop1); - retOop1 = instantiateClassindexableSize(classExternalData(), 0); +#else /* SPURVM */ + pushRemappableOop(retType); + oop2 = instantiateClassindexableSize(classExternalAddress(), 4); + ptr = firstIndexableField(oop2); + ptr[0] = (((sqInt) intRet)); + +#if SPURVM + retOop1 = instantiateClassindexableSize(classExternalData(), 0);
- /* external address */ +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + retType = popRemappableOop() +#endif /* SPURVM */ +, + storePointerofObjectwithValue(1, retOop1, retType), + methodReturnValue(retOop1), + goto l2) + : 0), + (classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure + ? classByteArray() + : classExternalAddress())), + +#if SPURVM + oop2 = instantiateClassindexableSize(classOop, 4);
- oop1 = popRemappableOop(); - storePointerofObjectwithValue(0, retOop1, oop1); +#else /* SPURVM */ + pushRemappableOop(retClass1); + oop2 = instantiateClassindexableSize(classOop, 4); + retClass1 = popRemappableOop() +#endif /* SPURVM */ +, + (ptr = firstIndexableField(oop2)), + ptr[0] = (((sqInt) intRet)), + +#if SPURVM + retOop1 = instantiateClassindexableSize(retClass1, 0);
- /* return type */ +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(retClass1, 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +, + storePointerofObjectwithValue(0, retOop1, oop2), + methodReturnValue(retOop1), + l2: /* end ffiReturnPointer:ofType:in: */) + : (/* begin ffiReturnStruct:ofType:in: */ + /* begin ffiReturnType: */ + (specLiteral = (specOnStack + ? stackValue(1) + : literalofMethod(0, primitiveMethod()))), + (argTypes = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral)), + (ffiRetType = fetchPointerofObject(0, argTypes)), + (retClass = fetchPointerofObject(1, ffiRetType)), + (retOop = instantiateClassindexableSize(retClass, 0)), + +#if SPURVM + oop1 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize));
- oop1 = popRemappableOop(); - storePointerofObjectwithValue(1, retOop1, oop1); - return methodReturnValue(retOop1); +#else /* SPURVM */ + pushRemappableOop(retOop); + oop1 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); + retOop = popRemappableOop() +#endif /* SPURVM */ +, + (returnStructInRegisters((calloutState->structReturnSize)) + ? memcpy(firstIndexableField(oop1), (&intRet), (calloutState->structReturnSize)) + : memcpy(firstIndexableField(oop1), (calloutState->limit), (calloutState->structReturnSize))), + storePointerofObjectwithValue(0, retOop, oop1), + methodReturnValue(retOop))); + } + if ((((usqInt) atomicType) >> 1) == (FFITypeSingleFloat > 1)) { + oop = floatObjectOf(floatRet); + } + else { + /* begin ffiCreateIntegralResultOop:ofAtomicType:in: */ + assert(atomicType < FFITypeSingleFloat); + if (atomicType == FFITypeBool) { + + /* Make sure bool honors the byte size requested */ + + byteSize = ((calloutState->ffiRetHeader)) & FFIStructSizeMask; + value = (byteSize == (sizeof(intRet)) + ? intRet + : intRet & ((1 << (byteSize * 8)) - 1)); + oop = (value == 0 + ? falseObject() + : trueObject()); + goto l1; } - pushRemappableOop(retClass1); - classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure - ? classByteArray() - : classExternalAddress()); - oop1 = instantiateClassindexableSize(classOop, 4); - ptr = firstIndexableField(oop1); - ptr[0] = (((sqInt) intRet)); + if (atomicType <= FFITypeSignedInt) {
- /* return class */ + /* these are all generall integer returns */
- retClass1 = popRemappableOop(); - pushRemappableOop(oop1); - retOop1 = instantiateClassindexableSize(retClass1, 0); + if (atomicType <= FFITypeSignedShort) {
- /* external address */ + /* byte/short. first extract partial word, then sign extend */
- oop1 = popRemappableOop(); - storePointerofObjectwithValue(0, retOop1, oop1); - return methodReturnValue(retOop1); - } - if (((calloutState->ffiRetHeader)) & FFIFlagStructure) { - /* begin ffiReturnStruct:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral = (specOnStack - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral); - ffiRetType = fetchPointerofObject(0, argTypes); - retClass = fetchPointerofObject(1, ffiRetType); - retOop = instantiateClassindexableSize(retClass, 0); - pushRemappableOop(retOop); - oop = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); - if (returnStructInRegisters((calloutState->structReturnSize))) { - memcpy(firstIndexableField(oop), (&intRet), (calloutState->structReturnSize)); + + /* # of significant bits */ + + shift = (((usqInt) atomicType) >> 1) * 8; + value = intRet & ((1 << shift) - 1); + if (atomicType & 1) { + + /* make the guy signed */ + + mask = 1 << (shift - 1); + value = (value & (mask - 1)) - (value & mask); + } + oop = integerObjectOf(value); + goto l1; + } + oop = (atomicType & 1 + ? signed32BitIntegerFor(intRet) + : positive32BitIntegerFor(intRet)); + goto l1; } - else { - memcpy(firstIndexableField(oop), (calloutState->limit), (calloutState->structReturnSize)); - } - retOop = popRemappableOop(); - storePointerofObjectwithValue(0, retOop, oop); - return methodReturnValue(retOop); + oop = ((((usqInt) atomicType) >> 1) == (((usqInt) FFITypeSignedLongLong) >> 1) + ? (atomicType & 1 + ? signed64BitIntegerFor(intRet) + : positive64BitIntegerFor(intRet)) + : characterObjectOf(intRet & ( +#if SPURVM + 0xFFFFFFFFUL +#else /* SPURVM */ + 0xFF +#endif /* SPURVM */ + ))); + l1: /* end ffiCreateIntegralResultOop:ofAtomicType:in: */; } - if ((atomicType == FFITypeSingleFloat) - || (atomicType == FFITypeDoubleFloat)) { - return methodReturnValue(floatObjectOf(floatRet)); - } - return methodReturnValue(ffiCreateIntegralResultOopofAtomicTypein(intRet, atomicType, calloutState)); + return methodReturnValue(oop); }
@@ -1757,6 +1859,7 @@ sqInt argTypes1; sqInt atomicType; sqInt atomicType1; + sqInt byteSize; CalloutState *calloutState; sqInt classOop; sqInt cPointer; @@ -1769,10 +1872,13 @@ sqInt i; sqInt i1; usqLong intRet; + extern void loadFloatRegs(double, double, double, double, double, double, double, double); + sqInt mask; sqInt myThreadIndex; sqInt oop; sqInt oop1; sqInt oop2; + sqInt oop3; void *pointer; int *ptr; sqInt *ptr1; @@ -1783,6 +1889,7 @@ sqInt retOop; sqInt retOop1; sqInt retType; + sqInt shift; sqInt specLiteral; sqInt specLiteral1; sqInt stackSize; @@ -1792,6 +1899,7 @@ CalloutState theCalloutState; sqInt typeSpec; sqInt typeSpec1; + usqLong value;
floatRet = 0; intRet = 0; @@ -1977,6 +2085,7 @@ storeIntegerofObjectwithValue(ExternalFunctionStackSizeIndex, externalFunction, stackSize); } /* begin ffiCalloutTo:SpecOnStack:in: */ + ; # if COGMTVM if (((calloutState->callFlags)) & FFICallFlagThreaded) { @@ -1994,12 +2103,17 @@ /* begin atomicTypeOf: */ typeSpec = (calloutState->ffiRetHeader); atomicType = ((usqInt) (typeSpec & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if (atomicType == FFITypeSingleFloat) { - floatRet = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + if ((((usqInt) atomicType) >> 1) == (FFITypeSingleFloat > 1)) { + if (atomicType == FFITypeSingleFloat) { + floatRet = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + } + else { + + /* atomicType = FFITypeDoubleFloat */ + + floatRet = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + } } - if (atomicType == FFITypeDoubleFloat) { - floatRet = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); - } else { intRet = dispatchFunctionPointerwithwithwithwith(((usqLong (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); } @@ -2014,115 +2128,212 @@
# endif /* COGMTVM */
- if (((calloutState->ffiRetHeader)) & FFIFlagPointer) { - /* begin ffiReturnPointer:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral1 = (argArrayOrNil != null - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes1 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral1); - retType = fetchPointerofObject(0, argTypes1); - retClass1 = fetchPointerofObject(1, retType); - if (retClass1 == (nilObject())) { + if (((calloutState->ffiRetHeader)) & (FFIFlagPointer + FFIFlagStructure)) {
- /* Create ExternalData upon return */ + /* Note: Order is important here since FFIFlagPointer + FFIFlagStructure is used to represent + 'typedef void* VoidPointer' and VoidPointer must be returned as pointer *not* as struct. */
- /* begin atomicTypeOf: */ - typeSpec1 = (calloutState->ffiRetHeader); - atomicType1 = ((usqInt) (typeSpec1 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if ((((usqInt) atomicType1) >> 1) == (((usqInt) FFITypeSignedChar) >> 1)) { + if (((calloutState->ffiRetHeader)) & FFIFlagPointer) { + /* begin ffiReturnPointer:ofType:in: */ + /* begin ffiReturnType: */ + specLiteral1 = (argArrayOrNil != null + ? stackValue(1) + : literalofMethod(0, primitiveMethod())); + argTypes1 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral1); + retType = fetchPointerofObject(0, argTypes1); + retClass1 = fetchPointerofObject(1, retType); + if (retClass1 == (nilObject())) {
- /* String return */ + /* Create ExternalData upon return */
- /* begin ffiReturnCStringFrom: */ - cPointer = ((usqInt) intRet); - if (cPointer == null) { - result = methodReturnValue(nilObject()); - goto l5; + /* begin atomicTypeOf: */ + typeSpec1 = (calloutState->ffiRetHeader); + atomicType1 = ((usqInt) (typeSpec1 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; + if ((((usqInt) atomicType1) >> 1) == (((usqInt) FFITypeSignedChar) >> 1)) { + + /* String return */ + + /* begin ffiReturnCStringFrom: */ + cPointer = ((usqInt) intRet); + if (cPointer == null) { + methodReturnValue(nilObject()); + goto l6; + } + cString = ((char *) cPointer); + strLen = 0; + while (!((cString[strLen]) == 0)) { + strLen += 1; + } + strOop = instantiateClassindexableSize(classString(), strLen); + strPtr = firstIndexableField(strOop); + for (i1 = 0; i1 < strLen; i1 += 1) { + strPtr[i1] = (cString[i1]); + } + methodReturnValue(strOop); + goto l6; } - cString = ((char *) cPointer); - strLen = 0; - while (!((cString[strLen]) == 0)) { - strLen += 1; - } - strOop = instantiateClassindexableSize(classString(), strLen); - strPtr = firstIndexableField(strOop); - for (i1 = 0; i1 < strLen; i1 += 1) { - strPtr[i1] = (cString[i1]); - } - result = methodReturnValue(strOop); - goto l5; + +#if SPURVM + oop2 = instantiateClassindexableSize(classExternalAddress(), 4); + ptr1 = firstIndexableField(oop2); + ptr1[0] = (((sqInt) intRet)); + +#if SPURVM + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + +#else /* SPURVM */ + pushRemappableOop(retType); + oop2 = instantiateClassindexableSize(classExternalAddress(), 4); + ptr1 = firstIndexableField(oop2); + ptr1[0] = (((sqInt) intRet)); + +#if SPURVM + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + retType = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(1, retOop1, retType); + methodReturnValue(retOop1); + goto l6; } - pushRemappableOop(retType); - oop1 = instantiateClassindexableSize(classExternalAddress(), 4); - ptr1 = firstIndexableField(oop1); + classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure + ? classByteArray() + : classExternalAddress()); + +#if SPURVM + oop2 = instantiateClassindexableSize(classOop, 4); + +#else /* SPURVM */ + pushRemappableOop(retClass1); + oop2 = instantiateClassindexableSize(classOop, 4); + retClass1 = popRemappableOop() +#endif /* SPURVM */ +; + ptr1 = firstIndexableField(oop2); ptr1[0] = (((sqInt) intRet)); - pushRemappableOop(oop1); - retOop1 = instantiateClassindexableSize(classExternalData(), 0); + +#if SPURVM + retOop1 = instantiateClassindexableSize(retClass1, 0);
- /* external address */ +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(retClass1, 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + result = methodReturnValue(retOop1); + l6: /* end ffiReturnPointer:ofType:in: */; + } + else { + /* begin ffiReturnStruct:ofType:in: */ + /* begin ffiReturnType: */ + specLiteral = (argArrayOrNil != null + ? stackValue(1) + : literalofMethod(0, primitiveMethod())); + argTypes = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral); + ffiRetType = fetchPointerofObject(0, argTypes); + retClass = fetchPointerofObject(1, ffiRetType); + retOop = instantiateClassindexableSize(retClass, 0); + +#if SPURVM + oop1 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize));
- oop1 = popRemappableOop(); - storePointerofObjectwithValue(0, retOop1, oop1); +#else /* SPURVM */ + pushRemappableOop(retOop); + oop1 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); + retOop = popRemappableOop() +#endif /* SPURVM */ +; + if (returnStructInRegisters((calloutState->structReturnSize))) { + memcpy(firstIndexableField(oop1), (&intRet), (calloutState->structReturnSize)); + } + else { + memcpy(firstIndexableField(oop1), (calloutState->limit), (calloutState->structReturnSize)); + } + storePointerofObjectwithValue(0, retOop, oop1); + result = methodReturnValue(retOop); + } + goto l7; + } + if ((((usqInt) atomicType) >> 1) == (FFITypeSingleFloat > 1)) { + oop3 = floatObjectOf(floatRet); + } + else { + /* begin ffiCreateIntegralResultOop:ofAtomicType:in: */ + assert(atomicType < FFITypeSingleFloat); + if (atomicType == FFITypeBool) {
- /* return type */ + /* Make sure bool honors the byte size requested */
- oop1 = popRemappableOop(); - storePointerofObjectwithValue(1, retOop1, oop1); - result = methodReturnValue(retOop1); + byteSize = ((calloutState->ffiRetHeader)) & FFIStructSizeMask; + value = (byteSize == (sizeof(intRet)) + ? intRet + : intRet & ((1 << (byteSize * 8)) - 1)); + oop3 = (value == 0 + ? falseObject() + : trueObject()); goto l5; } - pushRemappableOop(retClass1); - classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure - ? classByteArray() - : classExternalAddress()); - oop1 = instantiateClassindexableSize(classOop, 4); - ptr1 = firstIndexableField(oop1); - ptr1[0] = (((sqInt) intRet)); + if (atomicType <= FFITypeSignedInt) {
- /* return class */ + /* these are all generall integer returns */
- retClass1 = popRemappableOop(); - pushRemappableOop(oop1); - retOop1 = instantiateClassindexableSize(retClass1, 0); + if (atomicType <= FFITypeSignedShort) {
- /* external address */ + /* byte/short. first extract partial word, then sign extend */
- oop1 = popRemappableOop(); - storePointerofObjectwithValue(0, retOop1, oop1); - result = methodReturnValue(retOop1); - goto l5; - } - if (((calloutState->ffiRetHeader)) & FFIFlagStructure) { - /* begin ffiReturnStruct:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral = (argArrayOrNil != null - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral); - ffiRetType = fetchPointerofObject(0, argTypes); - retClass = fetchPointerofObject(1, ffiRetType); - retOop = instantiateClassindexableSize(retClass, 0); - pushRemappableOop(retOop); - oop2 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); - if (returnStructInRegisters((calloutState->structReturnSize))) { - memcpy(firstIndexableField(oop2), (&intRet), (calloutState->structReturnSize)); + + /* # of significant bits */ + + shift = (((usqInt) atomicType) >> 1) * 8; + value = intRet & ((1 << shift) - 1); + if (atomicType & 1) { + + /* make the guy signed */ + + mask = 1 << (shift - 1); + value = (value & (mask - 1)) - (value & mask); + } + oop3 = integerObjectOf(value); + goto l5; + } + oop3 = (atomicType & 1 + ? signed32BitIntegerFor(intRet) + : positive32BitIntegerFor(intRet)); + goto l5; } - else { - memcpy(firstIndexableField(oop2), (calloutState->limit), (calloutState->structReturnSize)); - } - retOop = popRemappableOop(); - storePointerofObjectwithValue(0, retOop, oop2); - result = methodReturnValue(retOop); - goto l5; + oop3 = ((((usqInt) atomicType) >> 1) == (((usqInt) FFITypeSignedLongLong) >> 1) + ? (atomicType & 1 + ? signed64BitIntegerFor(intRet) + : positive64BitIntegerFor(intRet)) + : characterObjectOf(intRet & ( +#if SPURVM + 0xFFFFFFFFUL +#else /* SPURVM */ + 0xFF +#endif /* SPURVM */ + ))); + l5: /* end ffiCreateIntegralResultOop:ofAtomicType:in: */; } - if ((atomicType == FFITypeSingleFloat) - || (atomicType == FFITypeDoubleFloat)) { - result = methodReturnValue(floatObjectOf(floatRet)); - goto l5; - } - result = methodReturnValue(ffiCreateIntegralResultOopofAtomicTypein(intRet, atomicType, calloutState)); -l5: /* end ffiCalloutTo:SpecOnStack:in: */; + result = methodReturnValue(oop3); +l7: /* end ffiCalloutTo:SpecOnStack:in: */; /* begin cleanupCalloutState: */ while (((calloutState->stringArgIndex)) > 0) { free(((calloutState->stringArgs))[(calloutState->stringArgIndex = ((calloutState->stringArgIndex)) - 1)]); @@ -2195,7 +2406,7 @@ /* Make sure bool honors the byte size requested */
byteSize = ((calloutState->ffiRetHeader)) & FFIStructSizeMask; - value = (byteSize == 4 + value = (byteSize == (sizeof(retVal)) ? retVal : retVal & ((1 << (byteSize * 8)) - 1)); return (value == 0 @@ -3338,41 +3549,70 @@ } return methodReturnValue(strOop); } - pushRemappableOop(retType); + +#if SPURVM oop = instantiateClassindexableSize(classExternalAddress(), 4); ptr = firstIndexableField(oop); ptr[0] = (((sqInt) retVal)); + +#if SPURVM + retOop = instantiateClassindexableSize(classExternalData(), 0); + +#else /* SPURVM */ pushRemappableOop(oop); retOop = instantiateClassindexableSize(classExternalData(), 0); + oop = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop, oop);
- /* external address */ +#else /* SPURVM */ + pushRemappableOop(retType); + oop = instantiateClassindexableSize(classExternalAddress(), 4); + ptr = firstIndexableField(oop); + ptr[0] = (((sqInt) retVal)); + +#if SPURVM + retOop = instantiateClassindexableSize(classExternalData(), 0);
- oop = popRemappableOop(); +#else /* SPURVM */ + pushRemappableOop(oop); + retOop = instantiateClassindexableSize(classExternalData(), 0); + oop = popRemappableOop() +#endif /* SPURVM */ +; storePointerofObjectwithValue(0, retOop, oop); - - /* return type */ - - oop = popRemappableOop(); - storePointerofObjectwithValue(1, retOop, oop); + retType = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(1, retOop, retType); return methodReturnValue(retOop); } - pushRemappableOop(retClass); classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure ? classByteArray() : classExternalAddress()); + +#if SPURVM oop = instantiateClassindexableSize(classOop, 4); + +#else /* SPURVM */ + pushRemappableOop(retClass); + oop = instantiateClassindexableSize(classOop, 4); + retClass = popRemappableOop() +#endif /* SPURVM */ +; ptr = firstIndexableField(oop); ptr[0] = (((sqInt) retVal)); + +#if SPURVM + retOop = instantiateClassindexableSize(retClass, 0);
- /* return class */ - - retClass = popRemappableOop(); +#else /* SPURVM */ pushRemappableOop(oop); retOop = instantiateClassindexableSize(retClass, 0); - - /* external address */ - - oop = popRemappableOop(); + oop = popRemappableOop() +#endif /* SPURVM */ +; storePointerofObjectwithValue(0, retOop, oop); return methodReturnValue(retOop); } @@ -3392,15 +3632,22 @@
retClass = fetchPointerofObject(1, ffiRetType); retOop = instantiateClassindexableSize(retClass, 0); + +#if SPURVM + oop = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); + +#else /* SPURVM */ pushRemappableOop(retOop); oop = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); + retOop = popRemappableOop() +#endif /* SPURVM */ +; if (returnStructInRegisters((calloutState->structReturnSize))) { memcpy(firstIndexableField(oop), (&longLongRet), (calloutState->structReturnSize)); } else { memcpy(firstIndexableField(oop), (calloutState->limit), (calloutState->structReturnSize)); } - retOop = popRemappableOop(); storePointerofObjectwithValue(0, retOop, oop); return methodReturnValue(retOop); } @@ -3584,6 +3831,8 @@ sqInt atomicType1; sqInt atomicType11; sqInt atomicType2; + sqInt byteSize; + sqInt byteSize1; CalloutState *calloutState; CalloutState *calloutState1; sqInt classOop; @@ -3609,6 +3858,10 @@ sqInt i3; usqLong intRet; usqLong intRet1; + extern void loadFloatRegs(double, double, double, double, double, double, double, double); + extern void loadFloatRegs1(double, double, double, double, double, double, double, double); + sqInt mask; + sqInt mask1; sqInt meth; sqInt myThreadIndex; sqInt myThreadIndex1; @@ -3619,7 +3872,9 @@ sqInt oop11; sqInt oop12; sqInt oop2; + sqInt oop21; sqInt oop3; + sqInt oop4; void *pointer; void *pointer1; int *ptr; @@ -3642,6 +3897,8 @@ sqInt retryCount; sqInt retType; sqInt retType1; + sqInt shift; + sqInt shift1; sqInt specLiteral; sqInt specLiteral1; sqInt specLiteral11; @@ -3660,6 +3917,8 @@ sqInt typeSpec1; sqInt typeSpec11; sqInt typeSpec2; + usqLong value; + usqLong value1;
floatRet = 0; floatRet1 = 0; @@ -3872,6 +4131,7 @@ storeIntegerofObjectwithValue(ExternalFunctionStackSizeIndex, externalFunction, stackSize); } /* begin ffiCalloutTo:SpecOnStack:in: */ + ; # if COGMTVM if (((calloutState->callFlags)) & FFICallFlagThreaded) { @@ -3889,12 +4149,17 @@ /* begin atomicTypeOf: */ typeSpec = (calloutState->ffiRetHeader); atomicType = ((usqInt) (typeSpec & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if (atomicType == FFITypeSingleFloat) { - floatRet = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + if ((((usqInt) atomicType) >> 1) == (FFITypeSingleFloat > 1)) { + if (atomicType == FFITypeSingleFloat) { + floatRet = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + } + else { + + /* atomicType = FFITypeDoubleFloat */ + + floatRet = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); + } } - if (atomicType == FFITypeDoubleFloat) { - floatRet = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); - } else { intRet = dispatchFunctionPointerwithwithwithwith(((usqLong (*)(int, int, int, int)) (((void *) address))), ((calloutState->integerRegisters))[0], ((calloutState->integerRegisters))[1], ((calloutState->integerRegisters))[2], ((calloutState->integerRegisters))[3]); } @@ -3909,115 +4174,212 @@
# endif /* COGMTVM */
- if (((calloutState->ffiRetHeader)) & FFIFlagPointer) { - /* begin ffiReturnPointer:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral1 = (null != null - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes1 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral1); - retType = fetchPointerofObject(0, argTypes1); - retClass1 = fetchPointerofObject(1, retType); - if (retClass1 == (nilObject())) { + if (((calloutState->ffiRetHeader)) & (FFIFlagPointer + FFIFlagStructure)) {
- /* Create ExternalData upon return */ + /* Note: Order is important here since FFIFlagPointer + FFIFlagStructure is used to represent + 'typedef void* VoidPointer' and VoidPointer must be returned as pointer *not* as struct. */
- /* begin atomicTypeOf: */ - typeSpec1 = (calloutState->ffiRetHeader); - atomicType1 = ((usqInt) (typeSpec1 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if ((((usqInt) atomicType1) >> 1) == (((usqInt) FFITypeSignedChar) >> 1)) { + if (((calloutState->ffiRetHeader)) & FFIFlagPointer) { + /* begin ffiReturnPointer:ofType:in: */ + /* begin ffiReturnType: */ + specLiteral1 = (null != null + ? stackValue(1) + : literalofMethod(0, primitiveMethod())); + argTypes1 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral1); + retType = fetchPointerofObject(0, argTypes1); + retClass1 = fetchPointerofObject(1, retType); + if (retClass1 == (nilObject())) {
- /* String return */ + /* Create ExternalData upon return */
- /* begin ffiReturnCStringFrom: */ - cPointer = ((usqInt) intRet); - if (cPointer == null) { - result1 = methodReturnValue(nilObject()); - goto l11; + /* begin atomicTypeOf: */ + typeSpec1 = (calloutState->ffiRetHeader); + atomicType1 = ((usqInt) (typeSpec1 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; + if ((((usqInt) atomicType1) >> 1) == (((usqInt) FFITypeSignedChar) >> 1)) { + + /* String return */ + + /* begin ffiReturnCStringFrom: */ + cPointer = ((usqInt) intRet); + if (cPointer == null) { + methodReturnValue(nilObject()); + goto l12; + } + cString = ((char *) cPointer); + strLen = 0; + while (!((cString[strLen]) == 0)) { + strLen += 1; + } + strOop = instantiateClassindexableSize(classString(), strLen); + strPtr = firstIndexableField(strOop); + for (i2 = 0; i2 < strLen; i2 += 1) { + strPtr[i2] = (cString[i2]); + } + methodReturnValue(strOop); + goto l12; } - cString = ((char *) cPointer); - strLen = 0; - while (!((cString[strLen]) == 0)) { - strLen += 1; - } - strOop = instantiateClassindexableSize(classString(), strLen); - strPtr = firstIndexableField(strOop); - for (i2 = 0; i2 < strLen; i2 += 1) { - strPtr[i2] = (cString[i2]); - } - result1 = methodReturnValue(strOop); - goto l11; + +#if SPURVM + oop2 = instantiateClassindexableSize(classExternalAddress(), 4); + ptr2 = firstIndexableField(oop2); + ptr2[0] = (((sqInt) intRet)); + +#if SPURVM + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + +#else /* SPURVM */ + pushRemappableOop(retType); + oop2 = instantiateClassindexableSize(classExternalAddress(), 4); + ptr2 = firstIndexableField(oop2); + ptr2[0] = (((sqInt) intRet)); + +#if SPURVM + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(classExternalData(), 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + retType = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(1, retOop1, retType); + methodReturnValue(retOop1); + goto l12; } - pushRemappableOop(retType); - oop11 = instantiateClassindexableSize(classExternalAddress(), 4); - ptr2 = firstIndexableField(oop11); + classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure + ? classByteArray() + : classExternalAddress()); + +#if SPURVM + oop2 = instantiateClassindexableSize(classOop, 4); + +#else /* SPURVM */ + pushRemappableOop(retClass1); + oop2 = instantiateClassindexableSize(classOop, 4); + retClass1 = popRemappableOop() +#endif /* SPURVM */ +; + ptr2 = firstIndexableField(oop2); ptr2[0] = (((sqInt) intRet)); - pushRemappableOop(oop11); - retOop1 = instantiateClassindexableSize(classExternalData(), 0); + +#if SPURVM + retOop1 = instantiateClassindexableSize(retClass1, 0);
- /* external address */ +#else /* SPURVM */ + pushRemappableOop(oop2); + retOop1 = instantiateClassindexableSize(retClass1, 0); + oop2 = popRemappableOop() +#endif /* SPURVM */ +; + storePointerofObjectwithValue(0, retOop1, oop2); + result1 = methodReturnValue(retOop1); + l12: /* end ffiReturnPointer:ofType:in: */; + } + else { + /* begin ffiReturnStruct:ofType:in: */ + /* begin ffiReturnType: */ + specLiteral = (null != null + ? stackValue(1) + : literalofMethod(0, primitiveMethod())); + argTypes = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral); + ffiRetType = fetchPointerofObject(0, argTypes); + retClass = fetchPointerofObject(1, ffiRetType); + retOop = instantiateClassindexableSize(retClass, 0); + +#if SPURVM + oop11 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize));
- oop11 = popRemappableOop(); - storePointerofObjectwithValue(0, retOop1, oop11); +#else /* SPURVM */ + pushRemappableOop(retOop); + oop11 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); + retOop = popRemappableOop() +#endif /* SPURVM */ +; + if (returnStructInRegisters((calloutState->structReturnSize))) { + memcpy(firstIndexableField(oop11), (&intRet), (calloutState->structReturnSize)); + } + else { + memcpy(firstIndexableField(oop11), (calloutState->limit), (calloutState->structReturnSize)); + } + storePointerofObjectwithValue(0, retOop, oop11); + result1 = methodReturnValue(retOop); + } + goto l13; + } + if ((((usqInt) atomicType) >> 1) == (FFITypeSingleFloat > 1)) { + oop3 = floatObjectOf(floatRet); + } + else { + /* begin ffiCreateIntegralResultOop:ofAtomicType:in: */ + assert(atomicType < FFITypeSingleFloat); + if (atomicType == FFITypeBool) {
- /* return type */ + /* Make sure bool honors the byte size requested */
- oop11 = popRemappableOop(); - storePointerofObjectwithValue(1, retOop1, oop11); - result1 = methodReturnValue(retOop1); + byteSize = ((calloutState->ffiRetHeader)) & FFIStructSizeMask; + value = (byteSize == (sizeof(intRet)) + ? intRet + : intRet & ((1 << (byteSize * 8)) - 1)); + oop3 = (value == 0 + ? falseObject() + : trueObject()); goto l11; } - pushRemappableOop(retClass1); - classOop = (((calloutState->ffiRetHeader)) & FFIFlagStructure - ? classByteArray() - : classExternalAddress()); - oop11 = instantiateClassindexableSize(classOop, 4); - ptr2 = firstIndexableField(oop11); - ptr2[0] = (((sqInt) intRet)); + if (atomicType <= FFITypeSignedInt) {
- /* return class */ + /* these are all generall integer returns */
- retClass1 = popRemappableOop(); - pushRemappableOop(oop11); - retOop1 = instantiateClassindexableSize(retClass1, 0); + if (atomicType <= FFITypeSignedShort) {
- /* external address */ + /* byte/short. first extract partial word, then sign extend */
- oop11 = popRemappableOop(); - storePointerofObjectwithValue(0, retOop1, oop11); - result1 = methodReturnValue(retOop1); - goto l11; - } - if (((calloutState->ffiRetHeader)) & FFIFlagStructure) { - /* begin ffiReturnStruct:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral = (null != null - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral); - ffiRetType = fetchPointerofObject(0, argTypes); - retClass = fetchPointerofObject(1, ffiRetType); - retOop = instantiateClassindexableSize(retClass, 0); - pushRemappableOop(retOop); - oop2 = instantiateClassindexableSize(classByteArray(), (calloutState->structReturnSize)); - if (returnStructInRegisters((calloutState->structReturnSize))) { - memcpy(firstIndexableField(oop2), (&intRet), (calloutState->structReturnSize)); + + /* # of significant bits */ + + shift = (((usqInt) atomicType) >> 1) * 8; + value = intRet & ((1 << shift) - 1); + if (atomicType & 1) { + + /* make the guy signed */ + + mask = 1 << (shift - 1); + value = (value & (mask - 1)) - (value & mask); + } + oop3 = integerObjectOf(value); + goto l11; + } + oop3 = (atomicType & 1 + ? signed32BitIntegerFor(intRet) + : positive32BitIntegerFor(intRet)); + goto l11; } - else { - memcpy(firstIndexableField(oop2), (calloutState->limit), (calloutState->structReturnSize)); - } - retOop = popRemappableOop(); - storePointerofObjectwithValue(0, retOop, oop2); - result1 = methodReturnValue(retOop); - goto l11; + oop3 = ((((usqInt) atomicType) >> 1) == (((usqInt) FFITypeSignedLongLong) >> 1) + ? (atomicType & 1 + ? signed64BitIntegerFor(intRet) + : positive64BitIntegerFor(intRet)) + : characterObjectOf(intRet & ( +#if SPURVM + 0xFFFFFFFFUL +#else /* SPURVM */ + 0xFF +#endif /* SPURVM */ + ))); + l11: /* end ffiCreateIntegralResultOop:ofAtomicType:in: */; } - if ((atomicType == FFITypeSingleFloat) - || (atomicType == FFITypeDoubleFloat)) { - result1 = methodReturnValue(floatObjectOf(floatRet)); - goto l11; - } - result1 = methodReturnValue(ffiCreateIntegralResultOopofAtomicTypein(intRet, atomicType, calloutState)); - l11: /* end ffiCalloutTo:SpecOnStack:in: */; + result1 = methodReturnValue(oop3); + l13: /* end ffiCalloutTo:SpecOnStack:in: */; /* begin cleanupCalloutState: */ while (((calloutState->stringArgIndex)) > 0) { free(((calloutState->stringArgs))[(calloutState->stringArgIndex = ((calloutState->stringArgIndex)) - 1)]); @@ -4225,6 +4587,7 @@ storeIntegerofObjectwithValue(ExternalFunctionStackSizeIndex, externalFunction, stackSize1); } /* begin ffiCalloutTo:SpecOnStack:in: */ + ; # if COGMTVM if (((calloutState1->callFlags)) & FFICallFlagThreaded) { @@ -4242,12 +4605,17 @@ /* begin atomicTypeOf: */ typeSpec2 = (calloutState1->ffiRetHeader); atomicType2 = ((usqInt) (typeSpec2 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if (atomicType2 == FFITypeSingleFloat) { - floatRet1 = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) (((void *) address1))), ((calloutState1->integerRegisters))[0], ((calloutState1->integerRegisters))[1], ((calloutState1->integerRegisters))[2], ((calloutState1->integerRegisters))[3]); + if ((((usqInt) atomicType2) >> 1) == (FFITypeSingleFloat > 1)) { + if (atomicType2 == FFITypeSingleFloat) { + floatRet1 = dispatchFunctionPointerwithwithwithwith(((float (*)(int, int, int, int)) (((void *) address1))), ((calloutState1->integerRegisters))[0], ((calloutState1->integerRegisters))[1], ((calloutState1->integerRegisters))[2], ((calloutState1->integerRegisters))[3]); + } + else { + + /* atomicType = FFITypeDoubleFloat */ + + floatRet1 = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) (((void *) address1))), ((calloutState1->integerRegisters))[0], ((calloutState1->integerRegisters))[1], ((calloutState1->integerRegisters))[2], ((calloutState1->integerRegisters))[3]); + } } - if (atomicType2 == FFITypeDoubleFloat) { - floatRet1 = dispatchFunctionPointerwithwithwithwith(((double (*)(int, int, int, int)) (((void *) address1))), ((calloutState1->integerRegisters))[0], ((calloutState1->integerRegisters))[1], ((calloutState1->integerRegisters))[2], ((calloutState1->integerRegisters))[3]); - } else { intRet1 = dispatchFunctionPointerwithwithwithwith(((usqLong (*)(int, int, int, int)) (((void *) address1))), ((calloutState1->integerRegisters))[0], ((calloutState1->integerRegisters))[1], ((calloutState1->integerRegisters))[2], ((calloutState1->integerRegisters))[3]); } @@ -4262,115 +4630,212 @@
# endif /* COGMTVM */
- if (((calloutState1->ffiRetHeader)) & FFIFlagPointer) { - /* begin ffiReturnPointer:ofType:in: */ - /* begin ffiReturnType: */ - specLiteral11 = (null != null - ? stackValue(1) - : literalofMethod(0, primitiveMethod())); - argTypes11 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral11); - retType1 = fetchPointerofObject(0, argTypes11); - retClass11 = fetchPointerofObject(1, retType1); - if (retClass11 == (nilObject())) { + if (((calloutState1->ffiRetHeader)) & (FFIFlagPointer + FFIFlagStructure)) {
- /* Create ExternalData upon return */ + /* Note: Order is important here since FFIFlagPointer + FFIFlagStructure is used to represent + 'typedef void* VoidPointer' and VoidPointer must be returned as pointer *not* as struct. */
- /* begin atomicTypeOf: */ - typeSpec11 = (calloutState1->ffiRetHeader); - atomicType11 = ((usqInt) (typeSpec11 & FFIAtomicTypeMask)) >> FFIAtomicTypeShift; - if ((((usqInt) atomicType11) >> 1) == (((usqInt) FFITypeSignedChar) >> 1)) { + if (((calloutState1->ffiRetHeader)) & FFIFlagPointer) { + /* begin ffiReturnPointer:ofType:in: */ + /* begin ffiReturnType: */ + specLiteral11 = (null != null + ? stackValue(1) + : literalofMethod(0, primitiveMethod())); + argTypes11 = fetchPointerofObject(ExternalFunctionArgTypesIndex, specLiteral11); + retType1 = fetchPointerofObject(0, argTypes11); + retClass11 = fetchPointerofObject(1, retType1); + if (retClass11 == (nilObject())) {
- /* String return */ + /* Create ExternalData upon return */
- /* begin ffiReturnCStringFrom: */ - cPointer1 = ((usqInt) intRet1); - if (cPointer1 == null) { - result2 = methodReturnValue(nilObject()); - goto l12; + /* begin atomicTypeOf: */ + typeSpec11 = (calloutState1->ffiRetHeader);
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org