The instruction st8.spill
writes to a specific bit in the UNAT
application register, according to the accessed address in memory. The
instruction ld8.fill
reads a specific bit of the UNAT
application register, according to the accessed address in memory. For
more details see the Intel
IAS cannot know the address of the accessed memory, so where no annotations are provided, it reports the following dependency violations:
WAW for every pair of st8.spill instructions
RAW for every ld8.fill instruction that appears after st8.spill in the same instruction group
In the following code, one WAW and two RAW dependency violations are reported, although the code assures that the accessed UNAT bits are different:
add r2=r1,8
add r3=r1,16;;
st8.spill [r1]=r11
st8.spill [r2]=r11
ld8.fill r12=[r3]
To avoid this false report, use a .mem.offset annotation before each st8.spill and ld8.fill instruction. The annotation must state the memory address location relative to some local arbitrary memory region, such as the current stack:
LOCAL_STACK_INDEX=0
add r2=8,r1
add r3=16,r1;;
.mem.offset 0,LOCAL_STACK_INDEX
.st8.spill [r1]=r11
.mem.offset 8,LOCAL_STACK_INDEX
.st8.spill [r2]=r11
.mem.offset 16,LOCAL_STACK_INDEX
.ld8.fill r12=[r3]
For further explanation of the .mem.offset
annotation, see the Intel
To understand how IAS performs predicate analysis, see Predicate Analysis.