zfh encoding: sqrt, convert, compare, classify PiperOrigin-RevId: 756020870 Change-Id: I7f5dca20de5eb379d06362f16ced8508eb1ecd76
diff --git a/riscv/riscv_zfh.bin_fmt b/riscv/riscv_zfh.bin_fmt index 59622de..92c7c9a 100644 --- a/riscv/riscv_zfh.bin_fmt +++ b/riscv/riscv_zfh.bin_fmt
@@ -41,4 +41,13 @@ fsgnj_h : RType : func7 == 0b0010010, func3 == 0b000, opcode == 0b1010011; fsgnjn_h : RType : func7 == 0b0010010, func3 == 0b001, opcode == 0b1010011; fsgnjx_h : RType : func7 == 0b0010010, func3 == 0b010, opcode == 0b1010011; + fsqrt_h : RType : func7 == 0b0101110, rs2 == 0b00000, opcode == 0b1010011; + fcvt_hw : RType : func7 == 0b1101010, rs2 == 0b00000, opcode == 0b1010011; + fcvt_wh : RType : func7 == 0b1100010, rs2 == 0b00000, opcode == 0b1010011; + fcvt_hwu : RType : func7 == 0b1101010, rs2 == 0b00001, opcode == 0b1010011; + fcvt_wuh : RType : func7 == 0b1100010, rs2 == 0b00001, opcode == 0b1010011; + fcmpeq_h : RType : func7 == 0b1010010, func3 == 0b010, opcode == 0b1010011; + fcmplt_h : RType : func7 == 0b1010010, func3 == 0b001, opcode == 0b1010011; + fcmple_h : RType : func7 == 0b1010010, func3 == 0b000, opcode == 0b1010011; + fclass_h : RType : func7 == 0b1110010, rs2 == 0b00000, func3 == 0b001, opcode == 0b1010011; };
diff --git a/riscv/test/zfh_encoding_test.cc b/riscv/test/zfh_encoding_test.cc index 073be00..a376c21 100644 --- a/riscv/test/zfh_encoding_test.cc +++ b/riscv/test/zfh_encoding_test.cc
@@ -93,6 +93,24 @@ constexpr uint32_t kFsgnjnH = 0b0010010'00000'00000'001'00000'1010011; // func7 | rs2 | rs1 |fn3| rd | opcode constexpr uint32_t kFsgnjxH = 0b0010010'00000'00000'010'00000'1010011; +// func7 | | rs1 |rm | rd | opcode +constexpr uint32_t kFsqrtH = 0b0101110'00000'00000'000'00000'1010011; +// func7 | | rs1 |rm | rd | opcode +constexpr uint32_t kFcvtHw = 0b1101010'00000'00000'000'00000'1010011; +// func7 | | rs1 |rm | rd | opcode +constexpr uint32_t kFcvtWh = 0b1100010'00000'00000'000'00000'1010011; +// func7 | | rs1 |rm | rd | opcode +constexpr uint32_t kFcvtHwu = 0b1101010'00001'00000'000'00000'1010011; +// func7 | | rs1 |rm | rd | opcode +constexpr uint32_t kFcvtWuh = 0b1100010'00001'00000'000'00000'1010011; +// func7 | rs2 | rs1 |fn3| rd | opcode +constexpr uint32_t kFcmpeqH = 0b1010010'00000'00000'010'00000'1010011; +// func7 | rs2 | rs1 |fn3| rd | opcode +constexpr uint32_t kFcmpltH = 0b1010010'00000'00000'001'00000'1010011; +// func7 | rs2 | rs1 |fn3| rd | opcode +constexpr uint32_t kFcmpleH = 0b1010010'00000'00000'000'00000'1010011; +// func7 | | rs1 |fn3| rd | opcode +constexpr uint32_t kFclassH = 0b1110010'00000'00000'001'00000'1010011; class ZfhEncodingTest : public testing::Test { protected: @@ -587,4 +605,153 @@ FloatFrdHelper(kFsgnjxH, OpcodeEnum::kFsgnjxH); } +TEST_F(ZfhEncodingTest, FsqrtH) { + enc_->ParseInstruction(kFsqrtH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsqrtH); +} + +TEST_F(ZfhEncodingTest, FsqrtH_frs1) { + FloatFrs1Helper(kFsqrtH, OpcodeEnum::kFsqrtH); +} + +TEST_F(ZfhEncodingTest, FsqrtH_rm) { + FloatRmHelper(kFsqrtH, OpcodeEnum::kFsqrtH); +} + +TEST_F(ZfhEncodingTest, FsqrtH_frd) { + FloatFrdHelper(kFsqrtH, OpcodeEnum::kFsqrtH); +} + +TEST_F(ZfhEncodingTest, FcvtHw) { + enc_->ParseInstruction(kFcvtHw); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcvtHw); +} + +TEST_F(ZfhEncodingTest, FcvtHw_frs1) { + FloatFrs1Helper(kFcvtHw, OpcodeEnum::kFcvtHw); +} + +TEST_F(ZfhEncodingTest, FcvtHw_rm) { + FloatRmHelper(kFcvtHw, OpcodeEnum::kFcvtHw); +} + +TEST_F(ZfhEncodingTest, FcvtHw_frd) { + FloatFrdHelper(kFcvtHw, OpcodeEnum::kFcvtHw); +} + +TEST_F(ZfhEncodingTest, FcvtWh) { + enc_->ParseInstruction(kFcvtWh); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcvtWh); +} + +TEST_F(ZfhEncodingTest, FcvtWh_frs1) { + FloatFrs1Helper(kFcvtWh, OpcodeEnum::kFcvtWh); +} + +TEST_F(ZfhEncodingTest, FcvtWh_rm) { + FloatRmHelper(kFcvtWh, OpcodeEnum::kFcvtWh); +} + +TEST_F(ZfhEncodingTest, FcvtWh_frd) { + FloatFrdHelper(kFcvtWh, OpcodeEnum::kFcvtWh); +} + +TEST_F(ZfhEncodingTest, FcvtHwu) { + enc_->ParseInstruction(kFcvtHwu); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcvtHwu); +} + +TEST_F(ZfhEncodingTest, FcvtHwu_frs1) { + FloatFrs1Helper(kFcvtHwu, OpcodeEnum::kFcvtHwu); +} + +TEST_F(ZfhEncodingTest, FcvtHwu_rm) { + FloatRmHelper(kFcvtHwu, OpcodeEnum::kFcvtHwu); +} + +TEST_F(ZfhEncodingTest, FcvtHwu_frd) { + FloatFrdHelper(kFcvtHwu, OpcodeEnum::kFcvtHwu); +} + +TEST_F(ZfhEncodingTest, FcvtWuh) { + enc_->ParseInstruction(kFcvtWuh); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcvtWuh); +} + +TEST_F(ZfhEncodingTest, FcvtWuh_frs1) { + FloatFrs1Helper(kFcvtWuh, OpcodeEnum::kFcvtWuh); +} + +TEST_F(ZfhEncodingTest, FcvtWuh_rm) { + FloatRmHelper(kFcvtWuh, OpcodeEnum::kFcvtWuh); +} + +TEST_F(ZfhEncodingTest, FcvtWuh_frd) { + FloatFrdHelper(kFcvtWuh, OpcodeEnum::kFcvtWuh); +} + +TEST_F(ZfhEncodingTest, FcmpeqH) { + enc_->ParseInstruction(kFcmpeqH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcmpeqH); +} + +TEST_F(ZfhEncodingTest, FcmpeqH_frs1) { + FloatFrs1Helper(kFcmpeqH, OpcodeEnum::kFcmpeqH); +} + +TEST_F(ZfhEncodingTest, FcmpeqH_frs2) { + FloatFrs2Helper(kFcmpeqH, OpcodeEnum::kFcmpeqH); +} + +TEST_F(ZfhEncodingTest, FcmpeqH_frd) { + FloatFrdHelper(kFcmpeqH, OpcodeEnum::kFcmpeqH); +} + +TEST_F(ZfhEncodingTest, FcmpltH) { + enc_->ParseInstruction(kFcmpltH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcmpltH); +} + +TEST_F(ZfhEncodingTest, FcmpltH_frs1) { + FloatFrs1Helper(kFcmpltH, OpcodeEnum::kFcmpltH); +} + +TEST_F(ZfhEncodingTest, FcmpltH_frs2) { + FloatFrs2Helper(kFcmpltH, OpcodeEnum::kFcmpltH); +} + +TEST_F(ZfhEncodingTest, FcmpltH_frd) { + FloatFrdHelper(kFcmpltH, OpcodeEnum::kFcmpltH); +} + +TEST_F(ZfhEncodingTest, FcmpleH) { + enc_->ParseInstruction(kFcmpleH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFcmpleH); +} + +TEST_F(ZfhEncodingTest, FcmpleH_frs1) { + FloatFrs1Helper(kFcmpleH, OpcodeEnum::kFcmpleH); +} + +TEST_F(ZfhEncodingTest, FcmpleH_frs2) { + FloatFrs2Helper(kFcmpleH, OpcodeEnum::kFcmpleH); +} + +TEST_F(ZfhEncodingTest, FcmpleH_frd) { + FloatFrdHelper(kFcmpleH, OpcodeEnum::kFcmpleH); +} + +TEST_F(ZfhEncodingTest, FclassH) { + enc_->ParseInstruction(kFclassH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFclassH); +} + +TEST_F(ZfhEncodingTest, FclassH_frs1) { + FloatFrs1Helper(kFclassH, OpcodeEnum::kFclassH); +} + +TEST_F(ZfhEncodingTest, FclassH_frd) { + FloatFrdHelper(kFclassH, OpcodeEnum::kFclassH); +} + } // namespace