Skip to content

Commit 7aa6b52

Browse files
andreisfrantmak
authored andcommitted
[Xtensa] Implemented builtins for Xtensa MAC16 instructions.
1 parent 55a9b82 commit 7aa6b52

File tree

16 files changed

+1480
-33
lines changed

16 files changed

+1480
-33
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
//===-- BuiltinsXtensa.def - Xtensa Builtin function database ----*- C++ -*-==//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file defines the Xtensa-specific builtin function database. Users of
10+
// this file must define the BUILTIN macro to make use of this information.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
// The format of this database matches clang/Basic/Builtins.def.
15+
16+
BUILTIN(__builtin_xtensa_umul_aa_ll, "vUiUi", "n")
17+
BUILTIN(__builtin_xtensa_umul_aa_lh, "vUiUi", "n")
18+
BUILTIN(__builtin_xtensa_umul_aa_hl, "vUiUi", "n")
19+
BUILTIN(__builtin_xtensa_umul_aa_hh, "vUiUi", "n")
20+
21+
BUILTIN(__builtin_xtensa_mul_aa_ll, "vUiUi", "n")
22+
BUILTIN(__builtin_xtensa_mul_aa_lh, "vUiUi", "n")
23+
BUILTIN(__builtin_xtensa_mul_aa_hl, "vUiUi", "n")
24+
BUILTIN(__builtin_xtensa_mul_aa_hh, "vUiUi", "n")
25+
26+
BUILTIN(__builtin_xtensa_mul_ad_ll, "vUiIUi", "n")
27+
BUILTIN(__builtin_xtensa_mul_ad_lh, "vUiIUi", "n")
28+
BUILTIN(__builtin_xtensa_mul_ad_hl, "vUiIUi", "n")
29+
BUILTIN(__builtin_xtensa_mul_ad_hh, "vUiIUi", "n")
30+
31+
BUILTIN(__builtin_xtensa_mul_da_ll, "vIUiUi", "n")
32+
BUILTIN(__builtin_xtensa_mul_da_lh, "vIUiUi", "n")
33+
BUILTIN(__builtin_xtensa_mul_da_hl, "vIUiUi", "n")
34+
BUILTIN(__builtin_xtensa_mul_da_hh, "vIUiUi", "n")
35+
36+
BUILTIN(__builtin_xtensa_mul_dd_ll, "vIUiIUi", "n")
37+
BUILTIN(__builtin_xtensa_mul_dd_lh, "vIUiIUi", "n")
38+
BUILTIN(__builtin_xtensa_mul_dd_hl, "vIUiIUi", "n")
39+
BUILTIN(__builtin_xtensa_mul_dd_hh, "vIUiIUi", "n")
40+
41+
BUILTIN(__builtin_xtensa_mula_aa_ll, "vUiUi", "n")
42+
BUILTIN(__builtin_xtensa_mula_aa_lh, "vUiUi", "n")
43+
BUILTIN(__builtin_xtensa_mula_aa_hl, "vUiUi", "n")
44+
BUILTIN(__builtin_xtensa_mula_aa_hh, "vUiUi", "n")
45+
46+
BUILTIN(__builtin_xtensa_mula_ad_ll, "vUiIUi", "n")
47+
BUILTIN(__builtin_xtensa_mula_ad_lh, "vUiIUi", "n")
48+
BUILTIN(__builtin_xtensa_mula_ad_hl, "vUiIUi", "n")
49+
BUILTIN(__builtin_xtensa_mula_ad_hh, "vUiIUi", "n")
50+
51+
BUILTIN(__builtin_xtensa_mula_da_ll, "vIUiUi", "n")
52+
BUILTIN(__builtin_xtensa_mula_da_lh, "vIUiUi", "n")
53+
BUILTIN(__builtin_xtensa_mula_da_hl, "vIUiUi", "n")
54+
BUILTIN(__builtin_xtensa_mula_da_hh, "vIUiUi", "n")
55+
56+
BUILTIN(__builtin_xtensa_mula_dd_ll, "vIUiIUi", "n")
57+
BUILTIN(__builtin_xtensa_mula_dd_lh, "vIUiIUi", "n")
58+
BUILTIN(__builtin_xtensa_mula_dd_hl, "vIUiIUi", "n")
59+
BUILTIN(__builtin_xtensa_mula_dd_hh, "vIUiIUi", "n")
60+
61+
BUILTIN(__builtin_xtensa_muls_aa_ll, "vUiUi", "n")
62+
BUILTIN(__builtin_xtensa_muls_aa_lh, "vUiUi", "n")
63+
BUILTIN(__builtin_xtensa_muls_aa_hl, "vUiUi", "n")
64+
BUILTIN(__builtin_xtensa_muls_aa_hh, "vUiUi", "n")
65+
66+
BUILTIN(__builtin_xtensa_muls_ad_ll, "vUiIUi", "n")
67+
BUILTIN(__builtin_xtensa_muls_ad_lh, "vUiIUi", "n")
68+
BUILTIN(__builtin_xtensa_muls_ad_hl, "vUiIUi", "n")
69+
BUILTIN(__builtin_xtensa_muls_ad_hh, "vUiIUi", "n")
70+
71+
BUILTIN(__builtin_xtensa_muls_da_ll, "vIUiUi", "n")
72+
BUILTIN(__builtin_xtensa_muls_da_lh, "vIUiUi", "n")
73+
BUILTIN(__builtin_xtensa_muls_da_hl, "vIUiUi", "n")
74+
BUILTIN(__builtin_xtensa_muls_da_hh, "vIUiUi", "n")
75+
76+
BUILTIN(__builtin_xtensa_muls_dd_ll, "vIUiIUi", "n")
77+
BUILTIN(__builtin_xtensa_muls_dd_lh, "vIUiIUi", "n")
78+
BUILTIN(__builtin_xtensa_muls_dd_hl, "vIUiIUi", "n")
79+
BUILTIN(__builtin_xtensa_muls_dd_hh, "vIUiIUi", "n")
80+
81+
BUILTIN(__builtin_xtensa_mula_da_ll_lddec, "vIUii**IUii", "n")
82+
BUILTIN(__builtin_xtensa_mula_da_lh_lddec, "vIUii**IUii", "n")
83+
BUILTIN(__builtin_xtensa_mula_da_hl_lddec, "vIUii**IUii", "n")
84+
BUILTIN(__builtin_xtensa_mula_da_hh_lddec, "vIUii**IUii", "n")
85+
86+
BUILTIN(__builtin_xtensa_mula_da_ll_ldinc, "vIUii**IUii", "n")
87+
BUILTIN(__builtin_xtensa_mula_da_lh_ldinc, "vIUii**IUii", "n")
88+
BUILTIN(__builtin_xtensa_mula_da_hl_ldinc, "vIUii**IUii", "n")
89+
BUILTIN(__builtin_xtensa_mula_da_hh_ldinc, "vIUii**IUii", "n")
90+
91+
BUILTIN(__builtin_xtensa_mula_dd_ll_lddec, "vIUii**IUiIUi", "n")
92+
BUILTIN(__builtin_xtensa_mula_dd_lh_lddec, "vIUii**IUiIUi", "n")
93+
BUILTIN(__builtin_xtensa_mula_dd_hl_lddec, "vIUii**IUiIUi", "n")
94+
BUILTIN(__builtin_xtensa_mula_dd_hh_lddec, "vIUii**IUiIUi", "n")
95+
96+
BUILTIN(__builtin_xtensa_mula_dd_ll_ldinc, "vIUii**IUiIUi", "n")
97+
BUILTIN(__builtin_xtensa_mula_dd_lh_ldinc, "vIUii**IUiIUi", "n")
98+
BUILTIN(__builtin_xtensa_mula_dd_hl_ldinc, "vIUii**IUiIUi", "n")
99+
BUILTIN(__builtin_xtensa_mula_dd_hh_ldinc, "vIUii**IUiIUi", "n")
100+
101+
// Load operations
102+
103+
BUILTIN(__builtin_xtensa_ldinc, "vIUii**", "n")
104+
BUILTIN(__builtin_xtensa_lddec, "vIUii**", "n")
105+
106+
// WSR/RSR/XSR
107+
108+
BUILTIN(__builtin_xtensa_wsr_acclo, "vUi", "n")
109+
BUILTIN(__builtin_xtensa_rsr_acclo, "Ui", "n")
110+
BUILTIN(__builtin_xtensa_xsr_acclo, "vUi*", "n")
111+
BUILTIN(__builtin_xtensa_wsr_acchi, "vUi", "n")
112+
BUILTIN(__builtin_xtensa_rsr_acchi, "Ui", "n")
113+
BUILTIN(__builtin_xtensa_xsr_acchi, "vUi*", "n")
114+
BUILTIN(__builtin_xtensa_wsr_m0, "vUi", "n")
115+
BUILTIN(__builtin_xtensa_rsr_m0, "Ui", "n")
116+
BUILTIN(__builtin_xtensa_xsr_m0, "vUi*", "n")
117+
BUILTIN(__builtin_xtensa_wsr_m1, "vUi", "n")
118+
BUILTIN(__builtin_xtensa_rsr_m1, "Ui", "n")
119+
BUILTIN(__builtin_xtensa_xsr_m1, "vUi*", "n")
120+
BUILTIN(__builtin_xtensa_wsr_m2, "vUi", "n")
121+
BUILTIN(__builtin_xtensa_rsr_m2, "Ui", "n")
122+
BUILTIN(__builtin_xtensa_xsr_m2, "vUi*", "n")
123+
BUILTIN(__builtin_xtensa_wsr_m3, "vUi", "n")
124+
BUILTIN(__builtin_xtensa_rsr_m3, "Ui", "n")
125+
BUILTIN(__builtin_xtensa_xsr_m3, "vUi*", "n")
126+
127+
#undef BUILTIN

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,15 @@ namespace clang {
209209
};
210210
}
211211

