diff options
author | Damien George <damien.p.george@gmail.com> | 2017-08-30 11:26:29 +1000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2017-08-30 11:26:29 +1000 |
commit | 20f1bd0a14181873ffce446d90c6125b66883926 (patch) | |
tree | c64029d3dae1a52cdd5a6236eb01dc61b0fa36af /py | |
parent | 4ddb838f8b03bfbbce0b7c1ffec4cf1dd1f34ec6 (diff) | |
download | micropython-20f1bd0a14181873ffce446d90c6125b66883926.tar.gz micropython-20f1bd0a14181873ffce446d90c6125b66883926.zip |
py/compile2: Combine arith and bit-shift ops into 1 compile routine.
A port of a040fb89e7b8507aa775b0620de1770642b0f5ee
Diffstat (limited to 'py')
-rw-r--r-- | py/compile2.c | 53 |
1 files changed, 14 insertions, 39 deletions
diff --git a/py/compile2.c b/py/compile2.c index b22ae8b940..189fa89084 100644 --- a/py/compile2.c +++ b/py/compile2.c @@ -2035,52 +2035,27 @@ STATIC void compile_and_expr(compiler_t *comp, const byte *p, const byte *ptop) c_binary_op(comp, p, ptop, MP_BINARY_OP_AND); } -STATIC void compile_shift_expr(compiler_t *comp, const byte *p, const byte *ptop) { - p = compile_node(comp, p); - while (p != ptop) { - byte tok; - p = pt_tok_extract(p, &tok); - p = compile_node(comp, p); - if (tok == MP_TOKEN_OP_DBL_LESS) { - EMIT_ARG(binary_op, MP_BINARY_OP_LSHIFT); - } else { - assert(tok == MP_TOKEN_OP_DBL_MORE); // should be - EMIT_ARG(binary_op, MP_BINARY_OP_RSHIFT); - } - } -} - -STATIC void compile_arith_expr(compiler_t *comp, const byte *p, const byte *ptop) { - p = compile_node(comp, p); - while (p != ptop) { - byte tok; - p = pt_tok_extract(p, &tok); - p = compile_node(comp, p); - if (tok == MP_TOKEN_OP_PLUS) { - EMIT_ARG(binary_op, MP_BINARY_OP_ADD); - } else { - assert(tok == MP_TOKEN_OP_MINUS); // should be - EMIT_ARG(binary_op, MP_BINARY_OP_SUBTRACT); - } - } -} - STATIC void compile_term(compiler_t *comp, const byte *p, const byte *ptop) { p = compile_node(comp, p); while (p != ptop) { byte tok; p = pt_tok_extract(p, &tok); p = compile_node(comp, p); - if (tok == MP_TOKEN_OP_STAR) { - EMIT_ARG(binary_op, MP_BINARY_OP_MULTIPLY); - } else if (tok == MP_TOKEN_OP_DBL_SLASH) { - EMIT_ARG(binary_op, MP_BINARY_OP_FLOOR_DIVIDE); - } else if (tok == MP_TOKEN_OP_SLASH) { - EMIT_ARG(binary_op, MP_BINARY_OP_TRUE_DIVIDE); - } else { - assert(tok == MP_TOKEN_OP_PERCENT); // should be - EMIT_ARG(binary_op, MP_BINARY_OP_MODULO); + mp_binary_op_t op; + switch (tok) { + case MP_TOKEN_OP_PLUS: op = MP_BINARY_OP_ADD; break; + case MP_TOKEN_OP_MINUS: op = MP_BINARY_OP_SUBTRACT; break; + case MP_TOKEN_OP_STAR: op = MP_BINARY_OP_MULTIPLY; break; + case MP_TOKEN_OP_DBL_SLASH: op = MP_BINARY_OP_FLOOR_DIVIDE; break; + case MP_TOKEN_OP_SLASH: op = MP_BINARY_OP_TRUE_DIVIDE; break; + case MP_TOKEN_OP_PERCENT: op = MP_BINARY_OP_MODULO; break; + case MP_TOKEN_OP_DBL_LESS: op = MP_BINARY_OP_LSHIFT; break; + default: + assert(tok == MP_TOKEN_OP_DBL_MORE); + op = MP_BINARY_OP_RSHIFT; + break; } + EMIT_ARG(binary_op, op); } } |