diff options
author | Damien George <damien.p.george@gmail.com> | 2015-11-06 23:25:10 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-11-06 23:25:10 +0000 |
commit | 8b8d189bc09b050f9a66048736c7e990ac8c8335 (patch) | |
tree | 5d9d9c77f5a9d0b84724037ff74907cf9c565234 /py/obj.h | |
parent | 8f7ff854b0e341aa49d198a93fea7e83dd4cc71c (diff) | |
download | micropython-8b8d189bc09b050f9a66048736c7e990ac8c8335.tar.gz micropython-8b8d189bc09b050f9a66048736c7e990ac8c8335.zip |
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.
Diffstat (limited to 'py/obj.h')
-rw-r--r-- | py/obj.h | 16 |
1 files changed, 8 insertions, 8 deletions
@@ -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); } |