zfh: fmin, fmax, fsgn binary decoder PiperOrigin-RevId: 755957256 Change-Id: I8113a62329b75b5b27336091ed7b0f6f248bb04b
diff --git a/riscv/riscv_zfh.bin_fmt b/riscv/riscv_zfh.bin_fmt index 51296a4..59622de 100644 --- a/riscv/riscv_zfh.bin_fmt +++ b/riscv/riscv_zfh.bin_fmt
@@ -24,16 +24,21 @@ } instruction group RiscVZfhminInst32[32] : Inst32Format { - flh : IType : func3 == 0b001, opcode == 0b000'0111; - fsh : SType : func3 == 0b001, opcode == 0b010'0111; - fmv_xh : RType : func7 == 0b1110010, rs2 == 0, func3 == 0b000, opcode == 0b1010011; - fmv_hx : RType : func7 == 0b1111010, rs2 == 0, func3 == 0b000, opcode == 0b1010011; - fcvt_sh : RType : func7 == 0b0100000, rs2 == 0b00010, opcode == 0b1010011; - 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; + flh : IType : func3 == 0b001, opcode == 0b000'0111; + fsh : SType : func3 == 0b001, opcode == 0b010'0111; + fmv_xh : RType : func7 == 0b1110010, rs2 == 0, func3 == 0b000, opcode == 0b1010011; + fmv_hx : RType : func7 == 0b1111010, rs2 == 0, func3 == 0b000, opcode == 0b1010011; + fcvt_sh : RType : func7 == 0b0100000, rs2 == 0b00010, opcode == 0b1010011; + 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; + fmin_h : RType : func7 == 0b0010110, func3 == 0b000, opcode == 0b1010011; + fmax_h : RType : func7 == 0b0010110, func3 == 0b001, opcode == 0b1010011; + 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; };
diff --git a/riscv/riscv_zfh.isa b/riscv/riscv_zfh.isa index 11e9a89..f906733 100644 --- a/riscv/riscv_zfh.isa +++ b/riscv/riscv_zfh.isa
@@ -152,7 +152,7 @@ resources: {next_pc, frs1, frs2 : frd[0..]}, semfunc: "&RiscVZfhFsgnjn", disasm: "fsgnjn.h", "%frd, %frs1, %frs2"; - fsgnjnx_h{: frs1, frs2 : frd }, + fsgnjx_h{: frs1, frs2 : frd }, resources: {next_pc, frs1, frs2 : frd[0..]}, semfunc: "&RiscVZfhFsgnjx", disasm: "fsgnjnx.h", "%frd, %frs1, %frs2";
diff --git a/riscv/test/zfh_encoding_test.cc b/riscv/test/zfh_encoding_test.cc index cb0dc02..073be00 100644 --- a/riscv/test/zfh_encoding_test.cc +++ b/riscv/test/zfh_encoding_test.cc
@@ -83,6 +83,16 @@ 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; +// func7 | rs2 | rs1 |fn3| rd | opcode +constexpr uint32_t kFminH = 0b0010110'00000'00000'000'00000'1010011; +// func7 | rs2 | rs1 |fn3| rd | opcode +constexpr uint32_t kFmaxH = 0b0010110'00000'00000'001'00000'1010011; +// func7 | rs2 | rs1 |fn3| rd | opcode +constexpr uint32_t kFsgnjH = 0b0010010'00000'00000'000'00000'1010011; +// func7 | rs2 | rs1 |fn3| rd | opcode +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; class ZfhEncodingTest : public testing::Test { protected: @@ -492,4 +502,89 @@ TEST_F(ZfhEncodingTest, FdivH_rm) { FloatRmHelper(kFdivH, OpcodeEnum::kFdivH); } +TEST_F(ZfhEncodingTest, FminH) { + enc_->ParseInstruction(kFminH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFminH); +} + +TEST_F(ZfhEncodingTest, FminH_frs1) { + FloatFrs1Helper(kFminH, OpcodeEnum::kFminH); +} + +TEST_F(ZfhEncodingTest, FminH_frs2) { + FloatFrs2Helper(kFminH, OpcodeEnum::kFminH); +} + +TEST_F(ZfhEncodingTest, FminH_frd) { + FloatFrdHelper(kFminH, OpcodeEnum::kFminH); +} + +TEST_F(ZfhEncodingTest, FmaxH) { + enc_->ParseInstruction(kFmaxH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFmaxH); +} + +TEST_F(ZfhEncodingTest, FmaxH_frs1) { + FloatFrs1Helper(kFmaxH, OpcodeEnum::kFmaxH); +} + +TEST_F(ZfhEncodingTest, FmaxH_frs2) { + FloatFrs2Helper(kFmaxH, OpcodeEnum::kFmaxH); +} + +TEST_F(ZfhEncodingTest, FmaxH_frd) { + FloatFrdHelper(kFmaxH, OpcodeEnum::kFmaxH); +} + +TEST_F(ZfhEncodingTest, FsgnjH) { + enc_->ParseInstruction(kFsgnjH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsgnjH); +} + +TEST_F(ZfhEncodingTest, FsgnjH_frs1) { + FloatFrs1Helper(kFsgnjH, OpcodeEnum::kFsgnjH); +} + +TEST_F(ZfhEncodingTest, FsgnjH_frs2) { + FloatFrs2Helper(kFsgnjH, OpcodeEnum::kFsgnjH); +} + +TEST_F(ZfhEncodingTest, FsgnjH_frd) { + FloatFrdHelper(kFsgnjH, OpcodeEnum::kFsgnjH); +} + +TEST_F(ZfhEncodingTest, FsgnjnH) { + enc_->ParseInstruction(kFsgnjnH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsgnjnH); +} + +TEST_F(ZfhEncodingTest, FsgnjnH_frs1) { + FloatFrs1Helper(kFsgnjnH, OpcodeEnum::kFsgnjnH); +} + +TEST_F(ZfhEncodingTest, FsgnjnH_frs2) { + FloatFrs2Helper(kFsgnjnH, OpcodeEnum::kFsgnjnH); +} + +TEST_F(ZfhEncodingTest, FsgnjnH_frd) { + FloatFrdHelper(kFsgnjnH, OpcodeEnum::kFsgnjnH); +} + +TEST_F(ZfhEncodingTest, FsgnjxH) { + enc_->ParseInstruction(kFsgnjxH); + EXPECT_EQ(enc_->GetOpcode(SlotEnum::kRiscv32Zfh, 0), OpcodeEnum::kFsgnjxH); +} + +TEST_F(ZfhEncodingTest, FsgnjxH_frs1) { + FloatFrs1Helper(kFsgnjxH, OpcodeEnum::kFsgnjxH); +} + +TEST_F(ZfhEncodingTest, FsgnjxH_frs2) { + FloatFrs2Helper(kFsgnjxH, OpcodeEnum::kFsgnjxH); +} + +TEST_F(ZfhEncodingTest, FsgnjxH_frd) { + FloatFrdHelper(kFsgnjxH, OpcodeEnum::kFsgnjxH); +} + } // namespace