Several important bug fixes:
authorVikram S. Adve <vadve@cs.uiuc.edu>
Thu, 10 Jul 2003 20:07:54 +0000 (20:07 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Thu, 10 Jul 2003 20:07:54 +0000 (20:07 +0000)
commit951df2b1bd3dae1eb3126cda56ee9ca67a44a33b
tree37a729199e920df9540d0c1b6f6a457ed0618f48
parent940a3a47b0394916fb02f86b656bfc33078a8394
Several important bug fixes:

(1) Cannot use ANDN(ot), ORN, and XORN for boolean ops, only bitwise ops.

(2) Conditional move instructions must distinguish signed and unsigned
    condition codes, e.g., MOVLE vs. MOVLEU.

(3) Conditional-move-on-register was using the cond-move-on-cc opcodes,
    which produces a valid-looking instruction with bogus registers!

(4) Here's a really cute one: dividing-by-2^k for negative numbers needs to
    add 2^k-1 before shifting, not add 1 after shifting.  Sadly, these
    are the same when k=0 so our poor test case worked fine.

(5) Casting between signed and unsigned values was not correct:
    completely reimplemented.

(6) Zero-extension on unsigned values was bogus: I was only doing the
    SRL and not the SLLX before it.  Don't know WHAT I was thinking!

(7) And the most important class of changes: Sign-extensions on signed values.
    Signed values are not sign-extended after ordinary operations,
    so they must be sign-extended before the following cases:
-- passing to an external or unknown function
-- returning from a function
-- using as operand 2 of DIV or REM
-- using as either operand of condition-code setting operation
           (currently only SUBCC), with smaller than 32-bit operands

Also, a couple of improvements:

(1) Fold cast-to-bool into Not(bool).  Need to do this for And, Or, XOR also.

(2) Convert SetCC-Const into a conditional-move-on-register (case 41)
    if the constant is 0.  This was only being done for branch-on-SetCC-Const
    when the branch is folded with the SetCC-Const.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7159 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/SparcV9/SparcV9InstrSelection.cpp