[llvm-commits] [llvm] r157966 - in /llvm/trunk: lib/Target/ARM/ARMInstrThumb2.td test/CodeGen/ARM/bicNoZext.ll
Evan Cheng
evan.cheng at apple.com
Mon Jun 4 17:12:40 PDT 2012
Eli pointed out this is missing a check on LHS top bits are zero.
Evan
On Jun 4, 2012, at 4:38 PM, Joel Jones <joel_k_jones at apple.com> wrote:
> Author: joel_k_jones
> Date: Mon Jun 4 18:38:57 2012
> New Revision: 157966
>
> URL: http://llvm.org/viewvc/llvm-project?rev=157966&view=rev
> Log:
> This change handles a another case for generating the bic instruction
> when a compile time constant is known. This occurs when implicitly zero
> extending function arguments from 16 bits to 32 bits.
>
> <rdar://problem/11481151>
>
> Added:
> llvm/trunk/test/CodeGen/ARM/bicNoZext.ll
> Modified:
> llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td
>
> Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=157966&r1=157965&r2=157966&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Mon Jun 4 18:38:57 2012
> @@ -62,6 +62,14 @@
> return CurDAG->getTargetConstant(-((int)N->getZExtValue()), MVT::i32);
> }]>;
>
> +// so_imm_not_sext_XFORM - Return a so_imm value packed into the format
> +// described for so_imm_not_sext def below.
> +def t2_so_imm_not_sext_XFORM : SDNodeXForm<imm, [{
> + APInt apIntN = N->getAPIntValue();
> + unsigned N16bitSignExt = apIntN.trunc(16).sext(32).getZExtValue();
> + return CurDAG->getTargetConstant(~N16bitSignExt, MVT::i32);
> +}]>;
> +
> // t2_so_imm - Match a 32-bit immediate operand, which is an
> // 8-bit immediate rotated by an arbitrary number of bits, or an 8-bit
> // immediate splatted into multiple bytes of the word.
> @@ -86,6 +94,17 @@
> let ParserMatchClass = t2_so_imm_not_asmoperand;
> }
>
> +// t2_so_imm_not_sext - Match an immediate that when zero-extended
> +// from 16-bits to 32-bits is a complement of a t2_so_imm.
> +def t2_so_imm_not_sext : Operand<i32>, PatLeaf<(imm), [{
> + APInt apIntN = N->getAPIntValue();
> + if (!apIntN.isIntN(16)) return false;
> + unsigned N16bitSignExt = apIntN.trunc(16).sext(32).getZExtValue();
> + return ARM_AM::getT2SOImmVal(~N16bitSignExt) != -1;
> + }], t2_so_imm_not_sext_XFORM> {
> + let ParserMatchClass = t2_so_imm_not_asmoperand;
> +}
> +
> // t2_so_imm_neg - Match an immediate that is a negation of a t2_so_imm.
> def t2_so_imm_neg_asmoperand : AsmOperandClass { let Name = "T2SOImmNeg"; }
> def t2_so_imm_neg : Operand<i32>, PatLeaf<(imm), [{
> @@ -2332,6 +2351,11 @@
> def : T2Pat<(and rGPR:$src, t2_so_imm_not:$imm),
> (t2BICri rGPR:$src, t2_so_imm_not:$imm)>;
>
> +// so_imm_not_sext is needed instead of so_imm_not, as the value of imm
> +// will match the original bitWidth for $src.
> +def : T2Pat<(and rGPR:$src, t2_so_imm_not_sext:$imm),
> + (t2BICri rGPR:$src, t2_so_imm_not_sext:$imm)>;
> +
> // FIXME: Disable this pattern on Darwin to workaround an assembler bug.
> def : T2Pat<(or rGPR:$src, t2_so_imm_not:$imm),
> (t2ORNri rGPR:$src, t2_so_imm_not:$imm)>,
>
> Added: llvm/trunk/test/CodeGen/ARM/bicNoZext.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/bicNoZext.ll?rev=157966&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/bicNoZext.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/bicNoZext.ll Mon Jun 4 18:38:57 2012
> @@ -0,0 +1,19 @@
> +; RUN: llc %s -o - | FileCheck %s
> +; ModuleID = 'bic.c'
> +target triple = "thumbv7-apple-ios3.0.0"
> +
> +define zeroext i16 @foo16(i16 zeroext %f) nounwind readnone optsize ssp {
> +entry:
> + ; CHECK: .thumb_func _foo16
> + ; CHECK: {{bic[^#]*#3}}
> + %and = and i16 %f, -4
> + ret i16 %and
> +}
> +
> +define i32 @foo32(i32 %f) nounwind readnone optsize ssp {
> +entry:
> + ; CHECK: .thumb_func _foo32
> + ; CHECK: {{bic[^#]*#3}}
> + %and = and i32 %f, -4
> + ret i32 %and
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list