Commit Graph

33 Commits

Author SHA1 Message Date
Jonas Paulsson a589fce0aa [SystemZ] Minor fixing in SystemZScheduleZ13.td
Some minor corrections for the recently added instructions.

Review: Ulrich Weigand

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307658 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-11 14:07:55 +00:00
Ulrich Weigand 4c8480dbc5 [SystemZ] Simplify handling of 128-bit multiply/divide instruction
Several integer multiply/divide instructions require use of a
register pair as input and output.  This patch moves setting
up the input register pair from C++ code to TableGen, simplifying
the whole process and making it more easily extensible.

No functional change.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307155 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-05 13:17:31 +00:00
Ulrich Weigand 55e17e75fd [SystemZ] Small cleanups to SystemZScheduleZ13.td
Fixes a couple of whitespace errors, re-sorts the vector floating-point
instructions to make them more easily extensible, and adds a missing
pseudo instruction.

No functional change.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307154 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-05 13:14:43 +00:00
Ulrich Weigand 75d5833bd6 [SystemZ] Add all remaining instructions
This adds all remaining instructions that were still missing, mostly
privileged and semi-privileged system-level instructions.  These are
provided for use with the assembler and disassembler only.

This brings the LLVM assembler / disassembler to parity with the
GNU binutils tools.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306876 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-30 20:43:40 +00:00
Ulrich Weigand 31866f9f66 [SystemZ] Add missing high-word facility instructions
There are a few instructions provided by the high-word facility (z196)
that we cannot easily exploit for code generation.  This patch at least
adds those missing instructions for the assembler and disassembler.

This means that now all nonprivileged instructions up to z13 are
supported by the LLVM assembler / disassembler.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306821 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-30 12:56:29 +00:00
Ulrich Weigand ccbe107148 [SystemZ] Add decimal floating-point instructions
This adds assembler / disassembler support for the decimal
floating-point instructions.  Since LLVM does not yet have
support for decimal float types, these cannot be used for
codegen at this point.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304203 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-30 10:15:16 +00:00
Ulrich Weigand 002ef9b847 [SystemZ] Add hexadecimal floating-point instructions
This adds assembler / disassembler support for the hexadecimal
floating-point instructions.  Since the Linux ABI does not use
any hex float data types, these are not useful for codegen.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304202 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-30 10:13:23 +00:00
Ulrich Weigand 81fa691fd6 [SystemZ] Add miscellaneous instructions
This adds a few missing instructions for the assembler and
disassembler.  Those should be the last missing general-
purpose (Chapter 7) instructions for the z10 ISA.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302667 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-10 14:20:15 +00:00
Ulrich Weigand c12fbb0eea [SystemZ] Add missing arithmetic instructions
This adds the remaining general arithmetic instructions
for assembler / disassembler use.  Most of these are not
useful for codegen; a few might be, and those are listed
in the README.txt for future improvements.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302665 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-10 14:18:47 +00:00
Ulrich Weigand 3f9585ca98 [SystemZ] Add decimal integer instructions
This adds the set of decimal integer (BCD) instructions for
assembler / disassembler use.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302646 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-10 12:42:45 +00:00
Ulrich Weigand b021f25a42 [SystemZ] Add crypto instructions
This adds the set of message-security assist instructions for
assembler / disassembler use.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302645 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-10 12:42:00 +00:00
Ulrich Weigand bf3379e0c4 [SystemZ] Add translate/convert instructions
This adds the set of character-set translate and convert instructions
for assembler / disassembler use.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302644 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-10 12:41:12 +00:00
Ulrich Weigand 0eab6e0590 [SystemZ] Add missing memory/string instructions
This adds a number of missing memory and string instructions
for assembler / disassembler use.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302643 91177308-0d34-0410-b5e6-96231b3b80d8
2017-05-10 12:40:15 +00:00
Jonas Paulsson d7599ee3b1 [SystemZ] Mark vector immediate load instructions with useful flags.
Vector immediate load instructions should have the isAsCheapAsAMove, isMoveImm
and isReMaterializable flags set. With them, these instruction will get
hoisted out of loops.

