add OP_GT and OP_GE
This commit is contained in:
parent
055691ebfc
commit
9e04a80636
|
@ -945,6 +945,8 @@ codegen_call_vm(pic_state *pic, codegen_context *cxt, pic_value proc, size_t len
|
||||||
VM(pic->uEQ, OP_EQ)
|
VM(pic->uEQ, OP_EQ)
|
||||||
VM(pic->uLT, OP_LT)
|
VM(pic->uLT, OP_LT)
|
||||||
VM(pic->uLE, OP_LE)
|
VM(pic->uLE, OP_LE)
|
||||||
|
VM(pic->uGT, OP_GT)
|
||||||
|
VM(pic->uGE, OP_GE)
|
||||||
VM(pic->uADD, OP_ADD)
|
VM(pic->uADD, OP_ADD)
|
||||||
VM(pic->uSUB, OP_SUB)
|
VM(pic->uSUB, OP_SUB)
|
||||||
VM(pic->uMUL, OP_MUL)
|
VM(pic->uMUL, OP_MUL)
|
||||||
|
|
|
@ -552,6 +552,8 @@ gc_mark_system_procedures(pic_state *pic)
|
||||||
P(pEQ);
|
P(pEQ);
|
||||||
P(pLT);
|
P(pLT);
|
||||||
P(pLE);
|
P(pLE);
|
||||||
|
P(pGT);
|
||||||
|
P(pGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -107,7 +107,7 @@ struct pic_state {
|
||||||
pic_sym *uVALUES, *uCALL_WITH_VALUES;
|
pic_sym *uVALUES, *uCALL_WITH_VALUES;
|
||||||
|
|
||||||
pic_value pCONS, pCAR, pCDR, pNILP, pPAIRP, pSYMBOLP, pNOT;
|
pic_value pCONS, pCAR, pCDR, pNILP, pPAIRP, pSYMBOLP, pNOT;
|
||||||
pic_value pADD, pSUB, pMUL, pDIV, pEQ, pLT, pLE;
|
pic_value pADD, pSUB, pMUL, pDIV, pEQ, pLT, pLE, pGT, pGE;
|
||||||
|
|
||||||
struct pic_lib *PICRIN_BASE;
|
struct pic_lib *PICRIN_BASE;
|
||||||
struct pic_lib *PICRIN_USER;
|
struct pic_lib *PICRIN_USER;
|
||||||
|
|
|
@ -45,6 +45,8 @@ enum pic_opcode {
|
||||||
OP_EQ,
|
OP_EQ,
|
||||||
OP_LT,
|
OP_LT,
|
||||||
OP_LE,
|
OP_LE,
|
||||||
|
OP_GT,
|
||||||
|
OP_GE,
|
||||||
OP_STOP
|
OP_STOP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -193,6 +195,12 @@ pic_dump_code(pic_code c)
|
||||||
case OP_LE:
|
case OP_LE:
|
||||||
puts("OP_LE");
|
puts("OP_LE");
|
||||||
break;
|
break;
|
||||||
|
case OP_GT:
|
||||||
|
puts("OP_GT");
|
||||||
|
break;
|
||||||
|
case OP_GE:
|
||||||
|
puts("OP_GE");
|
||||||
|
break;
|
||||||
case OP_STOP:
|
case OP_STOP:
|
||||||
puts("OP_STOP");
|
puts("OP_STOP");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -663,6 +663,8 @@ pic_define_aop(pic_div, /, f == round(f))
|
||||||
pic_define_cmp(pic_eq, ==)
|
pic_define_cmp(pic_eq, ==)
|
||||||
pic_define_cmp(pic_lt, <)
|
pic_define_cmp(pic_lt, <)
|
||||||
pic_define_cmp(pic_le, <=)
|
pic_define_cmp(pic_le, <=)
|
||||||
|
pic_define_cmp(pic_gt, >)
|
||||||
|
pic_define_cmp(pic_ge, >=)
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,6 +155,8 @@ pic_init_core(pic_state *pic)
|
||||||
VM(pic->uEQ, "=");
|
VM(pic->uEQ, "=");
|
||||||
VM(pic->uLT, "<");
|
VM(pic->uLT, "<");
|
||||||
VM(pic->uLE, "<=");
|
VM(pic->uLE, "<=");
|
||||||
|
VM(pic->uGT, ">");
|
||||||
|
VM(pic->uGE, ">=");
|
||||||
|
|
||||||
pic_init_undef(pic); DONE;
|
pic_init_undef(pic); DONE;
|
||||||
pic_init_bool(pic); DONE;
|
pic_init_bool(pic); DONE;
|
||||||
|
@ -194,6 +196,8 @@ pic_init_core(pic_state *pic)
|
||||||
VM2(pic->pEQ, "=");
|
VM2(pic->pEQ, "=");
|
||||||
VM2(pic->pLT, "<");
|
VM2(pic->pLT, "<");
|
||||||
VM2(pic->pLE, "<=");
|
VM2(pic->pLE, "<=");
|
||||||
|
VM2(pic->pGT, ">");
|
||||||
|
VM2(pic->pGE, ">=");
|
||||||
|
|
||||||
pic_try {
|
pic_try {
|
||||||
pic_load_cstr(pic, &pic_boot[0][0]);
|
pic_load_cstr(pic, &pic_boot[0][0]);
|
||||||
|
@ -387,6 +391,8 @@ pic_open(pic_allocf allocf, void *userdata)
|
||||||
pic->pEQ = pic_invalid_value();
|
pic->pEQ = pic_invalid_value();
|
||||||
pic->pLT = pic_invalid_value();
|
pic->pLT = pic_invalid_value();
|
||||||
pic->pLE = pic_invalid_value();
|
pic->pLE = pic_invalid_value();
|
||||||
|
pic->pGT = pic_invalid_value();
|
||||||
|
pic->pGE = pic_invalid_value();
|
||||||
|
|
||||||
/* root tables */
|
/* root tables */
|
||||||
pic->globals = pic_make_dict(pic);
|
pic->globals = pic_make_dict(pic);
|
||||||
|
|
|
@ -536,7 +536,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
&&L_OP_LAMBDA, &&L_OP_CONS, &&L_OP_CAR, &&L_OP_CDR, &&L_OP_NILP,
|
&&L_OP_LAMBDA, &&L_OP_CONS, &&L_OP_CAR, &&L_OP_CDR, &&L_OP_NILP,
|
||||||
&&L_OP_SYMBOLP, &&L_OP_PAIRP,
|
&&L_OP_SYMBOLP, &&L_OP_PAIRP,
|
||||||
&&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV,
|
&&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV,
|
||||||
&&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_STOP
|
&&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_GT, &&L_OP_GE, &&L_OP_STOP
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -968,6 +968,24 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||||
PUSH(pic_bool_value(pic_lt(pic, a, b)));
|
PUSH(pic_bool_value(pic_lt(pic, a, b)));
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
CASE(OP_GE) {
|
||||||
|
pic_value a, b;
|
||||||
|
check_condition(LT, 2);
|
||||||
|
b = POP();
|
||||||
|
a = POP();
|
||||||
|
(void)POP();
|
||||||
|
PUSH(pic_bool_value(pic_ge(pic, a, b)));
|
||||||
|
NEXT;
|
||||||
|
}
|
||||||
|
CASE(OP_GT) {
|
||||||
|
pic_value a, b;
|
||||||
|
check_condition(LE, 2);
|
||||||
|
b = POP();
|
||||||
|
a = POP();
|
||||||
|
(void)POP();
|
||||||
|
PUSH(pic_bool_value(pic_gt(pic, a, b)));
|
||||||
|
NEXT;
|
||||||
|
}
|
||||||
|
|
||||||
CASE(OP_STOP) {
|
CASE(OP_STOP) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue