mirror of
https://github.com/micropython/micropython.git
synced 2026-01-06 20:20:14 +01:00
py: Adjust object repr C (30-bit stuffed float) to reduce code size.
This patch adds/subtracts a constant from the 30-bit float representation so that str/qstr representations are favoured: they now have all the high bits set to zero. This makes encoding/decoding qstr strings more efficient (and they are used more often than floats, which are now slightly less efficient to encode/decode). Saves about 300 bytes of code space on Thumb 2 arch.
This commit is contained in:
16
py/obj.h
16
py/obj.h
@@ -130,16 +130,16 @@ static inline bool MP_OBJ_IS_SMALL_INT(mp_const_obj_t o)
|
||||
#define MP_OBJ_SMALL_INT_VALUE(o) (((mp_int_t)(o)) >> 1)
|
||||
#define MP_OBJ_NEW_SMALL_INT(small_int) ((mp_obj_t)((((mp_int_t)(small_int)) << 1) | 1))
|
||||
|
||||
#define mp_const_float_e ((mp_obj_t)((0x402df854 & ~3) | 2))
|
||||
#define mp_const_float_pi ((mp_obj_t)((0x40490fdb & ~3) | 2))
|
||||
#define mp_const_float_e ((mp_obj_t)(((0x402df854 & ~3) | 2) + 0x80800000))
|
||||
#define mp_const_float_pi ((mp_obj_t)(((0x40490fdb & ~3) | 2) + 0x80800000))
|
||||
|
||||
static inline bool mp_obj_is_float(mp_const_obj_t o)
|
||||
{ return (((mp_uint_t)(o)) & 3) == 2 && (((mp_uint_t)(o)) & 0x7f800004) != 0x7f800004; }
|
||||
{ return (((mp_uint_t)(o)) & 3) == 2 && (((mp_uint_t)(o)) & 0xff800007) != 0x00000006; }
|
||||
static inline mp_float_t mp_obj_float_get(mp_const_obj_t o) {
|
||||
union {
|
||||
mp_float_t f;
|
||||
mp_uint_t u;
|
||||
} num = {.u = (mp_uint_t)o & ~3};
|
||||
} num = {.u = ((mp_uint_t)o - 0x80800000) & ~3};
|
||||
return num.f;
|
||||
}
|
||||
static inline mp_obj_t mp_obj_new_float(mp_float_t f) {
|
||||
@@ -147,13 +147,13 @@ static inline mp_obj_t mp_obj_new_float(mp_float_t f) {
|
||||
mp_float_t f;
|
||||
mp_uint_t u;
|
||||
} num = {.f = f};
|
||||
return (mp_obj_t)((num.u & ~0x3) | 2);
|
||||
return (mp_obj_t)(((num.u & ~0x3) | 2) + 0x80800000);
|
||||
}
|
||||
|
||||
static inline bool MP_OBJ_IS_QSTR(mp_const_obj_t o)
|
||||
{ return (((mp_uint_t)(o)) & 0x7f800007) == 0x7f800006; }
|
||||
#define MP_OBJ_QSTR_VALUE(o) ((((mp_uint_t)(o)) >> 3) & 0xfffff)
|
||||
#define MP_OBJ_NEW_QSTR(qst) ((mp_obj_t)((((mp_uint_t)(qst)) << 3) | 0x7f800006))
|
||||
{ return (((mp_uint_t)(o)) & 0xff800007) == 0x00000006; }
|
||||
#define MP_OBJ_QSTR_VALUE(o) (((mp_uint_t)(o)) >> 3)
|
||||
#define MP_OBJ_NEW_QSTR(qst) ((mp_obj_t)((((mp_uint_t)(qst)) << 3) | 0x00000006))
|
||||
|
||||
static inline bool MP_OBJ_IS_OBJ(mp_const_obj_t o)
|
||||
{ return ((((mp_int_t)(o)) & 3) == 0); }
|
||||
|
||||
Reference in New Issue
Block a user