212+
/// Xtensa builtins
213+
namespace Xtensa {
214+
enum {
215+
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
216+
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
217+
#include "clang/Basic/BuiltinsXtensa.def"
218+
LastTSBuiltin
219+
};
220+
} // namespace Xtensa
212221
} // end namespace clang.
213222

214223
#endif

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11717,6 +11717,7 @@ class Sema final {
1171711717
bool CheckX86BuiltinGatherScatterScale(unsigned BuiltinID, CallExpr *TheCall);
1171811718
bool CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
1171911719
bool CheckPPCBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
11720+
bool CheckXtensaBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
1172011721

1172111722
bool SemaBuiltinVAStart(unsigned BuiltinID, CallExpr *TheCall);
1172211723
bool SemaBuiltinVAStartARMMicrosoft(CallExpr *Call);

clang/lib/Basic/Targets/Xtensa.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,21 @@
2020
using namespace clang;
2121
using namespace clang::targets;
2222

23+
const Builtin::Info XtensaTargetInfo::BuiltinInfo[] = {
24+
#define BUILTIN(ID, TYPE, ATTRS) \
25+
{#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
26+
#include "clang/Basic/BuiltinsXtensa.def"
27+
};
28+
2329
void XtensaTargetInfo::getTargetDefines(const LangOptions &Opts,
2430
MacroBuilder &Builder) const {
2531
Builder.defineMacro("__Xtensa__");
2632
Builder.defineMacro("__xtensa__");
2733
Builder.defineMacro("__XTENSA__");
2834
Builder.defineMacro("__XTENSA_EL__");
2935
}
36+
37+
ArrayRef<Builtin::Info> XtensaTargetInfo::getTargetBuiltins() const {
38+
return llvm::makeArrayRef(BuiltinInfo, clang::Xtensa::LastTSBuiltin -
39+
Builtin::FirstTSBuiltin);
40+
}

clang/lib/Basic/Targets/Xtensa.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class LLVM_LIBRARY_VISIBILITY XtensaTargetInfo : public TargetInfo {
5353
void getTargetDefines(const LangOptions &Opts,
5454
MacroBuilder &Builder) const override;
5555

56-
ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
56+
ArrayRef<Builtin::Info> getTargetBuiltins() const override;
5757

5858
BuiltinVaListKind getBuiltinVaListKind() const override {
5959

clang/lib/Sema/SemaChecking.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1662,6 +1662,10 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
16621662
if (CheckPPCBuiltinFunctionCall(BuiltinID, TheCall))
16631663
return ExprError();
16641664
break;
1665+
case llvm::Triple::xtensa:
1666+
if (CheckXtensaBuiltinFunctionCall(BuiltinID, TheCall))
1667+
return ExprError();
1668+
break;
16651669
default:
16661670
break;
16671671
}
@@ -3483,6 +3487,83 @@ bool Sema::CheckSystemZBuiltinFunctionCall(unsigned BuiltinID,
34833487
return SemaBuiltinConstantArgRange(TheCall, i, l, u);
34843488
}
34853489

3490+
bool Sema::CheckXtensaBuiltinFunctionCall(unsigned BuiltinID,
3491+
CallExpr *TheCall) {
3492+
unsigned i = 0, l = 0, u = 0;
3493+
switch (BuiltinID) {
3494+
default:
3495+
return false;
3496+
case Xtensa::BI__builtin_xtensa_mul_ad_ll:
3497+
case Xtensa::BI__builtin_xtensa_mul_ad_lh:
3498+
case Xtensa::BI__builtin_xtensa_mul_ad_hl:
3499+
case Xtensa::BI__builtin_xtensa_mul_ad_hh:
3500+
case Xtensa::BI__builtin_xtensa_mula_ad_ll:
3501+
case Xtensa::BI__builtin_xtensa_mula_ad_lh:
3502+
case Xtensa::BI__builtin_xtensa_mula_ad_hl:
3503+
case Xtensa::BI__builtin_xtensa_mula_ad_hh:
3504+
case Xtensa::BI__builtin_xtensa_muls_ad_ll:
3505+
case Xtensa::BI__builtin_xtensa_muls_ad_lh:
3506+
case Xtensa::BI__builtin_xtensa_muls_ad_hl:
3507+
case Xtensa::BI__builtin_xtensa_muls_ad_hh:
3508+
i = 1;
3509+
l = 2;
3510+
u = 3;
3511+
break;
3512+
case Xtensa::BI__builtin_xtensa_mul_da_ll:
3513+
case Xtensa::BI__builtin_xtensa_mul_da_lh:
3514+
case Xtensa::BI__builtin_xtensa_mul_da_hl:
3515+
case Xtensa::BI__builtin_xtensa_mul_da_hh:
3516+
case Xtensa::BI__builtin_xtensa_mula_da_ll:
3517+
case Xtensa::BI__builtin_xtensa_mula_da_lh:
3518+
case Xtensa::BI__builtin_xtensa_mula_da_hl:
3519+
case Xtensa::BI__builtin_xtensa_mula_da_hh:
3520+
case Xtensa::BI__builtin_xtensa_muls_da_ll:
3521+
case Xtensa::BI__builtin_xtensa_muls_da_lh:
3522+
case Xtensa::BI__builtin_xtensa_muls_da_hl:
3523+
case Xtensa::BI__builtin_xtensa_muls_da_hh:
3524+
i = 0;
3525+
l = 0;
3526+
u = 1;
3527+
break;
3528+
case Xtensa::BI__builtin_xtensa_mul_dd_ll:
3529+
case Xtensa::BI__builtin_xtensa_mul_dd_lh:
3530+
case Xtensa::BI__builtin_xtensa_mul_dd_hl:
3531+
case Xtensa::BI__builtin_xtensa_mul_dd_hh:
3532+
case Xtensa::BI__builtin_xtensa_mula_dd_ll:
3533+
case Xtensa::BI__builtin_xtensa_mula_dd_lh:
3534+
case Xtensa::BI__builtin_xtensa_mula_dd_hl:
3535+
case Xtensa::BI__builtin_xtensa_mula_dd_hh:
3536+
case Xtensa::BI__builtin_xtensa_muls_dd_ll:
3537+
case Xtensa::BI__builtin_xtensa_muls_dd_lh:
3538+
case Xtensa::BI__builtin_xtensa_muls_dd_hl:
3539+
case Xtensa::BI__builtin_xtensa_muls_dd_hh:
3540+
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 1) ||
3541+
SemaBuiltinConstantArgRange(TheCall, 1, 2, 3);
3542+
case Xtensa::BI__builtin_xtensa_mula_da_ll_lddec:
3543+
case Xtensa::BI__builtin_xtensa_mula_da_lh_lddec:
3544+
case Xtensa::BI__builtin_xtensa_mula_da_hl_lddec:
3545+
case Xtensa::BI__builtin_xtensa_mula_da_hh_lddec:
3546+
case Xtensa::BI__builtin_xtensa_mula_da_ll_ldinc:
3547+
case Xtensa::BI__builtin_xtensa_mula_da_lh_ldinc:
3548+
case Xtensa::BI__builtin_xtensa_mula_da_hl_ldinc:
3549+
case Xtensa::BI__builtin_xtensa_mula_da_hh_ldinc:
3550+
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 3) ||
3551+
SemaBuiltinConstantArgRange(TheCall, 2, 0, 1);
3552+
case Xtensa::BI__builtin_xtensa_mula_dd_ll_lddec:
3553+
case Xtensa::BI__builtin_xtensa_mula_dd_lh_lddec:
3554+
case Xtensa::BI__builtin_xtensa_mula_dd_hl_lddec:
3555+
case Xtensa::BI__builtin_xtensa_mula_dd_hh_lddec:
3556+
case Xtensa::BI__builtin_xtensa_mula_dd_ll_ldinc:
3557+
case Xtensa::BI__builtin_xtensa_mula_dd_lh_ldinc:
3558+
case Xtensa::BI__builtin_xtensa_mula_dd_hl_ldinc:
3559+
case Xtensa::BI__builtin_xtensa_mula_dd_hh_ldinc:
3560+
return SemaBuiltinConstantArgRange(TheCall, 0, 0, 3) ||
3561+
SemaBuiltinConstantArgRange(TheCall, 2, 0, 1) ||
3562+
SemaBuiltinConstantArgRange(TheCall, 3, 2, 3);
3563+
}
3564+
return SemaBuiltinConstantArgRange(TheCall, i, l, u);
3565+
}
3566+
34863567
/// SemaBuiltinCpuSupports - Handle __builtin_cpu_supports(char *).
34873568
/// This checks that the target supports __builtin_cpu_supports and
34883569
/// that the string argument is constant and valid.

llvm/include/llvm/IR/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ tablegen(LLVM IntrinsicsS390.h -gen-intrinsic-enums -intrinsic-prefix=s390)
1818
tablegen(LLVM IntrinsicsWebAssembly.h -gen-intrinsic-enums -intrinsic-prefix=wasm)
1919
tablegen(LLVM IntrinsicsX86.h -gen-intrinsic-enums -intrinsic-prefix=x86)
2020
tablegen(LLVM IntrinsicsXCore.h -gen-intrinsic-enums -intrinsic-prefix=xcore)
21+
tablegen(LLVM IntrinsicsXtensa.h -gen-intrinsic-enums -intrinsic-prefix=xtensa)
2122
add_public_tablegen_target(intrinsics_gen)

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,3 +1358,4 @@ include "llvm/IR/IntrinsicsBPF.td"
13581358
include "llvm/IR/IntrinsicsSystemZ.td"
13591359
include "llvm/IR/IntrinsicsWebAssembly.td"
13601360
include "llvm/IR/IntrinsicsRISCV.td"
1361+
include "llvm/IR/IntrinsicsXtensa.td"

0 commit comments

Comments
 (0)