本文整理汇总了C++中NEXT_INSN函数的典型用法代码示例。如果您正苦于以下问题:C++ NEXT_INSN函数的具体用法?C++ NEXT_INSN怎么用?C++ NEXT_INSN使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NEXT_INSN函数的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: all_uses_available_at
/* Check if all uses in DEF_INSN can be used in TARGET_INSN. This
would require full computation of available expressions;
we check only restricted conditions, see use_killed_between. */
static bool
all_uses_available_at (rtx_insn *def_insn, rtx_insn *target_insn)
{
df_ref use;
struct df_insn_info *insn_info = DF_INSN_INFO_GET (def_insn);
rtx def_set = single_set (def_insn);
rtx_insn *next;
gcc_assert (def_set);
/* If target_insn comes right after def_insn, which is very common
for addresses, we can use a quicker test. Ignore debug insns
other than target insns for this. */
next = NEXT_INSN (def_insn);
while (next && next != target_insn && DEBUG_INSN_P (next))
next = NEXT_INSN (next);
if (next == target_insn && REG_P (SET_DEST (def_set)))
{
rtx def_reg = SET_DEST (def_set);
/* If the insn uses the reg that it defines, the substitution is
invalid. */
FOR_EACH_INSN_INFO_USE (use, insn_info)
if (rtx_equal_p (DF_REF_REG (use), def_reg))
return false;
FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
if (rtx_equal_p (DF_REF_REG (use), def_reg))
return false;
}
开发者ID:ollie314,项目名称:gcc,代码行数:32,代码来源:fwprop.c
示例2: peephole
rtx
peephole (rtx ins1)
{
rtx insn ATTRIBUTE_UNUSED, x ATTRIBUTE_UNUSED, pat ATTRIBUTE_UNUSED;
if (NEXT_INSN (ins1)
&& BARRIER_P (NEXT_INSN (ins1)))
return 0;
return 0;
}
开发者ID:pjr0009,项目名称:3500,代码行数:11,代码来源:insn-peep.c
示例3: print_rtl_slim_with_bb
/* Provide a slim dump the instruction chain starting at FIRST to F, honoring
the dump flags given in FLAGS. Currently, TDF_BLOCKS and TDF_DETAILS
include more information on the basic blocks. */
void
print_rtl_slim_with_bb (FILE *f, rtx first, int flags)
{
basic_block current_bb = NULL;
rtx insn;
for (insn = first; NULL != insn; insn = NEXT_INSN (insn))
{
if ((flags & TDF_BLOCKS)
&& (INSN_P (insn) || GET_CODE (insn) == NOTE)
&& BLOCK_FOR_INSN (insn)
&& !current_bb)
{
current_bb = BLOCK_FOR_INSN (insn);
dump_bb_info (current_bb, true, false, flags, ";; ", f);
}
dump_insn_slim (f, insn);
if ((flags & TDF_BLOCKS)
&& current_bb
&& insn == BB_END (current_bb))
{
dump_bb_info (current_bb, false, true, flags, ";; ", f);
current_bb = NULL;
}
}
}
开发者ID:ochafik,项目名称:gccxml,代码行数:31,代码来源:sched-vis.c
示例4: sequence_uses_addressof
static int
sequence_uses_addressof (rtx seq)
{
rtx insn;
for (insn = seq; insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
{
/* If this is a CALL_PLACEHOLDER, then recursively call ourselves
with each nonempty sequence attached to the CALL_PLACEHOLDER. */
if (GET_CODE (insn) == CALL_INSN
&& GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
{
if (XEXP (PATTERN (insn), 0) != NULL_RTX
&& sequence_uses_addressof (XEXP (PATTERN (insn), 0)))
return 1;
if (XEXP (PATTERN (insn), 1) != NULL_RTX
&& sequence_uses_addressof (XEXP (PATTERN (insn), 1)))
return 1;
if (XEXP (PATTERN (insn), 2) != NULL_RTX
&& sequence_uses_addressof (XEXP (PATTERN (insn), 2)))
return 1;
}
else if (uses_addressof (PATTERN (insn))
|| (REG_NOTES (insn) && uses_addressof (REG_NOTES (insn))))
return 1;
}
return 0;
}
开发者ID:robinsonb5,项目名称:zpugcc,代码行数:29,代码来源:sibcall.c
示例5: insert_uses
static unsigned int
insert_uses (void)
{
static const int num_modes[] = NUM_MODES_FOR_MODE_SWITCHING;
#define N_ENTITIES ARRAY_SIZE (num_modes)
int e;
void (*target_insert_mode_switch_use) (rtx_insn *insn, int, int)
= TARGET_INSERT_MODE_SWITCH_USE;
for (e = N_ENTITIES - 1; e >= 0; e--)
{
int no_mode = num_modes[e];
rtx_insn *insn;
int mode;
if (!OPTIMIZE_MODE_SWITCHING (e))
continue;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
{
if (!INSN_P (insn))
continue;
mode = epiphany_mode_needed (e, insn);
if (mode == no_mode)
continue;
if (target_insert_mode_switch_use)
{
target_insert_mode_switch_use (insn, e, mode);
df_insn_rescan (insn);
}
}
}
return 0;
}
开发者ID:WojciechMigda,项目名称:gcc,代码行数:33,代码来源:mode-switch-use.c
示例6: execute_kernexec_retaddr
/*
* find all asm level function returns and forcibly set the highest bit of the return address
*/
static unsigned int execute_kernexec_retaddr(void)
{
rtx insn;
// 1. find function returns
for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) {
// rtl match: (jump_insn 41 40 42 2 (return) fptr.c:42 634 {return_internal} (nil))
// (jump_insn 12 9 11 2 (parallel [ (return) (unspec [ (0) ] UNSPEC_REP) ]) fptr.c:46 635 {return_internal_long} (nil))
// (jump_insn 97 96 98 6 (simple_return) fptr.c:50 -1 (nil) -> simple_return)
rtx body;
// is it a retn
if (!JUMP_P(insn))
continue;
body = PATTERN(insn);
if (GET_CODE(body) == PARALLEL)
body = XVECEXP(body, 0, 0);
if (!ANY_RETURN_P(body))
continue;
kernexec_instrument_retaddr(insn);
}
// print_simple_rtl(stderr, get_insns());
// print_rtl(stderr, get_insns());
return 0;
}
开发者ID:garyvan,项目名称:openwrt-1.6,代码行数:30,代码来源:kernexec_plugin.c
示例7: dump_rtl_slim
void
dump_rtl_slim (FILE *f, const_rtx first, const_rtx last,
int count, int flags ATTRIBUTE_UNUSED)
{
const_rtx insn, tail;
pretty_printer rtl_slim_pp;
rtl_slim_pp.buffer->stream = f;
tail = last ? NEXT_INSN (last) : NULL_RTX;
for (insn = first;
(insn != NULL) && (insn != tail) && (count != 0);
insn = NEXT_INSN (insn))
{
print_insn_with_notes (&rtl_slim_pp, insn);
if (count > 0)
count--;
}
pp_flush (&rtl_slim_pp);
}
开发者ID:ChaosJohn,项目名称:gcc,代码行数:20,代码来源:sched-vis.c
示例8: debug_rtx_range
DEBUG_FUNCTION void
debug_rtx_range (const_rtx start, const_rtx end)
{
while (1)
{
debug_rtx (start);
fprintf (stderr, "\n");
if (!start || start == end)
break;
start = NEXT_INSN (start);
}
}
开发者ID:hnaik,项目名称:gcc,代码行数:12,代码来源:print-rtl.c
示例9: maybe_dump_rtl_for_tree_stmt
static void
maybe_dump_rtl_for_tree_stmt (tree stmt, rtx since)
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "\n;; ");
print_generic_expr (dump_file, stmt, TDF_SLIM);
fprintf (dump_file, "\n");
print_rtl (dump_file, since ? NEXT_INSN (since) : since);
}
}
开发者ID:seguljac,项目名称:higpu,代码行数:12,代码来源:cfgexpand.c
示例10: rtl_value_profile_transformations
static bool
rtl_value_profile_transformations (void)
{
rtx insn, next;
int changed = false;
for (insn = get_insns (); insn; insn = next)
{
next = NEXT_INSN (insn);
if (!INSN_P (insn))
continue;
/* Scan for insn carrying a histogram. */
if (!find_reg_note (insn, REG_VALUE_PROFILE, 0))
continue;
/* Ignore cold areas -- we are growing a code. */
if (!maybe_hot_bb_p (BLOCK_FOR_INSN (insn)))
continue;
if (dump_file)
{
fprintf (dump_file, "Trying transformations on insn %d\n",
INSN_UID (insn));
print_rtl_single (dump_file, insn);
}
/* Transformations: */
if (flag_value_profile_transformations
&& (mod_subtract_transform (insn)
|| divmod_fixed_value_transform (insn)
|| mod_pow2_value_transform (insn)))
changed = true;
#ifdef HAVE_prefetch
if (flag_speculative_prefetching
&& speculative_prefetching_transform (insn))
changed = true;
#endif
}
if (changed)
{
commit_edge_insertions ();
allocate_reg_info (max_reg_num (), FALSE, FALSE);
}
return changed;
}
开发者ID:DJHartley,项目名称:iphone-dev,代码行数:49,代码来源:value-prof.c
示例11: local_ref_killed_between_p
static bool
local_ref_killed_between_p (df_ref ref, rtx_insn *from, rtx_insn *to)
{
rtx_insn *insn;
for (insn = from; insn != to; insn = NEXT_INSN (insn))
{
df_ref def;
if (!INSN_P (insn))
continue;
FOR_EACH_INSN_DEF (def, insn)
if (DF_REF_REGNO (ref) == DF_REF_REGNO (def))
return true;
}
return false;
}
开发者ID:ollie314,项目名称:gcc,代码行数:17,代码来源:fwprop.c
示例12: cleanup_barriers
/* Some old code expects exactly one BARRIER as the NEXT_INSN of a
non-fallthru insn. This is not generally true, as multiple barriers
may have crept in, or the BARRIER may be separated from the last
real insn by one or more NOTEs.
This simple pass moves barriers and removes duplicates so that the
old code is happy.
*/
unsigned int
cleanup_barriers (void)
{
rtx insn, next, prev;
for (insn = get_insns (); insn; insn = next)
{
next = NEXT_INSN (insn);
if (BARRIER_P (insn))
{
prev = prev_nonnote_insn (insn);
if (BARRIER_P (prev))
delete_insn (insn);
else if (prev != PREV_INSN (insn))
reorder_insns (insn, insn, prev);
}
}
return 0;
}
开发者ID:AhmadTux,项目名称:DragonFlyBSD,代码行数:26,代码来源:jump.c
示例13: nds32_output_casesi_pc_relative
/* Function to generate PC relative jump table.
Refer to nds32.md for more details.
The following is the sample for the case that diff value
can be presented in '.short' size.
addi $r1, $r1, -(case_lower_bound)
slti $ta, $r1, (case_number)
beqz $ta, .L_skip_label
la $ta, .L35 ! get jump table address
lh $r1, [$ta + $r1 << 1] ! load symbol diff from jump table entry
addi $ta, $r1, $ta
jr5 $ta
! jump table entry
L35:
.short .L25-.L35
.short .L26-.L35
.short .L27-.L35
.short .L28-.L35
.short .L29-.L35
.short .L30-.L35
.short .L31-.L35
.short .L32-.L35
.short .L33-.L35
.short .L34-.L35 */
const char *
nds32_output_casesi_pc_relative (rtx *operands)
{
enum machine_mode mode;
rtx diff_vec;
diff_vec = PATTERN (NEXT_INSN (as_a <rtx_insn *> (operands[1])));
gcc_assert (GET_CODE (diff_vec) == ADDR_DIFF_VEC);
/* Step C: "t <-- operands[1]". */
output_asm_insn ("la\t$ta, %l1", operands);
/* Get the mode of each element in the difference vector. */
mode = GET_MODE (diff_vec);
/* Step D: "z <-- (mem (plus (operands[0] << m) t))",
where m is 0, 1, or 2 to load address-diff value from table. */
switch (mode)
{
case QImode:
output_asm_insn ("lb\t%2, [$ta + %0 << 0]", operands);
break;
case HImode:
output_asm_insn ("lh\t%2, [$ta + %0 << 1]", operands);
break;
case SImode:
output_asm_insn ("lw\t%2, [$ta + %0 << 2]", operands);
break;
default:
gcc_unreachable ();
}
/* Step E: "t <-- z + t".
Add table label_ref with address-diff value to
obtain target case address. */
output_asm_insn ("add\t$ta, %2, $ta", operands);
/* Step F: jump to target with register t. */
if (TARGET_16_BIT)
return "jr5\t$ta";
else
return "jr\t$ta";
}
开发者ID:alcides,项目名称:gcc,代码行数:71,代码来源:nds32-md-auxiliary.c
注:本文中的NEXT_INSN函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论