st8.spill and ld8.fill in the Same Instruction Group

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® Itanium® Architecture Software Developer’s Manual.

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® Itanium® Architecture Assembly Language Reference Guide.

To understand how IAS performs predicate analysis, see Predicate Analysis.