@@ -997,13 +997,29 @@ static void emit_native_binary_op(emit_t *emit, rt_binary_op_t op) {
997997 vtype_kind_t vtype_lhs , vtype_rhs ;
998998 emit_pre_pop_reg_reg (emit , & vtype_rhs , REG_ARG_3 , & vtype_lhs , REG_ARG_2 );
999999 if (vtype_lhs == VTYPE_INT && vtype_rhs == VTYPE_INT ) {
1000- assert (op == RT_BINARY_OP_ADD || op == RT_BINARY_OP_INPLACE_ADD );
1000+ if (op == RT_BINARY_OP_ADD || op == RT_BINARY_OP_INPLACE_ADD ) {
10011001#if N_X64
1002- asm_x64_add_r64_to_r64 (emit -> as , REG_ARG_3 , REG_ARG_2 );
1002+ asm_x64_add_r64_to_r64 (emit -> as , REG_ARG_3 , REG_ARG_2 );
10031003#elif N_THUMB
1004- asm_thumb_add_reg_reg_reg (emit -> as , REG_ARG_2 , REG_ARG_2 , REG_ARG_3 );
1004+ asm_thumb_add_reg_reg_reg (emit -> as , REG_ARG_2 , REG_ARG_2 , REG_ARG_3 );
10051005#endif
1006- emit_post_push_reg (emit , VTYPE_INT , REG_ARG_2 );
1006+ emit_post_push_reg (emit , VTYPE_INT , REG_ARG_2 );
1007+ } else if (op == RT_COMPARE_OP_LESS ) {
1008+ #if N_X64
1009+ asm_x64_xor_r64_to_r64 (emit -> as , REG_RET , REG_RET );
1010+ asm_x64_cmp_r64_with_r64 (emit -> as , REG_ARG_3 , REG_ARG_2 );
1011+ asm_x64_setcc_r8 (emit -> as , JCC_JL , REG_RET );
1012+ #elif N_THUMB
1013+ asm_thumb_cmp_reg_reg (emit -> as , REG_ARG_2 , REG_ARG_3 );
1014+ asm_thumb_ite_ge (emit -> as );
1015+ asm_thumb_movs_rlo_i8 (emit -> as , REG_RET , 0 ); // if r0 >= r1
1016+ asm_thumb_movs_rlo_i8 (emit -> as , REG_RET , 1 ); // if r0 < r1
1017+ #endif
1018+ emit_post_push_reg (emit , VTYPE_BOOL , REG_RET );
1019+ } else {
1020+ // TODO other ops not yet implemented
1021+ assert (0 );
1022+ }
10071023 } else if (vtype_lhs == VTYPE_PYOBJ && vtype_rhs == VTYPE_PYOBJ ) {
10081024 emit_call_with_imm_arg (emit , RT_F_BINARY_OP , rt_binary_op , op , REG_ARG_1 );
10091025 emit_post_push_reg (emit , VTYPE_PYOBJ , REG_RET );
0 commit comments