achieveartificialintelligence created this revision.
achieveartificialintelligence added reviewers: HsiangKai, rkruppe, kito-cheng, 
craig.topper, jrtc27, luismarques.
Herald added subscribers: frasercrmck, NickHung, evandro, apazos, 
sameer.abuasal, pzheng, s.egerton, lenary, Jim, benna, psnobl, jocewei, PkmX, 
the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, shiva0217, 
niosHD, sabuasal, simoncook, johnrusso, rbar, asb, hiraditya.
achieveartificialintelligence requested review of this revision.
Herald added subscribers: llvm-commits, cfe-commits, MaskRay.
Herald added projects: clang, LLVM.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D93298

Files:
  clang/lib/Basic/Targets/RISCV.cpp
  clang/lib/Basic/Targets/RISCV.h
  llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
  llvm/lib/Target/RISCV/RISCV.td
  llvm/lib/Target/RISCV/RISCVInstrInfo.td
  llvm/lib/Target/RISCV/RISCVInstrInfoZfinx.td
  llvm/lib/Target/RISCV/RISCVSubtarget.h
  llvm/test/MC/RISCV/rv32d-invalid.s
  llvm/test/MC/RISCV/rv32zfh-invalid.s
  llvm/test/MC/RISCV/rvzfinx-valid.s

