±àÒëÆ÷²¢²»»á²åÈëÊ²Ã´ÌØ±ðµÄÖ¸ÁֻÊÇ×öÁ½¼þÊÂÇ飬һÊDz»ÈÃÖ¸ÁîÖØÅÅ¿çÔ½barrierÖ®ºóµÄ´úÂë£
¬¶þÊǰÑbarrier֮ǰ»º´æÔڼĴæÆ÷ÖеıäÁ¿»ØÐ´µ½ÄÚ´æ¡£Ö®ËùÒÔbarrierµÄ¶¨ÒåÖл¹Òª¼ÓÈëvolatil
eÊÇÒòΪ£ºgcc¿´µ½barrier¼ÈûÓÐÊäÈëÊä³ö²¿£¬Ò²Ã»ÓÐclobber£¬ÄÇô¾ÍÈÏΪ¸ÃÌõÖ¸ÁîûÓÐÒâÒ壬¾Í
»áÓÅ»¯µôbarrier£¬½á¹ûµ±È»¾Í²»»á×öÉÏÃæµÄÁ½¼þÊÂÇé¡£
À´×Ôgcc.4.0.0µÄÔ´´úÂëÆ¬¶Î[gcc/stmt.cÖеĺ¯Êýexpand_asm_operands]£º
/* If there are no outputs (but there are some clobbers)
store the bare ASM_OPERANDS into the PARALLEL. */
if (i == 0)
XVECEXP (body, 0, i++) = obody;
/* Store (clobber REG) for each clobbered register specified. */
for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
{
const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
int j = decode_reg_name (regname); // Èç¹ûregnameÊÇÒ»¸öclobber²Ù×÷Êý£¬ÄÇô·µ»Ø-4
rtx clobbered_reg;
if (j < 0)
{
if (j == -3) /* `cc', which is not a register */
continue;
if (j == -4) /* `memory', don't cache memory across asm */
{
XVECEXP (body, 0, i++)
= gen_rtx_CLOBBER (VOIDmode,
gen_rtx_MEM
(BLKmode,
gen_rtx_SCRATCH (VOIDmode)));
continue;
}
/* Ignore unknown register, error already signaled. */
continue;
}
......