zfh binary decoder fadd fsub fmul fdiv PiperOrigin-RevId: 755098560 Change-Id: Ib083c865f13d4f674bf5543daa45736fabe9a9d7
diff --git a/riscv/riscv_zfh.bin_fmt b/riscv/riscv_zfh.bin_fmt index f0b48ff..51296a4 100644 --- a/riscv/riscv_zfh.bin_fmt +++ b/riscv/riscv_zfh.bin_fmt
@@ -32,4 +32,8 @@ fcvt_hs : RType : func7 == 0b0100010, rs2 == 0b00000, opcode == 0b1010011; fcvt_dh : RType : func7 == 0b0100001, rs2 == 0b00010, opcode == 0b1010011; fcvt_hd : RType : func7 == 0b0100010, rs2 == 0b00001, opcode == 0b1010011; + fadd_h : RType : func7 == 0b0000010, opcode == 0b1010011; + fsub_h : RType : func7 == 0b0000110, opcode == 0b1010011; + fmul_h : RType : func7 == 0b0001010, opcode == 0b1010011; + fdiv_h : RType : func7 == 0b0001110, opcode == 0b1010011; };
diff --git a/riscv/test/zfh_encoding_test.cc b/riscv/test/zfh_encoding_test.cc index 56980d3..cb0dc02 100644 --- a/riscv/test/zfh_encoding_test.cc +++ b/riscv/test/zfh_encoding_test.cc
@@ -75,6 +75,14 @@ constexpr uint32_t kFcvtDh = 0b0100001'00010'00000'000'00000'1010011; // func7 | | rs1 |rm | rd | opcode constexpr uint32_t kFcvtHd = 0b0100010'00001'00000'000'00000'1010011; +// func7 | rs2 | rs1 |rm | rd | opcode +constexpr uint32_t kFaddH = 0b0000010'00000'00000'000'00000'1010011; +// func7 | rs2 | rs1 |rm | rd | opcode +constexpr uint32_t kFsubH = 0b0000110'00000'00000'000'00000'1010011; +// func7 | rs2 | rs1 |rm | rd | opcode +constexpr uint32_t kFmulH = 0b0001010'00000'00000'000'00000'1010011; +// func7 | rs2 | rs1 |rm | rd | opcode +constexpr uint32_t kFdivH = 0b0001110'00000'00000'000'00000'1010011; class ZfhEncodingTest : public testing::Test { protected: @@ -408,4 +416,80 @@ FloatRmHelper(kFcvtHd, OpcodeEnum::kFcvtHd); } +TEST_F(ZfhEncodingTest, FaddH) { + enc_->ParseInstruction(kFaddH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFaddH); +} + +TEST_F(ZfhEncodingTest, FaddH_frs1) { + FloatFrs1Helper(kFaddH, OpcodeEnum::kFaddH); +} + +TEST_F(ZfhEncodingTest, FaddH_frs2) { + FloatFrs2Helper(kFaddH, OpcodeEnum::kFaddH); +} + +TEST_F(ZfhEncodingTest, FaddH_frd) { + FloatFrdHelper(kFaddH, OpcodeEnum::kFaddH); +} + +TEST_F(ZfhEncodingTest, FaddH_rm) { FloatRmHelper(kFaddH, OpcodeEnum::kFaddH); } + +TEST_F(ZfhEncodingTest, FsubH) { + enc_->ParseInstruction(kFsubH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsubH); +} + +TEST_F(ZfhEncodingTest, FsubH_frs1) { + FloatFrs1Helper(kFsubH, OpcodeEnum::kFsubH); +} + +TEST_F(ZfhEncodingTest, FsubH_frs2) { + FloatFrs2Helper(kFsubH, OpcodeEnum::kFsubH); +} + +TEST_F(ZfhEncodingTest, FsubH_frd) { + FloatFrdHelper(kFsubH, OpcodeEnum::kFsubH); +} + +TEST_F(ZfhEncodingTest, FsubH_rm) { FloatRmHelper(kFsubH, OpcodeEnum::kFsubH); } + +TEST_F(ZfhEncodingTest, FmulH) { + enc_->ParseInstruction(kFmulH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFmulH); +} + +TEST_F(ZfhEncodingTest, FmulH_frs1) { + FloatFrs1Helper(kFmulH, OpcodeEnum::kFmulH); +} + +TEST_F(ZfhEncodingTest, FmulH_frs2) { + FloatFrs2Helper(kFmulH, OpcodeEnum::kFmulH); +} + +TEST_F(ZfhEncodingTest, FmulH_frd) { + FloatFrdHelper(kFmulH, OpcodeEnum::kFmulH); +} + +TEST_F(ZfhEncodingTest, FmulH_rm) { FloatRmHelper(kFmulH, OpcodeEnum::kFmulH); } + +TEST_F(ZfhEncodingTest, FdivH) { + enc_->ParseInstruction(kFdivH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFdivH); +} + +TEST_F(ZfhEncodingTest, FdivH_frs1) { + FloatFrs1Helper(kFdivH, OpcodeEnum::kFdivH); +} + +TEST_F(ZfhEncodingTest, FdivH_frs2) { + FloatFrs2Helper(kFdivH, OpcodeEnum::kFdivH); +} + +TEST_F(ZfhEncodingTest, FdivH_frd) { + FloatFrdHelper(kFdivH, OpcodeEnum::kFdivH); +} + +TEST_F(ZfhEncodingTest, FdivH_rm) { FloatRmHelper(kFdivH, OpcodeEnum::kFdivH); } + } // namespace