Index: llvm/test/MC/RISCV/rvzfinx-valid.s
===================================================================
--- /dev/null
+++ llvm/test/MC/RISCV/rvzfinx-valid.s
@@ -0,0 +1,333 @@
+# RUN: llvm-mc -triple=riscv64 -show-encoding --mattr=+experimental-zfinx %s \
+# RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+# RUN: not llvm-mc -triple=riscv64 -show-encoding %s 2>&1 \
+# RUN:        | FileCheck %s --check-prefix=CHECK-ERROR
+# RUN: llvm-mc -triple=riscv64 -filetype=obj --mattr=+experimental-zfinx %s \
+# RUN:        | llvm-objdump -d --mattr=+experimental-zfinx - \
+# RUN:        | FileCheck %s --check-prefix=CHECK-INST
+# RUN: llvm-mc -triple=riscv64 -filetype=obj --mattr=+experimental-zfinx %s \
+# RUN:        | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+
+fmadd.h a0, a1, a2, a3
+# CHECK-INST: fmadd.h a0, a1, a2, a3
+# CHECK-ENCODING: [0x43,0xf5,0xc5,0x6c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 43 f5 c5 6c <unknown>
+
+fmsub.h a0, a1, a2, a3
+# CHECK-INST: fmsub.h a0, a1, a2, a3
+# CHECK-ENCODING: [0x47,0xf5,0xc5,0x6c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 47 f5 c5 6c <unknown>
+
+fnmsub.h a0, a1, a2, a3
+# CHECK-INST: fnmsub.h a0, a1, a2, a3
+# CHECK-ENCODING: [0x4b,0xf5,0xc5,0x6c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 4b f5 c5 6c <unknown>
+
+fnmadd.h a0, a1, a2, a3
+# CHECK-INST: fnmadd.h a0, a1, a2, a3
+# CHECK-ENCODING: [0x4f,0xf5,0xc5,0x6c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 4f f5 c5 6c <unknown>
+
+fadd.h a0, a1, a2
+# CHECK-INST: fadd.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x04]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 04 <unknown>
+
+fsub.h a0, a1, a2
+# CHECK-INST: fsub.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x0c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 0c <unknown>
+
+fmul.h a0, a1, a2
+# CHECK-INST: fmul.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x14]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 14 <unknown>
+
+fdiv.h a0, a1, a2
+# CHECK-INST: fdiv.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x1c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 1c <unknown>
+
+fsqrt.h a0, a1
+# CHECK-INST: fsqrt.h a0, a1
+# CHECK-ENCODING: [0x53,0xf5,0x05,0x5c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 05 5c <unknown>
+
+fsgnj.h a0, a1, a2
+# CHECK-INST: fsgnj.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0x24]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 24 <unknown>
+
+fsgnjn.h a0, a1, a2
+# CHECK-INST: fsgnjn.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0x24]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 24 <unknown>
+
+fsgnjx.h a0, a1, a2
+# CHECK-INST: fsgnjx.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0xa5,0xc5,0x24]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 a5 c5 24 <unknown>
+
+fmin.h a0, a1, a2
+# CHECK-INST: fmin.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0x2c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 2c <unknown>
+
+fmax.h a0, a1, a2
+# CHECK-INST: fmax.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0x2c]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 2c <unknown>
+
+feq.h a0, a1, a2
+# CHECK-INST: feq.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0xa5,0xc5,0xa4]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 a5 c5 a4 <unknown>
+
+flt.h a0, a1, a2
+# CHECK-INST: flt.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0xa4]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 a4 <unknown>
+
+fle.h a0, a1, a2
+# CHECK-INST: fle.h a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0xa4]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 a4 <unknown>
+
+fclass.h a0, a1
+# CHECK-INST: fclass.h a0, a1
+# CHECK-ENCODING: [0x53,0x95,0x05,0xe4]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 05 e4 <unknown>
+
+fmadd.s a0, a1, a2, a3
+# CHECK-INST: fmadd.s a0, a1, a2, a3
+# CHECK-ENCODING: [0x43,0xf5,0xc5,0x68]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 43 f5 c5 68 <unknown>
+
+fmsub.s a0, a1, a2, a3
+# CHECK-INST: fmsub.s a0, a1, a2, a3
+# CHECK-ENCODING: [0x47,0xf5,0xc5,0x68]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 47 f5 c5 68 <unknown>
+
+fnmsub.s a0, a1, a2, a3
+# CHECK-INST: fnmsub.s a0, a1, a2, a3
+# CHECK-ENCODING: [0x4b,0xf5,0xc5,0x68]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 4b f5 c5 68 <unknown>
+
+fnmadd.s a0, a1, a2, a3
+# CHECK-INST: fnmadd.s a0, a1, a2, a3
+# CHECK-ENCODING: [0x4f,0xf5,0xc5,0x68]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 4f f5 c5 68 <unknown>
+
+fadd.s a0, a1, a2
+# CHECK-INST: fadd.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x00]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 00 <unknown>
+
+fsub.s a0, a1, a2
+# CHECK-INST: fsub.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x08]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 08 <unknown>
+
+fmul.s a0, a1, a2
+# CHECK-INST: fmul.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x10]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 10 <unknown>
+
+fdiv.s a0, a1, a2
+# CHECK-INST: fdiv.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x18]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 18 <unknown>
+
+fsqrt.s a0, a1
+# CHECK-INST: fsqrt.s a0, a1
+# CHECK-ENCODING: [0x53,0xf5,0x05,0x58]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 05 58 <unknown>
+
+fsgnj.s a0, a1, a2
+# CHECK-INST: fsgnj.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0x20]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 20 <unknown>
+
+fsgnjn.s a0, a1, a2
+# CHECK-INST: fsgnjn.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0x20]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 20 <unknown>
+
+fsgnjx.s a0, a1, a2
+# CHECK-INST: fsgnjx.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0xa5,0xc5,0x20]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 a5 c5 20 <unknown>
+
+fmin.s a0, a1, a2
+# CHECK-INST: fmin.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0x28]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 28 <unknown>
+
+fmax.s a0, a1, a2
+# CHECK-INST: fmax.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0x28]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 28 <unknown>
+
+feq.s a0, a1, a2
+# CHECK-INST: feq.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0xa5,0xc5,0xa0]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 a5 c5 a0 <unknown>
+
+flt.s a0, a1, a2
+# CHECK-INST: flt.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0xa0]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 a0 <unknown>
+
+fle.s a0, a1, a2
+# CHECK-INST: fle.s a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0xa0]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 a0 <unknown>
+
+fclass.s a0, a1
+# CHECK-INST: fclass.s a0, a1
+# CHECK-ENCODING: [0x53,0x95,0x05,0xe0]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 05 e0 <unknown>
+
+fmadd.d a0, a1, a2, a3
+# CHECK-INST: fmadd.d a0, a1, a2, a3
+# CHECK-ENCODING: [0x43,0xf5,0xc5,0x6a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 43 f5 c5 6a <unknown>
+
+fmsub.d a0, a1, a2, a3
+# CHECK-INST: fmsub.d a0, a1, a2, a3
+# CHECK-ENCODING: [0x47,0xf5,0xc5,0x6a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 47 f5 c5 6a <unknown>
+
+fnmsub.d a0, a1, a2, a3
+# CHECK-INST: fnmsub.d a0, a1, a2, a3
+# CHECK-ENCODING: [0x4b,0xf5,0xc5,0x6a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 4b f5 c5 6a <unknown>
+
+fnmadd.d a0, a1, a2, a3
+# CHECK-INST: fnmadd.d a0, a1, a2, a3
+# CHECK-ENCODING: [0x4f,0xf5,0xc5,0x6a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 4f f5 c5 6a <unknown>
+
+fadd.d a0, a1, a2
+# CHECK-INST: fadd.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x02]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 02 <unknown>
+
+fsub.d a0, a1, a2
+# CHECK-INST: fsub.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x0a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 0a <unknown>
+
+fmul.d a0, a1, a2
+# CHECK-INST: fmul.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x12]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 12 <unknown>
+
+fdiv.d a0, a1, a2
+# CHECK-INST: fdiv.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0xf5,0xc5,0x1a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 c5 1a <unknown>
+
+fsqrt.d a0, a1
+# CHECK-INST: fsqrt.d a0, a1
+# CHECK-ENCODING: [0x53,0xf5,0x05,0x5a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 f5 05 5a <unknown>
+
+fsgnj.d a0, a1, a2
+# CHECK-INST: fsgnj.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0x22]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 22 <unknown>
+
+fsgnjn.d a0, a1, a2
+# CHECK-INST: fsgnjn.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0x22]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 22 <unknown>
+
+fsgnjx.d a0, a1, a2
+# CHECK-INST: fsgnjx.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0xa5,0xc5,0x22]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 a5 c5 22 <unknown>
+
+fmin.d a0, a1, a2
+# CHECK-INST: fmin.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0x2a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 2a <unknown>
+
+fmax.d a0, a1, a2
+# CHECK-INST: fmax.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0x2a]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 2a <unknown>
+
+feq.d a0, a1, a2
+# CHECK-INST: feq.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0xa5,0xc5,0xa2]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 a5 c5 a2 <unknown>
+
+flt.d a0, a1, a2
+# CHECK-INST: flt.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0x95,0xc5,0xa2]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 c5 a2 <unknown>
+
+fle.d a0, a1, a2
+# CHECK-INST: fle.d a0, a1, a2
+# CHECK-ENCODING: [0x53,0x85,0xc5,0xa2]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 85 c5 a2 <unknown>
+
+fclass.d a0, a1
+# CHECK-INST: fclass.d a0, a1
+# CHECK-ENCODING: [0x53,0x95,0x05,0xe2]
+# CHECK-ERROR: 'Zfinx' (Float in Integer)
+# CHECK-UNKNOWN: 53 95 05 e2 <unknown>
Index: llvm/test/MC/RISCV/rv32zfh-invalid.s
===================================================================
--- llvm/test/MC/RISCV/rv32zfh-invalid.s
+++ llvm/test/MC/RISCV/rv32zfh-invalid.s
@@ -29,8 +29,5 @@
 fmsub.h f14, f15, f16, f17, 0 # CHECK: :[[@LINE]]:29: error: operand must be a valid floating point rounding mode mnemonic
 fnmsub.h f18, f19, f20, f21, 0b111 # CHECK: :[[@LINE]]:30: error: operand must be a valid floating point rounding mode mnemonic
 
