summaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-08-16 10:22:54 +0000
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-08-16 10:22:54 +0000
commit6c51f89498dd813c8dd16e46069decf2897b31b2 (patch)
treec696124346ab4fd26b3a88896a16fcc41f5c0e85 /lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
parent6f297afb7ea6ab53be1feae4a335e7b1cb7a1f02 (diff)
downloadllvm-6c51f89498dd813c8dd16e46069decf2897b31b2.tar.gz
llvm-6c51f89498dd813c8dd16e46069decf2897b31b2.tar.bz2
llvm-6c51f89498dd813c8dd16e46069decf2897b31b2.tar.xz
[SystemZ] Fix sign of integer memcmp result
r188163 used CLC to implement memcmp. Code that compares the result directly against zero can test the CC value produced by CLC, but code that needs an integer result must use IPM. The sequence I'd used was: ipm <reg> sll <reg>, 2 sra <reg>, 30 but I'd forgotten that this inverts the order, so that CC==1 ("less") becomes an integer greater than zero, and CC==2 ("greater") becomes an integer less than zero. This sequence should only be used if the CLC arguments are reversed to compensate. The problem then is that the branch condition must also be reversed when testing the CLC result directly. Rather than do that, I went for a different sequence that works with the natural CLC order: ipm <reg> srl <reg>, 28 rll <reg>, <reg>, 31 One advantage of this is that it doesn't clobber CC. A disadvantage is that any sign extension to 64 bits must be done separately, rather than being folded into the shifts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188538 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp')
0 files changed, 0 insertions, 0 deletions