Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions clang/include/clang/Basic/BuiltinsRISCV.td
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,8 @@ include "clang/Basic/BuiltinsRISCVXCV.td"
// XAndes extensions.
//===----------------------------------------------------------------------===//
include "clang/Basic/BuiltinsRISCVXAndes.td"

//===----------------------------------------------------------------------===//
// MIPS extensions.
//===----------------------------------------------------------------------===//
include "clang/Basic/BuiltinsRISCVXMIPS.td"
21 changes: 21 additions & 0 deletions clang/include/clang/Basic/BuiltinsRISCVXMIPS.td
Original file line number Diff line number Diff line change
@@ -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">;
}
1 change: 1 addition & 0 deletions clang/lib/Headers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ set(riscv_files
riscv_ntlh.h
sifive_vector.h
andes_vector.h
riscv_mips.h
)

set(spirv_files
Expand Down
34 changes: 34 additions & 0 deletions clang/lib/Headers/riscv_mips.h
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions clang/test/CodeGen/RISCV/builtins-riscv-mips.c
Original file line number Diff line number Diff line change
@@ -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();
}
1 change: 1 addition & 0 deletions llvm/include/llvm/IR/IntrinsicsRISCV.td
Original file line number Diff line number Diff line change
Expand Up @@ -1949,3 +1949,4 @@ include "llvm/IR/IntrinsicsRISCVXTHead.td"
include "llvm/IR/IntrinsicsRISCVXsf.td"
include "llvm/IR/IntrinsicsRISCVXCV.td"
include "llvm/IR/IntrinsicsRISCVXAndes.td"
include "llvm/IR/IntrinsicsRISCVXMIPS.td"
20 changes: 20 additions & 0 deletions llvm/include/llvm/IR/IntrinsicsRISCVXMIPS.td
Original file line number Diff line number Diff line change
@@ -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]>;
}
2 changes: 1 addition & 1 deletion llvm/lib/Target/RISCV/RISCVFeatures.td
Original file line number Diff line number Diff line change
Expand Up @@ -1426,7 +1426,7 @@ def NoVendorXMIPSCBOP : Predicate<"!Subtarget->hasVendorXMIPSCBOP()">;

def FeatureVendorXMIPSEXECTL : RISCVExtension<1, 0, "MIPS execution control">;
def HasVendorXMIPSEXECTL
: Predicate<"Subtarget->hasVendorXMIPSEXT()">,
: Predicate<"Subtarget->hasVendorXMIPSEXECTL()">,
AssemblerPredicate<(all_of FeatureVendorXMIPSEXECTL),
"'Xmipsexectl' (MIPS execution control)">;

Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfoXMips.td
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,13 @@ let Predicates = [HasVendorXMIPSEXECTL], DecoderNamespace = "XMIPS" in {
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})">,
Expand Down
35 changes: 35 additions & 0 deletions llvm/test/CodeGen/RISCV/xmips-exectl.ll
Original file line number Diff line number Diff line change
@@ -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
}