47,48c47
< cprintf("canOverflow: %%d\\n", Dest < resTemp);
< replaceBits(CondCodes, 27, Dest < resTemp);
---
> CondCodes = CondCodes | ((resTemp & 1) << 27);
70a70
> "saturate": ('0', '0', '0'),
88a89
> "saturate": '0',
101,102c102,103
< def buildImmDataInst(mnem, code, flagType = "logic", \
< suffix = "Imm", buildCc = True):
---
> def buildImmDataInst(mnem, code, flagType = "logic", suffix = "Imm", \
> buildCc = True, buildNonCc = True):
108c109
< if flagType == "overflow":
---
> if flagType == "saturate":
131c132,133
< subst(immIop)
---
> if buildNonCc:
> subst(immIop)
135,136c137,138
< def buildRegDataInst(mnem, code, flagType = "logic", \
< suffix = "Reg", buildCc = True):
---
> def buildRegDataInst(mnem, code, flagType = "logic", suffix = "Reg", \
> buildCc = True, buildNonCc = True):
142c144
< if flagType == "overflow":
---
> if flagType == "saturate":
165c167,168
< subst(regIop)
---
> if buildNonCc:
> subst(regIop)
170c173,174
< suffix = "RegReg", buildCc = True):
---
> suffix = "RegReg", \
> buildCc = True, buildNonCc = True):
176c180
< if flagType == "overflow":
---
> if flagType == "saturate":
201c205,206
< subst(regRegIop)
---
> if buildNonCc:
> subst(regRegIop)
252a258,352
>
> buildRegDataInst("qadd", '''
> int32_t midRes;
> resTemp = saturateOp<32>(midRes, Op1.sw, Op2.sw);
> Dest = midRes;
> ''', flagType="saturate", buildNonCc=False)
> buildRegDataInst("qadd16", '''
> int32_t midRes;
> for (unsigned i = 0; i < 2; i++) {
> int high = (i + 1) * 16 - 1;
> int low = i * 16;
> int64_t arg1 = sext<16>(bits(Op1.sw, high, low));
> int64_t arg2 = sext<16>(bits(Op2.sw, high, low));
> saturateOp<16>(midRes, arg1, arg2);
> replaceBits(resTemp, high, low, midRes);
> }
> Dest = resTemp;
> ''', flagType="none", buildCc=False)
> buildRegDataInst("qadd8", '''
> int32_t midRes;
> for (unsigned i = 0; i < 4; i++) {
> int high = (i + 1) * 8 - 1;
> int low = i * 8;
> int64_t arg1 = sext<8>(bits(Op1.sw, high, low));
> int64_t arg2 = sext<8>(bits(Op2.sw, high, low));
> saturateOp<8>(midRes, arg1, arg2);
> replaceBits(resTemp, high, low, midRes);
> }
> Dest = resTemp;
> ''', flagType="none", buildCc=False)
> buildRegDataInst("qdadd", '''
> int32_t midRes;
> resTemp = saturateOp<32>(midRes, Op2.sw, Op2.sw) |
> saturateOp<32>(midRes, Op1.sw, midRes);
> Dest = midRes;
> ''', flagType="saturate", buildNonCc=False)
> buildRegDataInst("qsub", '''
> int32_t midRes;
> resTemp = saturateOp<32>(midRes, Op1.sw, Op2.sw, true);
> Dest = midRes;
> ''', flagType="saturate")
> buildRegDataInst("qsub16", '''
> int32_t midRes;
> for (unsigned i = 0; i < 2; i++) {
> int high = (i + 1) * 16 - 1;
> int low = i * 16;
> int64_t arg1 = sext<16>(bits(Op1.sw, high, low));
> int64_t arg2 = sext<16>(bits(Op2.sw, high, low));
> saturateOp<16>(midRes, arg1, arg2, true);
> replaceBits(resTemp, high, low, midRes);
> }
> Dest = resTemp;
> ''', flagType="none", buildCc=False)
> buildRegDataInst("qsub8", '''
> int32_t midRes;
> for (unsigned i = 0; i < 4; i++) {
> int high = (i + 1) * 8 - 1;
> int low = i * 8;
> int64_t arg1 = sext<8>(bits(Op1.sw, high, low));
> int64_t arg2 = sext<8>(bits(Op2.sw, high, low));
> saturateOp<8>(midRes, arg1, arg2, true);
> replaceBits(resTemp, high, low, midRes);
> }
> Dest = resTemp;
> ''', flagType="none", buildCc=False)
> buildRegDataInst("qdsub", '''
> int32_t midRes;
> resTemp = saturateOp<32>(midRes, Op2.sw, Op2.sw) |
> saturateOp<32>(midRes, Op1.sw, midRes, true);
> Dest = midRes;
> ''', flagType="saturate", buildNonCc=False)
> buildRegDataInst("qasx", '''
> int32_t midRes;
> int64_t arg1Low = sext<16>(bits(Op1.sw, 15, 0));
> int64_t arg1High = sext<16>(bits(Op1.sw, 31, 16));
> int64_t arg2Low = sext<16>(bits(Op2.sw, 15, 0));
> int64_t arg2High = sext<16>(bits(Op2.sw, 31, 16));
> saturateOp<16>(midRes, arg1Low, arg2High, true);
> replaceBits(resTemp, 15, 0, midRes);
> saturateOp<16>(midRes, arg1High, arg2Low);
> replaceBits(resTemp, 31, 16, midRes);
> Dest = resTemp;
> ''', flagType="none", buildCc=False)
> buildRegDataInst("qsax", '''
> int32_t midRes;
> int64_t arg1Low = sext<16>(bits(Op1.sw, 15, 0));
> int64_t arg1High = sext<16>(bits(Op1.sw, 31, 16));
> int64_t arg2Low = sext<16>(bits(Op2.sw, 15, 0));
> int64_t arg2High = sext<16>(bits(Op2.sw, 31, 16));
> saturateOp<16>(midRes, arg1Low, arg2High);
> replaceBits(resTemp, 15, 0, midRes);
> saturateOp<16>(midRes, arg1High, arg2Low, true);
> replaceBits(resTemp, 31, 16, midRes);
> Dest = resTemp;
> ''', flagType="none", buildCc=False)