-# Integer registers where FP regs are expected
-fadd.h a2, a1, a0 # CHECK: :[[@LINE]]:8: error: invalid operand for instruction
-
 # FP registers where integer regs are expected
 fcvt.wu.h ft2, a1 # CHECK: :[[@LINE]]:11: error: invalid operand for instruction
Index: llvm/test/MC/RISCV/rv32d-invalid.s
===================================================================
--- llvm/test/MC/RISCV/rv32d-invalid.s
+++ llvm/test/MC/RISCV/rv32d-invalid.s
@@ -14,8 +14,5 @@
 fld ft1, 100(a10) # CHECK: :[[@LINE]]:14: error: expected register
 fsgnjn.d fa100, fa2, fa3 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction
 
-# Integer registers where FP regs are expected
-fadd.d a2, a1, a0 # CHECK: :[[@LINE]]:8: error: invalid operand for instruction
-
 # FP registers where integer regs are expected
 fcvt.wu.d ft2, a1 # CHECK: :[[@LINE]]:11: error: invalid operand for instruction
Index: llvm/lib/Target/RISCV/RISCVSubtarget.h
===================================================================
--- llvm/lib/Target/RISCV/RISCVSubtarget.h
+++ llvm/lib/Target/RISCV/RISCVSubtarget.h
@@ -54,6 +54,7 @@
   bool HasStdExtZvlsseg = false;
   bool HasStdExtZvamo = false;
   bool HasStdExtZfh = false;
+  bool HasStdExtZfinx = false;
   bool HasRV64 = false;
   bool IsRV32E = false;
   bool EnableLinkerRelax = false;
@@ -120,6 +121,7 @@
   bool hasStdExtZvlsseg() const { return HasStdExtZvlsseg; }
   bool hasStdExtZvamo() const { return HasStdExtZvamo; }
   bool hasStdExtZfh() const { return HasStdExtZfh; }
+  bool hasStdExtZfinx() const { return HasStdExtZfinx; }
   bool is64Bit() const { return HasRV64; }
   bool isRV32E() const { return IsRV32E; }
   bool enableLinkerRelax() const { return EnableLinkerRelax; }
