@@ -507,6 +507,9 @@ InstSelectorRiscV64::InstSelectorRiscV64(
507507 translatorHandlers[IRInstOperator::IRINST_OP_SHL_I ] = &InstSelectorRiscV64::translate_shl;
508508 translatorHandlers[IRInstOperator::IRINST_OP_ASHR_I ] = &InstSelectorRiscV64::translate_ashr;
509509 translatorHandlers[IRInstOperator::IRINST_OP_LSHR_I ] = &InstSelectorRiscV64::translate_lshr;
510+ translatorHandlers[IRInstOperator::IRINST_OP_AND_I ] = &InstSelectorRiscV64::translate_and;
511+ translatorHandlers[IRInstOperator::IRINST_OP_OR_I ] = &InstSelectorRiscV64::translate_or;
512+ translatorHandlers[IRInstOperator::IRINST_OP_XOR_I ] = &InstSelectorRiscV64::translate_xor;
510513 translatorHandlers[IRInstOperator::IRINST_OP_LT_I ] = &InstSelectorRiscV64::translate_icmp;
511514 translatorHandlers[IRInstOperator::IRINST_OP_GT_I ] = &InstSelectorRiscV64::translate_icmp;
512515 translatorHandlers[IRInstOperator::IRINST_OP_LE_I ] = &InstSelectorRiscV64::translate_icmp;
@@ -1469,6 +1472,71 @@ void InstSelectorRiscV64::translate_shift(Instruction * inst,
14691472 storeResult (inst, dstReg, inst);
14701473}
14711474
1475+ // / @brief 翻译按位与指令(and)
1476+ void InstSelectorRiscV64::translate_and (Instruction * inst)
1477+ {
1478+ translate_bitwise (inst, " and" , " andi" );
1479+ }
1480+
1481+ // / @brief 翻译按位或指令(or)
1482+ void InstSelectorRiscV64::translate_or (Instruction * inst)
1483+ {
1484+ translate_bitwise (inst, " or" , " ori" );
1485+ }
1486+
1487+ // / @brief 翻译按位异或指令(xor)
1488+ void InstSelectorRiscV64::translate_xor (Instruction * inst)
1489+ {
1490+ translate_bitwise (inst, " xor" , " xori" );
1491+ }
1492+
1493+ // / @brief 翻译按位运算指令的通用实现
1494+ // /
1495+ // / RV64 的 and/or/xor 无 W 变体,对两个已按 i32 符号扩展的寄存器做按位
1496+ // / 运算结果仍保持符号扩展性质,因此无需额外的 sext.w。
1497+ // / 右操作数为 12 位有符号范围内的常量时使用立即数形式
1498+ void InstSelectorRiscV64::translate_bitwise (Instruction * inst,
1499+ const std::string & regOp,
1500+ const std::string & immOp)
1501+ {
1502+ auto * binary = dynamic_cast <BinaryInst *>(inst);
1503+ if (binary == nullptr ) {
1504+ return ;
1505+ }
1506+
1507+ int dstReg = getResultReg (inst);
1508+ LocalTempManager::Lease dstLease;
1509+ if (dstReg < 0 ) {
1510+ dstLease = tempMgr.borrow (inst);
1511+ dstReg = dstLease.reg ();
1512+ }
1513+
1514+ OperandReg lhs = loadOperand (binary->getLHS (), inst, dstReg);
1515+
1516+ if (auto * rhsConst = asConstInteger (binary->getRHS ())) {
1517+ const int32_t imm = rhsConst->getVal ();
1518+ if (imm >= -2048 && imm <= 2047 ) {
1519+ iloc.inst (immOp,
1520+ PlatformRiscV64::regName[dstReg],
1521+ PlatformRiscV64::regName[lhs.reg ],
1522+ std::to_string (imm));
1523+ releaseOperand (lhs);
1524+ storeResult (inst, dstReg, inst);
1525+ return ;
1526+ }
1527+ }
1528+
1529+ const int rhsPreferredReg = lhs.reg != dstReg ? dstReg : -1 ;
1530+ OperandReg rhs = loadOperand (binary->getRHS (), inst, rhsPreferredReg < 0 ? dstReg : -1 , rhsPreferredReg);
1531+ iloc.inst (regOp,
1532+ PlatformRiscV64::regName[dstReg],
1533+ PlatformRiscV64::regName[lhs.reg ],
1534+ PlatformRiscV64::regName[rhs.reg ]);
1535+ releaseOperand (rhs);
1536+ releaseOperand (lhs);
1537+ storeResult (inst, dstReg, inst);
1538+ }
1539+
14721540// / @brief 翻译浮点二元运算的通用实现
14731541// /
14741542// / float SSA值优先保存在FPR中,避免在热点浮点运算中反复fmv.w.x/fmv.x.w。
0 commit comments