/* LoongArch definitions.
Copyright (C) 2021-2024 Free Software Foundation, Inc.
Contributed by Loongson Ltd.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
. */
/* Definition of standard codes for:
- base architecture types (isa_base),
- ISA extensions (isa_ext),
- base ABI types (abi_base),
- ABI extension types (abi_ext).
- code models (cmodel)
These values are primarily used for implementing option handling
logic in "loongarch.opt", "loongarch-driver.cc" and "loongarch-opt.cc".
As for the result of this option handling process, the following
scheme is adopted to represent the final configuration:
- The target ABI is encoded with a tuple (abi_base, abi_ext)
using the code defined below.
- The target ISA is encoded with a "struct loongarch_isa" defined
in loongarch-cpu.h.
- The target microarchitecture is represented with a cpu model
index defined in loongarch-cpu.h.
*/
#ifndef LOONGARCH_DEF_H
#define LOONGARCH_DEF_H
#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)
#include
#endif
#include "loongarch-def-array.h"
#include "loongarch-tune.h"
/* ISA base */
enum {
ISA_BASE_LA64 = 0, /* LoongArch64 */
N_ISA_BASE_TYPES = 1
};
extern loongarch_def_array
loongarch_isa_base_strings;
/* ISA extensions */
enum {
ISA_EXT_NONE = 0,
ISA_EXT_FPU32 = 1,
ISA_EXT_FPU64 = 2,
N_ISA_EXT_FPU_TYPES = 3,
ISA_EXT_SIMD_LSX = 3,
ISA_EXT_SIMD_LASX = 4,
N_ISA_EXT_TYPES = 5
};
extern loongarch_def_array
loongarch_isa_ext_strings;
/* Base ABI */
enum {
ABI_BASE_LP64D = 0,
ABI_BASE_LP64F = 1,
ABI_BASE_LP64S = 2,
N_ABI_BASE_TYPES = 3
};
extern loongarch_def_array
loongarch_abi_base_strings;
#define TO_LP64_ABI_BASE(C) (C)
#define ABI_LP64_P(abi_base) \
(abi_base == ABI_BASE_LP64D \
|| abi_base == ABI_BASE_LP64F \
|| abi_base == ABI_BASE_LP64S)
#define ABI_FPU64_P(abi_base) \
(abi_base == ABI_BASE_LP64D)
#define ABI_FPU32_P(abi_base) \
(abi_base == ABI_BASE_LP64F)
#define ABI_NOFPU_P(abi_base) \
(abi_base == ABI_BASE_LP64S)
/* ABI Extension */
enum {
ABI_EXT_BASE = 0,
N_ABI_EXT_TYPES = 1
};
extern loongarch_def_array
loongarch_abi_ext_strings;
/* Code Model */
enum {
CMODEL_NORMAL = 0,
CMODEL_TINY = 1,
CMODEL_TINY_STATIC = 2,
CMODEL_MEDIUM = 3,
CMODEL_LARGE = 4,
CMODEL_EXTREME = 5,
N_CMODEL_TYPES = 6
};
extern loongarch_def_array
loongarch_cmodel_strings;
/* Explicit Reloc Type */
enum {
EXPLICIT_RELOCS_AUTO = 0,
EXPLICIT_RELOCS_NONE = 1,
EXPLICIT_RELOCS_ALWAYS = 2,
N_EXPLICIT_RELOCS_TYPES = 3
};
/* The common default value for variables whose assignments
are triggered by command-line options. */
#define M_OPT_UNSET -1
#define M_OPT_ABSENT(opt_enum) ((opt_enum) == M_OPT_UNSET)
/* Internal representation of the target. */
struct loongarch_isa
{
int base; /* ISA_BASE_ */
int fpu; /* ISA_EXT_FPU_ */
int simd; /* ISA_EXT_SIMD_ */
/* ISA evolution features implied by -march=, for -march=native probed
via CPUCFG. The features implied by base may be not included here.
Using int64_t instead of HOST_WIDE_INT for C compatibility. */
int64_t evolution;
int64_t evolution_set;
loongarch_isa () :
base (0), fpu (0), simd (0), evolution (0), evolution_set (0)
{}
loongarch_isa base_ (int _base) { base = _base; return *this; }
loongarch_isa fpu_ (int _fpu) { fpu = _fpu; return *this; }
loongarch_isa simd_ (int _simd) { simd = _simd; return *this; }
loongarch_isa evolution_ (int64_t _evolution)
{ evolution = _evolution; return *this; }
};
struct loongarch_abi
{
int base; /* ABI_BASE_ */
int ext; /* ABI_EXT_ */
};
struct loongarch_target
{
struct loongarch_isa isa;
struct loongarch_abi abi;
int cpu_arch; /* ARCH_ */
int cpu_tune; /* TUNE_ */
int cmodel; /* CMODEL_ */
int tls_dialect; /* TLS_ */
};
/* ISA target presets (-march=*) */
enum {
ARCH_NATIVE = 0,
ARCH_ABI_DEFAULT = 1,
ARCH_LOONGARCH64 = 2,
ARCH_LA464 = 3,
ARCH_LA664 = 4,
ARCH_LA64V1_0 = 5,
ARCH_LA64V1_1 = 6,
N_ARCH_TYPES = 7,
};
/* Tune target presets (-mtune=*) */
enum {
TUNE_NATIVE = 0,
TUNE_GENERIC = 1,
TUNE_LOONGARCH64 = 2,
TUNE_LA464 = 3,
TUNE_LA664 = 4,
N_TUNE_TYPES = 5,
};
/* TLS types. */
enum {
TLS_TRADITIONAL = 0,
TLS_DESCRIPTORS = 1
};
/* Target preset properties */
extern loongarch_def_array
loongarch_arch_strings;
extern loongarch_def_array
loongarch_tune_strings;
extern loongarch_def_array
loongarch_cpu_default_isa;
extern loongarch_def_array
loongarch_cpu_issue_rate;
extern loongarch_def_array
loongarch_cpu_multipass_dfa_lookahead;
extern loongarch_def_array
loongarch_cpu_cache;
extern loongarch_def_array
loongarch_cpu_align;
extern loongarch_def_array
loongarch_cpu_rtx_cost_data;
extern loongarch_def_array<
loongarch_def_array,
N_ABI_BASE_TYPES> abi_minimal_isa;
#endif /* LOONGARCH_DEF_H */