Index: llvm/lib/Target/RISCV/RISCVInstrInfoZfinx.td
===================================================================
--- /dev/null
+++ llvm/lib/Target/RISCV/RISCVInstrInfoZfinx.td
@@ -0,0 +1,322 @@
+//=== RISCVInstrInfoZfinx.td - RISC-V 'Zfinx' instructions -*- tablegen -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the RISC-V instructions from the standard 'Zfinx'
+// float in integer.
+// This version is still experimental as the 'Zfinx' extension hasn't been
+// ratified yet.
+//
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+// Instruction class templates
+//===----------------------------------------------------------------------===//
+
+
+
+
+// Zfh Part
+let DecoderNamespace = "RVZfinx", Predicates = [HasStdExtZfinx] in {
+
+// Common
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPUnaryOp_r_frm<bits<7> funct7, RegisterClass rdty, RegisterClass rs1ty,
+                      string opcodestr>
+    : RVInstRFrm<funct7, OPC_OP_FP, (outs GPR:$rd),
+                 (ins GPR:$rs1, frmarg:$funct3), opcodestr,
+                  "$rd, $rs1, $funct3">;
+
+
+// Zfh Part
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPFMAH_rrr_frm<RISCVOpcode opcode, string opcodestr>
+    : RVInstR4<0b10, opcode, (outs GPR:$rd),
+               (ins GPR:$rs1, GPR:$rs2, GPR:$rs3, frmarg:$funct3),
+                opcodestr, "$rd, $rs1, $rs2, $rs3, $funct3">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPALUH_rr_frm<bits<7> funct7, string opcodestr>
+    : RVInstRFrm<funct7, OPC_OP_FP, (outs GPR:$rd),
+                 (ins GPR:$rs1, GPR:$rs2, frmarg:$funct3), opcodestr,
+                  "$rd, $rs1, $rs2, $funct3">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPALUH_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
+    : RVInstR<funct7, funct3, OPC_OP_FP, (outs GPR:$rd),
+              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPCmpH_rr<bits<3> funct3, string opcodestr>
+    : RVInstR<0b1010010, funct3, OPC_OP_FP, (outs GPR:$rd),
+              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">,
+      Sched<[]>;
+
+
+// F Part
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPFMAS_rrr_frm<RISCVOpcode opcode, string opcodestr>
+    : RVInstR4<0b00, opcode, (outs GPR:$rd),
+               (ins GPR:$rs1, GPR:$rs2, GPR:$rs3, frmarg:$funct3),
+                opcodestr, "$rd, $rs1, $rs2, $rs3, $funct3">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPALUS_rr_frm<bits<7> funct7, string opcodestr>
+    : RVInstRFrm<funct7, OPC_OP_FP, (outs GPR:$rd),
+                 (ins GPR:$rs1, GPR:$rs2, frmarg:$funct3), opcodestr,
+                  "$rd, $rs1, $rs2, $funct3">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPALUS_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
+    : RVInstR<funct7, funct3, OPC_OP_FP, (outs GPR:$rd),
+              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPCmpS_rr<bits<3> funct3, string opcodestr>
+    : RVInstR<0b1010000, funct3, OPC_OP_FP, (outs GPR:$rd),
+              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">,
+      Sched<[WriteFCmp32, ReadFCmp32, ReadFCmp32]>;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPUnaryOp_r<bits<7> funct7, bits<3> funct3, RegisterClass rdty,
+                RegisterClass rs1ty, string opcodestr>
+    : RVInstR<funct7, funct3, OPC_OP_FP, (outs GPR:$rd), (ins GPR:$rs1),
+              opcodestr, "$rd, $rs1">;
+
+
+// D Part
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPFMAD_rrr_frm<RISCVOpcode opcode, string opcodestr>
+    : RVInstR4<0b01, opcode, (outs GPR:$rd),
+               (ins GPR:$rs1, GPR:$rs2, GPR:$rs3, frmarg:$funct3),
+                opcodestr, "$rd, $rs1, $rs2, $rs3, $funct3">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPALUD_rr_frm<bits<7> funct7, string opcodestr>
+    : RVInstRFrm<funct7, OPC_OP_FP, (outs GPR:$rd),
+                (ins GPR:$rs1, GPR:$rs2, frmarg:$funct3), opcodestr,
+                 "$rd, $rs1, $rs2, $funct3">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPALUD_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
+    : RVInstR<funct7, funct3, OPC_OP_FP, (outs GPR:$rd),
+              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
+
+let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
+class Zfinx_FPCmpD_rr<bits<3> funct3, string opcodestr>
+    : RVInstR<0b1010001, funct3, OPC_OP_FP, (outs GPR:$rd),
+              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">,
+      Sched<[WriteFCmp64, ReadFCmp64, ReadFCmp64]>;
+} // ! DecoderNamespace = "RVZfinx", Predicates = [HasStdExtZfinx]
+
+//===----------------------------------------------------------------------===//
+// Instruction class templates alias
+//===----------------------------------------------------------------------===//
+
+
+// Zfh Part
+class Zfinx_FPFMAHDynFrmAlias<Zfinx_FPFMAH_rrr_frm Inst, string OpcodeStr>
+    : InstAlias<OpcodeStr#" $rd, $rs1, $rs2, $rs3",
+                (Inst GPR:$rd, GPR:$rs1, GPR:$rs2, GPR:$rs3, 0b111)>;
+
+class Zfinx_FPALUHDynFrmAlias<Zfinx_FPALUH_rr_frm Inst, string OpcodeStr>
+    : InstAlias<OpcodeStr#" $rd, $rs1, $rs2",
+                (Inst GPR:$rd, GPR:$rs1, GPR:$rs2, 0b111)>;
+
+
+// F Part
+class Zfinx_FPFMASDynFrmAlias<Zfinx_FPFMAS_rrr_frm Inst, string OpcodeStr>
+    : InstAlias<OpcodeStr#" $rd, $rs1, $rs2, $rs3",
+                (Inst GPR:$rd, GPR:$rs1, GPR:$rs2, GPR:$rs3, 0b111)>;
+
+class Zfinx_FPALUSDynFrmAlias<Zfinx_FPALUS_rr_frm Inst, string OpcodeStr>
+    : InstAlias<OpcodeStr#" $rd, $rs1, $rs2",
+                (Inst GPR:$rd, GPR:$rs1, GPR:$rs2, 0b111)>;
+class Zfinx_FPUnaryOpDynFrmAlias<Zfinx_FPUnaryOp_r_frm Inst, string OpcodeStr, RegisterClass rdty, RegisterClass rs1ty>
+    : InstAlias<OpcodeStr#" $rd, $rs1",
+                (Inst GPR:$rd, GPR:$rs1, 0b111)>;
+
+
+// D Part
+class Zfinx_FPFMADDynFrmAlias<Zfinx_FPFMAD_rrr_frm Inst, string OpcodeStr>
+    : InstAlias<OpcodeStr#" $rd, $rs1, $rs2, $rs3",
+                (Inst GPR:$rd, GPR:$rs1, GPR:$rs2, GPR:$rs3, 0b111)>;
+
+class Zfinx_FPALUDDynFrmAlias<Zfinx_FPALUD_rr_frm Inst, string OpcodeStr>
+    : InstAlias<OpcodeStr#" $rd, $rs1, $rs2",
+                (Inst GPR:$rd, GPR:$rs1, GPR:$rs2, 0b111)>;
+
+
+//===----------------------------------------------------------------------===//
+// Instructions
+//===----------------------------------------------------------------------===//
+
+
+// Zfh Part
+let Predicates = [HasStdExtZfinx] in {
+def Zfinx_FMADD_H  : Zfinx_FPFMAH_rrr_frm<OPC_MADD, "fmadd.h">,
+                     Sched<[]>;
+def                : Zfinx_FPFMAHDynFrmAlias<Zfinx_FMADD_H, "fmadd.h">;
+def Zfinx_FMSUB_H  : Zfinx_FPFMAH_rrr_frm<OPC_MSUB, "fmsub.h">,
+                     Sched<[]>;
+def                : Zfinx_FPFMAHDynFrmAlias<Zfinx_FMSUB_H, "fmsub.h">;
+def Zfinx_FNMSUB_H : Zfinx_FPFMAH_rrr_frm<OPC_NMSUB, "fnmsub.h">,
+                     Sched<[]>;
+def                : Zfinx_FPFMAHDynFrmAlias<Zfinx_FNMSUB_H, "fnmsub.h">;
+def Zfinx_FNMADD_H : Zfinx_FPFMAH_rrr_frm<OPC_NMADD, "fnmadd.h">,
+                     Sched<[]>;
+def                : Zfinx_FPFMAHDynFrmAlias<Zfinx_FNMADD_H, "fnmadd.h">;
+
+def Zfinx_FADD_H : Zfinx_FPALUH_rr_frm<0b0000010, "fadd.h">,
+                   Sched<[]>;
+def              : Zfinx_FPALUHDynFrmAlias<Zfinx_FADD_H, "fadd.h">;
+def Zfinx_FSUB_H : Zfinx_FPALUH_rr_frm<0b0000110, "fsub.h">,
+                   Sched<[]>;
+def              : Zfinx_FPALUHDynFrmAlias<Zfinx_FSUB_H, "fsub.h">;
+def Zfinx_FMUL_H : Zfinx_FPALUH_rr_frm<0b0001010, "fmul.h">,
+                   Sched<[]>;
+def              : Zfinx_FPALUHDynFrmAlias<Zfinx_FMUL_H, "fmul.h">;
+def Zfinx_FDIV_H : Zfinx_FPALUH_rr_frm<0b0001110, "fdiv.h">,
+                   Sched<[]>;
+def              : Zfinx_FPALUHDynFrmAlias<Zfinx_FDIV_H, "fdiv.h">;
+
+def Zfinx_FSQRT_H : Zfinx_FPUnaryOp_r_frm<0b0101110, FPR16, FPR16, "fsqrt.h">,
+                    Sched<[]> {
+  let rs2 = 0b00000;
+}
+def               : Zfinx_FPUnaryOpDynFrmAlias<Zfinx_FSQRT_H, "fsqrt.h", FPR16, FPR16>;
+
+
+def Zfinx_FSGNJ_H  : Zfinx_FPALUH_rr<0b0010010, 0b000, "fsgnj.h">,
+                     Sched<[]>;
+def Zfinx_FSGNJN_H : Zfinx_FPALUH_rr<0b0010010, 0b001, "fsgnjn.h">,
+                     Sched<[]>;
+def Zfinx_FSGNJX_H : Zfinx_FPALUH_rr<0b0010010, 0b010, "fsgnjx.h">,
+                     Sched<[]>;
+def Zfinx_FMIN_H   : Zfinx_FPALUH_rr<0b0010110, 0b000, "fmin.h">,
+                     Sched<[]>;
+def Zfinx_FMAX_H   : Zfinx_FPALUH_rr<0b0010110, 0b001, "fmax.h">,
+                     Sched<[]>;
+
+def Zfinx_FEQ_H : Zfinx_FPCmpH_rr<0b010, "feq.h">;
+def Zfinx_FLT_H : Zfinx_FPCmpH_rr<0b001, "flt.h">;
+def Zfinx_FLE_H : Zfinx_FPCmpH_rr<0b000, "fle.h">;
+
+def Zfinx_FCLASS_H : Zfinx_FPUnaryOp_r<0b1110010, 0b001, GPR, FPR16, "fclass.h">,
+               Sched<[]> {
+  let rs2 = 0b00000;
+}
+
+
+// F Part
+def Zfinx_FMADD_S  : Zfinx_FPFMAS_rrr_frm<OPC_MADD, "fmadd.s">,
+                     Sched<[WriteFMulAdd32, ReadFMulAdd32, ReadFMulAdd32, ReadFMulAdd32]>;
+def                : Zfinx_FPFMASDynFrmAlias<Zfinx_FMADD_S, "fmadd.s">;
+def Zfinx_FMSUB_S  : Zfinx_FPFMAS_rrr_frm<OPC_MSUB, "fmsub.s">,
+                     Sched<[WriteFMulSub32, ReadFMulSub32, ReadFMulSub32, ReadFMulSub32]>;
+def                : Zfinx_FPFMASDynFrmAlias<Zfinx_FMSUB_S, "fmsub.s">;
+def Zfinx_FNMSUB_S : Zfinx_FPFMAS_rrr_frm<OPC_NMSUB, "fnmsub.s">,
+                     Sched<[WriteFMulSub32, ReadFMulSub32, ReadFMulSub32, ReadFMulSub32]>;
+def                : Zfinx_FPFMASDynFrmAlias<Zfinx_FNMSUB_S, "fnmsub.s">;
+def Zfinx_FNMADD_S : Zfinx_FPFMAS_rrr_frm<OPC_NMADD, "fnmadd.s">,
+                     Sched<[WriteFMulAdd32, ReadFMulAdd32, ReadFMulAdd32, ReadFMulAdd32]>;
+def                : Zfinx_FPFMASDynFrmAlias<Zfinx_FNMADD_S, "fnmadd.s">;
+
+def Zfinx_FADD_S : Zfinx_FPALUS_rr_frm<0b0000000, "fadd.s">,
+                   Sched<[WriteFALU32, ReadFALU32, ReadFALU32]>;
+def              : Zfinx_FPALUSDynFrmAlias<Zfinx_FADD_S, "fadd.s">;
+def Zfinx_FSUB_S : Zfinx_FPALUS_rr_frm<0b0000100, "fsub.s">,
+                   Sched<[WriteFALU32, ReadFALU32, ReadFALU32]>;
+def              : Zfinx_FPALUSDynFrmAlias<Zfinx_FSUB_S, "fsub.s">;
+def Zfinx_FMUL_S : Zfinx_FPALUS_rr_frm<0b0001000, "fmul.s">,
+                   Sched<[WriteFMul32, ReadFMul32, ReadFMul32]>;
+def              : Zfinx_FPALUSDynFrmAlias<Zfinx_FMUL_S, "fmul.s">;
+def Zfinx_FDIV_S : Zfinx_FPALUS_rr_frm<0b0001100, "fdiv.s">,
+                   Sched<[WriteFDiv32, ReadFDiv32, ReadFDiv32]>;
+def              : Zfinx_FPALUSDynFrmAlias<Zfinx_FDIV_S, "fdiv.s">;
+
+def Zfinx_FSQRT_S : Zfinx_FPUnaryOp_r_frm<0b0101100, FPR32, FPR32, "fsqrt.s">,
+                    Sched<[WriteFSqrt32, ReadFSqrt32]> {
+  let rs2 = 0b00000;
+}
+def               : Zfinx_FPUnaryOpDynFrmAlias<Zfinx_FSQRT_S, "fsqrt.s", FPR32, FPR32>;
+
+def Zfinx_FSGNJ_S  : Zfinx_FPALUS_rr<0b0010000, 0b000, "fsgnj.s">,
+                     Sched<[WriteFSGNJ32, ReadFSGNJ32, ReadFSGNJ32]>;
+def Zfinx_FSGNJN_S : Zfinx_FPALUS_rr<0b0010000, 0b001, "fsgnjn.s">,
+                     Sched<[WriteFSGNJ32, ReadFSGNJ32, ReadFSGNJ32]>;
+def Zfinx_FSGNJX_S : Zfinx_FPALUS_rr<0b0010000, 0b010, "fsgnjx.s">,
+                     Sched<[WriteFSGNJ32, ReadFSGNJ32, ReadFSGNJ32]>;
+def Zfinx_FMIN_S   : Zfinx_FPALUS_rr<0b0010100, 0b000, "fmin.s">,
+                     Sched<[WriteFMinMax32, ReadFMinMax32, ReadFMinMax32]>;
+def Zfinx_FMAX_S   : Zfinx_FPALUS_rr<0b0010100, 0b001, "fmax.s">,
+                     Sched<[WriteFMinMax32, ReadFMinMax32, ReadFMinMax32]>;
+
+def Zfinx_FEQ_S : Zfinx_FPCmpS_rr<0b010, "feq.s">;
+def Zfinx_FLT_S : Zfinx_FPCmpS_rr<0b001, "flt.s">;
+def Zfinx_FLE_S : Zfinx_FPCmpS_rr<0b000, "fle.s">;
+
+def Zfinx_FCLASS_S : Zfinx_FPUnaryOp_r<0b1110000, 0b001, GPR, FPR32, "fclass.s">,
+                     Sched<[WriteFClass32, ReadFClass32]> {
+  let rs2 = 0b00000;
+}
+
+
+// D Part
+def Zfinx_FMADD_D  : Zfinx_FPFMAD_rrr_frm<OPC_MADD, "fmadd.d">,
+                     Sched<[WriteFMulAdd64, ReadFMulAdd64, ReadFMulAdd64, ReadFMulAdd64]>;
+def                : Zfinx_FPFMADDynFrmAlias<Zfinx_FMADD_D, "fmadd.d">;
+def Zfinx_FMSUB_D  : Zfinx_FPFMAD_rrr_frm<OPC_MSUB, "fmsub.d">,
+                     Sched<[WriteFMulSub64, ReadFMulSub64, ReadFMulSub64, ReadFMulSub64]>;
+def                : Zfinx_FPFMADDynFrmAlias<Zfinx_FMSUB_D, "fmsub.d">;
+def Zfinx_FNMSUB_D : Zfinx_FPFMAD_rrr_frm<OPC_NMSUB, "fnmsub.d">,
+                     Sched<[WriteFMulSub64, ReadFMulSub64, ReadFMulSub64, ReadFMulSub64]>;
+def                : Zfinx_FPFMADDynFrmAlias<Zfinx_FNMSUB_D, "fnmsub.d">;
+def Zfinx_FNMADD_D : Zfinx_FPFMAD_rrr_frm<OPC_NMADD, "fnmadd.d">,
+                     Sched<[WriteFMulAdd64, ReadFMulAdd64, ReadFMulAdd64, ReadFMulAdd64]>;
+def                : Zfinx_FPFMADDynFrmAlias<Zfinx_FNMADD_D, "fnmadd.d">;
+
+def Zfinx_FADD_D : Zfinx_FPALUD_rr_frm<0b0000001, "fadd.d">,
+                   Sched<[WriteFALU64, ReadFALU64, ReadFALU64]>;
+def              : Zfinx_FPALUDDynFrmAlias<Zfinx_FADD_D, "fadd.d">;
+def Zfinx_FSUB_D : Zfinx_FPALUD_rr_frm<0b0000101, "fsub.d">,
+                   Sched<[WriteFALU64, ReadFALU64, ReadFALU64]>;
+def              : Zfinx_FPALUDDynFrmAlias<Zfinx_FSUB_D, "fsub.d">;
+def Zfinx_FMUL_D : Zfinx_FPALUD_rr_frm<0b0001001, "fmul.d">,
+                   Sched<[WriteFMul64, ReadFMul64, ReadFMul64]>;
+def              : Zfinx_FPALUDDynFrmAlias<Zfinx_FMUL_D, "fmul.d">;
+def Zfinx_FDIV_D : Zfinx_FPALUD_rr_frm<0b0001101, "fdiv.d">,
+                   Sched<[WriteFDiv64, ReadFDiv64, ReadFDiv64]>;
+def              : Zfinx_FPALUDDynFrmAlias<Zfinx_FDIV_D, "fdiv.d">;
+
+def Zfinx_FSQRT_D : Zfinx_FPUnaryOp_r_frm<0b0101101, FPR64, FPR64, "fsqrt.d">,
+                    Sched<[WriteFSqrt64, ReadFSqrt64]> {
+  let rs2 = 0b00000;
+}
+def               : Zfinx_FPUnaryOpDynFrmAlias<Zfinx_FSQRT_D, "fsqrt.d", FPR64, FPR64>;
+
+
+def Zfinx_FSGNJ_D  : Zfinx_FPALUD_rr<0b0010001, 0b000, "fsgnj.d">,
+                     Sched<[WriteFSGNJ64, ReadFSGNJ64, ReadFSGNJ64]>;
+def Zfinx_FSGNJN_D : Zfinx_FPALUD_rr<0b0010001, 0b001, "fsgnjn.d">,
+                     Sched<[WriteFSGNJ64, ReadFSGNJ64, ReadFSGNJ64]>;
+def Zfinx_FSGNJX_D : Zfinx_FPALUD_rr<0b0010001, 0b010, "fsgnjx.d">,
+                     Sched<[WriteFSGNJ64, ReadFSGNJ64, ReadFSGNJ64]>;
+def Zfinx_FMIN_D   : Zfinx_FPALUD_rr<0b0010101, 0b000, "fmin.d">,
+                     Sched<[WriteFMinMax64, ReadFMinMax64, ReadFMinMax64]>;
+def Zfinx_FMAX_D   : Zfinx_FPALUD_rr<0b0010101, 0b001, "fmax.d">,
+                     Sched<[WriteFMinMax64, ReadFMinMax64, ReadFMinMax64]>;
+
+def Zfinx_FEQ_D : Zfinx_FPCmpD_rr<0b010, "feq.d">;
+def Zfinx_FLT_D : Zfinx_FPCmpD_rr<0b001, "flt.d">;
+def Zfinx_FLE_D : Zfinx_FPCmpD_rr<0b000, "fle.d">;
+
+def Zfinx_FCLASS_D : Zfinx_FPUnaryOp_r<0b1110001, 0b001, GPR, FPR64, "fclass.d">,
+                     Sched<[WriteFClass64, ReadFClass64]> {
+  let rs2 = 0b00000;
+}
+} // Predicates = [HasStdExtZfinx]
Index: llvm/lib/Target/RISCV/RISCVInstrInfo.td
===================================================================
--- llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -1224,3 +1224,4 @@
 include "RISCVInstrInfoB.td"
 include "RISCVInstrInfoV.td"
 include "RISCVInstrInfoZfh.td"