Review: Ulrich Weigand

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292790 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-23 14:09:58 +00:00
Ulrich Weigand 49c2555361 [SystemZ] Support remaining atomic instructions
Add assembler support for all atomic instructions that weren't already
supported.  Some of those could be used to implement codegen for 128-bit
atomic operations, but this isn't done here yet.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288526 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-02 18:24:16 +00:00
Ulrich Weigand 4b7476c294 [SystemZ] Support floating-point control register instructions
Add assembler support for instructions manipulating the FPC.

Also add codegen support via the GCC compatibility builtins:
  __builtin_s390_sfpc
  __builtin_s390_efpc



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288525 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-02 18:21:53 +00:00
Ulrich Weigand 7e1b0a5ad4 [SystemZ] Support execution hint instructions
This adds assembler support for the instructions provided by the
execution-hint facility (NIAI and BP(R)P).  This required adding
support for the new relocation types for 12-bit and 24-bit PC-
relative offsets used by the BP(R)P instructions.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288031 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-28 14:01:51 +00:00
Ulrich Weigand 595240010a [SystemZ] Support load-and-trap instructions
This adds support for the instructions provided with the
load-and-trap facility.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288030 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-28 13:59:22 +00:00
Ulrich Weigand 3079ca7f0c [SystemZ] Add remaining branch instructions
This patch adds assembler support for the remaining branch instructions:
the non-relative branch on count variants, and all variants of branch
on index.

The only one of those that can be readily exploited for code generation
is BRCTH (branch on count using a high 32-bit register as count).  Do
use it, however, it is necessary to also introduce a hew CHIMux pseudo
to allow comparisons of a 32-bit value agains a short immediate to go
into a high register as well (implemented via CHI/CIH).

This causes a bit of codegen changes overall, but those have proven to
be neutral (or even beneficial) in performance measurements.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288029 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-28 13:40:08 +00:00
Ulrich Weigand 0291833580 [SystemZ] Improve use of conditional instructions
This patch moves formation of LOC-type instructions from (late)
IfConversion to the early if-conversion pass, and in some cases
additionally creates them directly from select instructions
during DAG instruction selection.

To make early if-conversion work, the patch implements the
canInsertSelect / insertSelect callbacks.  It also implements
the commuteInstructionImpl and FoldImmediate callbacks to
enable generation of the full range of LOC instructions.

Finally, the patch adds support for all instructions of the
load-store-on-condition-2 facility, which allows using LOC
instructions also for high registers.

Due to the use of the GRX32 register class to enable high registers,
we now also have to handle the cases where there are still no single
hardware instructions (conditional move from a low register to a high
register or vice versa).  These are converted back to a branch sequence
after register allocation.  Since the expandRAPseudos callback is not
allowed to create new basic blocks, this requires a simple new pass,
modelled after the ARM/AArch64 ExpandPseudos pass.

Overall, this patch causes significantly more LOC-type instructions
to be used, and results in a measurable performance improvement.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288028 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-28 13:34:08 +00:00
Ulrich Weigand 93f9010c1f [SystemZ] Support CL(G)T instructions
This adds support for the compare logical and trap (memory)
instructions that were added as part of the miscellaneous
instruction extensions feature with zEC12.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286587 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-11 12:48:26 +00:00
Ulrich Weigand 864946f0ea [SystemZ] Support load-and-zero-rightmost-byte facility
This adds support for the LZRF/LZRG/LLZRGF instructions that were
added on z13, and uses them for code generation were appropriate.

SystemZDAGToDAGISel::tryRISBGZero is updated again to prefer LLZRGF
over RISBG where both would be possible.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286586 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-11 12:46:28 +00:00
Ulrich Weigand 90353577ef [SystemZ] Use LLGT(R) instructions
This adds support for the 31-to-64-bit zero extension instructions
LLGT and LLGTR and uses them for code generation where appropriate.

