diff options
| author | Derek Schuff <dschuff@google.com> | 2014-10-15 17:10:04 +0000 |
|---|---|---|
| committer | Derek Schuff <dschuff@google.com> | 2014-10-15 17:10:04 +0000 |
| commit | 05fb735f3aaaae3bafa301bb70ceb364206f3581 (patch) | |
| tree | 9221ec58c97399a20b8cf2bc915fb25a1fe00873 /llvm/test | |
| parent | 001fe64333f184251ea72aba8b3b8144e2a2b9df (diff) | |
| download | bcm5719-llvm-05fb735f3aaaae3bafa301bb70ceb364206f3581.tar.gz bcm5719-llvm-05fb735f3aaaae3bafa301bb70ceb364206f3581.zip | |
[MC] Make bundle alignment mode setting idempotent and support nested bundles
Summary:
Currently an error is thrown if bundle alignment mode is set more than once
per module (either via the API or the .bundle_align_mode directive). This
change allows setting it multiple times as long as the alignment doesn't
change.
Also nested bundle_lock groups are currently not allowed. This change allows
them, with the effect that the group stays open until all nests are exited,
and if any of the bundle_lock directives has the align_to_end flag, the
group becomes align_to_end.
These changes make the bundle aligment simpler to use in the compiler, and
also better match the corresponding support in GNU as.
Reviewers: jvoung, eliben
Differential Revision: http://reviews.llvm.org/D5801
llvm-svn: 219811
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/MC/X86/AlignedBundling/nesting.s | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/llvm/test/MC/X86/AlignedBundling/nesting.s b/llvm/test/MC/X86/AlignedBundling/nesting.s new file mode 100644 index 00000000000..8996170a1d1 --- /dev/null +++ b/llvm/test/MC/X86/AlignedBundling/nesting.s @@ -0,0 +1,67 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \ +# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s + +# Will be bundle-aligning to 16 byte boundaries + .bundle_align_mode 4 + .text +# CHECK-LABEL: foo +foo: +# Test that bundle alignment mode can be set more than once. + .bundle_align_mode 4 +# Each of these callq instructions is 5 bytes long + callq bar + callq bar + .bundle_lock + .bundle_lock + callq bar + callq bar + .bundle_unlock + .bundle_unlock +# CHECK: 10: callq +# CHECK-NEXT: 15: callq + + .p2align 4 +# CHECK-LABEL: bar +bar: + callq foo + callq foo +# Check that the callqs get bundled together, and that the whole group is +# align_to_end + .bundle_lock + callq bar + .bundle_lock align_to_end + callq bar + .bundle_unlock + .bundle_unlock +# CHECK: 36: callq +# CHECK-NEXT: 3b: callq + +# CHECK-LABEL: baz +baz: + callq foo + callq foo +# Check that the callqs get bundled together, and that the whole group is +# align_to_end (with the outer directive marked align_to_end) + .bundle_lock align_to_end + callq bar + .bundle_lock + callq bar + .bundle_unlock + .bundle_unlock +# CHECK: 56: callq +# CHECK-NEXT: 5b: callq + +# CHECK-LABEL: quux +quux: + callq bar + callq bar + .bundle_lock + .bundle_lock + callq bar + .bundle_unlock + callq bar + .bundle_unlock +# Check that the calls are bundled together when the second one is after the +# inner nest is closed. +# CHECK: 70: callq +# CHECK-NEXT: 75: callq |