+include "RISCVInstrInfoZfinx.td"
Index: llvm/lib/Target/RISCV/RISCV.td
===================================================================
--- llvm/lib/Target/RISCV/RISCV.td
+++ llvm/lib/Target/RISCV/RISCV.td
@@ -49,6 +49,13 @@
                              AssemblerPredicate<(all_of FeatureExtZfh),
                              "'Zfh' (Half-Precision Floating-Point)">;
 
+def FeatureExtZfinx
+    : SubtargetFeature<"experimental-zfinx", "HasStdExtZfinx", "true",
+                       "'Zfinx' (Float in Integer)">;
+def HasStdExtZfinx : Predicate<"Subtarget->hasStdExtZfinx()">,
+                             AssemblerPredicate<(all_of FeatureExtZfinx),
+                             "'Zfinx' (Float in Integer)">;
+
 def FeatureStdExtC
     : SubtargetFeature<"c", "HasStdExtC", "true",
                        "'C' (Compressed Instructions)">;
Index: llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
===================================================================
--- llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -367,6 +367,18 @@
       return MCDisassembler::Fail;
     }
     Insn = support::endian::read32le(Bytes.data());
+
+    if (STI.getFeatureBits()[RISCV::FeatureExtZfinx]) {
+      LLVM_DEBUG(dbgs() << "Trying RVZfinx table (Float in Integer):\n");
+      // Calling the auto-generated decoder function.
+      Result = decodeInstruction(DecoderTableRVZfinx32, MI, Insn, Address, this,
+                                 STI);
+      if (Result != MCDisassembler::Fail) {
+        Size = 4;
+        return Result;
+      }
+    }
+
     LLVM_DEBUG(dbgs() << "Trying RISCV32 table :\n");
     Result = decodeInstruction(DecoderTable32, MI, Insn, Address, this, STI);
     Size = 4;
