summaryrefslogtreecommitdiffstatshomepage
path: root/py
diff options
context:
space:
mode:
authorDamien <damien.p.george@gmail.com>2013-10-22 16:53:02 +0100
committerDamien <damien.p.george@gmail.com>2013-10-22 16:53:02 +0100
commit7b2d3f38ceae0ca3839d3812421a8a113ae5105c (patch)
tree156da0241e59debd3b2691c1c49386ad89d94cf8 /py
parent1b50affca8927acfec1129baf2b428daa58c737b (diff)
downloadmicropython-7b2d3f38ceae0ca3839d3812421a8a113ae5105c.tar.gz
micropython-7b2d3f38ceae0ca3839d3812421a8a113ae5105c.zip
Implement some more operators, mostly for small ints.
Diffstat (limited to 'py')
-rw-r--r--py/runtime.c43
1 files 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;
}