Lines Matching defs:rs1
168 static bool CompareB(uint64_t rs1, uint64_t rs2, uint32_t funct3) {
171 return rs1 == rs2;
173 return rs1 != rs2;
175 return int64_t(rs1) < int64_t(rs2);
177 return int64_t(rs1) >= int64_t(rs2);
179 return rs1 < rs2;
181 return rs1 >= rs2;
221 return transformOptional(inst.rs1.Read(emulator), [&](uint64_t rs1) {
222 return rs1 + uint64_t(SignExt(inst.imm));
256 return transformOptional(inst.rs1.Read(emulator),
257 [&](uint64_t rs1) {
258 return rs1 % align == 0
259 ? std::optional<uint64_t>(rs1)
699 return transformOptional(zipOpt(m_emu.ReadPC(), inst.rs1.Read(m_emu)),
701 auto [pc, rs1] = tup;
703 m_emu.WritePC((SignExt(inst.imm) + rs1) &
709 return transformOptional(zipOpt(m_emu.ReadPC(), inst.rs1.Read(m_emu),
712 auto [pc, rs1, rs2] = tup;
714 CompareB(rs1, rs2, inst.funct3))
739 return transformOptional(inst.rs1.ReadI64(m_emu),
740 [&](int64_t rs1) {
742 m_emu, rs1 + int64_t(SignExt(inst.imm)));
747 return transformOptional(inst.rs1.ReadI64(m_emu),
748 [&](int64_t rs1) {
750 m_emu, rs1 < int64_t(SignExt(inst.imm)));
755 return transformOptional(inst.rs1.Read(m_emu),
756 [&](uint64_t rs1) {
758 m_emu, rs1 < uint64_t(SignExt(inst.imm)));
763 return transformOptional(inst.rs1.Read(m_emu),
764 [&](uint64_t rs1) {
766 m_emu, rs1 ^ uint64_t(SignExt(inst.imm)));
771 return transformOptional(inst.rs1.Read(m_emu),
772 [&](uint64_t rs1) {
774 m_emu, rs1 | uint64_t(SignExt(inst.imm)));
779 return transformOptional(inst.rs1.Read(m_emu),
780 [&](uint64_t rs1) {
782 m_emu, rs1 & uint64_t(SignExt(inst.imm)));
787 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
789 auto [rs1, rs2] = tup;
790 return inst.rd.Write(m_emu, rs1 + rs2);
795 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
797 auto [rs1, rs2] = tup;
798 return inst.rd.Write(m_emu, rs1 - rs2);
803 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
805 auto [rs1, rs2] = tup;
807 rs1 << (rs2 & 0b111111));
813 zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.ReadI64(m_emu)),
815 auto [rs1, rs2] = tup;
816 return inst.rd.Write(m_emu, rs1 < rs2);
821 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
823 auto [rs1, rs2] = tup;
824 return inst.rd.Write(m_emu, rs1 < rs2);
829 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
831 auto [rs1, rs2] = tup;
832 return inst.rd.Write(m_emu, rs1 ^ rs2);
837 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
839 auto [rs1, rs2] = tup;
841 rs1 >> (rs2 & 0b111111));
847 zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.Read(m_emu)),
849 auto [rs1, rs2] = tup;
850 return inst.rd.Write(m_emu, rs1 >> (rs2 & 0b111111));
855 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
857 auto [rs1, rs2] = tup;
858 return inst.rd.Write(m_emu, rs1 | rs2);
863 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
865 auto [rs1, rs2] = tup;
866 return inst.rd.Write(m_emu, rs1 & rs2);
878 return transformOptional(inst.rs1.Read(m_emu),
879 [&](uint64_t rs1) {
880 return inst.rd.Write(m_emu, rs1 << inst.shamt);
885 return transformOptional(inst.rs1.Read(m_emu),
886 [&](uint64_t rs1) {
887 return inst.rd.Write(m_emu, rs1 >> inst.shamt);
892 return transformOptional(inst.rs1.ReadI64(m_emu),
893 [&](int64_t rs1) {
894 return inst.rd.Write(m_emu, rs1 >> inst.shamt);
899 return transformOptional(inst.rs1.ReadI32(m_emu),
900 [&](int32_t rs1) {
902 m_emu, SextW(rs1 + SignExt(inst.imm)));
907 return transformOptional(inst.rs1.ReadU32(m_emu),
908 [&](uint32_t rs1) {
910 SextW(rs1 << inst.shamt));
915 return transformOptional(inst.rs1.ReadU32(m_emu),
916 [&](uint32_t rs1) {
918 SextW(rs1 >> inst.shamt));
923 return transformOptional(inst.rs1.ReadI32(m_emu),
924 [&](int32_t rs1) {
926 SextW(rs1 >> inst.shamt));
931 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
933 auto [rs1, rs2] = tup;
935 SextW(uint32_t(rs1 + rs2)));
940 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
942 auto [rs1, rs2] = tup;
944 SextW(uint32_t(rs1 - rs2)));
950 zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)),
952 auto [rs1, rs2] = tup;
953 return inst.rd.Write(m_emu, SextW(rs1 << (rs2 & 0b11111)));
959 zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)),
961 auto [rs1, rs2] = tup;
962 return inst.rd.Write(m_emu, SextW(rs1 >> (rs2 & 0b11111)));
968 zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.Read(m_emu)),
970 auto [rs1, rs2] = tup;
971 return inst.rd.Write(m_emu, SextW(rs1 >> (rs2 & 0b11111)));
977 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
979 auto [rs1, rs2] = tup;
980 return inst.rd.Write(m_emu, rs1 * rs2);
986 zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
988 auto [rs1, rs2] = tup;
990 auto mul = APInt(128, rs1, true) * APInt(128, rs2, true);
998 zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
1000 auto [rs1, rs2] = tup;
1003 APInt(128, rs1, true).zext(128) * APInt(128, rs2, false);
1011 zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
1013 auto [rs1, rs2] = tup;
1015 auto mul = APInt(128, rs1, false) * APInt(128, rs2, false);
1023 zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.ReadI64(m_emu)),
1038 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
1051 zipOpt(inst.rs1.ReadI64(m_emu), inst.rs2.ReadI64(m_emu)),
1066 return transformOptional(zipOpt(inst.rs1.Read(m_emu), inst.rs2.Read(m_emu)),
1079 zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.ReadI32(m_emu)),
1081 auto [rs1, rs2] = tup;
1082 return inst.rd.Write(m_emu, SextW(rs1 * rs2));
1088 zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.ReadI32(m_emu)),
1104 zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)),
1117 zipOpt(inst.rs1.ReadI32(m_emu), inst.rs2.ReadI32(m_emu)),
1133 zipOpt(inst.rs1.ReadU32(m_emu), inst.rs2.ReadU32(m_emu)),
1236 return transformOptional(inst.rs1.Read(m_emu),
1237 [&](auto &&rs1) {
1238 uint64_t addr = rs1 + uint64_t(inst.imm);
1247 return transformOptional(zipOpt(inst.rs1.Read(m_emu),
1250 auto [rs1, rs2] = tup;
1251 uint64_t addr = rs1 + uint64_t(inst.imm);
1259 std::tuple<bool, APFloat> FusedMultiplyAdd(APFloat rs1, APFloat rs2,
1261 auto opStatus = rs1.fusedMultiplyAdd(rs2, rs3, m_emu.GetRoundingMode());
1263 return {res, rs1};
1267 return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, isDouble),
1271 auto [rs1, rs2, rs3] = tup;
1274 auto [res, f] = FusedMultiplyAdd(rs1, rs2, rs3);
1287 return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, isDouble),
1290 auto [rs1, rs2] = tup;
1292 ((&rs1)->*f)(rs2, m_emu.GetRoundingMode());
1293 inst.rd.WriteAPFloat(m_emu, rs1);
1307 return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, isDouble),
1310 auto [rs1, rs2] = tup;
1313 rs1.copySign(rs2);
1314 return inst.rd.WriteAPFloat(m_emu, rs1);
1321 return transformOptional(zipOpt(inst.rs1.ReadAPFloat(m_emu, isDouble),
1324 auto [rs1, rs2] = tup;
1326 // of rs1 and rs2. if rs1 and rs2 have the same
1327 // signs set rs1 to positive else set rs1 to
1329 if (rs1.isNegative() == rs2.isNegative()) {
1330 rs1.clearSign();
1332 rs1.clearSign();
1333 rs1.changeSign();
1335 return inst.rd.WriteAPFloat(m_emu, rs1);
1344 zipOpt(inst.rs1.ReadAPFloat(m_emu, isDouble),
1347 auto [rs1, rs2] = tup;
1352 if (rs1.isNaN() || rs2.isNaN())
1354 if (rs1.isNaN() && rs2.isNaN()) {
1355 auto canonicalNaN = APFloat::getQNaN(rs1.getSemantics());
1358 return inst.rd.WriteAPFloat(m_emu, f(rs1, rs2));
1374 inst.rs1.ReadAPFloat(m_emu, isDouble),
1375 [&](auto &&rs1) {
1376 if (rs1.isNaN()) {
1382 auto bits = rs1.bitcastToAPInt().getZExtValue();
1398 zipOpt(inst.rs1.ReadAPFloat(m_emu, isDouble),
1401 auto [rs1, rs2] = tup;
1402 if (rs1.isNaN() || rs2.isNaN()) {
1404 if (rs1.isSignaling() || rs2.isSignaling()) {
1416 rs1.compare(rs2) == APFloat::cmpEqual);
1418 return inst.rd.Write(m_emu, rs1.compare(rs2) ==
1421 return inst.rd.Write(m_emu, rs1.compare(rs2) !=
1433 return transformOptional(inst.rs1.ReadAPFloat(m_emu, isDouble),
1434 [&](auto &&rs1) {
1436 if (rs1.isInfinity() && rs1.isNegative())
1439 if (rs1.isNormal() && rs1.isNegative())
1442 if (rs1.isDenormal() && rs1.isNegative())
1444 if (rs1.isNegZero())
1446 if (rs1.isPosZero())
1449 if (rs1.isNormal() && !rs1.isNegative())
1452 if (rs1.isDenormal() && !rs1.isNegative())
1454 if (rs1.isInfinity() && !rs1.isNegative())
1456 if (rs1.isNaN()) {
1457 if (rs1.isSignaling())
1470 return transformOptional(((&inst.rs1)->*f)(m_emu),
1471 [&](auto &&rs1) {
1472 APFloat apf(semantics, rs1);
1485 return transformOptional(inst.rs1.Read(m_emu),
1486 [&](auto &&rs1) {
1487 APInt apInt(numBits, rs1);
1489 apInt = APInt(numBits, NanUnBoxing(rs1));
1500 return transformOptional(inst.rs1.ReadAPFloat(m_emu, isDouble),
1501 [&](auto &&rs1) {
1502 E res = E((&rs1->*f)());
1541 return transformOptional(inst.rs1.ReadAPFloat(m_emu, true),
1542 [&](auto &&rs1) {
1543 double d = rs1.convertToDouble();
1550 return transformOptional(inst.rs1.ReadAPFloat(m_emu, false),
1551 [&](auto &&rs1) {
1552 float f = rs1.convertToFloat();