diff --git a/libsrc/runtime/bcast.s b/libsrc/runtime/bcast.s new file mode 100644 index 000000000..bb37b6ec0 --- /dev/null +++ b/libsrc/runtime/bcast.s @@ -0,0 +1,21 @@ +; +; acqn, 01.16.2020 +; +; CC65 runtime: boolean cast +; + + .export bcasta, bcastax + +bcastax: + cpx #0 + bne L1 + +bcasta: + tax + beq L0 ; Zero already in X + +L1: ldx #0 + lda #1 + +L0: rts + diff --git a/libsrc/runtime/lbcast.s b/libsrc/runtime/lbcast.s new file mode 100644 index 000000000..3dee8d956 --- /dev/null +++ b/libsrc/runtime/lbcast.s @@ -0,0 +1,20 @@ +; +; acqn, 01.16.2020 +; +; CC65 runtime: boolean cast for longs +; + + .export bcasteax + .importzp sreg, tmp1 + +bcasteax: + stx tmp1 + ldx #0 ; High byte of result + ora tmp1 + ora sreg + ora sreg+1 + beq L0 + + lda #1 +L0: rts + diff --git a/src/cc65/codeent.c b/src/cc65/codeent.c index 09ca0a9c5..0e3094962 100644 --- a/src/cc65/codeent.c +++ b/src/cc65/codeent.c @@ -851,7 +851,9 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if ((In->RegA & 0x0F) >= 8) { Out->RegA = 0; } - } else if (FindBoolCmpCond (E->Arg) != CMP_INV || + } else if (strcmp (E->Arg, "bcastax") == 0 || + strcmp (E->Arg, "bnegax") == 0 || + FindBoolCmpCond (E->Arg) != CMP_INV || FindTosCmpCond (E->Arg) != CMP_INV) { /* Result is boolean value, so X is zero on output */ Out->RegX = 0; diff --git a/src/cc65/codeinfo.c b/src/cc65/codeinfo.c index 24e27ee10..f51189293 100644 --- a/src/cc65/codeinfo.c +++ b/src/cc65/codeinfo.c @@ -107,6 +107,9 @@ static const FuncInfo FuncInfoTable[] = { { "asreax2", REG_EAX, REG_EAX | REG_TMP1 }, { "asreax3", REG_EAX, REG_EAX | REG_TMP1 }, { "asreax4", REG_EAX, REG_EAXY | REG_TMP1 }, + { "bcasta", REG_A, REG_AX }, + { "bcastax", REG_AX, REG_AX }, + { "bcasteax", REG_EAX, REG_EAX | REG_TMP1 }, { "bnega", REG_A, REG_AX }, { "bnegax", REG_AX, REG_AX }, { "bnegeax", REG_EAX, REG_EAX | REG_TMP1 }, diff --git a/src/cc65/coptstop.c b/src/cc65/coptstop.c index f4f34d163..34a9b88d6 100644 --- a/src/cc65/coptstop.c +++ b/src/cc65/coptstop.c @@ -2328,6 +2328,7 @@ static int HarmlessCall (const char* Name) "asrax3", "asrax4", "asraxy", + "bcastax", "bnegax", "complax", "decax1",