optimise is/2 as a binary predicate.
This commit is contained in:
parent
8a3978e3e1
commit
89635fb1f6
28
C/amasm.c
28
C/amasm.c
|
@ -1598,29 +1598,31 @@ static COUNT
|
||||||
compile_cmp_flags(char *s)
|
compile_cmp_flags(char *s)
|
||||||
{
|
{
|
||||||
if (strcmp(s,"=<") == 0)
|
if (strcmp(s,"=<") == 0)
|
||||||
return(EQ_OK_IN_CMP|LT_OK_IN_CMP);
|
return EQ_OK_IN_CMP|LT_OK_IN_CMP;
|
||||||
|
if (strcmp(s,"is") == 0)
|
||||||
|
return EQ_OK_IN_CMP;
|
||||||
if (strcmp(s,"@=<") == 0)
|
if (strcmp(s,"@=<") == 0)
|
||||||
return(EQ_OK_IN_CMP|LT_OK_IN_CMP);
|
return EQ_OK_IN_CMP|LT_OK_IN_CMP;
|
||||||
if (strcmp(s,"<") == 0)
|
if (strcmp(s,"<") == 0)
|
||||||
return(LT_OK_IN_CMP);
|
return LT_OK_IN_CMP;
|
||||||
if (strcmp(s,"@<") == 0)
|
if (strcmp(s,"@<") == 0)
|
||||||
return(LT_OK_IN_CMP);
|
return LT_OK_IN_CMP;
|
||||||
if (strcmp(s,">=") == 0)
|
if (strcmp(s,">=") == 0)
|
||||||
return(EQ_OK_IN_CMP|GT_OK_IN_CMP);
|
return EQ_OK_IN_CMP|GT_OK_IN_CMP;
|
||||||
if (strcmp(s,"@>=") == 0)
|
if (strcmp(s,"@>=") == 0)
|
||||||
return(EQ_OK_IN_CMP|GT_OK_IN_CMP);
|
return EQ_OK_IN_CMP|GT_OK_IN_CMP;
|
||||||
if (strcmp(s,">") == 0)
|
if (strcmp(s,">") == 0)
|
||||||
return(GT_OK_IN_CMP);
|
return GT_OK_IN_CMP;
|
||||||
if (strcmp(s,"@>") == 0)
|
if (strcmp(s,"@>") == 0)
|
||||||
return(GT_OK_IN_CMP);
|
return GT_OK_IN_CMP;
|
||||||
if (strcmp(s,"=:=") == 0)
|
if (strcmp(s,"=:=") == 0)
|
||||||
return(EQ_OK_IN_CMP);
|
return EQ_OK_IN_CMP;
|
||||||
if (strcmp(s,"=\\=") == 0)
|
if (strcmp(s,"=\\=") == 0)
|
||||||
return(GT_OK_IN_CMP|LT_OK_IN_CMP);
|
return GT_OK_IN_CMP|LT_OK_IN_CMP;
|
||||||
if (strcmp(s,"\\==") == 0)
|
if (strcmp(s,"\\==") == 0)
|
||||||
return(GT_OK_IN_CMP|LT_OK_IN_CMP);
|
return GT_OK_IN_CMP|LT_OK_IN_CMP;
|
||||||
Yap_Error(INTERNAL_COMPILER_ERROR, TermNil, "internal assembler error, %s is not recognised", s);
|
Yap_Error(INTERNAL_COMPILER_ERROR, TermNil, "internal assembler error, %s/2 not recognised as binary op", s);
|
||||||
return(0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
COUNT
|
COUNT
|
||||||
|
|
8
C/eval.c
8
C/eval.c
|
@ -131,16 +131,16 @@ BEAM_is(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_is(void)
|
p_is(CELL result, CELL in)
|
||||||
{ /* X is Y */
|
{ /* X is Y */
|
||||||
Term out;
|
Term out;
|
||||||
|
|
||||||
out = Eval(Deref(ARG2));
|
out = Eval(Deref(in));
|
||||||
if (out == 0L) {
|
if (out == 0L) {
|
||||||
Yap_Error(EVALUATION_ERROR_INT_OVERFLOW, ARG2, "is/2");
|
Yap_Error(EVALUATION_ERROR_INT_OVERFLOW, ARG2, "is/2");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return Yap_unify_constant(ARG1,out);
|
return Yap_unify_constant(result,out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -150,6 +150,6 @@ Yap_InitEval(void)
|
||||||
Yap_InitConstExps();
|
Yap_InitConstExps();
|
||||||
Yap_InitUnaryExps();
|
Yap_InitUnaryExps();
|
||||||
Yap_InitBinaryExps();
|
Yap_InitBinaryExps();
|
||||||
Yap_InitCPred("is", 2, p_is, TestPredFlag | SafePredFlag);
|
Yap_InitCmpPred("is", 2, p_is, BinaryPredFlag | TestPredFlag | SafePredFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in New Issue