;; Machine description for T-Head vendor extensions ;; Copyright (C) 2021-2024 Free Software Foundation, Inc. ;; 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 ;; . ;; XTheadBa (define_insn "*th_addsl4" [(set (match_operand:X 0 "register_operand" "=r") (plus:X (ashift:X (match_operand:X 1 "register_operand" "r") (match_operand:QI 2 "imm123_operand" "Ds3")) (match_operand:X 3 "register_operand" "r")))] "TARGET_XTHEADBA" "th.addsl\t%0,%3,%1,%2" [(set_attr "type" "bitmanip") (set_attr "mode" "")]) ;; XTheadBb (define_insn "*th_srri3" [(set (match_operand:GPR 0 "register_operand" "=r") (rotatert:GPR (match_operand:GPR 1 "register_operand" "r") (match_operand 2 "const_int_operand" "n")))] "TARGET_XTHEADBB && (TARGET_64BIT || mode == SImode)" { bool wform = TARGET_64BIT && (mode == SImode); operands[2] = GEN_INT (INTVAL (operands[2]) & (GET_MODE_BITSIZE (mode) - 1)); return wform ? "th.srriw\t%0,%1,%2" : "th.srri\t%0,%1,%2"; } [(set_attr "type" "bitmanip") (set_attr "mode" "")]) (define_insn "*th_ext4" [(set (match_operand:GPR 0 "register_operand" "=r") (sign_extract:GPR (match_operand:GPR 1 "register_operand" "r") (match_operand 2 "const_int_operand") (match_operand 3 "const_int_operand")))] "TARGET_XTHEADBB" { operands[2] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[3]) - 1); return "th.ext\t%0,%1,%2,%3"; } [(set_attr "type" "bitmanip") (set_attr "mode" "")]) (define_insn "*extendhi2_th_ext" [(set (match_operand:SUPERQI 0 "register_operand" "=r,r") (sign_extend:SUPERQI (match_operand:HI 1 "nonimmediate_operand" "r,m")))] "TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX" "@ th.ext\t%0,%1,15,0 lh\t%0,%1" [(set_attr "type" "bitmanip,load") (set_attr "mode" "")]) (define_insn "*extendqi2_th_ext" [(set (match_operand:SUPERQI 0 "register_operand" "=r,r") (sign_extend:SUPERQI (match_operand:QI 1 "nonimmediate_operand" "r,m")))] "TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX" "@ th.ext\t%0,%1,7,0 lb\t%0,%1" [(set_attr "type" "bitmanip,load") (set_attr "mode" "")]) (define_insn "*th_extu4" [(set (match_operand:GPR 0 "register_operand" "=r") (zero_extract:GPR (match_operand:GPR 1 "register_operand" "r") (match_operand 2 "const_int_operand") (match_operand 3 "const_int_operand")))] "TARGET_XTHEADBB && (UINTVAL (operands[2]) + UINTVAL (operands[3]) <= GET_MODE_BITSIZE (mode))" { operands[2] = GEN_INT (INTVAL (operands[2]) + INTVAL (operands[3]) - 1); return "th.extu\t%0,%1,%2,%3"; } [(set_attr "type" "bitmanip") (set_attr "mode" "")]) (define_insn "*zero_extendsidi2_th_extu" [(set (match_operand:DI 0 "register_operand" "=r,r") (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "r,m")))] "TARGET_64BIT && TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX" "@ th.extu\t%0,%1,31,0 lwu\t%0,%1" [(set_attr "type" "bitmanip,load") (set_attr "mode" "DI")]) (define_insn "*zero_extendhi2_th_extu" [(set (match_operand:GPR 0 "register_operand" "=r,r") (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" "r,m")))] "TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX" "@ th.extu\t%0,%1,15,0 lhu\t%0,%1" [(set_attr "type" "bitmanip,load") (set_attr "mode" "")]) (define_insn "*th_clz2" [(set (match_operand:X 0 "register_operand" "=r") (clz:X (match_operand:X 1 "register_operand" "r")))] "TARGET_XTHEADBB" "th.ff1\t%0,%1" [(set_attr "type" "bitmanip") (set_attr "mode" "")]) (define_insn "th_rev2" [(set (match_operand:GPR 0 "register_operand" "=r") (bswap:GPR (match_operand:GPR 1 "register_operand" "r")))] "TARGET_XTHEADBB && (TARGET_64BIT || mode == SImode)" { bool wform = TARGET_64BIT && (mode == SImode); return wform ? "th.revw\t%0,%1" : "th.rev\t%0,%1"; } [(set_attr "type" "bitmanip") (set_attr "mode" "")]) (define_insn "th_tstnbz2" [(set (match_operand:X 0 "register_operand" "=r") (unspec:X [(match_operand:X 1 "register_operand" "r")] UNSPEC_ORC_B))] "TARGET_XTHEADBB" "th.tstnbz\t%0,%1" [(set_attr "type" "bitmanip")]) ;; XTheadBs (define_insn "*th_tst3" [(set (match_operand:X 0 "register_operand" "=r") (zero_extract:X (match_operand:X 1 "register_operand" "r") (const_int 1) (match_operand 2 "const_int_operand" "n")))] "TARGET_XTHEADBS && UINTVAL (operands[2]) < GET_MODE_BITSIZE (mode)" "th.tst\t%0,%1,%2" [(set_attr "type" "bitmanip")]) ;; XTheadCondMov (define_insn "*th_cond_mov" [(set (match_operand:GPR 0 "register_operand" "=r,r") (if_then_else:GPR (match_operator 4 "equality_operator" [(match_operand:GPR2 1 "register_operand" "r,r") (const_int 0)]) (match_operand:GPR 2 "reg_or_0_operand" "rJ,0") (match_operand:GPR 3 "reg_or_0_operand" "0,rJ")))] "TARGET_XTHEADCONDMOV" { if (which_alternative == 0) return "th.mv%C4z\t%0,%z2,%1"; /* Invert the condition and take else-block. */ rtx_code code = GET_CODE (operands[4]); code = (code == EQ) ? NE : EQ; operands[4] = gen_rtx_fmt_ee (code, VOIDmode, operands[1], const0_rtx); return "th.mv%C4z\t%0,%z3,%1"; } [(set_attr "type" "condmove") (set_attr "mode" "")]) ;; XTheadFmv ;; In RV32, we lack fmv.x.d and fmv.d.x, but XTheadFmv has instructions ;; that cover this case. (define_insn "th_fmv_hw_w_x" [(set (match_operand:DF 0 "register_operand" "=f") (unspec:DF [(match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "register_operand" "r")] UNSPEC_XTHEADFMV))] "!TARGET_64BIT && TARGET_XTHEADFMV" "fmv.w.x\t%0,%2\n\tth.fmv.hw.x\t%0,%1" [(set_attr "move_type" "move") (set_attr "type" "fmove") (set_attr "mode" "DF")]) (define_insn "th_fmv_x_w" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:DF 1 "register_operand" "f")] UNSPEC_XTHEADFMV))] "!TARGET_64BIT && TARGET_XTHEADFMV" "fmv.x.w\t%0,%1" [(set_attr "move_type" "move") (set_attr "type" "fmove") (set_attr "mode" "DF")]) (define_insn "th_fmv_x_hw" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:DF 1 "register_operand" "f")] UNSPEC_XTHEADFMV_HW))] "!TARGET_64BIT && TARGET_XTHEADFMV" "th.fmv.x.hw\t%0,%1" [(set_attr "move_type" "move") (set_attr "type" "fmove") (set_attr "mode" "DF")]) ;; XTheadInt (define_constants [(T0_REGNUM 5) (T1_REGNUM 6) (T2_REGNUM 7) (A0_REGNUM 10) (A1_REGNUM 11) (A2_REGNUM 12) (A3_REGNUM 13) (A4_REGNUM 14) (A5_REGNUM 15) (A6_REGNUM 16) (A7_REGNUM 17) (T3_REGNUM 28) (T4_REGNUM 29) (T5_REGNUM 30) (T6_REGNUM 31) ]) (define_insn "th_int_push" [(unspec_volatile [(const_int 0)] UNSPECV_XTHEADINT_PUSH) (use (reg:SI RETURN_ADDR_REGNUM)) (use (reg:SI T0_REGNUM)) (use (reg:SI T1_REGNUM)) (use (reg:SI T2_REGNUM)) (use (reg:SI A0_REGNUM)) (use (reg:SI A1_REGNUM)) (use (reg:SI A2_REGNUM)) (use (reg:SI A3_REGNUM)) (use (reg:SI A4_REGNUM)) (use (reg:SI A5_REGNUM)) (use (reg:SI A6_REGNUM)) (use (reg:SI A7_REGNUM)) (use (reg:SI T3_REGNUM)) (use (reg:SI T4_REGNUM)) (use (reg:SI T5_REGNUM)) (use (reg:SI T6_REGNUM))] "TARGET_XTHEADINT && !TARGET_64BIT" "th.ipush" [(set_attr "type" "store") (set_attr "mode" "SI")]) (define_insn "th_int_pop" [(unspec_volatile [(const_int 0)] UNSPECV_XTHEADINT_POP) (clobber (reg:SI RETURN_ADDR_REGNUM)) (clobber (reg:SI T0_REGNUM)) (clobber (reg:SI T1_REGNUM)) (clobber (reg:SI T2_REGNUM)) (clobber (reg:SI A0_REGNUM)) (clobber (reg:SI A1_REGNUM)) (clobber (reg:SI A2_REGNUM)) (clobber (reg:SI A3_REGNUM)) (clobber (reg:SI A4_REGNUM)) (clobber (reg:SI A5_REGNUM)) (clobber (reg:SI A6_REGNUM)) (clobber (reg:SI A7_REGNUM)) (clobber (reg:SI T3_REGNUM)) (clobber (reg:SI T4_REGNUM)) (clobber (reg:SI T5_REGNUM)) (clobber (reg:SI T6_REGNUM)) (return)] "TARGET_XTHEADINT && !TARGET_64BIT" "th.ipop" [(set_attr "type" "ret") (set_attr "mode" "SI")]) ;; XTheadMac (define_insn "*th_mula" [(set (match_operand:X 0 "register_operand" "=r") (plus:X (mult:X (match_operand:X 1 "register_operand" "r") (match_operand:X 2 "register_operand" "r")) (match_operand:X 3 "register_operand" "0")))] "TARGET_XTHEADMAC" "th.mula\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "")] ) (define_insn "*th_mulawsi" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "register_operand" "r")) (match_operand:SI 3 "register_operand" "0"))))] "TARGET_XTHEADMAC && TARGET_64BIT" "th.mulaw\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_mulawsi2" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "register_operand" "r")) (match_operand:SI 3 "register_operand" "0")))] "TARGET_XTHEADMAC && TARGET_64BIT" "th.mulaw\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_maddhisi4" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" " r")) (sign_extend:SI (match_operand:HI 2 "register_operand" " r"))) (match_operand:SI 3 "register_operand" " 0")))] "TARGET_XTHEADMAC" "th.mulah\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_sextw_maddhisi4" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (plus:SI (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" " r")) (sign_extend:SI (match_operand:HI 2 "register_operand" " r"))) (match_operand:SI 3 "register_operand" " 0"))))] "TARGET_XTHEADMAC && TARGET_64BIT" "th.mulah\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_muls" [(set (match_operand:X 0 "register_operand" "=r") (minus:X (match_operand:X 3 "register_operand" "0") (mult:X (match_operand:X 1 "register_operand" "r") (match_operand:X 2 "register_operand" "r"))))] "TARGET_XTHEADMAC" "th.muls\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "")] ) (define_insn "*th_mulswsi" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (minus:SI (match_operand:SI 3 "register_operand" "0") (mult:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "register_operand" "r")))))] "TARGET_XTHEADMAC && TARGET_64BIT" "th.mulsw\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_mulswsi2" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 3 "register_operand" "0") (mult:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "register_operand" "r"))))] "TARGET_XTHEADMAC && TARGET_64BIT" "th.mulsw\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_msubhisi4" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 3 "register_operand" " 0") (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" " r")) (sign_extend:SI (match_operand:HI 2 "register_operand" " r")))))] "TARGET_XTHEADMAC" "th.mulsh\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) (define_insn "*th_sextw_msubhisi4" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (minus:SI (match_operand:SI 3 "register_operand" " 0") (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" " r")) (sign_extend:SI (match_operand:HI 2 "register_operand" " r"))))))] "TARGET_XTHEADMAC && TARGET_64BIT" "th.mulsh\\t%0,%1,%2" [(set_attr "type" "imul") (set_attr "mode" "SI")] ) ;; XTheadMemPair ;; MEMPAIR load 64/32 bit (define_insn "*th_mempair_load_2" [(set (match_operand:GPR 0 "register_operand" "=r") (match_operand:GPR 1 "memory_operand" "m")) (set (match_operand:GPR 2 "register_operand" "=r") (match_operand:GPR 3 "memory_operand" "m"))] "TARGET_XTHEADMEMPAIR && reload_completed && th_mempair_operands_p (operands, true, mode)" { return th_mempair_output_move (operands, true, mode, UNKNOWN); } [(set_attr "move_type" "load") (set_attr "type" "load") (set_attr "mode" "")]) ;; MEMPAIR store 64/32 bit (define_insn "*th_mempair_store_2" [(set (match_operand:GPR 0 "memory_operand" "=m") (match_operand:GPR 1 "register_operand" "r")) (set (match_operand:GPR 2 "memory_operand" "=m") (match_operand:GPR 3 "register_operand" "r"))] "TARGET_XTHEADMEMPAIR && reload_completed && th_mempair_operands_p (operands, false, mode)" { return th_mempair_output_move (operands, false, mode, UNKNOWN); } [(set_attr "move_type" "store") (set_attr "type" "store") (set_attr "mode" "")]) ;; MEMPAIR load DI extended signed SI (define_insn "*th_mempair_load_extendsidi2" [(set (match_operand:DI 0 "register_operand" "=r") (sign_extend:DI (match_operand:SI 1 "memory_operand" "m"))) (set (match_operand:DI 2 "register_operand" "=r") (sign_extend:DI (match_operand:SI 3 "memory_operand" "m")))] "TARGET_XTHEADMEMPAIR && TARGET_64BIT && reload_completed && th_mempair_operands_p (operands, true, SImode)" { return th_mempair_output_move (operands, true, SImode, SIGN_EXTEND); } [(set_attr "move_type" "load") (set_attr "type" "load") (set_attr "mode" "DI") (set_attr "length" "8")]) ;; MEMPAIR load DI extended unsigned SI (define_insn "*th_mempair_load_zero_extendsidi2" [(set (match_operand:DI 0 "register_operand" "=r") (zero_extend:DI (match_operand:SI 1 "memory_operand" "m"))) (set (match_operand:DI 2 "register_operand" "=r") (zero_extend:DI (match_operand:SI 3 "memory_operand" "m")))] "TARGET_XTHEADMEMPAIR && TARGET_64BIT && reload_completed && th_mempair_operands_p (operands, true, SImode)" { return th_mempair_output_move (operands, true, SImode, ZERO_EXTEND); } [(set_attr "move_type" "load") (set_attr "type" "load") (set_attr "mode" "DI") (set_attr "length" "8")]) ;; XTheadMemIdx (define_insn "*th_memidx_zero_extendqi2" [(set (match_operand:SUPERQI 0 "register_operand" "=r,r,r,r,r,r") (zero_extend:SUPERQI (match_operand:QI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_XTHEADMEMIDX" "@ andi\t%0,%1,0xff th.lbuia\t%0,%1 th.lbuib\t%0,%1 th.lrbu\t%0,%1 th.lurbu\t%0,%1 lbu\t%0,%1" [(set_attr "move_type" "andi,load,load,load,load,load") (set_attr "mode" "")]) (define_insn "*th_memidx_extendsidi2" [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r") (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_64BIT && TARGET_XTHEADMEMIDX" "@ sext.w\t%0,%1 th.lwia\t%0,%1 th.lwib\t%0,%1 th.lrw\t%0,%1 th.lurw\t%0,%1 lw\t%0,%1" [(set_attr "move_type" "move,load,load,load,load,load") (set_attr "mode" "DI")]) ;; XTheadMemIdx (without XTheadBb) (define_insn_and_split "*th_memidx_zero_extendsidi2" [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r") (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_64BIT && TARGET_XTHEADMEMIDX && !TARGET_XTHEADBB" "@ # th.lwuia\t%0,%1 th.lwuib\t%0,%1 th.lrwu\t%0,%1 th.lurwu\t%0,%1 lwu\t%0,%1" "&& reload_completed && REG_P (operands[1]) && !paradoxical_subreg_p (operands[0])" [(set (match_dup 0) (ashift:DI (match_dup 1) (const_int 32))) (set (match_dup 0) (lshiftrt:DI (match_dup 0) (const_int 32)))] { operands[1] = gen_lowpart (DImode, operands[1]); } [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "DI")]) (define_insn_and_split "*th_memidx_zero_extendhi2" [(set (match_operand:GPR 0 "register_operand" "=r,r,r,r,r,r") (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_XTHEADMEMIDX && !TARGET_XTHEADBB" "@ # th.lhuia\t%0,%1 th.lhuib\t%0,%1 th.lrhu\t%0,%1 th.lurhu\t%0,%1 lhu\t%0,%1" "&& reload_completed && REG_P (operands[1]) && !paradoxical_subreg_p (operands[0])" [(set (match_dup 0) (ashift:GPR (match_dup 1) (match_dup 2))) (set (match_dup 0) (lshiftrt:GPR (match_dup 0) (match_dup 2)))] { operands[1] = gen_lowpart (mode, operands[1]); operands[2] = GEN_INT(GET_MODE_BITSIZE(mode) - 16); } [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "")]) (define_insn_and_split "*th_memidx_extend2" [(set (match_operand:SUPERQI 0 "register_operand" "=r,r,r,r,r,r") (sign_extend:SUPERQI (match_operand:SHORT 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_XTHEADMEMIDX && !TARGET_XTHEADBB" "@ # th.lia\t%0,%1 th.lib\t%0,%1 th.lr\t%0,%1 th.lur\t%0,%1 l\t%0,%1" "&& reload_completed && REG_P (operands[1]) && !paradoxical_subreg_p (operands[0])" [(set (match_dup 0) (ashift:SI (match_dup 1) (match_dup 2))) (set (match_dup 0) (ashiftrt:SI (match_dup 0) (match_dup 2)))] { operands[0] = gen_lowpart (SImode, operands[0]); operands[1] = gen_lowpart (SImode, operands[1]); operands[2] = GEN_INT (GET_MODE_BITSIZE (SImode) - GET_MODE_BITSIZE (mode)); } [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "SI")]) ;; XTheadMemIdx (with XTheadBb) (define_insn "*th_memidx_bb_zero_extendsidi2" [(set (match_operand:DI 0 "register_operand" "=r,r,r,r,r,r") (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_64BIT && TARGET_XTHEADMEMIDX && TARGET_XTHEADBB" "@ th.extu\t%0,%1,31,0 th.lwuia\t%0,%1 th.lwuib\t%0,%1 th.lrwu\t%0,%1 th.lurwu\t%0,%1 lwu\t%0,%1" [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "DI")]) (define_insn "*th_memidx_bb_zero_extendhi2" [(set (match_operand:GPR 0 "register_operand" "=r,r,r,r,r,r") (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_XTHEADMEMIDX && TARGET_XTHEADBB" "@ th.extu\t%0,%1,15,0 th.lhuia\t%0,%1 th.lhuib\t%0,%1 th.lrhu\t%0,%1 th.lurhu\t%0,%1 lhu\t%0,%1" [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "")]) (define_insn "*th_memidx_bb_extendhi2" [(set (match_operand:GPR 0 "register_operand" "=r,r,r,r,r,r") (sign_extend:GPR (match_operand:HI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_XTHEADMEMIDX && TARGET_XTHEADBB" "@ th.ext\t%0,%1,15,0 th.lhia\t%0,%1 th.lhib\t%0,%1 th.lrh\t%0,%1 th.lurh\t%0,%1 lh\t%0,%1" [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "")]) (define_insn "*th_memidx_bb_extendqi2" [(set (match_operand:SUPERQI 0 "register_operand" "=r,r,r,r,r,r") (sign_extend:SUPERQI (match_operand:QI 1 "nonimmediate_operand" " r,th_m_mia,th_m_mib,th_m_mir,th_m_miu,m")))] "TARGET_XTHEADMEMIDX && TARGET_XTHEADBB" "@ th.ext\t%0,%1,7,0 th.lbia\t%0,%1 th.lbib\t%0,%1 th.lrb\t%0,%1 th.lurb\t%0,%1 lb\t%0,%1" [(set_attr "move_type" "shift_shift,load,load,load,load,load") (set_attr "mode" "")]) (include "thead-peephole.md")