From 7b2d3f38ceae0ca3839d3812421a8a113ae5105c Mon Sep 17 00:00:00 2001 From: Damien Date: Tue, 22 Oct 2013 16:53:02 +0100 Subject: [PATCH] Implement some more operators, mostly for small ints. --- py/runtime.c | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/py/runtime.c b/py/runtime.c index ec8c1577a8..a1c94930ff 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -522,7 +522,6 @@ FILE *fp_native = NULL; #endif void rt_init() { - printf("%u\n", sizeof(py_obj_base_t)); q_append = qstr_from_str_static("append"); q_print = qstr_from_str_static("print"); q_len = qstr_from_str_static("len"); @@ -957,14 +956,27 @@ py_obj_t rt_binary_op(int op, py_obj_t lhs, py_obj_t rhs) { } else if (IS_SMALL_INT(lhs) && IS_SMALL_INT(rhs)) { py_small_int_t val; switch (op) { + case RT_BINARY_OP_OR: + case RT_BINARY_OP_INPLACE_OR: val = FROM_SMALL_INT(lhs) | FROM_SMALL_INT(rhs); break; + case RT_BINARY_OP_XOR: + case RT_BINARY_OP_INPLACE_XOR: val = FROM_SMALL_INT(lhs) ^ FROM_SMALL_INT(rhs); break; + case RT_BINARY_OP_AND: + case RT_BINARY_OP_INPLACE_AND: val = FROM_SMALL_INT(lhs) & FROM_SMALL_INT(rhs); break; + case RT_BINARY_OP_LSHIFT: + case RT_BINARY_OP_INPLACE_LSHIFT: val = FROM_SMALL_INT(lhs) << FROM_SMALL_INT(rhs); break; + case RT_BINARY_OP_RSHIFT: + case RT_BINARY_OP_INPLACE_RSHIFT: val = FROM_SMALL_INT(lhs) >> FROM_SMALL_INT(rhs); break; case RT_BINARY_OP_ADD: case RT_BINARY_OP_INPLACE_ADD: val = FROM_SMALL_INT(lhs) + FROM_SMALL_INT(rhs); break; case RT_BINARY_OP_SUBTRACT: case RT_BINARY_OP_INPLACE_SUBTRACT: val = FROM_SMALL_INT(lhs) - FROM_SMALL_INT(rhs); break; - case RT_BINARY_OP_MULTIPLY: val = FROM_SMALL_INT(lhs) * FROM_SMALL_INT(rhs); break; - case RT_BINARY_OP_FLOOR_DIVIDE: val = FROM_SMALL_INT(lhs) / FROM_SMALL_INT(rhs); break; + case RT_BINARY_OP_MULTIPLY: + case RT_BINARY_OP_INPLACE_MULTIPLY: val = FROM_SMALL_INT(lhs) * FROM_SMALL_INT(rhs); break; + case RT_BINARY_OP_FLOOR_DIVIDE: + case RT_BINARY_OP_INPLACE_FLOOR_DIVIDE: val = FROM_SMALL_INT(lhs) / FROM_SMALL_INT(rhs); break; #if MICROPY_ENABLE_FLOAT - case RT_BINARY_OP_TRUE_DIVIDE: return py_obj_new_float((float_t)FROM_SMALL_INT(lhs) / (float_t)FROM_SMALL_INT(rhs)); + case RT_BINARY_OP_TRUE_DIVIDE: + case RT_BINARY_OP_INPLACE_TRUE_DIVIDE: return py_obj_new_float((float_t)FROM_SMALL_INT(lhs) / (float_t)FROM_SMALL_INT(rhs)); #endif default: printf("%d\n", op); assert(0); val = 0; } @@ -988,11 +1000,32 @@ py_obj_t rt_binary_op(int op, py_obj_t lhs, py_obj_t rhs) { py_obj_t rt_compare_op(int op, py_obj_t lhs, py_obj_t rhs) { DEBUG_OP_printf("compare %d %p %p\n", op, lhs, rhs); + + // deal with == and != + if (op == RT_COMPARE_OP_EQUAL || op == RT_COMPARE_OP_NOT_EQUAL) { + if (py_obj_equal(lhs, rhs)) { + if (op == RT_COMPARE_OP_EQUAL) { + return py_const_true; + } else { + return py_const_false; + } + } else { + if (op == RT_COMPARE_OP_EQUAL) { + return py_const_false; + } else { + return py_const_true; + } + } + } + + // deal with small ints if (IS_SMALL_INT(lhs) && IS_SMALL_INT(rhs)) { int cmp; switch (op) { case RT_COMPARE_OP_LESS: cmp = FROM_SMALL_INT(lhs) < FROM_SMALL_INT(rhs); break; case RT_COMPARE_OP_MORE: cmp = FROM_SMALL_INT(lhs) > FROM_SMALL_INT(rhs); break; + case RT_COMPARE_OP_LESS_EQUAL: cmp = FROM_SMALL_INT(lhs) <= FROM_SMALL_INT(rhs); break; + case RT_COMPARE_OP_MORE_EQUAL: cmp = FROM_SMALL_INT(lhs) >= FROM_SMALL_INT(rhs); break; default: assert(0); cmp = 0; } if (cmp) { @@ -1001,6 +1034,8 @@ py_obj_t rt_compare_op(int op, py_obj_t lhs, py_obj_t rhs) { return py_const_false; } } + + // not implemented assert(0); return py_const_none; }