You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
103
external/llvm/utils/testgen/mc-bundling-x86-gen.py
vendored
103
external/llvm/utils/testgen/mc-bundling-x86-gen.py
vendored
@ -1,103 +0,0 @@
|
||||
|
||||
#!/usr/bin/python
|
||||
|
||||
# Auto-generates an exhaustive and repetitive test for correct bundle-locked
|
||||
# alignment on x86.
|
||||
# For every possible offset in an aligned bundle, a bundle-locked group of every
|
||||
# size in the inclusive range [1, bundle_size] is inserted. An appropriate CHECK
|
||||
# is added to verify that NOP padding occurred (or did not occur) as expected.
|
||||
# Run with --align-to-end to generate a similar test with align_to_end for each
|
||||
# .bundle_lock directive.
|
||||
|
||||
# This script runs with Python 2.7 and 3.2+
|
||||
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
|
||||
BUNDLE_SIZE_POW2 = 4
|
||||
BUNDLE_SIZE = 2 ** BUNDLE_SIZE_POW2
|
||||
|
||||
PREAMBLE = '''
|
||||
# RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -o - \\
|
||||
# RUN: | llvm-objdump -triple i386 -disassemble -no-show-raw-insn - | FileCheck %s
|
||||
|
||||
# !!! This test is auto-generated from utils/testgen/mc-bundling-x86-gen.py !!!
|
||||
# It tests that bundle-aligned grouping works correctly in MC. Read the
|
||||
# source of the script for more details.
|
||||
|
||||
.text
|
||||
.bundle_align_mode {0}
|
||||
'''.format(BUNDLE_SIZE_POW2).lstrip()
|
||||
|
||||
ALIGNTO = ' .align {0}, 0x90'
|
||||
NOPFILL = ' .fill {0}, 1, 0x90'
|
||||
|
||||
def print_bundle_locked_sequence(len, align_to_end=False):
|
||||
print(' .bundle_lock{0}'.format(' align_to_end' if align_to_end else ''))
|
||||
print(' .rept {0}'.format(len))
|
||||
print(' inc %eax')
|
||||
print(' .endr')
|
||||
print(' .bundle_unlock')
|
||||
|
||||
def generate(align_to_end=False):
|
||||
print(PREAMBLE)
|
||||
|
||||
ntest = 0
|
||||
for instlen in range(1, BUNDLE_SIZE + 1):
|
||||
for offset in range(0, BUNDLE_SIZE):
|
||||
# Spread out all the instructions to not worry about cross-bundle
|
||||
# interference.
|
||||
print(ALIGNTO.format(2 * BUNDLE_SIZE))
|
||||
print('INSTRLEN_{0}_OFFSET_{1}:'.format(instlen, offset))
|
||||
if offset > 0:
|
||||
print(NOPFILL.format(offset))
|
||||
print_bundle_locked_sequence(instlen, align_to_end)
|
||||
|
||||
# Now generate an appropriate CHECK line
|
||||
base_offset = ntest * 2 * BUNDLE_SIZE
|
||||
inst_orig_offset = base_offset + offset # had it not been padded...
|
||||
|
||||
def print_check(adjusted_offset=None, nop_split_offset=None):
|
||||
if adjusted_offset is not None:
|
||||
print('# CHECK: {0:x}: nop'.format(inst_orig_offset))
|
||||
if nop_split_offset is not None:
|
||||
print('# CHECK: {0:x}: nop'.format(nop_split_offset))
|
||||
print('# CHECK: {0:x}: incl'.format(adjusted_offset))
|
||||
else:
|
||||
print('# CHECK: {0:x}: incl'.format(inst_orig_offset))
|
||||
|
||||
if align_to_end:
|
||||
if offset + instlen == BUNDLE_SIZE:
|
||||
# No padding needed
|
||||
print_check()
|
||||
elif offset + instlen < BUNDLE_SIZE:
|
||||
# Pad to end at nearest bundle boundary
|
||||
offset_to_end = base_offset + (BUNDLE_SIZE - instlen)
|
||||
print_check(offset_to_end)
|
||||
else: # offset + instlen > BUNDLE_SIZE
|
||||
# Pad to end at next bundle boundary, splitting the nop sequence
|
||||
# at the nearest bundle boundary
|
||||
offset_to_nearest_bundle = base_offset + BUNDLE_SIZE
|
||||
offset_to_end = base_offset + (BUNDLE_SIZE * 2 - instlen)
|
||||
if offset_to_nearest_bundle == offset_to_end:
|
||||
offset_to_nearest_bundle = None
|
||||
print_check(offset_to_end, offset_to_nearest_bundle)
|
||||
else:
|
||||
if offset + instlen > BUNDLE_SIZE:
|
||||
# Padding needed
|
||||
aligned_offset = (inst_orig_offset + instlen) & ~(BUNDLE_SIZE - 1)
|
||||
print_check(aligned_offset)
|
||||
else:
|
||||
# No padding needed
|
||||
print_check()
|
||||
|
||||
print()
|
||||
ntest += 1
|
||||
|
||||
if __name__ == '__main__':
|
||||
argparser = argparse.ArgumentParser()
|
||||
argparser.add_argument('--align-to-end',
|
||||
action='store_true',
|
||||
help='generate .bundle_lock with align_to_end option')
|
||||
args = argparser.parse_args()
|
||||
generate(align_to_end=args.align_to_end)
|
Reference in New Issue
Block a user