objVal - should not be sJitTemp1
| 3863 | |
| 3864 | // objVal - should not be sJitTemp1 |
| 3865 | void genWriteBarrier(CppiaCompiler *compiler, JitReg objVal, JitVal valuePtr) |
| 3866 | { |
| 3867 | |
| 3868 | // unsigned char mark = ((unsigned char *)(obj))[ HX_ENDIAN_MARK_ID_BYTE] != ctx->byteMarkId |
| 3869 | compiler->move(sJitTemp1, objVal.star(jtByte, HX_ENDIAN_MARK_ID_BYTE) ); |
| 3870 | JumpId newMark = compiler->compare(cmpI_NOT_EQUAL,sJitTemp1,sJitCtx.star(jtInt, offsetof(hx::StackContext,byteMarkId))); |
| 3871 | |
| 3872 | compiler->move(sJitTemp1, valuePtr ); |
| 3873 | |
| 3874 | // Value != 0 |
| 3875 | JumpId nullValue = compiler->compare(cmpP_ZERO, sJitTemp1.as(jtPointer),0); |
| 3876 | compiler->move(sJitTemp1, sJitTemp1.star(jtByte, HX_ENDIAN_MARK_ID_BYTE) ); |
| 3877 | JumpId notNursery = compiler->compare(cmpI_NOT_ZERO, sJitTemp1, 0); |
| 3878 | |
| 3879 | // TODO - not use temp? |
| 3880 | JitTemp tmpObj(compiler, jtPointer); |
| 3881 | compiler->move(tmpObj, objVal); |
| 3882 | compiler->callNative( (void *)pushWriteBarrier, sJitCtx, tmpObj ); |
| 3883 | |
| 3884 | compiler->comeFrom(notNursery); |
| 3885 | compiler->comeFrom(nullValue); |
| 3886 | compiler->comeFrom(newMark); |
| 3887 | } |
| 3888 | |
| 3889 | |
| 3890 | #endif |