Skip to content

Commit 8576b07

Browse files
Claudiu Zissulescuartemiy-volkov
authored andcommitted
arc64: Add MAC/MACD/VMAC2H signed/unsigned instructions
1 parent 33ed791 commit 8576b07

File tree

4 files changed

+377
-42
lines changed

4 files changed

+377
-42
lines changed

gcc/config/arc64/arc64.c

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2522,6 +2522,97 @@ arc64_reorg (void)
25222522
compute_bb_for_insn ();
25232523
df_analyze ();
25242524
reorg_loops (true, &arc64_doloop_hooks);
2525+
2526+
/* Search MAC instructions and remove the super-flu move from
2527+
accumulator to a register. Hence, we try to repair what we do in
2528+
madd expands or in mac* splits. */
2529+
for (rtx_insn *insn = get_insns (); insn; insn = next_real_insn (insn))
2530+
{
2531+
rtx op0, op1, op2, tmp;
2532+
enum insn_code icode = CODE_FOR_nothing;
2533+
machine_mode mode = E_VOIDmode;
2534+
2535+
if (!INSN_P (insn))
2536+
continue;
2537+
2538+
/* 1st find the MAC instruction with null (accumulator)
2539+
output. */
2540+
switch (INSN_CODE (insn))
2541+
{
2542+
case CODE_FOR_umachi0:
2543+
icode = CODE_FOR_umachi;
2544+
mode = E_SImode;
2545+
break;
2546+
2547+
case CODE_FOR_machi0:
2548+
icode = CODE_FOR_machi;
2549+
mode = E_SImode;
2550+
break;
2551+
2552+
case CODE_FOR_umacd0:
2553+
icode = CODE_FOR_umacd;
2554+
mode = E_DImode;
2555+
break;
2556+
2557+
case CODE_FOR_macd0:
2558+
icode = CODE_FOR_macd;
2559+
mode = E_DImode;
2560+
break;
2561+
2562+
case CODE_FOR_macsi0:
2563+
icode = CODE_FOR_macsi;
2564+
mode = E_SImode;
2565+
break;
2566+
2567+
default:
2568+
continue;
2569+
}
2570+
2571+
gcc_assert (REGNO (SET_DEST (PATTERN (insn))) == R58_REGNUM);
2572+
rtx_insn *nxt = next_real_insn (insn);
2573+
2574+
/* 2nd Check if it is a move instruction. */
2575+
tmp = PATTERN (nxt);
2576+
if (GET_CODE (tmp) != SET
2577+
|| (GET_CODE (SET_SRC (tmp)) != REG)
2578+
|| (GET_CODE (SET_DEST (tmp)) != REG))
2579+
continue;
2580+
2581+
op0 = SET_DEST (tmp);
2582+
op1 = SET_SRC (tmp);
2583+
if (REGNO (op1) != R58_REGNUM)
2584+
continue;
2585+
2586+
/* Make the new MAC instruction. */
2587+
switch (INSN_CODE (insn))
2588+
{
2589+
case CODE_FOR_umachi0:
2590+
case CODE_FOR_umacd0:
2591+
case CODE_FOR_machi0:
2592+
case CODE_FOR_macd0:
2593+
tmp = SET_SRC (PATTERN (insn));
2594+
op1 = XEXP (XEXP (XEXP (tmp, 0), 0), 0);
2595+
op2 = XEXP (XEXP (XEXP (tmp, 0), 1), 0);
2596+
break;
2597+
2598+
case CODE_FOR_macsi0:
2599+
tmp = SET_SRC (PATTERN (insn));
2600+
op1 = XEXP (XEXP (tmp, 0), 0);
2601+
op2 = XEXP (XEXP (tmp, 0), 1);
2602+
break;
2603+
2604+
default:
2605+
gcc_unreachable ();
2606+
}
2607+
2608+
emit_insn_before (GEN_FCN (icode) (op0, op1, op2,
2609+
gen_rtx_REG (mode, R58_REGNUM)),
2610+
insn);
2611+
2612+
/* Remove the old MAC and MOV instruction. */
2613+
set_insn_deleted (insn);
2614+
set_insn_deleted (nxt);
2615+
}
25252616
}
25262617

25272618
/* Expand a compare and swap pattern. */

gcc/config/arc64/arc64.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,9 @@ dmpywh, ex, div, divl, ext, fadd, fcmp, fsub, fmul, fdiv, fh2s, fmin,
425425
fmax, fsgnj, fsgnjx, fsgnjn, fmadd, fmov, fmsub, fnmadd, fnmsub,
426426
fsqrt, frnd, fs2d, fs2h, fd2s, int2fp, uint2fp, fp2int, fp2uint, ffs,
427427
fls, flag, jl, jump, ld, llock, lsr, lsrl, lr, max, maxl, min, minl,
428-
move, movecc, mod, modl, neg, nop, norm, normh, norml, mpy, mpyl, not,
429-
notl, or, orl, return, ror,rol, sbcl, scond, setcc, sex, sr, st, sub,
430-
subl, swap, swapl, swape, swapel, sync, trap, qmach, qmpyh, udiv,
428+
move, movecc, mod, modl, neg, nop, norm, normh, norml, mac, mpy, mpyl,
429+
not, notl, or, orl, return, ror,rol, sbcl, scond, setcc, sex, sr, st,
430+
sub, subl, swap, swapl, swape, swapel, sync, trap, qmach, qmpyh, udiv,
431431
udivl, umod, umodl, unknown, vadd, vsub, vmac2h, vmpy2h, vfadd, vfext,
432432
vfins, vfsub, vfmul, vfdiv, vfrep, vpack, xbfu, xor, xorl"
433433
(const_string "unknown"))

0 commit comments

Comments
 (0)