diff --git a/src/mzscheme/src/char.c b/src/mzscheme/src/char.c index df8979e1cc..572a446c40 100644 --- a/src/mzscheme/src/char.c +++ b/src/mzscheme/src/char.c @@ -93,11 +93,10 @@ void scheme_init_char (Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("char?", p, env); - scheme_add_global_constant("char=?", - scheme_make_folding_prim(char_eq, - "char=?", - 2, -1, 1), - env); + p = scheme_make_folding_prim(char_eq, "char=?", 2, -1, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("char=?", p, env); + scheme_add_global_constant("charrator; + GC_CAN_IGNORE jit_insn *reffail = NULL, *ref; + int direct = 0; + + LOG_IT(("inlined %s\n", ((Scheme_Primitive_Proc *)rator)->name)); + + r1 = app->rand1; + r2 = app->rand2; + generate_two_args(r1, r2, jitter, 1); + + __START_SHORT_JUMPS__(branch_short); + + if (!SCHEME_CHARP(r1)) { + GC_CAN_IGNORE jit_insn *pref; + pref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1); + reffail = _jit.x.pc; + jit_movi_p(JIT_R2, ((Scheme_Primitive_Proc *)rator)->prim_val); + (void)jit_jmpi(call_original_binary_rev_arith_code); + mz_patch_branch(pref); + jit_ldxi_s(JIT_R2, JIT_R0, (int)&((Scheme_Object *)0x0)->type); + (void)jit_bnei_i(reffail, JIT_R2, scheme_char_type); + } else { + if (!direct) + direct = (SCHEME_CHAR_VAL(r1) < 256); + } + if (!SCHEME_CHARP(r2)) { + if (!reffail) { + GC_CAN_IGNORE jit_insn *pref; + pref = jit_bmci_ul(jit_forward(), JIT_R1, 0x1); + reffail = _jit.x.pc; + jit_movi_p(JIT_R2, ((Scheme_Primitive_Proc *)rator)->prim_val); + (void)jit_jmpi(call_original_binary_rev_arith_code); + mz_patch_branch(pref); + } else { + (void)jit_bmsi_ul(reffail, JIT_R1, 0x1); + } + jit_ldxi_s(JIT_R2, JIT_R1, (int)&((Scheme_Object *)0x0)->type); + (void)jit_bnei_i(reffail, JIT_R2, scheme_char_type); + } else { + if (!direct) + direct = (SCHEME_CHAR_VAL(r2) < 256); + } + + if (!direct) { + /* Extract character value */ + jit_ldxi_i(JIT_R0, JIT_R0, (int)&SCHEME_CHAR_VAL((Scheme_Object *)0x0)); + jit_ldxi_i(JIT_R1, JIT_R1, (int)&SCHEME_CHAR_VAL((Scheme_Object *)0x0)); + ref = jit_bner_i(jit_forward(), JIT_R0, JIT_R1); + } else { + ref = jit_bner_p(jit_forward(), JIT_R0, JIT_R1); + } + if (for_branch) { + for_branch[0] = ref; + } else { + GC_CAN_IGNORE jit_insn *ref2; + (void)jit_movi_p(JIT_R0, scheme_true); + ref2 = jit_jmpi(jit_forward()); + mz_patch_branch(ref); + (void)jit_movi_p(JIT_R0, scheme_false); + mz_patch_ucbranch(ref2); + } + + __END_SHORT_JUMPS__(branch_short); + + return 1; +} + static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, int is_tail, int multi_ok, jit_insn **for_branch, int branch_short) { @@ -2722,6 +2794,9 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i } else if (IS_NAMED_PRIM(rator, ">")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, 0, 2, 0, for_branch, branch_short); return 1; + } else if (IS_NAMED_PRIM(rator, "char=?")) { + generate_binary_char(jitter, app, for_branch, branch_short); + return 1; } else if (!for_branch) { if (IS_NAMED_PRIM(rator, "+")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, 1, 0, 0, NULL, 1); diff --git a/src/mzscheme/src/list.c b/src/mzscheme/src/list.c index 53a2486bdc..1c5a9f3dd7 100644 --- a/src/mzscheme/src/list.c +++ b/src/mzscheme/src/list.c @@ -1170,7 +1170,7 @@ name (int argc, Scheme_Object *argv[]) \ } GEN_MEM(memv, memv, scheme_eqv) -GEN_MEM(memq, memq, scheme_eq) +GEN_MEM(memq, memq, SAME_OBJ) GEN_MEM(member, member, scheme_equal) #define GEN_ASS(name, scheme_name, comp) \ @@ -1219,7 +1219,7 @@ name (int argc, Scheme_Object *argv[]) \ } GEN_ASS(assv, assv, scheme_eqv) -GEN_ASS(assq, assq, scheme_eq) +GEN_ASS(assq, assq, SAME_OBJ) GEN_ASS(assoc, assoc, scheme_equal) #define LISTFUNC2(name, C, D) \