RISC-V: builtins support for MIPS RV64 P8700 execution control .
the following changes are made
a)Typo Fix (with previous PRhttps://github.com/llvm/llvm-project/pull/155747)
b)builtins support for MIPS P8700 execution control instructions .
c)Testcase
diff --git a/clang/include/clang/Basic/BuiltinsRISCV.td b/clang/include/clang/Basic/BuiltinsRISCV.td
index 5927eaf..2dad5ed 100644
--- a/clang/include/clang/Basic/BuiltinsRISCV.td
+++ b/clang/include/clang/Basic/BuiltinsRISCV.td
@@ -162,3 +162,8 @@
// XAndes extensions.
//===----------------------------------------------------------------------===//
include "clang/Basic/BuiltinsRISCVXAndes.td"
+
+//===----------------------------------------------------------------------===//
+// MIPS extensions.
+//===----------------------------------------------------------------------===//
+include "clang/Basic/BuiltinsRISCVXMIPS.td"
diff --git a/clang/include/clang/Basic/BuiltinsRISCVXMIPS.td b/clang/include/clang/Basic/BuiltinsRISCVXMIPS.td
new file mode 100644
index 0000000..07fb68a
--- /dev/null
+++ b/clang/include/clang/Basic/BuiltinsRISCVXMIPS.td
@@ -0,0 +1,21 @@
+//==- BuiltinsRISCVXMIPS.td - RISC-V MIPS Builtin database ----*- C++ -*-==//
+//
+// 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 defines the MIPS-specific builtin function database. Users of
+// this file must define the BUILTIN macro to make use of this information.
+//
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+// MIPS execution control extensions.
+//===----------------------------------------------------------------------===//
+let Attributes = [NoThrow, Const] in {
+def mips_pause : RISCVBuiltin<"void()", "xmipsexectl">;
+def mips_ehb : RISCVBuiltin<"void()", "xmipsexectl">;
+def mips_ihb : RISCVBuiltin<"void()", "xmipsexectl">;
+}
diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt
index dd52498..32a6be8 100644
--- a/clang/lib/Headers/CMakeLists.txt
+++ b/clang/lib/Headers/CMakeLists.txt
@@ -131,6 +131,7 @@
riscv_ntlh.h
sifive_vector.h
andes_vector.h
+ riscv_mips.h
)
set(spirv_files
diff --git a/clang/lib/Headers/riscv_mips.h b/clang/lib/Headers/riscv_mips.h
new file mode 100644
index 0000000..124a989
--- /dev/null
+++ b/clang/lib/Headers/riscv_mips.h
@@ -0,0 +1,34 @@
+//===----- riscv_mips.h - RISC-V MIPS Intrinsic definitions
+//----------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __RISCV_MIPS_H
+#define __RISCV_MIPS_H
+
+#if !defined(__riscv)
+#error "This header is only meant to be used on riscv architecture"
+#endif
+
+#define __DEFAULT_FN_ATTRS \
+ __attribute__((__always_inline__, __nodebug__, __target__("xmipsexectl")))
+
+static __inline__ void __DEFAULT_FN_ATTRS __mips_pause() {
+ __builtin_riscv_mips_pause();
+}
+
+static __inline__ void __DEFAULT_FN_ATTRS __mips_ehb() {
+ __builtin_riscv_mips_ehb();
+}
+
+static __inline__ void __DEFAULT_FN_ATTRS __mips_ihb() {
+ __builtin_riscv_mips_ihb();
+}
+
+#undef __DEFAULT_FN_ATTRS
+
+#endif
diff --git a/clang/test/CodeGen/RISCV/builtins-riscv-mips.c b/clang/test/CodeGen/RISCV/builtins-riscv-mips.c
new file mode 100644
index 0000000..b20ab80
--- /dev/null
+++ b/clang/test/CodeGen/RISCV/builtins-riscv-mips.c
@@ -0,0 +1,37 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6
+// RUN: %clang_cc1 -triple riscv32-linux-elf -O3 -target-feature +xmipsexectl -emit-llvm -o - %s | FileCheck %s
+
+#include<riscv_mips.h>
+
+// CHECK-LABEL: define dso_local void @test_mips_pause(
+// CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT: [[ENTRY:.*:]]
+// CHECK-NEXT: tail call void @llvm.riscv.mips.pause()
+// CHECK-NEXT: ret void
+//
+void test_mips_pause()
+{
+ __mips_pause();
+}
+
+// CHECK-LABEL: define dso_local void @test_mips_ehb(
+// CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
+// CHECK-NEXT: [[ENTRY:.*:]]
+// CHECK-NEXT: tail call void @llvm.riscv.mips.ehb()
+// CHECK-NEXT: ret void
+//
+void test_mips_ehb()
+{
+ __mips_ehb();
+}
+
+// CHECK-LABEL: define dso_local void @test_mips_ihb(
+// CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
+// CHECK-NEXT: [[ENTRY:.*:]]
+// CHECK-NEXT: tail call void @llvm.riscv.mips.ihb()
+// CHECK-NEXT: ret void
+//
+void test_mips_ihb()
+{
+ __mips_ihb();
+}
diff --git a/llvm/include/llvm/IR/IntrinsicsRISCV.td b/llvm/include/llvm/IR/IntrinsicsRISCV.td
index 4d0debd..77fcc46 100644
--- a/llvm/include/llvm/IR/IntrinsicsRISCV.td
+++ b/llvm/include/llvm/IR/IntrinsicsRISCV.td
@@ -1964,3 +1964,4 @@
include "llvm/IR/IntrinsicsRISCVXsf.td"
include "llvm/IR/IntrinsicsRISCVXCV.td"
include "llvm/IR/IntrinsicsRISCVXAndes.td"
+include "llvm/IR/IntrinsicsRISCVXMIPS.td"
diff --git a/llvm/include/llvm/IR/IntrinsicsRISCVXMIPS.td b/llvm/include/llvm/IR/IntrinsicsRISCVXMIPS.td
new file mode 100644
index 0000000..d231feb
--- /dev/null
+++ b/llvm/include/llvm/IR/IntrinsicsRISCVXMIPS.td
@@ -0,0 +1,20 @@
+//===- IntrinsicsRISCVXMIPS.td - MIPS intrinsics -------*- 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 defines all of the MIPS specific intrinsics for RISC-V.
+//
+//===----------------------------------------------------------------------===//
+
+let TargetPrefix = "riscv" in {
+ def int_riscv_mips_pause : ClangBuiltin<"__builtin_riscv_mips_pause">,
+ Intrinsic<[], [], [IntrNoMem, IntrHasSideEffects]>;
+ def int_riscv_mips_ehb : ClangBuiltin<"__builtin_riscv_mips_ehb">,
+ Intrinsic<[], [], [IntrNoMem, IntrHasSideEffects]>;
+ def int_riscv_mips_ihb : ClangBuiltin<"__builtin_riscv_mips_ihb">,
+ Intrinsic<[], [], [IntrNoMem, IntrHasSideEffects]>;
+}
diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td b/llvm/lib/Target/RISCV/RISCVFeatures.td
index 8425cfb..677d935 100644
--- a/llvm/lib/Target/RISCV/RISCVFeatures.td
+++ b/llvm/lib/Target/RISCV/RISCVFeatures.td
@@ -1439,7 +1439,7 @@
def FeatureVendorXMIPSEXECTL : RISCVExtension<1, 0, "MIPS execution control">;
def HasVendorXMIPSEXECTL
- : Predicate<"Subtarget->hasVendorXMIPSEXT()">,
+ : Predicate<"Subtarget->hasVendorXMIPSEXECTL()">,
AssemblerPredicate<(all_of FeatureVendorXMIPSEXECTL),
"'Xmipsexectl' (MIPS execution control)">;
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXMips.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXMips.td
index d615094..115ab38e 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoXMips.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXMips.td
@@ -143,6 +143,13 @@
def MIPS_PAUSE : MIPSExtInst_ri<0b000101, "mips.pause">;
}
+let Predicates = [HasVendorXMIPSEXECTL] in {
+ // Intrinsics
+ def : Pat<(int_riscv_mips_pause), (MIPS_PAUSE)>;
+ def : Pat<(int_riscv_mips_ihb), (MIPS_IHB)>;
+ def : Pat<(int_riscv_mips_ehb), (MIPS_EHB)>;
+}
+
let Predicates = [HasVendorXMIPSCBOP], DecoderNamespace = "XMIPS" in {
def MIPS_PREF : Mips_prefetch_ri<(outs), (ins GPR:$rs1, uimm9:$imm9, uimm5:$hint),
"mips.pref", "$hint, ${imm9}(${rs1})">,
diff --git a/llvm/test/CodeGen/RISCV/xmips-exectl.ll b/llvm/test/CodeGen/RISCV/xmips-exectl.ll
new file mode 100644
index 0000000..a013e01
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/xmips-exectl.ll
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=riscv64 -mcpu=mips-p8700 -O3 -verify-machineinstrs < %s \
+; RUN: | FileCheck -check-prefix=MIPS %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32-S128"
+
+define void @test_mips_pause() {
+; MIPS-LABEL: test_mips_pause:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: mips.pause
+; MIPS-NEXT: ret
+entry:
+ tail call void @llvm.riscv.mips.pause()
+ ret void
+}
+
+define void @test_mips_ehb() {
+; MIPS-LABEL: test_mips_ehb:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: mips.ehb
+; MIPS-NEXT: ret
+entry:
+ tail call void @llvm.riscv.mips.ehb()
+ ret void
+}
+
+define void @test_mips_ihb() {
+; MIPS-LABEL: test_mips_ihb:
+; MIPS: # %bb.0: # %entry
+; MIPS-NEXT: mips.ihb
+; MIPS-NEXT: ret
+entry:
+ tail call void @llvm.riscv.mips.ihb()
+ ret void
+}