Home | History | Annotate | Line # | Download | only in config
tc-loongarch.c revision 1.1.1.2
      1 /* tc-loongarch.c -- Assemble for the LoongArch ISA
      2 
      3    Copyright (C) 2021-2024 Free Software Foundation, Inc.
      4    Contributed by Loongson Ltd.
      5 
      6    This file is part of GAS.
      7 
      8    GAS is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the license, or
     11    (at your option) any later version.
     12 
     13    GAS is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program; see the file COPYING3.  If not,
     20    see <http://www.gnu.org/licenses/>.  */
     21 
     22 #include "as.h"
     23 #include "subsegs.h"
     24 #include "dw2gencfi.h"
     25 #include "loongarch-lex.h"
     26 #include "elf/loongarch.h"
     27 #include "opcode/loongarch.h"
     28 #include "obj-elf.h"
     29 #include "bfd/elfxx-loongarch.h"
     30 #include <stdlib.h>
     31 #include <string.h>
     32 #include <stdio.h>
     33 #include <assert.h>
     34 
     35 /* All information about an instruction during assemble.  */
     36 struct loongarch_cl_insn
     37 {
     38   /* First split string.  */
     39   const char *name;
     40   const char *arg_strs[MAX_ARG_NUM_PLUS_2];
     41   size_t arg_num;
     42 
     43   /* Second analyze name_str and each actual args string to match the insn
     44      in 'loongarch-opc.c'. And actual args may need be relocated.
     45      We get length of insn.  If 'insn_length == 0 && insn_mo->macro != NULL',
     46      it's a macro insntruction and we call 'md_assemble' recursively
     47      after expanding it.  */
     48   int match_now;
     49   int all_match;
     50 
     51   const struct loongarch_opcode *insn;
     52   size_t insn_length;
     53 
     54   offsetT args[MAX_ARG_NUM_PLUS_2];
     55   struct reloc_info reloc_info[MAX_RELOC_NUMBER_A_INSN];
     56   size_t reloc_num;
     57 
     58   /* For relax reserved.  We not support relax now.
     59      'insn_length < relax_max_length' means need to relax.
     60      And 'insn_length == relax_max_length' means no need to relax.  */
     61   size_t relax_max_length;
     62   relax_substateT subtype;
     63 
     64   /* Then we get the binary representation of insn
     65      and write it in to section.  */
     66   insn_t insn_bin;
     67 
     68   /* The frag that contains the instruction.  */
     69   struct frag *frag;
     70   /* The offset into FRAG of the first instruction byte.  */
     71   long where;
     72   /* The relocs associated with the instruction, if any.  */
     73   fixS *fixp[MAX_RELOC_NUMBER_A_INSN];
     74   /* Represents macros or instructions expanded from macro.
     75      For la.local -> la.pcrel or la.pcrel -> pcalau12i + addi.d, la.pcrel,
     76      pcalau12i and addi.d are expanded from macro.
     77      The first bit represents expanded from one register macro (e.g.
     78      la.local $t0, symbol) and emit R_LARCH_RELAX relocations.
     79      The second bit represents expanded from two registers macro (e.g.
     80      la.local $t0, $t1, symbol) and not emit R_LARCH_RELAX relocations.
     81 
     82      The macros or instructions expanded from macros do not output register
     83      deprecated warning.  */
     84   unsigned int expand_from_macro;
     85 };
     86 
     87 #ifndef DEFAULT_ARCH
     88 #define DEFAULT_ARCH "loongarch64"
     89 #endif
     90 
     91 /* This array holds the chars that always start a comment.  If the
     92    pre-processor is disabled, these aren't very useful.  */
     93 const char comment_chars[] = "#";
     94 
     95 /* This array holds the chars that only start a comment at the beginning of
     96    a line.  If the line seems to have the form '# 123 filename'
     97    .line and .file directives will appear in the pre-processed output.  */
     98 /* Note that input_file.c hand checks for '#' at the beginning of the
     99    first line of the input file.  This is because the compiler outputs
    100    #NO_APP at the beginning of its output.  */
    101 /* Also note that C style comments are always supported.  */
    102 const char line_comment_chars[] = "#";
    103 
    104 /* This array holds machine specific line separator characters.  */
    105 const char line_separator_chars[] = ";";
    106 
    107 /* Chars that can be used to separate mant from exp in floating point nums.  */
    108 const char EXP_CHARS[] = "eE";
    109 
    110 /* Chars that mean this number is a floating point constant.  */
    111 /* As in 0f12.456.  */
    112 /* or    0d1.2345e12.  */
    113 const char FLT_CHARS[] = "rRsSfFdDxXpP";
    114 
    115 const char *md_shortopts = "O::g::G:";
    116 
    117 static const char default_arch[] = DEFAULT_ARCH;
    118 
    119 /* The lowest 4-bit is the bytes of instructions.  */
    120 #define RELAX_BRANCH_16 0xc0000014
    121 #define RELAX_BRANCH_21 0xc0000024
    122 #define RELAX_BRANCH_26 0xc0000048
    123 
    124 #define RELAX_BRANCH(x) \
    125   (((x) & 0xf0000000) == 0xc0000000)
    126 #define RELAX_BRANCH_ENCODE(x) \
    127   (BFD_RELOC_LARCH_B16 == (x) ? RELAX_BRANCH_16 : RELAX_BRANCH_21)
    128 
    129 enum options
    130 {
    131   OPTION_IGNORE = OPTION_MD_BASE,
    132 
    133   OPTION_ABI,
    134   OPTION_FLOAT_ABI,
    135 
    136   OPTION_FLOAT_ISA,
    137 
    138   OPTION_LA_LOCAL_WITH_ABS,
    139   OPTION_LA_GLOBAL_WITH_PCREL,
    140   OPTION_LA_GLOBAL_WITH_ABS,
    141   OPTION_RELAX,
    142   OPTION_NO_RELAX,
    143   OPTION_THIN_ADD_SUB,
    144 
    145   OPTION_END_OF_ENUM,
    146 };
    147 
    148 struct option md_longopts[] =
    149 {
    150   { "mabi", required_argument, NULL, OPTION_ABI },
    151 
    152   { "mfpu", required_argument, NULL, OPTION_FLOAT_ISA },
    153 
    154   { "mla-local-with-abs", no_argument, NULL, OPTION_LA_LOCAL_WITH_ABS },
    155   { "mla-global-with-pcrel", no_argument, NULL, OPTION_LA_GLOBAL_WITH_PCREL },
    156   { "mla-global-with-abs", no_argument, NULL, OPTION_LA_GLOBAL_WITH_ABS },
    157 
    158   { "mrelax", no_argument, NULL, OPTION_RELAX },
    159   { "mno-relax", no_argument, NULL, OPTION_NO_RELAX },
    160   { "mthin-add-sub", no_argument, NULL, OPTION_THIN_ADD_SUB},
    161 
    162   { NULL, no_argument, NULL, 0 }
    163 };
    164 
    165 size_t md_longopts_size = sizeof (md_longopts);
    166 
    167 int
    168 md_parse_option (int c, const char *arg)
    169 {
    170   int ret = 1;
    171   char lp64[256] = "";
    172   char ilp32[256] = "";
    173   unsigned char *suf = (unsigned char *)arg;
    174 
    175   lp64['s'] = lp64['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
    176   lp64['f'] = lp64['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
    177   lp64['d'] = lp64['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
    178 
    179   ilp32['s'] = ilp32['S'] = EF_LOONGARCH_ABI_SOFT_FLOAT;
    180   ilp32['f'] = ilp32['F'] = EF_LOONGARCH_ABI_SINGLE_FLOAT;
    181   ilp32['d'] = ilp32['D'] = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
    182 
    183   switch (c)
    184     {
    185     case OPTION_ABI:
    186       if (strncasecmp (arg, "lp64", 4) == 0 && lp64[suf[4]] != 0)
    187 	{
    188 	  LARCH_opts.ase_ilp32 = 1;
    189 	  LARCH_opts.ase_lp64 = 1;
    190 	  LARCH_opts.ase_lsx = 1;
    191 	  LARCH_opts.ase_lasx = 1;
    192 	  LARCH_opts.ase_lvz = 1;
    193 	  LARCH_opts.ase_lbt = 1;
    194 	  LARCH_opts.ase_abi = lp64[suf[4]];
    195 	}
    196       else if (strncasecmp (arg, "ilp32", 5) == 0 && ilp32[suf[5]] != 0)
    197 	{
    198 	  LARCH_opts.ase_abi = ilp32[suf[5]];
    199 	  LARCH_opts.ase_ilp32 = 1;
    200 	}
    201       else
    202 	ret = 0;
    203       break;
    204 
    205     case OPTION_FLOAT_ISA:
    206       if (strcasecmp (arg, "soft") == 0)
    207 	LARCH_opts.ase_nf = 1;
    208       else if (strcasecmp (arg, "single") == 0)
    209 	LARCH_opts.ase_sf = 1;
    210       else if (strcasecmp (arg, "double") == 0)
    211 	{
    212 	  LARCH_opts.ase_sf = 1;
    213 	  LARCH_opts.ase_df = 1;
    214 	}
    215       else
    216 	ret = 0;
    217       break;
    218 
    219     case OPTION_LA_LOCAL_WITH_ABS:
    220       LARCH_opts.ase_labs = 1;
    221       break;
    222 
    223     case OPTION_LA_GLOBAL_WITH_PCREL:
    224       LARCH_opts.ase_gpcr = 1;
    225       break;
    226 
    227     case OPTION_LA_GLOBAL_WITH_ABS:
    228       LARCH_opts.ase_gabs = 1;
    229       break;
    230 
    231     case OPTION_RELAX:
    232       LARCH_opts.relax = 1;
    233       break;
    234 
    235     case OPTION_NO_RELAX:
    236       LARCH_opts.relax = 0;
    237       break;
    238 
    239     case OPTION_THIN_ADD_SUB:
    240       LARCH_opts.thin_add_sub = 1;
    241       break;
    242 
    243     case OPTION_IGNORE:
    244       break;
    245 
    246     default:
    247       ret = 0;
    248       break;
    249     }
    250   return ret;
    251 }
    252 
    253 static const char *const *r_abi_names = NULL;
    254 static const char *const *f_abi_names = NULL;
    255 static struct htab *r_htab = NULL;
    256 static struct htab *r_deprecated_htab = NULL;
    257 static struct htab *f_htab = NULL;
    258 static struct htab *f_deprecated_htab = NULL;
    259 static struct htab *fc_htab = NULL;
    260 static struct htab *fcn_htab = NULL;
    261 static struct htab *c_htab = NULL;
    262 static struct htab *cr_htab = NULL;
    263 static struct htab *v_htab = NULL;
    264 static struct htab *x_htab = NULL;
    265 
    266 void
    267 loongarch_after_parse_args ()
    268 {
    269   /* Set default ABI/ISA LP64D.  */
    270   if (!LARCH_opts.ase_ilp32)
    271     {
    272       if (strcmp (default_arch, "loongarch64") == 0)
    273 	{
    274 	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
    275 	  LARCH_opts.ase_ilp32 = 1;
    276 	  LARCH_opts.ase_lp64 = 1;
    277 	  LARCH_opts.ase_lsx = 1;
    278 	  LARCH_opts.ase_lasx = 1;
    279 	  LARCH_opts.ase_lvz = 1;
    280 	  LARCH_opts.ase_lbt = 1;
    281 	}
    282       else if (strcmp (default_arch, "loongarch32") == 0)
    283 	{
    284 	  LARCH_opts.ase_abi = EF_LOONGARCH_ABI_DOUBLE_FLOAT;
    285 	  LARCH_opts.ase_ilp32 = 1;
    286 	}
    287       else
    288 	as_bad ("unknown default architecture `%s'", default_arch);
    289     }
    290 
    291   LARCH_opts.ase_abi |= EF_LOONGARCH_OBJABI_V1;
    292   /* Set default ISA double-float.  */
    293   if (!LARCH_opts.ase_nf
    294       && !LARCH_opts.ase_sf
    295       && !LARCH_opts.ase_df)
    296     {
    297       LARCH_opts.ase_sf = 1;
    298       LARCH_opts.ase_df = 1;
    299     }
    300 
    301   size_t i;
    302 
    303   assert(LARCH_opts.ase_ilp32);
    304 
    305   /* Init ilp32/lp64 registers names.  */
    306   if (!r_htab)
    307     r_htab = str_htab_create (), str_hash_insert (r_htab, "", 0, 0);
    308   if (!r_deprecated_htab)
    309     r_deprecated_htab = str_htab_create (),
    310 			str_hash_insert (r_deprecated_htab, "", 0, 0);
    311 
    312   r_abi_names = loongarch_r_normal_name;
    313   for (i = 0; i < ARRAY_SIZE (loongarch_r_normal_name); i++)
    314     str_hash_insert (r_htab, loongarch_r_normal_name[i], (void *) (i + 1), 0);
    315 
    316   /* Init ilp32/lp64 registers alias.  */
    317   r_abi_names = loongarch_r_alias;
    318   for (i = 0; i < ARRAY_SIZE (loongarch_r_alias); i++)
    319     str_hash_insert (r_htab, loongarch_r_alias[i], (void *) (i + 1), 0);
    320 
    321   for (i = 0; i < ARRAY_SIZE (loongarch_r_alias_1); i++)
    322     str_hash_insert (r_htab, loongarch_r_alias_1[i], (void *) (i + 1), 0);
    323 
    324   for (i = 0; i < ARRAY_SIZE (loongarch_r_alias_deprecated); i++)
    325     str_hash_insert (r_deprecated_htab, loongarch_r_alias_deprecated[i],
    326 	(void *) (i + 1), 0);
    327 
    328   if (!cr_htab)
    329     cr_htab = str_htab_create (), str_hash_insert (cr_htab, "", 0, 0);
    330 
    331   for (i = 0; i < ARRAY_SIZE (loongarch_cr_normal_name); i++)
    332     str_hash_insert (cr_htab, loongarch_cr_normal_name[i], (void *) (i + 1), 0);
    333 
    334   /* Init single/double float registers names.  */
    335   if (LARCH_opts.ase_sf || LARCH_opts.ase_df)
    336     {
    337       if (!f_htab)
    338 	f_htab = str_htab_create (), str_hash_insert (f_htab, "", 0, 0);
    339       if (!f_deprecated_htab)
    340 	f_deprecated_htab = str_htab_create (),
    341 			    str_hash_insert (f_deprecated_htab, "", 0, 0);
    342 
    343       f_abi_names = loongarch_f_normal_name;
    344       for (i = 0; i < ARRAY_SIZE (loongarch_f_normal_name); i++)
    345 	str_hash_insert (f_htab, loongarch_f_normal_name[i], (void *) (i + 1),
    346 			 0);
    347 
    348       /* Init float-ilp32/lp64 registers alias.  */
    349       f_abi_names = loongarch_f_alias;
    350       for (i = 0; i < ARRAY_SIZE (loongarch_f_alias); i++)
    351 	str_hash_insert (f_htab, loongarch_f_alias[i],
    352 	    (void *) (i + 1), 0);
    353       for (i = 0; i < ARRAY_SIZE (loongarch_f_alias_deprecated); i++)
    354 	str_hash_insert (f_deprecated_htab, loongarch_f_alias_deprecated[i],
    355 	    (void *) (i + 1), 0);
    356 
    357       if (!fc_htab)
    358 	fc_htab = str_htab_create (), str_hash_insert (fc_htab, "", 0, 0);
    359 
    360       for (i = 0; i < ARRAY_SIZE (loongarch_fc_normal_name); i++)
    361 	str_hash_insert (fc_htab, loongarch_fc_normal_name[i], (void *) (i + 1),
    362 			 0);
    363 
    364       if (!fcn_htab)
    365 	fcn_htab = str_htab_create (), str_hash_insert (fcn_htab, "", 0, 0);
    366 
    367       for (i = 0; i < ARRAY_SIZE (loongarch_fc_numeric_name); i++)
    368 	str_hash_insert (fcn_htab, loongarch_fc_numeric_name[i], (void *) (i + 1),
    369 			 0);
    370 
    371       if (!c_htab)
    372 	c_htab = str_htab_create (), str_hash_insert (c_htab, "", 0, 0);
    373 
    374       for (i = 0; i < ARRAY_SIZE (loongarch_c_normal_name); i++)
    375 	str_hash_insert (c_htab, loongarch_c_normal_name[i], (void *) (i + 1),
    376 			 0);
    377 
    378     }
    379 
    380   /* Init lsx registers names.  */
    381   if (LARCH_opts.ase_lsx)
    382     {
    383       if (!v_htab)
    384 	v_htab = str_htab_create (), str_hash_insert (v_htab, "", 0, 0);
    385       for (i = 0; i < ARRAY_SIZE (loongarch_v_normal_name); i++)
    386 	str_hash_insert (v_htab, loongarch_v_normal_name[i], (void *) (i + 1),
    387 			 0);
    388     }
    389 
    390   /* Init lasx registers names.  */
    391   if (LARCH_opts.ase_lasx)
    392     {
    393       if (!x_htab)
    394 	x_htab = str_htab_create (), str_hash_insert (x_htab, "", 0, 0);
    395       for (i = 0; i < ARRAY_SIZE (loongarch_x_normal_name); i++)
    396 	str_hash_insert (x_htab, loongarch_x_normal_name[i], (void *) (i + 1),
    397 			 0);
    398     }
    399 
    400 }
    401 
    402 const char *
    403 loongarch_target_format ()
    404 {
    405   return LARCH_opts.ase_lp64 ? "elf64-loongarch" : "elf32-loongarch";
    406 }
    407 
    408 void
    409 md_begin ()
    410 {
    411   const struct loongarch_opcode *it;
    412   struct loongarch_ase *ase;
    413   for (ase = loongarch_ASEs; ase->enabled; ase++)
    414     for (it = ase->opcodes; it->name; it++)
    415       {
    416 	if (loongarch_check_format (it->format) != 0)
    417 	  as_fatal (_("insn name: %s\tformat: %s\tsyntax error"),
    418 		    it->name, it->format);
    419 	if (it->mask == 0 && it->macro == 0)
    420 	  as_fatal (_("insn name: %s\nformat: %s\nwe want macro but "
    421 		      "macro is NULL"),
    422 		    it->name, it->format);
    423 	if (it->macro
    424 	    && loongarch_check_macro (it->format, it->macro) != 0)
    425 	  as_fatal (_("insn name: %s\nformat: %s\nmacro: %s\tsyntax error"),
    426 		    it->name, it->format, it->macro);
    427       }
    428 
    429   /* FIXME: expressionS use 'offsetT' as constant,
    430    * we want this is 64-bit type.  */
    431   assert (8 <= sizeof (offsetT));
    432 }
    433 
    434 unsigned long
    435 loongarch_mach (void)
    436 {
    437   return LARCH_opts.ase_lp64 ? bfd_mach_loongarch64 : bfd_mach_loongarch32;
    438 }
    439 
    440 static const expressionS const_0 = { .X_op = O_constant, .X_add_number = 0 };
    441 
    442 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
    443    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
    444    use in DWARF debug information.  */
    445 
    446 static void
    447 s_dtprel (int bytes)
    448 {
    449   expressionS ex;
    450   char *p;
    451 
    452   expression (&ex);
    453 
    454   if (ex.X_op != O_symbol)
    455     {
    456       as_bad (_("Unsupported use of %s"),
    457 	      (bytes == 8 ? ".dtpreldword" : ".dtprelword"));
    458       ignore_rest_of_line ();
    459     }
    460 
    461   p = frag_more (bytes);
    462   md_number_to_chars (p, 0, bytes);
    463   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
    464 	       (bytes == 8
    465 		? BFD_RELOC_LARCH_TLS_DTPREL64
    466 		: BFD_RELOC_LARCH_TLS_DTPREL32));
    467 
    468   demand_empty_rest_of_line ();
    469 }
    470 
    471 static const pseudo_typeS loongarch_pseudo_table[] =
    472 {
    473   { "dword", cons, 8 },
    474   { "word", cons, 4 },
    475   { "half", cons, 2 },
    476   { "dtprelword", s_dtprel, 4 },
    477   { "dtpreldword", s_dtprel, 8 },
    478   { NULL, NULL, 0 },
    479 };
    480 
    481 void
    482 loongarch_pop_insert (void)
    483 {
    484   pop_insert (loongarch_pseudo_table);
    485 }
    486 
    487 #define INTERNAL_LABEL_SPECIAL 10
    488 static unsigned long internal_label_count[INTERNAL_LABEL_SPECIAL] = { 0 };
    489 
    490 static const char *
    491 loongarch_internal_label_name (unsigned long label, int augend)
    492 {
    493   static char symbol_name_build[24];
    494   unsigned long want_label;
    495   char *p;
    496 
    497   want_label = internal_label_count[label] + augend;
    498 
    499   p = symbol_name_build;
    500 #ifdef LOCAL_LABEL_PREFIX
    501   *p++ = LOCAL_LABEL_PREFIX;
    502 #endif
    503   *p++ = 'L';
    504   for (; label; label /= 10)
    505     *p++ = label % 10 + '0';
    506   /* Make sure internal label never belong to normal label namespace.  */
    507   *p++ = ':';
    508   for (; want_label; want_label /= 10)
    509     *p++ = want_label % 10 + '0';
    510   *p++ = '\0';
    511   return symbol_name_build;
    512 }
    513 
    514 static void
    515 setup_internal_label_here (unsigned long label)
    516 {
    517   assert (label < INTERNAL_LABEL_SPECIAL);
    518   internal_label_count[label]++;
    519   colon (loongarch_internal_label_name (label, 0));
    520 }
    521 
    522 void
    523 get_internal_label (expressionS *label_expr, unsigned long label,
    524 		    int augend /* 0 for previous, 1 for next.  */)
    525 {
    526   assert (label < INTERNAL_LABEL_SPECIAL);
    527     as_fatal (_("internal error: we have no internal label yet"));
    528   label_expr->X_op = O_symbol;
    529   label_expr->X_add_symbol =
    530     symbol_find_or_make (loongarch_internal_label_name (label, augend));
    531   label_expr->X_add_number = 0;
    532 }
    533 
    534 static int
    535 is_internal_label (const char *c_str)
    536 {
    537   do
    538     {
    539       if (*c_str != ':')
    540 	break;
    541       c_str++;
    542       if (!('0' <= *c_str && *c_str <= '9'))
    543 	break;
    544       while ('0' <= *c_str && *c_str <= '9')
    545 	c_str++;
    546       if (*c_str != 'b' && *c_str != 'f')
    547 	break;
    548       c_str++;
    549       return *c_str == '\0';
    550     }
    551   while (0);
    552   return 0;
    553 }
    554 
    555 static int
    556 is_label (const char *c_str)
    557 {
    558   if (is_internal_label (c_str))
    559     return 1;
    560   else if ('0' <= *c_str && *c_str <= '9')
    561     {
    562       /* [0-9]+[bf]  */
    563       while ('0' <= *c_str && *c_str <= '9')
    564 	c_str++;
    565       return *c_str == 'b' || *c_str == 'f';
    566     }
    567   else if (is_name_beginner (*c_str))
    568     {
    569       /* [a-zA-Z\._\$][0-9a-zA-Z\._\$]*  */
    570       c_str++;
    571       while (is_part_of_name (*c_str))
    572 	c_str++;
    573       return *c_str == '\0';
    574     }
    575   else
    576     return 0;
    577 }
    578 
    579 static int
    580 is_label_with_addend (const char *c_str)
    581 {
    582   if (is_internal_label (c_str))
    583     return 1;
    584   else if ('0' <= *c_str && *c_str <= '9')
    585     {
    586       /* [0-9]+[bf]  */
    587       while ('0' <= *c_str && *c_str <= '9')
    588 	c_str++;
    589       if (*c_str == 'b' || *c_str == 'f')
    590 	c_str++;
    591       else
    592 	return 0;
    593       return *c_str == '\0'
    594 		       || ((*c_str == '-' || *c_str == '+')
    595 			   && is_unsigned (c_str + 1));
    596     }
    597   else if (is_name_beginner (*c_str))
    598     {
    599       /* [a-zA-Z\._\$][0-9a-zA-Z\._\$]*  */
    600       c_str++;
    601       while (is_part_of_name (*c_str))
    602 	c_str++;
    603       return *c_str == '\0'
    604 		       || ((*c_str == '-' || *c_str == '+')
    605 			   && is_unsigned (c_str + 1));
    606     }
    607   else
    608     return 0;
    609 }
    610 
    611 static int32_t
    612 loongarch_args_parser_can_match_arg_helper (char esc_ch1, char esc_ch2,
    613 					    const char *bit_field,
    614 					    const char *arg, void *context)
    615 {
    616   struct loongarch_cl_insn *ip = context;
    617   offsetT imm, ret = 0;
    618   size_t reloc_num_we_have = MAX_RELOC_NUMBER_A_INSN - ip->reloc_num;
    619   size_t reloc_num = 0;
    620 
    621   if (!ip->match_now)
    622     return 0;
    623 
    624   switch (esc_ch1)
    625     {
    626     case 'l':
    627       switch (esc_ch2)
    628 	{
    629 	default:
    630 	  ip->match_now = is_label (arg);
    631 	  if (!ip->match_now && is_label_with_addend (arg))
    632 	    as_fatal (_("This label shouldn't be with addend."));
    633 	  break;
    634 	case 'a':
    635 	  ip->match_now = is_label_with_addend (arg);
    636 	  break;
    637 	}
    638       break;
    639     /* This is used for TLS, where the fourth operand is %le_add_r,
    640        to get a relocation applied to an add instruction, for relaxation to use.
    641        Two conditions, ip->match_now and reloc_num, are used to check tls insn
    642        to prevent cases like add.d $a0,$a0,$a0,8.  */
    643     case 't':
    644       ip->match_now = loongarch_parse_expr (arg, ip->reloc_info + ip->reloc_num,
    645 				reloc_num_we_have, &reloc_num, &imm) == 0;
    646 
    647       if (!ip->match_now)
    648 	break;
    649 
    650       bfd_reloc_code_real_type tls_reloc_type = BFD_RELOC_LARCH_TLS_LE_ADD_R;
    651 
    652       if (reloc_num
    653 	  && (ip->reloc_info[ip->reloc_num].type == tls_reloc_type))
    654 	{
    655 	  ip->reloc_num += reloc_num;
    656 	  ip->reloc_info[ip->reloc_num].type = BFD_RELOC_LARCH_RELAX;
    657 	  ip->reloc_info[ip->reloc_num].value = const_0;
    658 	  ip->reloc_num++;
    659 	}
    660       else
    661 	ip->match_now = 0;
    662       break;
    663     case 's':
    664     case 'u':
    665       ip->match_now =
    666 	loongarch_parse_expr (arg, ip->reloc_info + ip->reloc_num,
    667 			      reloc_num_we_have, &reloc_num, &imm) == 0;
    668 
    669       if (!ip->match_now)
    670 	break;
    671 
    672       ret = imm;
    673       if (reloc_num)
    674 	{
    675 	  bfd_reloc_code_real_type reloc_type = BFD_RELOC_NONE;
    676 	  reloc_num_we_have -= reloc_num;
    677 	  if (reloc_num_we_have == 0)
    678 	    as_fatal (_("expr too huge") /* Want one more reloc.  */);
    679 	  if (esc_ch1 == 'u')
    680 	    {
    681 	      if (strncmp (bit_field, "10:12", strlen ("10:12")) == 0)
    682 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_U_10_12;
    683 	    }
    684 	  else if (esc_ch1 == 's')
    685 	    {
    686 	      if (strncmp (bit_field, "10:16<<2", strlen ("10:16<<2")) == 0)
    687 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_10_16_S2;
    688 	      else if (strncmp (bit_field, "0:5|10:16<<2",
    689 				strlen ("0:5|10:16<<2")) == 0)
    690 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_0_5_10_16_S2;
    691 	      else if (strncmp (bit_field, "0:10|10:16<<2",
    692 				strlen ("0:10|10:16<<2")) == 0)
    693 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_0_10_10_16_S2;
    694 	      else if (strncmp (bit_field, "10:12", strlen ("10:12")) == 0)
    695 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_10_12;
    696 	      else if (strncmp (bit_field, "5:20", strlen ("5:20")) == 0)
    697 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_5_20;
    698 	      else if (strncmp (bit_field, "10:16", strlen ("10:16")) == 0)
    699 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_10_16;
    700 	      else if (strncmp (bit_field, "10:5", strlen ("10:5")) == 0)
    701 		reloc_type = BFD_RELOC_LARCH_SOP_POP_32_S_10_5;
    702 	    }
    703 	  if (reloc_type == BFD_RELOC_NONE)
    704 	    as_fatal (
    705 		      _("not support reloc bit-field\nfmt: %c%c %s\nargs: %s"),
    706 		      esc_ch1, esc_ch2, bit_field, arg);
    707 
    708 	  if (ip->reloc_info[0].type >= BFD_RELOC_LARCH_B16
    709 	      && ip->reloc_info[0].type <= BFD_RELOC_LARCH_TLS_DESC_PCREL20_S2)
    710 	    {
    711 	      /* As we compact stack-relocs, it is no need for pop operation.
    712 		 But break out until here in order to check the imm field.
    713 		 May be reloc_num > 1 if implement relax?  */
    714 	      ip->reloc_num += reloc_num;
    715 	      reloc_type = ip->reloc_info[0].type;
    716 
    717 	      if (LARCH_opts.relax
    718 		    && (BFD_RELOC_LARCH_TLS_LE_HI20_R == reloc_type
    719 			|| BFD_RELOC_LARCH_TLS_LE_LO12_R == reloc_type))
    720 		{
    721 		  ip->reloc_info[ip->reloc_num].type = BFD_RELOC_LARCH_RELAX;
    722 		  ip->reloc_info[ip->reloc_num].value = const_0;
    723 		  ip->reloc_num++;
    724 		}
    725 
    726 	      /* Only one register macros (used in normal code model)
    727 		 emit R_LARCH_RELAX.
    728 		 LARCH_opts.ase_labs and LARCH_opts.ase_gabs are used
    729 		 to generate the code model of absolute addresses, and
    730 		 we do not relax this code model.  */
    731 	      if (LARCH_opts.relax && (ip->expand_from_macro & 1)
    732 		    && ! (LARCH_opts.ase_labs | LARCH_opts.ase_gabs)
    733 		    && (BFD_RELOC_LARCH_PCALA_HI20 == reloc_type
    734 			|| BFD_RELOC_LARCH_PCALA_LO12 == reloc_type
    735 			|| BFD_RELOC_LARCH_GOT_PC_HI20 == reloc_type
    736 			|| BFD_RELOC_LARCH_GOT_PC_LO12 == reloc_type
    737 			|| BFD_RELOC_LARCH_TLS_LD_PC_HI20 == reloc_type
    738 			|| BFD_RELOC_LARCH_TLS_GD_PC_HI20 == reloc_type
    739 			|| BFD_RELOC_LARCH_TLS_DESC_PC_HI20 == reloc_type
    740 			|| BFD_RELOC_LARCH_TLS_DESC_PC_LO12 == reloc_type
    741 			|| BFD_RELOC_LARCH_TLS_DESC_LD == reloc_type
    742 			|| BFD_RELOC_LARCH_TLS_DESC_CALL == reloc_type
    743 			|| BFD_RELOC_LARCH_TLS_IE_PC_HI20 == reloc_type
    744 			|| BFD_RELOC_LARCH_TLS_IE_PC_LO12 == reloc_type))
    745 		{
    746 		  ip->reloc_info[ip->reloc_num].type = BFD_RELOC_LARCH_RELAX;
    747 		  ip->reloc_info[ip->reloc_num].value = const_0;
    748 		  ip->reloc_num++;
    749 		}
    750 	      break;
    751 	    }
    752 	  reloc_num++;
    753 	  ip->reloc_num += reloc_num;
    754 	  ip->reloc_info[ip->reloc_num - 1].type = reloc_type;
    755 	  ip->reloc_info[ip->reloc_num - 1].value = const_0;
    756 	}
    757       break;
    758     case 'r':
    759       imm = (intptr_t) str_hash_find (r_htab, arg);
    760       ip->match_now = 0 < imm;
    761       ret = imm - 1;
    762       if (ip->match_now)
    763 	break;
    764       /* Handle potential usage of deprecated register aliases.  */
    765       imm = (intptr_t) str_hash_find (r_deprecated_htab, arg);
    766       ip->match_now = 0 < imm;
    767       ret = imm - 1;
    768       /* !ip->expand_from_macro: avoiding duplicate output warnings,
    769 	 only the first macro output warning.  */
    770       if (ip->match_now && !ip->expand_from_macro)
    771 	as_warn (_("register alias %s is deprecated, use %s instead"),
    772 		 arg, r_abi_names[ret]);
    773       break;
    774     case 'f':
    775       switch (esc_ch2)
    776 	{
    777 	case 'c':
    778 	  imm = (intptr_t) str_hash_find (fc_htab, arg);
    779 	  if (0 >= imm)
    780 	    {
    781 	      imm = (intptr_t) str_hash_find (fcn_htab, arg);
    782 	    }
    783 	  break;
    784 	default:
    785 	  imm = (intptr_t) str_hash_find (f_htab, arg);
    786 	}
    787       ip->match_now = 0 < imm;
    788       ret = imm - 1;
    789       if (ip->match_now && !ip->expand_from_macro)
    790 	break;
    791       /* Handle potential usage of deprecated register aliases.  */
    792       imm = (intptr_t) str_hash_find (f_deprecated_htab, arg);
    793       ip->match_now = 0 < imm;
    794       ret = imm - 1;
    795       if (ip->match_now)
    796 	as_warn (_("register alias %s is deprecated, use %s instead"),
    797 		 arg, f_abi_names[ret]);
    798       break;
    799     case 'c':
    800       switch (esc_ch2)
    801 	{
    802 	case 'r':
    803 	  imm = (intptr_t) str_hash_find (cr_htab, arg);
    804 	  break;
    805 	default:
    806 	  imm = (intptr_t) str_hash_find (c_htab, arg);
    807 	}
    808       ip->match_now = 0 < imm;
    809       ret = imm - 1;
    810       break;
    811     case 'v':
    812       imm = (intptr_t) str_hash_find (v_htab, arg);
    813       ip->match_now = 0 < imm;
    814       ret = imm - 1;
    815       break;
    816     case 'x':
    817       imm = (intptr_t) str_hash_find (x_htab, arg);
    818       ip->match_now = 0 < imm;
    819       ret = imm - 1;
    820       break;
    821     case '\0':
    822       ip->all_match = ip->match_now;
    823       ip->insn_length =
    824 	ip->insn->mask ? loongarch_insn_length (ip->insn->match) : 0;
    825       /* FIXME: now we have no relax insn.  */
    826       ip->relax_max_length = ip->insn_length;
    827       break;
    828     default:
    829       as_fatal (_("unknown escape"));
    830     }
    831 
    832   do
    833     {
    834       /* Check imm overflow.  */
    835       int bit_width, bits_needed_s, bits_needed_u;
    836       char *t;
    837 
    838       if (!ip->match_now)
    839 	break;
    840 
    841       if (0 < reloc_num)
    842 	break;
    843 
    844       bit_width = loongarch_get_bit_field_width (bit_field, &t);
    845 
    846       if (bit_width == -1)
    847 	/* No specify bit width.  */
    848 	break;
    849 
    850       imm = ret;
    851       if (t[0] == '<' && t[1] == '<')
    852 	{
    853 	  int i = strtol (t += 2, &t, 10), j;
    854 	  for (j = i; 0 < j; j--, imm >>= 1)
    855 	    if (imm & 1)
    856 	      as_fatal (_("require imm low %d bit is 0."), i);
    857 	}
    858 
    859       if (*t == '+')
    860 	imm -= strtol (t, &t, 10);
    861 
    862       bits_needed_s = loongarch_bits_imm_needed (imm, 1);
    863       bits_needed_u = loongarch_bits_imm_needed (imm, 0);
    864 
    865       if ((esc_ch1 == 's' && bit_width < bits_needed_s)
    866 	  || (esc_ch1 != 's' && bit_width < bits_needed_u))
    867 	/* How to do after we detect overflow.  */
    868 	as_fatal (_("Immediate overflow.\n"
    869 		    "format: %c%c%s\n"
    870 		    "arg: %s"),
    871 		  esc_ch1, esc_ch2, bit_field, arg);
    872     }
    873   while (0);
    874 
    875   if (esc_ch1 != '\0')
    876     {
    877       ip->args[ip->arg_num] = ret;
    878       ip->arg_num++;
    879     }
    880   return ret;
    881 }
    882 
    883 static void
    884 get_loongarch_opcode (struct loongarch_cl_insn *insn)
    885 {
    886   const struct loongarch_opcode *it;
    887   struct loongarch_ase *ase;
    888   for (ase = loongarch_ASEs; ase->enabled; ase++)
    889     {
    890       if (!*ase->enabled || (ase->include && !*ase->include)
    891 	  || (ase->exclude && *ase->exclude))
    892 	continue;
    893 
    894       if (!ase->name_hash_entry)
    895 	{
    896 	  ase->name_hash_entry = str_htab_create ();
    897 	  for (it = ase->opcodes; it->name; it++)
    898 	    {
    899 	      if ((!it->include || (it->include && *it->include))
    900 		  && (!it->exclude || (it->exclude && !(*it->exclude)))
    901 		  && !(it->pinfo & INSN_DIS_ALIAS))
    902 		str_hash_insert (ase->name_hash_entry, it->name,
    903 				 (void *) it, 0);
    904 	    }
    905 	}
    906 
    907       if ((it = str_hash_find (ase->name_hash_entry, insn->name)) == NULL)
    908 	continue;
    909 
    910       do
    911 	{
    912 	  insn->insn = it;
    913 	  insn->match_now = 1;
    914 	  insn->all_match = 0;
    915 	  insn->arg_num = 0;
    916 	  insn->reloc_num = 0;
    917 	  insn->insn_bin = (loongarch_foreach_args
    918 			    (it->format, insn->arg_strs,
    919 			     loongarch_args_parser_can_match_arg_helper,
    920 			     insn));
    921 	  if (insn->all_match && !(it->include && !*it->include)
    922 	      && !(it->exclude && *it->exclude))
    923 	    {
    924 	      insn->insn_bin |= it->match;
    925 	      return;
    926 	    }
    927 	  it++;
    928 	}
    929       while (it->name && strcasecmp (it->name, insn->name) == 0);
    930     }
    931 }
    932 
    933 static int
    934 check_this_insn_before_appending (struct loongarch_cl_insn *ip)
    935 {
    936   int ret = 0;
    937 
    938   if (strncmp (ip->name, "la.abs", 6) == 0)
    939     {
    940       ip->reloc_info[ip->reloc_num].type = BFD_RELOC_LARCH_MARK_LA;
    941       ip->reloc_info[ip->reloc_num].value = const_0;
    942       ip->reloc_num++;
    943     }
    944   else if (ip->insn->mask == 0xffff8000
    945 	   /* amcas.b  rd, rk, rj  */
    946 	   && ((ip->insn_bin & 0xfff80000) == 0x38580000
    947 	       /* amswap.w  rd, rk, rj  */
    948 	       || (ip->insn_bin & 0xfff00000) == 0x38600000
    949 	       /* ammax_db.wu  rd, rk, rj  */
    950 	       || (ip->insn_bin & 0xffff0000) == 0x38700000
    951 	       /* ammin_db.wu  rd, rk, rj  */
    952 	       || (ip->insn_bin & 0xffff0000) == 0x38710000))
    953     {
    954       /* For AMO insn amswap.[wd], amadd.[wd], etc.  */
    955       if (ip->args[0] != 0
    956 	  && (ip->args[0] == ip->args[1] || ip->args[0] == ip->args[2]))
    957 	as_fatal (_("AMO insns require rd != base && rd != rt"
    958 		    " when rd isn't $r0"));
    959     }
    960   else if ((ip->insn->mask == 0xffe08000
    961 	    /* bstrins.w  rd, rj, msbw, lsbw  */
    962 	    && (ip->insn_bin & 0xffe00000) == 0x00600000)
    963 	   || (ip->insn->mask == 0xffc00000
    964 	       /* bstrins.d  rd, rj, msbd, lsbd  */
    965 	       && (ip->insn_bin & 0xff800000) == 0x00800000))
    966     {
    967       /* For bstr(ins|pick).[wd].  */
    968       if (ip->args[2] < ip->args[3])
    969 	as_fatal (_("bstr(ins|pick).[wd] require msbd >= lsbd"));
    970     }
    971   else if (ip->insn->mask != 0 && (ip->insn_bin & 0xfe0003c0) == 0x04000000
    972 	   /* csrxchg  rd, rj, csr_num  */
    973 	   && (strcmp ("csrxchg", ip->name) == 0))
    974     as_fatal (_("csrxchg require rj != $r0 && rj != $r1"));
    975 
    976   return ret;
    977 }
    978 
    979 static void
    980 install_insn (const struct loongarch_cl_insn *insn)
    981 {
    982   char *f = insn->frag->fr_literal + insn->where;
    983   if (0 < insn->insn_length)
    984     md_number_to_chars (f, insn->insn_bin, insn->insn_length);
    985 }
    986 
    987 static void
    988 move_insn (struct loongarch_cl_insn *insn, fragS *frag, long where)
    989 {
    990   size_t i;
    991   insn->frag = frag;
    992   insn->where = where;
    993   for (i = 0; i < insn->reloc_num; i++)
    994     {
    995       if (insn->fixp[i])
    996 	{
    997 	  insn->fixp[i]->fx_frag = frag;
    998 	  insn->fixp[i]->fx_where = where;
    999 	}
   1000     }
   1001   install_insn (insn);
   1002 }
   1003 
   1004 /* Add INSN to the end of the output.  */
   1005 static void
   1006 append_fixed_insn (struct loongarch_cl_insn *insn)
   1007 {
   1008   /* Ensure the jirl is emitted to the same frag as the pcaddu18i.  */
   1009   if (BFD_RELOC_LARCH_CALL36 == insn->reloc_info[0].type)
   1010     frag_grow (8);
   1011 
   1012   char *f = frag_more (insn->insn_length);
   1013   move_insn (insn, frag_now, f - frag_now->fr_literal);
   1014 }
   1015 
   1016 /* Add instructions based on the worst-case scenario firstly.  */
   1017 static void
   1018 append_relaxed_branch_insn (struct loongarch_cl_insn *insn, int max_chars,
   1019 	    int var, relax_substateT subtype, symbolS *symbol, offsetT offset)
   1020 {
   1021   frag_grow (max_chars);
   1022   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
   1023   frag_var (rs_machine_dependent, max_chars, var,
   1024 	    subtype, symbol, offset, NULL);
   1025 }
   1026 
   1027 static void
   1028 append_fixp_and_insn (struct loongarch_cl_insn *ip)
   1029 {
   1030   reloc_howto_type *howto;
   1031   bfd_reloc_code_real_type r_type;
   1032   struct reloc_info *reloc_info = ip->reloc_info;
   1033   size_t i;
   1034 
   1035   dwarf2_emit_insn (0);
   1036 
   1037   for (i = 0; i < ip->reloc_num; i++)
   1038     {
   1039       r_type = reloc_info[i].type;
   1040 
   1041       if (r_type != BFD_RELOC_UNUSED)
   1042 	{
   1043 
   1044 	  gas_assert (&(reloc_info[i].value));
   1045 	  if (BFD_RELOC_LARCH_B16 == r_type || BFD_RELOC_LARCH_B21 == r_type)
   1046 	    {
   1047 	      int min_bytes = 4; /* One branch instruction.  */
   1048 	      unsigned max_bytes = 8; /* Branch and jump instructions.  */
   1049 
   1050 	      if (now_seg == absolute_section)
   1051 		{
   1052 		  as_bad (_("relaxable branches not supported in absolute section"));
   1053 		  return;
   1054 		}
   1055 
   1056 	      append_relaxed_branch_insn (ip, max_bytes, min_bytes,
   1057 					  RELAX_BRANCH_ENCODE (r_type),
   1058 					  reloc_info[i].value.X_add_symbol,
   1059 					  reloc_info[i].value.X_add_number);
   1060 	      return;
   1061 	    }
   1062 	  else
   1063 	    {
   1064 	      howto = bfd_reloc_type_lookup (stdoutput, r_type);
   1065 	      if (howto == NULL)
   1066 		as_fatal (_("no HOWTO loong relocation number %d"), r_type);
   1067 
   1068 	      ip->fixp[i] = fix_new_exp (ip->frag, ip->where,
   1069 					 bfd_get_reloc_size (howto),
   1070 					 &reloc_info[i].value, FALSE, r_type);
   1071 	    }
   1072 	}
   1073     }
   1074 
   1075   if (ip->insn_length < ip->relax_max_length)
   1076     as_fatal (_("Internal error: not support relax now"));
   1077   else
   1078     append_fixed_insn (ip);
   1079 
   1080   /* We need to start a new frag after any instruction that can be
   1081      optimized away or compressed by the linker during relaxation, to prevent
   1082      the assembler from computing static offsets across such an instruction.
   1083 
   1084      This is necessary to get correct .eh_frame FDE DW_CFA_advance_loc info.
   1085      If one cfi_insn_data's two symbols are not in the same frag, it will
   1086      generate ADD and SUB relocations pairs to calculate DW_CFA_advance_loc.
   1087      (gas/dw2gencfi.c: output_cfi_insn:
   1088      if (symbol_get_frag (to) == symbol_get_frag (from)))
   1089 
   1090      For macro instructions, only the first instruction expanded from macro
   1091      need to start a new frag.  */
   1092   if (LARCH_opts.relax
   1093       && (BFD_RELOC_LARCH_PCALA_HI20 == reloc_info[0].type
   1094 	  || BFD_RELOC_LARCH_GOT_PC_HI20 == reloc_info[0].type
   1095 	  || BFD_RELOC_LARCH_TLS_LE_HI20_R == reloc_info[0].type
   1096 	  || BFD_RELOC_LARCH_TLS_LE_ADD_R == reloc_info[0].type
   1097 	  || BFD_RELOC_LARCH_TLS_LD_PC_HI20 == reloc_info[0].type
   1098 	  || BFD_RELOC_LARCH_TLS_GD_PC_HI20 == reloc_info[0].type
   1099 	  || BFD_RELOC_LARCH_TLS_DESC_PC_HI20 == reloc_info[0].type
   1100 	  || BFD_RELOC_LARCH_TLS_DESC_PC_LO12 == reloc_info[0].type
   1101 	  || BFD_RELOC_LARCH_TLS_DESC_LD == reloc_info[0].type
   1102 	  || BFD_RELOC_LARCH_TLS_DESC_CALL == reloc_info[0].type
   1103 	  || BFD_RELOC_LARCH_TLS_IE_PC_HI20 == reloc_info[0].type
   1104 	  || BFD_RELOC_LARCH_TLS_IE_PC_LO12 == reloc_info[0].type))
   1105     {
   1106       frag_wane (frag_now);
   1107       frag_new (0);
   1108     }
   1109 }
   1110 
   1111 /* Ask helper for returning a malloced c_str or NULL.  */
   1112 static char *
   1113 assember_macro_helper (const char *const args[], void *context_ptr)
   1114 {
   1115   struct loongarch_cl_insn *insn = context_ptr;
   1116   char *ret = NULL;
   1117   if ( strcmp (insn->name, "li.w") == 0 || strcmp (insn->name, "li.d") == 0)
   1118     {
   1119       char args_buf[50], insns_buf[200];
   1120       const char *arg_strs[6];
   1121       uint32_t hi32, lo32;
   1122 
   1123       /* We pay attention to sign extend beacause it is chance of reduce insn.
   1124 	 The exception is 12-bit and hi-12-bit unsigned,
   1125 	 we need a 'ori' or a 'lu52i.d' accordingly.  */
   1126       char all0_bit_vec, sign_bit_vec, allf_bit_vec, paritial_is_sext_of_prev;
   1127 
   1128       lo32 = insn->args[1] & 0xffffffff;
   1129       hi32 = insn->args[1] >> 32;
   1130 
   1131       if (strcmp (insn->name, "li.w") == 0)
   1132 	{
   1133 	  if (hi32 != 0 && hi32 != 0xffffffff)
   1134 	    as_fatal (_("li overflow: hi32:0x%x lo32:0x%x"), hi32, lo32);
   1135 	  hi32 = lo32 & 0x80000000 ? 0xffffffff : 0;
   1136 	}
   1137 
   1138       if (strcmp (insn->name, "li.d") == 0 && !LARCH_opts.ase_lp64)
   1139 	as_fatal (_("we can't li.d on 32bit-arch"));
   1140 
   1141       snprintf (args_buf, sizeof (args_buf), "0x%x,0x%x,0x%x,0x%x,%s",
   1142 		(hi32 >> 20) & 0xfff, hi32 & 0xfffff, (lo32 >> 12) & 0xfffff,
   1143 		lo32 & 0xfff, args[0]);
   1144       loongarch_split_args_by_comma (args_buf, arg_strs);
   1145 
   1146       all0_bit_vec =
   1147 	((((hi32 & 0xfff00000) == 0) << 3) | (((hi32 & 0x000fffff) == 0) << 2)
   1148 	 | (((lo32 & 0xfffff000) == 0) << 1) | ((lo32 & 0x00000fff) == 0));
   1149       sign_bit_vec =
   1150 	((((hi32 & 0x80000000) != 0) << 3) | (((hi32 & 0x00080000) != 0) << 2)
   1151 	 | (((lo32 & 0x80000000) != 0) << 1) | ((lo32 & 0x00000800) != 0));
   1152       allf_bit_vec =
   1153 	((((hi32 & 0xfff00000) == 0xfff00000) << 3)
   1154 	 | (((hi32 & 0x000fffff) == 0x000fffff) << 2)
   1155 	 | (((lo32 & 0xfffff000) == 0xfffff000) << 1)
   1156 	 | ((lo32 & 0x00000fff) == 0x00000fff));
   1157       paritial_is_sext_of_prev =
   1158 	(all0_bit_vec ^ allf_bit_vec) & (all0_bit_vec ^ (sign_bit_vec << 1));
   1159 
   1160       static const char *const li_32bit[] =
   1161 	{
   1162 	  "lu12i.w %5,%3&0x80000?%3-0x100000:%3;ori %5,%5,%4;",
   1163 	  "lu12i.w %5,%3&0x80000?%3-0x100000:%3;",
   1164 	  "addi.w %5,$r0,%4&0x800?%4-0x1000:%4;",
   1165 	  "or %5,$r0,$r0;",
   1166 	};
   1167       static const char *const li_hi_32bit[] =
   1168 	{
   1169 	  "lu32i.d %5,%2&0x80000?%2-0x100000:%2;"
   1170 	  "lu52i.d %5,%5,%1&0x800?%1-0x1000:%1;",
   1171 	  "lu52i.d %5,%5,%1&0x800?%1-0x1000:%1;",
   1172 	  "lu32i.d %5,%2&0x80000?%2-0x100000:%2;",
   1173 	  "",
   1174 	};
   1175       do
   1176 	{
   1177 	  insns_buf[0] = '\0';
   1178 	  if (paritial_is_sext_of_prev == 0x7)
   1179 	    {
   1180 	      strcat (insns_buf, "lu52i.d %5,$r0,%1&0x800?%1-0x1000:%1;");
   1181 	      break;
   1182 	    }
   1183 	  if ((all0_bit_vec & 0x3) == 0x2)
   1184 	    strcat (insns_buf, "ori %5,$r0,%4;");
   1185 	  else
   1186 	    strcat (insns_buf, li_32bit[paritial_is_sext_of_prev & 0x3]);
   1187 	  strcat (insns_buf, li_hi_32bit[paritial_is_sext_of_prev >> 2]);
   1188 	}
   1189       while (0);
   1190 
   1191       ret = loongarch_expand_macro (insns_buf, arg_strs, NULL, NULL,
   1192 				    sizeof (args_buf));
   1193     }
   1194 
   1195   return ret;
   1196 }
   1197 
   1198 /* Accept instructions separated by ';'
   1199  * assuming 'not starting with space and not ending with space' or pass in
   1200  * empty c_str.  */
   1201 static void
   1202 loongarch_assemble_INSNs (char *str, unsigned int expand_from_macro)
   1203 {
   1204   char *rest;
   1205   size_t len_str = strlen(str);
   1206 
   1207   for (rest = str; *rest != ';' && *rest != '\0'; rest++);
   1208   if (*rest == ';')
   1209     *rest++ = '\0';
   1210 
   1211   if (*str == ':')
   1212     {
   1213       str++;
   1214       setup_internal_label_here (strtol (str, &str, 10));
   1215       str++;
   1216     }
   1217 
   1218   do
   1219     {
   1220       if (*str == '\0')
   1221 	break;
   1222 
   1223       struct loongarch_cl_insn the_one = { 0 };
   1224       the_one.name = str;
   1225       the_one.expand_from_macro = expand_from_macro;
   1226 
   1227       for (; *str && *str != ' '; str++)
   1228 	;
   1229       if (*str == ' ')
   1230 	*str++ = '\0';
   1231 
   1232       loongarch_split_args_by_comma (str, the_one.arg_strs);
   1233       get_loongarch_opcode (&the_one);
   1234 
   1235       if (!the_one.all_match)
   1236 	{
   1237 	  char *ss = loongarch_cat_splited_strs (the_one.arg_strs);
   1238 	  as_bad (_("no match insn: %s\t%s"), the_one.name, ss ? ss : "");
   1239 	  free(ss);
   1240 	  return;
   1241 	}
   1242 
   1243       if (check_this_insn_before_appending (&the_one) != 0)
   1244 	break;
   1245 
   1246       append_fixp_and_insn (&the_one);
   1247 
   1248       /* Expanding macro instructions.  */
   1249       if (the_one.insn_length == 0 && the_one.insn->macro)
   1250 	{
   1251 	  unsigned int new_expand_from_macro = 0;
   1252 	  if (2 == the_one.arg_num)
   1253 	    new_expand_from_macro |= 1;
   1254 	  else if (3 == the_one.arg_num)
   1255 	    new_expand_from_macro |= 2;
   1256 
   1257 	  char *c_str = loongarch_expand_macro (the_one.insn->macro,
   1258 						the_one.arg_strs,
   1259 						assember_macro_helper,
   1260 						&the_one, len_str);
   1261 	  /* The first instruction expanded from macro.  */
   1262 	  loongarch_assemble_INSNs (c_str, new_expand_from_macro);
   1263 	  free (c_str);
   1264 	}
   1265     }
   1266   while (0);
   1267 
   1268   /* The rest instructions expanded from macro, split by semicolon(;),
   1269      assembly one by one.  */
   1270   if (*rest != '\0')
   1271     loongarch_assemble_INSNs (rest, expand_from_macro);
   1272 }
   1273 
   1274 void
   1275 md_assemble (char *str)
   1276 {
   1277   loongarch_assemble_INSNs (str, 0);
   1278 }
   1279 
   1280 const char *
   1281 md_atof (int type, char *litP, int *sizeP)
   1282 {
   1283   return ieee_md_atof (type, litP, sizeP, FALSE);
   1284 }
   1285 
   1286 void
   1287 md_number_to_chars (char *buf, valueT val, int n)
   1288 {
   1289   number_to_chars_littleendian (buf, val, n);
   1290 }
   1291 
   1292 /* The location from which a PC relative jump should be calculated,
   1293    given a PC relative reloc.  */
   1294 long
   1295 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
   1296 {
   1297   return 0;
   1298 }
   1299 
   1300 static void fix_reloc_insn (fixS *fixP, bfd_vma reloc_val, char *buf)
   1301 {
   1302   reloc_howto_type *howto;
   1303   insn_t insn;
   1304   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
   1305 
   1306   insn = bfd_getl32 (buf);
   1307 
   1308   if (!loongarch_adjust_reloc_bitsfield (NULL, howto, &reloc_val))
   1309     as_bad_where (fixP->fx_file, fixP->fx_line, "Reloc overflow");
   1310 
   1311   insn = (insn & (insn_t)howto->src_mask)
   1312     | ((insn & (~(insn_t)howto->dst_mask)) | reloc_val);
   1313 
   1314   bfd_putl32 (insn, buf);
   1315 }
   1316 
   1317 void
   1318 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
   1319 {
   1320   static int64_t stack_top;
   1321   static int last_reloc_is_sop_push_pcrel_1 = 0;
   1322   int last_reloc_is_sop_push_pcrel = last_reloc_is_sop_push_pcrel_1;
   1323   segT sub_segment;
   1324   last_reloc_is_sop_push_pcrel_1 = 0;
   1325 
   1326   char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
   1327   switch (fixP->fx_r_type)
   1328     {
   1329     case BFD_RELOC_LARCH_SOP_PUSH_TLS_TPREL:
   1330     case BFD_RELOC_LARCH_SOP_PUSH_TLS_GD:
   1331     case BFD_RELOC_LARCH_SOP_PUSH_TLS_GOT:
   1332     case BFD_RELOC_LARCH_TLS_LE_HI20:
   1333     case BFD_RELOC_LARCH_TLS_LE_LO12:
   1334     case BFD_RELOC_LARCH_TLS_LE64_LO20:
   1335     case BFD_RELOC_LARCH_TLS_LE64_HI12:
   1336     case BFD_RELOC_LARCH_TLS_IE_PC_HI20:
   1337     case BFD_RELOC_LARCH_TLS_IE_PC_LO12:
   1338     case BFD_RELOC_LARCH_TLS_IE64_PC_LO20:
   1339     case BFD_RELOC_LARCH_TLS_IE64_PC_HI12:
   1340     case BFD_RELOC_LARCH_TLS_IE_HI20:
   1341     case BFD_RELOC_LARCH_TLS_IE_LO12:
   1342     case BFD_RELOC_LARCH_TLS_IE64_LO20:
   1343     case BFD_RELOC_LARCH_TLS_IE64_HI12:
   1344     case BFD_RELOC_LARCH_TLS_LD_PC_HI20:
   1345     case BFD_RELOC_LARCH_TLS_LD_HI20:
   1346     case BFD_RELOC_LARCH_TLS_GD_PC_HI20:
   1347     case BFD_RELOC_LARCH_TLS_GD_HI20:
   1348     case BFD_RELOC_LARCH_TLS_DESC_PC_HI20:
   1349     case BFD_RELOC_LARCH_TLS_DESC_PC_LO12:
   1350     case BFD_RELOC_LARCH_TLS_DESC64_PC_LO20:
   1351     case BFD_RELOC_LARCH_TLS_DESC64_PC_HI12:
   1352     case BFD_RELOC_LARCH_TLS_DESC_HI20:
   1353     case BFD_RELOC_LARCH_TLS_DESC_LO12:
   1354     case BFD_RELOC_LARCH_TLS_DESC64_LO20:
   1355     case BFD_RELOC_LARCH_TLS_DESC64_HI12:
   1356       /* Add tls lo (got_lo reloc type).  */
   1357       if (fixP->fx_addsy == NULL)
   1358 	as_bad_where (fixP->fx_file, fixP->fx_line,
   1359 		      _("Relocation against a constant"));
   1360       S_SET_THREAD_LOCAL (fixP->fx_addsy);
   1361       break;
   1362 
   1363     case BFD_RELOC_LARCH_SOP_PUSH_PCREL:
   1364       if (fixP->fx_addsy == NULL)
   1365 	as_bad_where (fixP->fx_file, fixP->fx_line,
   1366 		      _("Relocation against a constant"));
   1367 
   1368       last_reloc_is_sop_push_pcrel_1 = 1;
   1369       if (S_GET_SEGMENT (fixP->fx_addsy) == seg)
   1370 	stack_top = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
   1371 		     - (fixP->fx_where + fixP->fx_frag->fr_address));
   1372       else
   1373 	stack_top = 0;
   1374       break;
   1375 
   1376     case BFD_RELOC_LARCH_TLS_DESC_LD:
   1377     case BFD_RELOC_LARCH_TLS_DESC_CALL:
   1378       break;
   1379 
   1380     case BFD_RELOC_LARCH_SOP_POP_32_S_10_5:
   1381     case BFD_RELOC_LARCH_SOP_POP_32_S_10_12:
   1382     case BFD_RELOC_LARCH_SOP_POP_32_U_10_12:
   1383     case BFD_RELOC_LARCH_SOP_POP_32_S_10_16:
   1384     case BFD_RELOC_LARCH_SOP_POP_32_S_10_16_S2:
   1385     case BFD_RELOC_LARCH_SOP_POP_32_S_5_20:
   1386     case BFD_RELOC_LARCH_SOP_POP_32_U:
   1387     case BFD_RELOC_LARCH_SOP_POP_32_S_0_5_10_16_S2:
   1388     case BFD_RELOC_LARCH_SOP_POP_32_S_0_10_10_16_S2:
   1389       if (!last_reloc_is_sop_push_pcrel)
   1390 	break;
   1391 
   1392       fix_reloc_insn (fixP, (bfd_vma)stack_top, buf);
   1393       break;
   1394 
   1395     /* LARCH only has R_LARCH_64/32, not has R_LARCH_24/16/8.
   1396        For BFD_RELOC_64/32, if fx_addsy and fx_subsy not null, wer need
   1397        generate BFD_RELOC_LARCH_ADD64/32 and BFD_RELOC_LARCH_SUB64/32 here.
   1398        Then will parse howto table bfd_reloc_code_real_type to generate
   1399        R_LARCH_ADD64/32 and R_LARCH_SUB64/32 reloc at tc_gen_reloc function.
   1400        If only fx_addsy not null, skip here directly, then generate
   1401        R_LARCH_64/32.
   1402 
   1403        For BFD_RELOC_24/16/8, if fx_addsy and fx_subsy not null, wer need
   1404        generate BFD_RELOC_LARCH_ADD24/16/8 and BFD_RELOC_LARCH_SUB24/16/8 here.
   1405        Then will parse howto table bfd_reloc_code_real_type to generate
   1406        R_LARCH_ADD24/16/8 and R_LARCH_SUB24/16/8 reloc at tc_gen_reloc
   1407        function. If only fx_addsy not null, we generate
   1408        BFD_RELOC_LARCH_ADD24/16/8 only, then generate R_LARCH_24/16/8.
   1409        To avoid R_LARCH_ADDxx add extra value, we write 0 first
   1410        (use md_number_to_chars (buf, 0, fixP->fx_size)).  */
   1411     case BFD_RELOC_64:
   1412     case BFD_RELOC_32:
   1413       if (fixP->fx_pcrel)
   1414 	{
   1415 	  switch (fixP->fx_r_type)
   1416 	    {
   1417 	    case BFD_RELOC_64:
   1418 	      fixP->fx_r_type = BFD_RELOC_LARCH_64_PCREL;
   1419 	      break;
   1420 	    case BFD_RELOC_32:
   1421 	      fixP->fx_r_type = BFD_RELOC_LARCH_32_PCREL;
   1422 	      break;
   1423 	    default:
   1424 	      break;
   1425 	    }
   1426 	}
   1427 
   1428       /* If symbol in .eh_frame the address may be adjusted, and contents of
   1429 	 .eh_frame will be adjusted, so use pc-relative relocation for FDE
   1430 	 initial location.
   1431 	 The Option of mthin-add-sub does not affect the generation of
   1432 	 R_LARCH_32_PCREL relocation in .eh_frame.  */
   1433       if (fixP->fx_r_type == BFD_RELOC_32
   1434 	  && fixP->fx_addsy && fixP->fx_subsy
   1435 	  && (sub_segment = S_GET_SEGMENT (fixP->fx_subsy))
   1436 	  && strcmp (sub_segment->name, ".eh_frame") == 0
   1437 	  && S_GET_VALUE (fixP->fx_subsy)
   1438 	  == fixP->fx_frag->fr_address + fixP->fx_where)
   1439 	{
   1440 	  fixP->fx_r_type = BFD_RELOC_LARCH_32_PCREL;
   1441 	  fixP->fx_subsy = NULL;
   1442 	  break;
   1443 	}
   1444 
   1445       if (fixP->fx_addsy && fixP->fx_subsy)
   1446 	{
   1447 	  fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
   1448 	  fixP->fx_next->fx_addsy = fixP->fx_subsy;
   1449 	  fixP->fx_next->fx_subsy = NULL;
   1450 	  fixP->fx_next->fx_offset = 0;
   1451 	  fixP->fx_subsy = NULL;
   1452 
   1453 	  switch (fixP->fx_r_type)
   1454 	    {
   1455 	    case BFD_RELOC_64:
   1456 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD64;
   1457 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB64;
   1458 	      break;
   1459 	    case BFD_RELOC_32:
   1460 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD32;
   1461 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB32;
   1462 	      break;
   1463 	    default:
   1464 	      break;
   1465 	    }
   1466 
   1467 	  md_number_to_chars (buf, 0, fixP->fx_size);
   1468 	}
   1469 
   1470       if (fixP->fx_addsy == NULL)
   1471 	{
   1472 	  fixP->fx_done = 1;
   1473 	  md_number_to_chars (buf, *valP, fixP->fx_size);
   1474 	}
   1475       break;
   1476 
   1477     case BFD_RELOC_24:
   1478     case BFD_RELOC_16:
   1479     case BFD_RELOC_8:
   1480       if (fixP->fx_addsy)
   1481 	{
   1482 	  fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
   1483 	  fixP->fx_next->fx_addsy = fixP->fx_subsy;
   1484 	  fixP->fx_next->fx_subsy = NULL;
   1485 	  fixP->fx_next->fx_offset = 0;
   1486 	  fixP->fx_subsy = NULL;
   1487 
   1488 	  switch (fixP->fx_r_type)
   1489 	    {
   1490 	    case BFD_RELOC_24:
   1491 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD24;
   1492 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB24;
   1493 	      break;
   1494 	    case BFD_RELOC_16:
   1495 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD16;
   1496 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB16;
   1497 	      break;
   1498 	    case BFD_RELOC_8:
   1499 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD8;
   1500 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB8;
   1501 	      break;
   1502 	    default:
   1503 	      break;
   1504 	    }
   1505 
   1506 	  md_number_to_chars (buf, 0, fixP->fx_size);
   1507 
   1508 	  if (fixP->fx_next->fx_addsy == NULL)
   1509 	    fixP->fx_next->fx_done = 1;
   1510 	}
   1511 
   1512       if (fixP->fx_addsy == NULL)
   1513 	{
   1514 	  fixP->fx_done = 1;
   1515 	  md_number_to_chars (buf, *valP, fixP->fx_size);
   1516 	}
   1517       break;
   1518 
   1519     case BFD_RELOC_LARCH_CFA:
   1520       if (fixP->fx_addsy && fixP->fx_subsy)
   1521 	{
   1522 	  fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
   1523 	  fixP->fx_next->fx_addsy = fixP->fx_subsy;
   1524 	  fixP->fx_next->fx_subsy = NULL;
   1525 	  fixP->fx_next->fx_offset = 0;
   1526 	  fixP->fx_subsy = NULL;
   1527 
   1528 	  unsigned int subtype;
   1529 	  offsetT loc;
   1530 	  subtype = bfd_get_8 (NULL, &((fragS *)
   1531 		      (fixP->fx_frag->fr_opcode))->fr_literal[fixP->fx_where]);
   1532 	  loc = fixP->fx_frag->fr_fix - (subtype & 7);
   1533 	  switch (subtype)
   1534 	    {
   1535 	    case DW_CFA_advance_loc1:
   1536 	      fixP->fx_where = loc + 1;
   1537 	      fixP->fx_next->fx_where = loc + 1;
   1538 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD8;
   1539 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB8;
   1540 	      md_number_to_chars (buf+1, 0, fixP->fx_size);
   1541 	      break;
   1542 
   1543 	    case DW_CFA_advance_loc2:
   1544 	      fixP->fx_size = 2;
   1545 	      fixP->fx_next->fx_size = 2;
   1546 	      fixP->fx_where = loc + 1;
   1547 	      fixP->fx_next->fx_where = loc + 1;
   1548 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD16;
   1549 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB16;
   1550 	      md_number_to_chars (buf+1, 0, fixP->fx_size);
   1551 	      break;
   1552 
   1553 	    case DW_CFA_advance_loc4:
   1554 	      fixP->fx_size = 4;
   1555 	      fixP->fx_next->fx_size = 4;
   1556 	      fixP->fx_where = loc;
   1557 	      fixP->fx_next->fx_where = loc;
   1558 	      fixP->fx_r_type = BFD_RELOC_LARCH_ADD32;
   1559 	      fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB32;
   1560 	      md_number_to_chars (buf+1, 0, fixP->fx_size);
   1561 	      break;
   1562 
   1563 	    default:
   1564 	      if (subtype < 0x80 && (subtype & 0x40))
   1565 		{
   1566 		  /* DW_CFA_advance_loc.  */
   1567 		  fixP->fx_frag = (fragS *) fixP->fx_frag->fr_opcode;
   1568 		  fixP->fx_next->fx_frag = fixP->fx_frag;
   1569 		  fixP->fx_r_type = BFD_RELOC_LARCH_ADD6;
   1570 		  fixP->fx_next->fx_r_type = BFD_RELOC_LARCH_SUB6;
   1571 		  md_number_to_chars (buf, 0x40, fixP->fx_size);
   1572 		  }
   1573 	      else
   1574 		as_fatal (_("internal: bad CFA value #%d"), subtype);
   1575 	      break;
   1576 	    }
   1577 	}
   1578       break;
   1579 
   1580     case BFD_RELOC_LARCH_B16:
   1581     case BFD_RELOC_LARCH_B21:
   1582     case BFD_RELOC_LARCH_B26:
   1583       if (fixP->fx_addsy == NULL)
   1584 	{
   1585 	  as_bad_where (fixP->fx_file, fixP->fx_line,
   1586 			_ ("Relocation against a constant."));
   1587 	}
   1588       if (S_GET_SEGMENT (fixP->fx_addsy) == seg
   1589 	  && !S_FORCE_RELOC (fixP->fx_addsy, 1))
   1590 	{
   1591 	  int64_t sym_addend = S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset;
   1592 	  int64_t pc = fixP->fx_where + fixP->fx_frag->fr_address;
   1593 	  fix_reloc_insn (fixP, sym_addend - pc, buf);
   1594 
   1595 	  /* If relax, symbol value may change at link time, so reloc need to
   1596 	     be saved.  */
   1597 	  if (!LARCH_opts.relax)
   1598 	    fixP->fx_done = 1;
   1599 	}
   1600       break;
   1601 
   1602     /* Because ADD_ULEB128/SUB_ULEB128 always occur in pairs.
   1603        So just deal with one is ok.
   1604     case BFD_RELOC_LARCH_ADD_ULEB128:  */
   1605     case BFD_RELOC_LARCH_SUB_ULEB128:
   1606       {
   1607 	unsigned int len = 0;
   1608 	len = loongarch_get_uleb128_length ((bfd_byte *)buf);
   1609 	bfd_byte *endp = (bfd_byte*) buf + len -1;
   1610 	/* Clean the uleb128 value to 0. Do not reduce the length.  */
   1611 	memset (buf, 0x80, len - 1);
   1612 	*endp = 0;
   1613 	break;
   1614       }
   1615 
   1616     default:
   1617       break;
   1618     }
   1619 }
   1620 
   1621 int
   1622 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
   1623 			       asection *segtype ATTRIBUTE_UNUSED)
   1624 {
   1625   return (fragp->fr_var = 4);
   1626 }
   1627 
   1628 /* Translate internal representation of relocation info to BFD target
   1629    format.  */
   1630 arelent *
   1631 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
   1632 {
   1633   arelent *reloc = (arelent *) xmalloc (sizeof (arelent));
   1634 
   1635   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
   1636   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1637   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1638   reloc->addend = fixp->fx_offset;
   1639 
   1640   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
   1641   if (reloc->howto == NULL)
   1642     {
   1643       as_bad_where (fixp->fx_file, fixp->fx_line,
   1644 		    _("cannot represent %s relocation in object file"),
   1645 		    bfd_get_reloc_code_name (fixp->fx_r_type));
   1646       return NULL;
   1647     }
   1648 
   1649   return reloc;
   1650 }
   1651 
   1652 /* Standard calling conventions leave the CFA at SP on entry.  */
   1653 void
   1654 loongarch_cfi_frame_initial_instructions (void)
   1655 {
   1656   cfi_add_CFA_def_cfa_register (3 /* $sp */);
   1657 }
   1658 
   1659 void
   1660 loongarch_pre_output_hook (void)
   1661 {
   1662   const frchainS *frch;
   1663   segT s;
   1664 
   1665   if (!LARCH_opts.relax)
   1666     return;
   1667 
   1668   /* Save the current segment info.  */
   1669   segT seg = now_seg;
   1670   subsegT subseg = now_subseg;
   1671 
   1672   for (s = stdoutput->sections; s; s = s->next)
   1673     for (frch = seg_info (s)->frchainP; frch; frch = frch->frch_next)
   1674       {
   1675 	fragS *frag;
   1676 
   1677 	for (frag = frch->frch_root; frag; frag = frag->fr_next)
   1678 	  {
   1679 	    if (frag->fr_type == rs_cfa)
   1680 	      {
   1681 		expressionS exp;
   1682 		expressionS *symval;
   1683 
   1684 		symval = symbol_get_value_expression (frag->fr_symbol);
   1685 		exp.X_op = O_subtract;
   1686 		exp.X_add_symbol = symval->X_add_symbol;
   1687 		exp.X_add_number = 0;
   1688 		exp.X_op_symbol = symval->X_op_symbol;
   1689 
   1690 		/* We must set the segment before creating a frag after all
   1691 		   frag chains have been chained together.  */
   1692 		subseg_set (s, frch->frch_subseg);
   1693 
   1694 		fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0,
   1695 			     BFD_RELOC_LARCH_CFA);
   1696 	      }
   1697 	  }
   1698       }
   1699 
   1700   /* Restore the original segment info.  */
   1701   subseg_set (seg, subseg);
   1702 }
   1703 
   1704 void
   1705 tc_loongarch_parse_to_dw2regnum (expressionS *exp)
   1706 {
   1707   expression_and_evaluate (exp);
   1708 }
   1709 
   1710 void
   1711 md_show_usage (FILE *stream)
   1712 {
   1713   fprintf (stream, _("LARCH options:\n"));
   1714   /* FIXME */
   1715   fprintf (stream, _("\
   1716   -mthin-add-sub	  Convert a pair of R_LARCH_ADD32/64 and R_LARCH_SUB32/64 to\n\
   1717 			  R_LARCH_32/64_PCREL as much as possible\n\
   1718 			  The option does not affect the generation of R_LARCH_32_PCREL\n\
   1719 			  relocations in .eh_frame\n"));
   1720 }
   1721 
   1722 static void
   1723 loongarch_make_nops (char *buf, bfd_vma bytes)
   1724 {
   1725   bfd_vma i = 0;
   1726 
   1727   /* Fill with 4-byte NOPs.  */
   1728   for ( ; i < bytes; i += 4)
   1729     number_to_chars_littleendian (buf + i, LARCH_NOP, 4);
   1730 }
   1731 
   1732 /* Called from md_do_align.  Used to create an alignment frag in a
   1733    code section by emitting a worst-case NOP sequence that the linker
   1734    will later relax to the correct number of NOPs.  We can't compute
   1735    the correct alignment now because of other linker relaxations.  */
   1736 
   1737 bool
   1738 loongarch_frag_align_code (int n, int max)
   1739 {
   1740   char *nops;
   1741   symbolS *s;
   1742   expressionS ex;
   1743 
   1744   bfd_vma insn_alignment = 4;
   1745   bfd_vma bytes = (bfd_vma) 1 << n;
   1746   bfd_vma worst_case_bytes = bytes - insn_alignment;
   1747 
   1748   /* If we are moving to a smaller alignment than the instruction size, then no
   1749      alignment is required.  */
   1750   if (bytes <= insn_alignment)
   1751     return true;
   1752 
   1753   /* When not relaxing, loongarch_handle_align handles code alignment.  */
   1754   if (!LARCH_opts.relax)
   1755     return false;
   1756 
   1757   nops = frag_more (worst_case_bytes);
   1758 
   1759   s = symbol_find (".Lla-relax-align");
   1760   if (s == NULL)
   1761     s = (symbolS *)local_symbol_make (".Lla-relax-align", now_seg,
   1762 				      &zero_address_frag, 0);
   1763 
   1764   ex.X_add_symbol = s;
   1765   ex.X_op = O_symbol;
   1766   ex.X_add_number = (max << 8) | n;
   1767 
   1768   loongarch_make_nops (nops, worst_case_bytes);
   1769 
   1770   fix_new_exp (frag_now, nops - frag_now->fr_literal, 0,
   1771 	       &ex, false, BFD_RELOC_LARCH_ALIGN);
   1772 
   1773   /* We need to start a new frag after the alignment which may be removed by
   1774      the linker, to prevent the assembler from computing static offsets.
   1775      This is necessary to get correct EH info.  */
   1776   frag_wane (frag_now);
   1777   frag_new (0);
   1778 
   1779   return true;
   1780 }
   1781 
   1782 /* Fill in an rs_align_code fragment.  We want to fill 'andi $r0,$r0,0'.  */
   1783 void
   1784 loongarch_handle_align (fragS *fragp)
   1785 {
   1786   /* char nop_opcode; */
   1787   char *p;
   1788   int bytes, size, excess;
   1789   valueT opcode;
   1790 
   1791   if (fragp->fr_type != rs_align_code)
   1792     return;
   1793 
   1794   struct loongarch_cl_insn nop =
   1795     { .name = "andi", .arg_strs = { "$r0", "$r0", "0", NULL } };
   1796 
   1797   get_loongarch_opcode (&nop);
   1798   gas_assert (nop.all_match);
   1799 
   1800   p = fragp->fr_literal + fragp->fr_fix;
   1801   opcode = nop.insn_bin;
   1802   size = 4;
   1803 
   1804   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
   1805   excess = bytes % size;
   1806 
   1807   gas_assert (excess < 4);
   1808   fragp->fr_fix += excess;
   1809 
   1810   while (excess-- != 0)
   1811     *p++ = 0;
   1812 
   1813   md_number_to_chars (p, opcode, size);
   1814   fragp->fr_var = size;
   1815 }
   1816 
   1817 /* Scan uleb128 subtraction expressions and insert fixups for them.
   1818    e.g., .uleb128 .L1 - .L0
   1819    Because relaxation may change the value of the subtraction, we
   1820    must resolve them at link-time.  */
   1821 
   1822 static void
   1823 loongarch_insert_uleb128_fixes (bfd *abfd ATTRIBUTE_UNUSED,
   1824 		      asection *sec, void *xxx ATTRIBUTE_UNUSED)
   1825 {
   1826   segment_info_type *seginfo = seg_info (sec);
   1827   struct frag *fragP;
   1828 
   1829   subseg_set (sec, 0);
   1830 
   1831   for (fragP = seginfo->frchainP->frch_root;
   1832        fragP; fragP = fragP->fr_next)
   1833     {
   1834       expressionS *exp, *exp_dup;
   1835 
   1836       if (fragP->fr_type != rs_leb128  || fragP->fr_symbol == NULL)
   1837 	continue;
   1838 
   1839       exp = symbol_get_value_expression (fragP->fr_symbol);
   1840 
   1841       if (exp->X_op != O_subtract)
   1842 	continue;
   1843 
   1844       /* FIXME: Skip for .sleb128.  */
   1845       if (fragP->fr_subtype != 0)
   1846 	continue;
   1847 
   1848       exp_dup = xmemdup (exp, sizeof (*exp), sizeof (*exp));
   1849       exp_dup->X_op = O_symbol;
   1850       exp_dup->X_op_symbol = NULL;
   1851 
   1852       exp_dup->X_add_symbol = exp->X_add_symbol;
   1853       fix_new_exp (fragP, fragP->fr_fix, 0,
   1854 		   exp_dup, 0, BFD_RELOC_LARCH_ADD_ULEB128);
   1855 
   1856       /* From binutils/testsuite/binutils-all/dw5.S
   1857 	 section .debug_rnglists
   1858 	 .uleb128 .Letext0-.Ltext0    Range length (*.LLRL2)
   1859     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
   1860 0000000000000015  0000000200000079 R_LARCH_ADD_ULEB128    0000000000000000 .text + 2
   1861 0000000000000015  000000020000007a R_LARCH_SUB_ULEB128    0000000000000000 .text + 0.  */
   1862 
   1863       /* Only the ADD_ULEB128 has X_add_number (Addend)?  */
   1864       exp_dup->X_add_number = 0;
   1865       exp_dup->X_add_symbol = exp->X_op_symbol;
   1866       fix_new_exp (fragP, fragP->fr_fix, 0,
   1867 		   exp_dup, 0, BFD_RELOC_LARCH_SUB_ULEB128);
   1868     }
   1869 }
   1870 
   1871 void
   1872 loongarch_md_finish (void)
   1873 {
   1874   /* Insert relocations for uleb128 directives, so the values can be recomputed
   1875      at link time.  */
   1876   if (LARCH_opts.relax)
   1877     bfd_map_over_sections (stdoutput, loongarch_insert_uleb128_fixes, NULL);
   1878 }
   1879 
   1880 void
   1881 loongarch_elf_final_processing (void)
   1882 {
   1883   elf_elfheader (stdoutput)->e_flags = LARCH_opts.ase_abi;
   1884 }
   1885 
   1886 /* Compute the length of a branch sequence, and adjust the stored length
   1887    accordingly.  If FRAGP is NULL, the worst-case length is returned.  */
   1888 static unsigned
   1889 loongarch_relaxed_branch_length (fragS *fragp, asection *sec, int update)
   1890 {
   1891   int length = 4;
   1892 
   1893   if (!fragp)
   1894     return 8;
   1895 
   1896   if (fragp->fr_symbol != NULL
   1897       && S_IS_DEFINED (fragp->fr_symbol)
   1898       && !S_IS_WEAK (fragp->fr_symbol)
   1899       && sec == S_GET_SEGMENT (fragp->fr_symbol))
   1900     {
   1901       offsetT val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
   1902 
   1903       val -= fragp->fr_address + fragp->fr_fix;
   1904 
   1905       if (RELAX_BRANCH_16 == fragp->fr_subtype
   1906 	  && OUT_OF_RANGE (val, 16, 2))
   1907 	{
   1908 	  length = 8;
   1909 	  if (update)
   1910 	    fragp->fr_subtype = RELAX_BRANCH_26;
   1911 	}
   1912 
   1913       if (RELAX_BRANCH_21 == fragp->fr_subtype
   1914 	  && OUT_OF_RANGE (val, 21, 2))
   1915 	{
   1916 	  length = 8;
   1917 	  if (update)
   1918 	    fragp->fr_subtype = RELAX_BRANCH_26;
   1919 	}
   1920 
   1921       if (RELAX_BRANCH_26 == fragp->fr_subtype)
   1922 	length = 8;
   1923     }
   1924 
   1925   return length;
   1926 }
   1927 
   1928 int
   1929 loongarch_relax_frag (asection *sec ATTRIBUTE_UNUSED,
   1930 		      fragS *fragp ATTRIBUTE_UNUSED,
   1931 		      long stretch ATTRIBUTE_UNUSED)
   1932 {
   1933   if (RELAX_BRANCH (fragp->fr_subtype))
   1934     {
   1935       offsetT old_var = fragp->fr_var;
   1936       fragp->fr_var = loongarch_relaxed_branch_length (fragp, sec, true);
   1937       return fragp->fr_var - old_var;
   1938     }
   1939   return 0;
   1940 }
   1941 
   1942 /* Expand far branches to multi-instruction sequences.
   1943    Branch instructions:
   1944    beq, bne, blt, bgt, bltz, bgtz, ble, bge, blez, bgez
   1945    bltu, bgtu, bleu, bgeu
   1946    beqz, bnez, bceqz, bcnez.  */
   1947 
   1948 static void
   1949 loongarch_convert_frag_branch (fragS *fragp)
   1950 {
   1951   bfd_byte *buf;
   1952   expressionS exp;
   1953   fixS *fixp;
   1954   insn_t insn;
   1955 
   1956   buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
   1957 
   1958   exp.X_op = O_symbol;
   1959   exp.X_add_symbol = fragp->fr_symbol;
   1960   exp.X_add_number = fragp->fr_offset;
   1961 
   1962   gas_assert ((fragp->fr_subtype & 0xf) == fragp->fr_var);
   1963 
   1964   /* blt $t0, $t1, .L1
   1965      nop
   1966      change to:
   1967      bge $t0, $t1, .L2
   1968      b .L1
   1969    .L2:
   1970      nop  */
   1971   switch (fragp->fr_subtype)
   1972     {
   1973     case RELAX_BRANCH_26:
   1974       insn = bfd_getl32 (buf);
   1975       /* Invert the branch condition.  */
   1976       if (LARCH_FLOAT_BRANCH == (insn & LARCH_BRANCH_OPCODE_MASK))
   1977 	insn ^= LARCH_FLOAT_BRANCH_INVERT_BIT;
   1978       else
   1979 	insn ^= LARCH_BRANCH_INVERT_BIT;
   1980       insn |= ENCODE_BRANCH16_IMM (8);  /* Set target to PC + 8.  */
   1981       bfd_putl32 (insn, buf);
   1982       buf += 4;
   1983 
   1984       /* Add the B instruction and jump to the original target.  */
   1985       bfd_putl32 (LARCH_B, buf);
   1986       fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
   1987 			  4, &exp, false, BFD_RELOC_LARCH_B26);
   1988       buf += 4;
   1989       break;
   1990     case RELAX_BRANCH_21:
   1991       fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
   1992 			  4, &exp, false, BFD_RELOC_LARCH_B21);
   1993       buf += 4;
   1994       break;
   1995     case RELAX_BRANCH_16:
   1996       fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
   1997 			  4, &exp, false, BFD_RELOC_LARCH_B16);
   1998       buf += 4;
   1999       break;
   2000 
   2001     default:
   2002       abort();
   2003     }
   2004 
   2005   fixp->fx_file = fragp->fr_file;
   2006   fixp->fx_line = fragp->fr_line;
   2007 
   2008   gas_assert (buf == (bfd_byte *)fragp->fr_literal
   2009 	      + fragp->fr_fix + fragp->fr_var);
   2010 
   2011   fragp->fr_fix += fragp->fr_var;
   2012 }
   2013 
   2014 /* Relax a machine dependent frag.  This returns the amount by which
   2015    the current size of the frag should change.  */
   2016 
   2017 void
   2018 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
   2019 		 fragS *fragp)
   2020 {
   2021   gas_assert (RELAX_BRANCH (fragp->fr_subtype));
   2022   loongarch_convert_frag_branch (fragp);
   2023 }
   2024