Since this operation can also be performed via RISBG, we have to
update SystemZDAGToDAGISel::tryRISBGZero so that we prefer LLGT
over RISBG in case both are possible.  The patch includes some
simplification to the tryRISBGZero code; this is not intended
to cause any (further) functional change in codegen.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286585 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-11 12:43:51 +00:00
Jonas Paulsson e6c9f7f938 [SystemZ] A few fixes in scheduler files.
Review: U Weigand

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286362 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-09 12:47:57 +00:00
Ulrich Weigand d57fec9698 [SystemZ] Add missing FP extension instructions
This completes assembler / disassembler support for all BFP
instructions provided by the floating-point extensions facility.
The instructions added here are not currently used for codegen.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286285 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-08 20:18:41 +00:00
Ulrich Weigand c505e815ac [SystemZ] Add program mask and addressing mode instructions
Add several instructions that operate on the program mask
or the addressing mode.  These are not really needed for
code generation under Linux, but are provided for completeness
for the assembler/disassembler.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286284 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-08 20:17:02 +00:00
Ulrich Weigand ba2fbb8f1e [SystemZ] Model access registers as LLVM registers
Add the 16 access registers as LLVM registers.  This allows removing
a lot of special cases in the assembler and disassembler where we
were handling access registers; this can all just use the generic
register code now.

Also add a bunch of instructions to operate on access registers,
for assembler/disassembler use only.  No change in code generation
intended.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286283 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-08 20:15:26 +00:00
Ulrich Weigand c84d2a5725 [SystemZ] Refactor branch and conditional instruction patterns
Rework patterns for branches, call & return instructions,
compare-and-branch, compare-and-trap, and conditional move
instructions.

In particular, simplify creation of patterns for the extended
opcodes of instructions that take a CC mask.

Also, use semantical instruction classes for all the instructions
instead of open-coding them in SystemZInstrInfo.td.

Adds a couple of the basic branch instructions (that are unused
for codegen) for the assembler/disassembler.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286263 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-08 18:30:50 +00:00
Jonas Paulsson 175d83abfe [SystemZ] Correct the SchedModel regarding vector unit / instructions.
* Use a generic vector unit to model the issue unit more accurately.
* Update some vector instructions that actually use the vector unit for more
  than one cycle.

Review: Ulrich Weigand

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286112 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-07 15:45:06 +00:00
Jonas Paulsson d5d412ea27 [SystemZ] Fixes in SchedModels for older subtargets.
IssueWidth updated to reflect the capacity of the issue unit correctly.
Correct number of FX and LS units modelled (2, was 1).

Review: Ulrich Weigand

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286109 91177308-0d34-0410-b5e6-96231b3b80d8
2016-11-07 14:47:25 +00:00
Ulrich Weigand c1487e1e69 [SystemZ] Rework processor feature definitions and add -mcpu=archX support
This patch implements two changes:

- Move processor feature definition into a new file SystemZFeatures.td,
  and provide explicit lists of supported and unsupported features for
  each level of the z/Architecture.  This allows specifying unsupported
  features in the scheduler definition files for each processor.

- Add optional aliases for the -mcpu processor names according to the
  level of the z/Architecture, for compatibility with other compilers
  on the platform.  The supported aliases are:
    -mcpu=arch8  equals  -mcpu=z10
    -mcpu=arch9  equals  -mcpu=z196
    -mcpu=arch10 equals  -mcpu=zEC12
    -mcpu=arch11 equals  -mcpu=z13



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285577 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-31 14:33:29 +00:00
Jonas Paulsson eeb178c41b [SystemZ] Model 2 VBU units (not 1) in SystemZScheduleZ13.td.
NFC.

Review: Ulrich Weigand.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285566 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-31 13:05:48 +00:00
Jonas Paulsson a007516937 [SystemZ] Post-RA scheduler implementation
Post-RA sched strategy and scheduling instruction annotations for z196, zEC12
and z13.

This scheduler optimizes decoder grouping and balances processor resources
(including side steering the FPd unit instructions).

The SystemZHazardRecognizer keeps track of the scheduling state, which can
be dumped with -debug-only=misched.

Reviers: Ulrich Weigand, Andrew Trick.
https://reviews.llvm.org/D17260

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284704 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-20 08:27:16 +00:00