Index: clang/lib/Basic/Targets/RISCV.h
===================================================================
--- clang/lib/Basic/Targets/RISCV.h
+++ clang/lib/Basic/Targets/RISCV.h
@@ -33,11 +33,12 @@
   bool HasB;
   bool HasV;
   bool HasZfh;
+  bool HasZfinx;
 
 public:
   RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
       : TargetInfo(Triple), HasM(false), HasA(false), HasF(false), HasD(false),
-        HasC(false), HasB(false), HasV(false), HasZfh(false) {
+        HasC(false), HasB(false), HasV(false), HasZfh(false), HasZfinx(false) {
     LongDoubleWidth = 128;
     LongDoubleAlign = 128;
     LongDoubleFormat = &llvm::APFloat::IEEEquad();
Index: clang/lib/Basic/Targets/RISCV.cpp
===================================================================
--- clang/lib/Basic/Targets/RISCV.cpp
+++ clang/lib/Basic/Targets/RISCV.cpp
@@ -141,6 +141,9 @@
 
   if (HasZfh)
     Builder.defineMacro("__riscv_zfh");
+
+  if (HasZfinx)
+    Builder.defineMacro("__riscv_zfinx");
 }
 
 /// Return true if has this feature, need to sync with handleTargetFeatures.
@@ -158,6 +161,7 @@
       .Case("experimental-b", HasB)
       .Case("experimental-v", HasV)
       .Case("experimental-zfh", HasZfh)
+      .Case("experimental-zfinx", HasZfinx)
       .Default(false);
 }
 
@@ -181,6 +185,8 @@
       HasV = true;
     else if (Feature == "+experimental-zfh")
       HasZfh = true;
+    else if (Feature == "+experimental-zfinx")
+      HasZfinx = true;
   }
 
   return true;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to