|
93 | 93 | ARC64_VUNSPEC_ATOOPS
|
94 | 94 |
|
95 | 95 | ARC64_UNSPEC_MEMBAR
|
| 96 | + ARC64_UNSPEC_FLS |
96 | 97 | ])
|
97 | 98 |
|
98 | 99 | (include "constraints.md")
|
|
114 | 115 | ;; Iterator for all integer modes (up to 64-bit)
|
115 | 116 | (define_mode_iterator ALLI [QI HI SI DI])
|
116 | 117 |
|
| 118 | +;; Iterator for HI SI and DI modes |
| 119 | +(define_mode_iterator EPI [HI SI DI]) |
| 120 | + |
117 | 121 | ;; This mode iterator allows :P to be used for patterns that operate on
|
118 | 122 | ;; pointer-sized quantities. Exactly one of the two alternatives will match.
|
119 | 123 | (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")])
|
|
238 | 242 | (define_attr "type" "abs, adcl, add, addhl, addl, and, andl, asl,
|
239 | 243 | asll, asr, asrl, atldop, atldlop, bic, bl, block, bmsk, branch,
|
240 | 244 | branchcc, brk, bset, bsetl, btst, bxor, bxorl, compare, dbnz, dmb, ex,
|
241 |
| -div, divl, ext, flag, jl, jump, ld, llock, lsr, lsrl, lr, max, maxl, |
242 |
| -min, minl, move, movecc, mod, modl, neg, nop, norm, normh, norml, mpy, |
243 |
| -mpyl, not, notl, or, orl, return, ror,rol, sbcl, scond, setcc, sex, |
244 |
| -sr, st, sub, subl, swape, swapel, sync, trap, udiv, udivl, umod, |
245 |
| -umodl, unknown, xbfu, xor, xorl" |
| 245 | +div, divl, ext, ffs, fls, flag, jl, jump, ld, llock, lsr, lsrl, lr, |
| 246 | +max, maxl, min, minl, move, movecc, mod, modl, neg, nop, norm, normh, |
| 247 | +norml, mpy, mpyl, not, notl, or, orl, return, ror,rol, sbcl, scond, |
| 248 | +setcc, sex, sr, st, sub, subl, swape, swapel, sync, trap, udiv, udivl, |
| 249 | +umod, umodl, unknown, xbfu, xor, xorl" |
246 | 250 | (const_string "unknown"))
|
247 | 251 |
|
248 | 252 | (define_attr "iscompact" "yes,no,maybe" (const_string "no"))
|
@@ -1494,6 +1498,47 @@ umodl, unknown, xbfu, xor, xorl"
|
1494 | 1498 | (set_attr "length" "4,8")
|
1495 | 1499 | (set_attr "predicable" "no")])
|
1496 | 1500 |
|
| 1501 | +;; ------------------------------------------------------------------- |
| 1502 | +;; Bitscan |
| 1503 | +;; ------------------------------------------------------------------- |
| 1504 | + |
| 1505 | +(define_insn "clrsb<mode>2" |
| 1506 | + [(set (match_operand:EPI 0 "register_operand" "=r") |
| 1507 | + (clrsb:EPI (match_operand:EPI 1 "register_operand" "r")))] |
| 1508 | + "TARGET_BITSCAN" |
| 1509 | + "norm<sfxtab>\\t%0,%1" |
| 1510 | + [(set_attr "length" "4") |
| 1511 | + (set_attr "type" "norm<sfxtab>")]) |
| 1512 | + |
| 1513 | +(define_expand "clz<mode>2" |
| 1514 | + [(match_operand:GPI 0 "register_operand") |
| 1515 | + (match_operand:GPI 1 "register_operand")] |
| 1516 | + "TARGET_BITSCAN" |
| 1517 | + { |
| 1518 | + rtx tmp = gen_reg_rtx (<MODE>mode); |
| 1519 | + unsigned int size = GET_MODE_SIZE (<MODE>mode) * BITS_PER_UNIT - 1; |
| 1520 | + emit_insn (gen_arc64_fls<sfxtab>2 (tmp, operands[1])); |
| 1521 | + emit_insn (gen_sub<mode>3 (operands[0], GEN_INT (size), tmp)); |
| 1522 | + DONE; |
| 1523 | + }) |
| 1524 | + |
| 1525 | +(define_insn "ctz<mode>2" |
| 1526 | + [(set (match_operand:GPI 0 "register_operand" "=r") |
| 1527 | + (ctz:GPI (match_operand:GPI 1 "register_operand" "r")))] |
| 1528 | + "TARGET_BITSCAN" |
| 1529 | + "ffs<sfxtab>\\t%0,%1" |
| 1530 | + [(set_attr "length" "4") |
| 1531 | + (set_attr "type" "ffs")]) |
| 1532 | + |
| 1533 | +(define_insn "arc64_fls<sfxtab>2" |
| 1534 | + [(set (match_operand:GPI 0 "register_operand" "=r") |
| 1535 | + (unspec:GPI [(match_operand:GPI 1 "register_operand" "r")] |
| 1536 | + ARC64_UNSPEC_FLS))] |
| 1537 | + "TARGET_BITSCAN" |
| 1538 | + "fls<sfxtab>\\t%0,%1" |
| 1539 | + [(set_attr "length" "4") |
| 1540 | + (set_attr "type" "fls")]) |
| 1541 | + |
1497 | 1542 | ;; -------------------------------------------------------------------
|
1498 | 1543 | ;; Floating-point intrinsics
|
1499 | 1544 | ;; -------------------------------------------------------------------
|
|
0 commit comments