summaryrefslogtreecommitdiff
path: root/devdocs/gcc~13/loongarch-base-built-in-functions.html
blob: bed8728f659ead57cc6d3ae679e8008492b84db9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<div class="subsection-level-extent" id="LoongArch-Base-Built-in-Functions"> <div class="nav-panel"> <p> Next: <a href="mips-dsp-built-in-functions" accesskey="n" rel="next">MIPS DSP Built-in Functions</a>, Previous: <a href="fr-v-built-in-functions" accesskey="p" rel="prev">FR-V Built-in Functions</a>, Up: <a href="target-builtins" accesskey="u" rel="up">Built-in Functions Specific to Particular Target Machines</a> [<a href="index#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="indices" title="Index" rel="index">Index</a>]</p> </div>  <h1 class="subsection" id="LoongArch-Base-Built-in-Functions-1"><span>6.60.14 LoongArch Base Built-in Functions<a class="copiable-link" href="#LoongArch-Base-Built-in-Functions-1"> ¶</a></span></h1> <p>These built-in functions are available for LoongArch. </p> <p>Data Type Description: </p>
<ul class="itemize mark-bullet"> <li>
<code class="code">imm0_31</code>, a compile-time constant in range 0 to 31; </li>
<li>
<code class="code">imm0_16383</code>, a compile-time constant in range 0 to 16383; </li>
<li>
<code class="code">imm0_32767</code>, a compile-time constant in range 0 to 32767; </li>
<li>
<code class="code">imm_n2048_2047</code>, a compile-time constant in range -2048 to 2047; </li>
</ul> <p>The intrinsics provided are listed below: </p>
<div class="example smallexample"> <pre class="example-preformatted" data-language="cpp">unsigned int __builtin_loongarch_movfcsr2gr (imm0_31)
void __builtin_loongarch_movgr2fcsr (imm0_31, unsigned int)
void __builtin_loongarch_cacop_d (imm0_31, unsigned long int, imm_n2048_2047)
unsigned int __builtin_loongarch_cpucfg (unsigned int)
void __builtin_loongarch_asrtle_d (long int, long int)
void __builtin_loongarch_asrtgt_d (long int, long int)
long int __builtin_loongarch_lddir_d (long int, imm0_31)
void __builtin_loongarch_ldpte_d (long int, imm0_31)

int __builtin_loongarch_crc_w_b_w (char, int)
int __builtin_loongarch_crc_w_h_w (short, int)
int __builtin_loongarch_crc_w_w_w (int, int)
int __builtin_loongarch_crc_w_d_w (long int, int)
int __builtin_loongarch_crcc_w_b_w (char, int)
int __builtin_loongarch_crcc_w_h_w (short, int)
int __builtin_loongarch_crcc_w_w_w (int, int)
int __builtin_loongarch_crcc_w_d_w (long int, int)

unsigned int __builtin_loongarch_csrrd_w (imm0_16383)
unsigned int __builtin_loongarch_csrwr_w (unsigned int, imm0_16383)
unsigned int __builtin_loongarch_csrxchg_w (unsigned int, unsigned int, imm0_16383)
unsigned long int __builtin_loongarch_csrrd_d (imm0_16383)
unsigned long int __builtin_loongarch_csrwr_d (unsigned long int, imm0_16383)
unsigned long int __builtin_loongarch_csrxchg_d (unsigned long int, unsigned long int, imm0_16383)

unsigned char __builtin_loongarch_iocsrrd_b (unsigned int)
unsigned short __builtin_loongarch_iocsrrd_h (unsigned int)
unsigned int __builtin_loongarch_iocsrrd_w (unsigned int)
unsigned long int __builtin_loongarch_iocsrrd_d (unsigned int)
void __builtin_loongarch_iocsrwr_b (unsigned char, unsigned int)
void __builtin_loongarch_iocsrwr_h (unsigned short, unsigned int)
void __builtin_loongarch_iocsrwr_w (unsigned int, unsigned int)
void __builtin_loongarch_iocsrwr_d (unsigned long int, unsigned int)

void __builtin_loongarch_dbar (imm0_32767)
void __builtin_loongarch_ibar (imm0_32767)

void __builtin_loongarch_syscall (imm0_32767)
void __builtin_loongarch_break (imm0_32767)</pre>
</div> <p><em class="emph">Note:</em>Since the control register is divided into 32-bit and 64-bit, but the access instruction is not distinguished. So GCC renames the control instructions when implementing intrinsics. </p> <p>Take the csrrd instruction as an example, built-in functions are implemented as follows: </p>
<div class="example smallexample"> <pre class="example-preformatted" data-language="cpp">__builtin_loongarch_csrrd_w  // When reading the 32-bit control register use.
__builtin_loongarch_csrrd_d  // When reading the 64-bit control register use.</pre>
</div> <p>For the convenience of use, the built-in functions are encapsulated, the encapsulated functions and <code class="code">__drdtime_t, __rdtime_t</code> are defined in the <code class="code">larchintrin.h</code>. So if you call the following function you need to include <code class="code">larchintrin.h</code>. </p> <div class="example smallexample"> <pre class="example-preformatted" data-language="cpp">typedef struct drdtime{
       unsigned long dvalue;
       unsigned long dtimeid;
} __drdtime_t;

typedef struct rdtime{
       unsigned int value;
       unsigned int timeid;
} __rdtime_t;</pre>
</div> <div class="example smallexample"> <pre class="example-preformatted" data-language="cpp">__drdtime_t __rdtime_d (void)
__rdtime_t  __rdtimel_w (void)
__rdtime_t  __rdtimeh_w (void)
unsigned int  __movfcsr2gr (imm0_31)
void __movgr2fcsr (imm0_31, unsigned int)
void __cacop_d (imm0_31, unsigned long, imm_n2048_2047)
unsigned int  __cpucfg (unsigned int)
void __asrtle_d (long int, long int)
void __asrtgt_d (long int, long int)
long int  __lddir_d (long int, imm0_31)
void __ldpte_d (long int, imm0_31)

int  __crc_w_b_w (char, int)
int  __crc_w_h_w (short, int)
int  __crc_w_w_w (int, int)
int  __crc_w_d_w (long int, int)
int  __crcc_w_b_w (char, int)
int  __crcc_w_h_w (short, int)
int  __crcc_w_w_w (int, int)
int  __crcc_w_d_w (long int, int)

unsigned int  __csrrd_w (imm0_16383)
unsigned int  __csrwr_w (unsigned int, imm0_16383)
unsigned int  __csrxchg_w (unsigned int, unsigned int, imm0_16383)
unsigned long  __csrrd_d (imm0_16383)
unsigned long  __csrwr_d (unsigned long, imm0_16383)
unsigned long  __csrxchg_d (unsigned long, unsigned long, imm0_16383)

unsigned char   __iocsrrd_b (unsigned int)
unsigned short  __iocsrrd_h (unsigned int)
unsigned int  __iocsrrd_w (unsigned int)
unsigned long  __iocsrrd_d (unsigned int)
void __iocsrwr_b (unsigned char, unsigned int)
void __iocsrwr_h (unsigned short, unsigned int)
void __iocsrwr_w (unsigned int, unsigned int)
void __iocsrwr_d (unsigned long, unsigned int)

void __dbar (imm0_32767)
void __ibar (imm0_32767)

void __syscall (imm0_32767)
void __break (imm0_32767)</pre>
</div> </div>  <div class="nav-panel"> <p> Next: <a href="mips-dsp-built-in-functions">MIPS DSP Built-in Functions</a>, Previous: <a href="fr-v-built-in-functions">FR-V Built-in Functions</a>, Up: <a href="target-builtins">Built-in Functions Specific to Particular Target Machines</a> [<a href="index#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="indices" title="Index" rel="index">Index</a>]</p> </div><div class="_attribution">
  <p class="_attribution-p">
    &copy; Free Software Foundation<br>Licensed under the GNU Free Documentation License, Version 1.3.<br>
    <a href="https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc/LoongArch-Base-Built-in-Functions.html" class="_attribution-link">https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc/LoongArch-Base-Built-in-Functions.html</a>
  </p>
</div>