diff --git a/include/crt.c b/include/crt.c index 5219457..0033a41 100644 --- a/include/crt.c +++ b/include/crt.c @@ -1853,7 +1853,7 @@ W1: jmp startup.exec #pragma bytecode(BC_BINOP_SHRI_I16, inp_binop_shri_s16) #pragma bytecode(BC_BINOP_SHRR_I16, inp_binop_shri_s16.inp_binop_shrr_s16) -__asm cmp +__asm cmp16 { inp_binop_cmpr_s16: lda (ip), y @@ -1926,10 +1926,76 @@ inp_binop_cmpi_s16: beq cmp_eq } -#pragma bytecode(BC_BINOP_CMPSR_16, cmp.inp_binop_cmpr_s16) -#pragma bytecode(BC_BINOP_CMPSI_16, cmp.inp_binop_cmpi_s16) -#pragma bytecode(BC_BINOP_CMPUR_16, cmp.inp_binop_cmpr_u16) -#pragma bytecode(BC_BINOP_CMPUI_16, cmp.inp_binop_cmpi_u16) +#pragma bytecode(BC_BINOP_CMPSR_16, cmp16.inp_binop_cmpr_s16) +#pragma bytecode(BC_BINOP_CMPSI_16, cmp16.inp_binop_cmpi_s16) +#pragma bytecode(BC_BINOP_CMPUR_16, cmp16.inp_binop_cmpr_u16) +#pragma bytecode(BC_BINOP_CMPUI_16, cmp16.inp_binop_cmpi_u16) + + +__asm cmp8 +{ +inp_binop_cmpr_s8: + lda (ip), y + tax + iny + + sec + lda $00, x + sbc accu + beq cmp_eq +cmpnes: + bvc cmpsv + eor #$80 +cmpsv: bmi cmp_lt + bpl cmp_gt + +inp_binop_cmpr_u8: + lda (ip), y + tax + iny + lda $00, x + cmp accu + bne cmpne + beq cmp_eq + +inp_binop_cmpi_u8: + lda (ip), y + iny + cmp accu + bne cmpne +cmp_eq: + lda #0 + sta accu + sta accu + 1 + jmp startup.exec +cmp_lt: + lda #$ff + sta accu + sta accu +1 + jmp startup.exec +cmpne: + bcc cmp_lt +cmp_gt: + lda #1 + sta accu + lda #0 + sta accu + 1 + jmp startup.exec + +inp_binop_cmpi_s8: + lda (ip), y + iny + sec + sbc accu + bne cmpnes + beq cmp_eq +} + + +#pragma bytecode(BC_BINOP_CMPSR_8, cmp8.inp_binop_cmpr_s8) +#pragma bytecode(BC_BINOP_CMPSI_8, cmp8.inp_binop_cmpi_s8) +#pragma bytecode(BC_BINOP_CMPUR_8, cmp8.inp_binop_cmpr_u8) +#pragma bytecode(BC_BINOP_CMPUI_8, cmp8.inp_binop_cmpi_u8) __asm bra { diff --git a/include/crt.h b/include/crt.h index 3d82972..caea93b 100644 --- a/include/crt.h +++ b/include/crt.h @@ -91,6 +91,12 @@ enum ByteCode BC_BINOP_CMPUI_16, BC_BINOP_CMPSI_16, + BC_BINOP_CMPUR_8, + BC_BINOP_CMPSR_8, + + BC_BINOP_CMPUI_8, + BC_BINOP_CMPSI_8, + BC_OP_NEGATE_16, BC_OP_INVERT_16, @@ -134,6 +140,8 @@ enum ByteCode BC_SET_LT, BC_SET_LE, + BC_NATIVE = 0x75, + BC_ENTER, BC_RETURN, BC_CALL, @@ -148,8 +156,6 @@ enum ByteCode BC_EXTRT, - BC_NATIVE = 0x75, - BC_CONV_I16_I32 = 0x80, BC_CONV_U16_U32, diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index dba9005..1c2c5a6 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -196,6 +196,8 @@ bool ByteCodeInstruction::ChangesRegister(uint32 reg) const return true; if (mCode >= BC_BINOP_CMPUR_16 && mCode <= BC_BINOP_CMPSI_16) return true; + if (mCode >= BC_BINOP_CMPUR_8 && mCode <= BC_BINOP_CMPSI_8) + return true; if (mCode >= BC_OP_NEGATE_16 && mCode <= BC_OP_INVERT_16) return true; if (mCode >= BC_BINOP_ADD_F32 && mCode <= BC_OP_CEIL_F32) @@ -388,6 +390,8 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl case BC_BINOP_CMPUR_16: case BC_BINOP_CMPSR_16: + case BC_BINOP_CMPUR_8: + case BC_BINOP_CMPSR_8: block->PutCode(generator, mCode); block->PutByte(mRegister); break; @@ -398,6 +402,12 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl block->PutWord(uint16(mValue)); break; + case BC_BINOP_CMPUI_8: + case BC_BINOP_CMPSI_8: + block->PutCode(generator, mCode); + block->PutByte(uint8(mValue)); + break; + case BC_OP_NEGATE_16: case BC_OP_INVERT_16: block->PutCode(generator, mCode); @@ -2416,6 +2426,69 @@ ByteCode ByteCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const cins.mRegisterFinal = ins->mSrc[1].mFinal; mIns.Push(cins); } + else if (ins->mSrc[0].mType == IT_INT8) + { + if (ins->mSrc[1].mTemp < 0) + { + ByteCodeInstruction lins(BC_LOAD_REG_8); + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; + mIns.Push(lins); + if (csigned) + { + ByteCodeInstruction cins(BC_BINOP_CMPSI_8); + cins.mValue = ins->mSrc[1].mIntConst; + mIns.Push(cins); + } + else + { + ByteCodeInstruction cins(BC_BINOP_CMPUI_8); + cins.mValue = ins->mSrc[1].mIntConst; + mIns.Push(cins); + } + } + else if (ins->mSrc[0].mTemp < 0) + { + ByteCodeInstruction lins(BC_LOAD_REG_8); + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + lins.mRegisterFinal = ins->mSrc[1].mFinal; + mIns.Push(lins); + if (csigned) + { + ByteCodeInstruction cins(BC_BINOP_CMPSI_8); + cins.mValue = ins->mSrc[0].mIntConst; + mIns.Push(cins); + } + else + { + ByteCodeInstruction cins(BC_BINOP_CMPUI_8); + cins.mValue = ins->mSrc[0].mIntConst; + mIns.Push(cins); + } + code = TransposeBranchCondition(code); + } + else + { + ByteCodeInstruction lins(BC_LOAD_REG_8); + lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; + lins.mRegisterFinal = ins->mSrc[0].mFinal; + mIns.Push(lins); + if (csigned) + { + ByteCodeInstruction cins(BC_BINOP_CMPSR_8); + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + cins.mRegisterFinal = ins->mSrc[1].mFinal; + mIns.Push(cins); + } + else + { + ByteCodeInstruction cins(BC_BINOP_CMPUR_8); + cins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; + cins.mRegisterFinal = ins->mSrc[1].mFinal; + mIns.Push(cins); + } + } + } else { if (ins->mSrc[1].mTemp < 0) diff --git a/oscar64/ByteCodeGenerator.h b/oscar64/ByteCodeGenerator.h index 8c87237..7cae193 100644 --- a/oscar64/ByteCodeGenerator.h +++ b/oscar64/ByteCodeGenerator.h @@ -92,6 +92,12 @@ enum ByteCode BC_BINOP_CMPUI_16, BC_BINOP_CMPSI_16, + BC_BINOP_CMPUR_8, + BC_BINOP_CMPSR_8, + + BC_BINOP_CMPUI_8, + BC_BINOP_CMPSI_8, + BC_OP_NEGATE_16, BC_OP_INVERT_16, @@ -135,6 +141,8 @@ enum ByteCode BC_SET_LT, BC_SET_LE, + BC_NATIVE = 0x75, + BC_ENTER, BC_RETURN, BC_CALL, @@ -149,8 +157,6 @@ enum ByteCode BC_EXTRT, - BC_NATIVE = 0x75, - BC_CONV_I16_I32 = 0x80, BC_CONV_U16_U32, diff --git a/oscar64/Disassembler.cpp b/oscar64/Disassembler.cpp index f544e21..fdce4de 100644 --- a/oscar64/Disassembler.cpp +++ b/oscar64/Disassembler.cpp @@ -343,10 +343,28 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star i += 2; break; case BC_BINOP_CMPSI_16: - fprintf(file, "CMPS\tACCU, #$%04X", uint16(memory[start + i + 0] + 256 * memory[start + i + 1])); + fprintf(file, "CMPS\tACCU, #$%04X", int16(memory[start + i + 0] + 256 * memory[start + i + 1])); i += 2; break; + case BC_BINOP_CMPUR_8: + fprintf(file, "CMPUB\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc)); + i += 1; + break; + case BC_BINOP_CMPSR_8: + fprintf(file, "CMPSB\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc)); + i += 1; + break; + + case BC_BINOP_CMPUI_8: + fprintf(file, "CMPUB\tACCU, #$%04X", uint8(memory[start + i + 0] + 256 * memory[start + i + 1])); + i += 1; + break; + case BC_BINOP_CMPSI_8: + fprintf(file, "CMPSB\tACCU, #$%04X", int8(memory[start + i + 0])); + i += 1; + break; + case BC_BINOP_ADD_F32: fprintf(file, "ADDF\tACCU, %s", TempName(memory[start + i + 0], tbuffer, proc)); i += 1; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index f355667..bba64f2 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -1111,6 +1111,38 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); } + else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR && + tvalue[ins->mSrc[1].mTemp]->mOperator != IA_FLOAT2INT && tvalue[ins->mSrc[1].mTemp]->mOperator != IA_INT2FLOAT && + tvalue[ins->mSrc[0].mTemp]->mOperator == tvalue[ins->mSrc[1].mTemp]->mOperator) + { + ins->mSrc[0].mType = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mType; + ins->mSrc[0].mTemp = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mTemp; + ins->mSrc[1].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType; + ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp; + + UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); + } + else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR && + ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT && + tvalue[ins->mSrc[1].mTemp]->mOperator != IA_FLOAT2INT && tvalue[ins->mSrc[1].mTemp]->mOperator != IA_INT2FLOAT) + { + ins->mSrc[0].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType; + ins->mSrc[1].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType; + ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp; + + UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); + } + else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR && + ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && + tvalue[ins->mSrc[0].mTemp]->mOperator != IA_FLOAT2INT && tvalue[ins->mSrc[0].mTemp]->mOperator != IA_INT2FLOAT) + { + ins->mSrc[1].mType = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mType; + ins->mSrc[0].mType = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mType; + ins->mSrc[0].mTemp = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mTemp; + + UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); + } else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp) { ins->mCode = IC_CONSTANT; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 3313ca0..8bc6150 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -6370,13 +6370,15 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In case IA_CMPEQ: case IA_CMPLEU: mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); + if (ins->mSrc[0].mType != IT_INT8) + mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); this->Close(trueJump, falseJump, ASMIT_BEQ); break; case IA_CMPNE: case IA_CMPGU: mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); + if (ins->mSrc[0].mType != IT_INT8) + mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); this->Close(trueJump, falseJump, ASMIT_BNE); break; case IA_CMPGEU: @@ -6386,34 +6388,142 @@ void NativeCodeBasicBlock::RelationalOperator(InterCodeProcedure* proc, const In this->Close(falseJump, nullptr, ASMIT_JMP); break; case IA_CMPGES: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); + if (ins->mSrc[0].mType == IT_INT8) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt])); + else + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); this->Close(trueJump, falseJump, ASMIT_BPL); break; case IA_CMPLS: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); + if (ins->mSrc[0].mType == IT_INT8) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt])); + else + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); this->Close(trueJump, falseJump, ASMIT_BMI); break; case IA_CMPGS: { NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); + if (ins->mSrc[0].mType == IT_INT8) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt])); + else + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); this->Close(eblock, falseJump, ASMIT_BPL); - eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); + if (ins->mSrc[0].mType != IT_INT8) + eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); eblock->Close(trueJump, falseJump, ASMIT_BNE); break; } case IA_CMPLES: { NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); + if (ins->mSrc[0].mType == IT_INT8) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt])); + else + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 1)); this->Close(eblock, trueJump, ASMIT_BPL); - eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); + if (ins->mSrc[0].mType != IT_INT8) + eblock->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[rt] + 0)); eblock->Close(trueJump, falseJump, ASMIT_BEQ); break; } } } + else if (ins->mSrc[0].mType == IT_INT8) + { + NativeCodeBasicBlock* eblock = nproc->AllocateBlock(); + NativeCodeBasicBlock* nblock = nproc->AllocateBlock(); + + int li = 1, ri = 0; + if (op == IA_CMPLEU || op == IA_CMPGU || op == IA_CMPLES || op == IA_CMPGS) + { + li = 0; ri = 1; + } + + int iconst = 0; + bool rconst = false; + + if (ins->mSrc[li].mTemp < 0 && (op == IA_CMPGES || op == IA_CMPLS) && int16(ins->mSrc[li].mIntConst) > - 128) + { + iconst = ins->mSrc[li].mIntConst - 1; + rconst = true; + li = ri; ri = 1 - li; + + NativeCodeBasicBlock* t = trueJump; trueJump = falseJump; falseJump = t; + } + else if (ins->mSrc[li].mTemp < 0 && (op == IA_CMPLES || op == IA_CMPGS) && int16(ins->mSrc[li].mIntConst) < 127) + { + iconst = ins->mSrc[li].mIntConst + 1; + rconst = true; + li = ri; ri = 1 - li; + + NativeCodeBasicBlock* t = trueJump; trueJump = falseJump; falseJump = t; + } + else if (ins->mSrc[ri].mTemp < 0) + { + iconst = ins->mSrc[ri].mIntConst; + rconst = true; + } + + if (op >= IA_CMPGES && ins->mOperator <= IA_CMPLS) + { + if (!rconst) + { + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK)); + } + + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, (ins->mSrc[li].mIntConst & 0xff) ^ 0x80)); + else + { + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); + mIns.Push(NativeCodeInstruction(ASMIT_EOR, ASMIM_IMMEDIATE, 0x80)); + } + + if (rconst) + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, (iconst & 0xff) ^ 0x80)); + else + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_WORK)); + } + else + { + if (ins->mSrc[li].mTemp < 0) + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins->mSrc[li].mIntConst & 0xff)); + else + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[li].mTemp])); + if (rconst) + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_IMMEDIATE, iconst & 0xff)); + else + mIns.Push(NativeCodeInstruction(ASMIT_CMP, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[ri].mTemp])); + } + + switch (op) + { + case IA_CMPEQ: + this->Close(trueJump, falseJump, ASMIT_BEQ); + break; + case IA_CMPNE: + this->Close(falseJump, trueJump, ASMIT_BEQ); + break; + case IA_CMPLU: + case IA_CMPLS: + case IA_CMPGU: + case IA_CMPGS: + this->Close(trueJump, falseJump, ASMIT_BCC); + break; + case IA_CMPLEU: + case IA_CMPLES: + case IA_CMPGEU: + case IA_CMPGES: + this->Close(falseJump, trueJump, ASMIT_BCC); + break; + + } + + } #if 1 else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst < 256 && ins->mSrc[1].mIntConst > 0 || ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mIntConst < 256 && ins->mSrc[0].mIntConst > 0) {