mpy-cross viper incompatibility with OBJ_REPR_B
Port, board and/or hardware
unix port, obj_repr_b, x86 (32-bit)
MicroPython version
based on v1.27.0-preview-154-g44986b1f04
Reproduction
- Make a 32-bit REPR_B "standard" or "coverage" build (from e.g., #17688)
- Run
RUN_TESTS_MPY_CROSS_FLAGS="--mpy-cross-flags=\"-march=x86 -msmall-int-bits=30\"" make -C ports/unix/ VARIANT=standard test_full_no_native# orVARIANT=coverage, depending
Expected behaviour
Tests pass
Observed behaviour
12 tests failed: micropython/native_gen.py micropython/native_misc.py micropython/native_try.py micropython/viper_import.py micropython/native_try_deep.py micropython/native_while.py micropython/native_with.py micropython/viper_misc3.py micropython/native_closure.py micropython/native_const.py micropython/native_for.py micropython/viper_with.py
I didn't dig deeply because native & viper were not important to my use case but I think that there are some assumptions about the encoding of small integer values as discussed in a related PR: https://github.com/micropython/micropython/pull/17688#issuecomment-3075383706
} else if (si->vtype == VTYPE_INT || si->vtype == VTYPE_UINT) {
ASM_MOV_REG_IMM(emit->as, reg_dest, (uintptr_t)MP_OBJ_NEW_SMALL_INT(si->data.u_imm));
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree
Add OBJ_REPR_E for full 32-bit float precision
Summary
Add a new object representation called OBJ_REPR_E.
This work is loosely inspired by Float Self-Tagging but the shift & tag values are not any of those proposed in the paper.
Testing
I locally ran the testsuite. Some native tests fail, which I'll have to resolve one way or another. It may be #18108 because the small int size is 30 bits, not 31.
Trade-offs and Alternatives
I did not see a way to organize the new repr while retaining 31-bit ints. This means we hit #18105 and #18108 -- no uctypes, and no mpy-compiled native/viper code.
It adds about +1.5kB.
This builds on #18396