brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.1 KiB · b73af67 Raw
287 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686--   | FileCheck %s --check-prefix=X324 5define i32 @sub_zext_cmp_mask_same_size_result(i32 %x) {6; X64-LABEL: sub_zext_cmp_mask_same_size_result:7; X64:       # %bb.0:8; X64-NEXT:    # kill: def $edi killed $edi def $rdi9; X64-NEXT:    andl $1, %edi10; X64-NEXT:    leal -28(%rdi), %eax11; X64-NEXT:    retq12;13; X32-LABEL: sub_zext_cmp_mask_same_size_result:14; X32:       # %bb.0:15; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax16; X32-NEXT:    andl $1, %eax17; X32-NEXT:    orl $-28, %eax18; X32-NEXT:    retl19  %a = and i32 %x, 120  %c = icmp eq i32 %a, 021  %z = zext i1 %c to i3222  %r = sub i32 -27, %z23  ret i32 %r24}25 26define i32 @sub_zext_cmp_mask_wider_result(i8 %x) {27; X64-LABEL: sub_zext_cmp_mask_wider_result:28; X64:       # %bb.0:29; X64-NEXT:    # kill: def $edi killed $edi def $rdi30; X64-NEXT:    andl $1, %edi31; X64-NEXT:    leal 26(%rdi), %eax32; X64-NEXT:    retq33;34; X32-LABEL: sub_zext_cmp_mask_wider_result:35; X32:       # %bb.0:36; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax37; X32-NEXT:    andl $1, %eax38; X32-NEXT:    orl $26, %eax39; X32-NEXT:    retl40  %a = and i8 %x, 141  %c = icmp eq i8 %a, 042  %z = zext i1 %c to i3243  %r = sub i32 27, %z44  ret i32 %r45}46 47define i8 @sub_zext_cmp_mask_narrower_result(i32 %x) {48; X64-LABEL: sub_zext_cmp_mask_narrower_result:49; X64:       # %bb.0:50; X64-NEXT:    # kill: def $edi killed $edi def $rdi51; X64-NEXT:    andb $1, %dil52; X64-NEXT:    leal 46(%rdi), %eax53; X64-NEXT:    # kill: def $al killed $al killed $eax54; X64-NEXT:    retq55;56; X32-LABEL: sub_zext_cmp_mask_narrower_result:57; X32:       # %bb.0:58; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax59; X32-NEXT:    andb $1, %al60; X32-NEXT:    orb $46, %al61; X32-NEXT:    retl62  %a = and i32 %x, 163  %c = icmp eq i32 %a, 064  %z = zext i1 %c to i865  %r = sub i8 47, %z66  ret i8 %r67}68 69define i8 @add_zext_cmp_mask_same_size_result(i8 %x) {70; X64-LABEL: add_zext_cmp_mask_same_size_result:71; X64:       # %bb.0:72; X64-NEXT:    movl %edi, %eax73; X64-NEXT:    andb $1, %al74; X64-NEXT:    xorb $27, %al75; X64-NEXT:    # kill: def $al killed $al killed $eax76; X64-NEXT:    retq77;78; X32-LABEL: add_zext_cmp_mask_same_size_result:79; X32:       # %bb.0:80; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax81; X32-NEXT:    andb $1, %al82; X32-NEXT:    xorb $27, %al83; X32-NEXT:    retl84  %a = and i8 %x, 185  %c = icmp eq i8 %a, 086  %z = zext i1 %c to i887  %r = add i8 %z, 2688  ret i8 %r89}90 91define i32 @add_zext_cmp_mask_wider_result(i8 %x) {92; X64-LABEL: add_zext_cmp_mask_wider_result:93; X64:       # %bb.0:94; X64-NEXT:    movl %edi, %eax95; X64-NEXT:    andl $1, %eax96; X64-NEXT:    xorl $27, %eax97; X64-NEXT:    retq98;99; X32-LABEL: add_zext_cmp_mask_wider_result:100; X32:       # %bb.0:101; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax102; X32-NEXT:    andl $1, %eax103; X32-NEXT:    xorl $27, %eax104; X32-NEXT:    retl105  %a = and i8 %x, 1106  %c = icmp eq i8 %a, 0107  %z = zext i1 %c to i32108  %r = add i32 %z, 26109  ret i32 %r110}111 112define i8 @add_zext_cmp_mask_narrower_result(i32 %x) {113; X64-LABEL: add_zext_cmp_mask_narrower_result:114; X64:       # %bb.0:115; X64-NEXT:    movl %edi, %eax116; X64-NEXT:    andb $1, %al117; X64-NEXT:    xorb $43, %al118; X64-NEXT:    # kill: def $al killed $al killed $eax119; X64-NEXT:    retq120;121; X32-LABEL: add_zext_cmp_mask_narrower_result:122; X32:       # %bb.0:123; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax124; X32-NEXT:    andb $1, %al125; X32-NEXT:    xorb $43, %al126; X32-NEXT:    retl127  %a = and i32 %x, 1128  %c = icmp eq i32 %a, 0129  %z = zext i1 %c to i8130  %r = add i8 %z, 42131  ret i8 %r132}133 134define i32 @low_bit_select_constants_bigger_false_same_size_result(i32 %x) {135; X64-LABEL: low_bit_select_constants_bigger_false_same_size_result:136; X64:       # %bb.0:137; X64-NEXT:    # kill: def $edi killed $edi def $rdi138; X64-NEXT:    andl $1, %edi139; X64-NEXT:    leal 42(%rdi), %eax140; X64-NEXT:    retq141;142; X32-LABEL: low_bit_select_constants_bigger_false_same_size_result:143; X32:       # %bb.0:144; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax145; X32-NEXT:    andl $1, %eax146; X32-NEXT:    orl $42, %eax147; X32-NEXT:    retl148  %a = and i32 %x, 1149  %c = icmp eq i32 %a, 0150  %r = select i1 %c, i32 42, i32 43151  ret i32 %r152}153 154define i64 @low_bit_select_constants_bigger_false_wider_result(i32 %x) {155; X64-LABEL: low_bit_select_constants_bigger_false_wider_result:156; X64:       # %bb.0:157; X64-NEXT:    # kill: def $edi killed $edi def $rdi158; X64-NEXT:    andl $1, %edi159; X64-NEXT:    leaq 26(%rdi), %rax160; X64-NEXT:    retq161;162; X32-LABEL: low_bit_select_constants_bigger_false_wider_result:163; X32:       # %bb.0:164; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax165; X32-NEXT:    andl $1, %eax166; X32-NEXT:    orl $26, %eax167; X32-NEXT:    xorl %edx, %edx168; X32-NEXT:    retl169  %a = and i32 %x, 1170  %c = icmp eq i32 %a, 0171  %r = select i1 %c, i64 26, i64 27172  ret i64 %r173}174 175define i16 @low_bit_select_constants_bigger_false_narrower_result(i32 %x) {176; X64-LABEL: low_bit_select_constants_bigger_false_narrower_result:177; X64:       # %bb.0:178; X64-NEXT:    # kill: def $edi killed $edi def $rdi179; X64-NEXT:    andl $1, %edi180; X64-NEXT:    leal 36(%rdi), %eax181; X64-NEXT:    # kill: def $ax killed $ax killed $eax182; X64-NEXT:    retq183;184; X32-LABEL: low_bit_select_constants_bigger_false_narrower_result:185; X32:       # %bb.0:186; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax187; X32-NEXT:    andl $1, %eax188; X32-NEXT:    orl $36, %eax189; X32-NEXT:    # kill: def $ax killed $ax killed $eax190; X32-NEXT:    retl191  %a = and i32 %x, 1192  %c = icmp eq i32 %a, 0193  %r = select i1 %c, i16 36, i16 37194  ret i16 %r195}196 197define i8 @low_bit_select_constants_bigger_true_same_size_result(i8 %x) {198; X64-LABEL: low_bit_select_constants_bigger_true_same_size_result:199; X64:       # %bb.0:200; X64-NEXT:    movl %edi, %eax201; X64-NEXT:    andb $1, %al202; X64-NEXT:    xorb $-29, %al203; X64-NEXT:    # kill: def $al killed $al killed $eax204; X64-NEXT:    retq205;206; X32-LABEL: low_bit_select_constants_bigger_true_same_size_result:207; X32:       # %bb.0:208; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax209; X32-NEXT:    andb $1, %al210; X32-NEXT:    xorb $-29, %al211; X32-NEXT:    retl212  %a = and i8 %x, 1213  %c = icmp eq i8 %a, 0214  %r = select i1 %c, i8 227, i8 226215  ret i8 %r216}217 218define i32 @low_bit_select_constants_bigger_true_wider_result(i8 %x) {219; X64-LABEL: low_bit_select_constants_bigger_true_wider_result:220; X64:       # %bb.0:221; X64-NEXT:    movl %edi, %eax222; X64-NEXT:    andl $1, %eax223; X64-NEXT:    xorl $227, %eax224; X64-NEXT:    retq225;226; X32-LABEL: low_bit_select_constants_bigger_true_wider_result:227; X32:       # %bb.0:228; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax229; X32-NEXT:    andl $1, %eax230; X32-NEXT:    xorl $227, %eax231; X32-NEXT:    retl232  %a = and i8 %x, 1233  %c = icmp eq i8 %a, 0234  %r = select i1 %c, i32 227, i32 226235  ret i32 %r236}237 238define i8 @low_bit_select_constants_bigger_true_narrower_result(i16 %x) {239; X64-LABEL: low_bit_select_constants_bigger_true_narrower_result:240; X64:       # %bb.0:241; X64-NEXT:    movl %edi, %eax242; X64-NEXT:    andb $1, %al243; X64-NEXT:    xorb $41, %al244; X64-NEXT:    # kill: def $al killed $al killed $eax245; X64-NEXT:    retq246;247; X32-LABEL: low_bit_select_constants_bigger_true_narrower_result:248; X32:       # %bb.0:249; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax250; X32-NEXT:    andb $1, %al251; X32-NEXT:    xorb $41, %al252; X32-NEXT:    retl253  %a = and i16 %x, 1254  %c = icmp eq i16 %a, 0255  %r = select i1 %c, i8 41, i8 40256  ret i8 %r257}258 259; Truncation hoisting must not occur with opaque constants260; because that can induce infinite looping.261 262define i1 @opaque_constant(i48 %x, i48 %y) {263; X64-LABEL: opaque_constant:264; X64:       # %bb.0:265; X64-NEXT:    movq %rdi, %rax266; X64-NEXT:    xorq %rsi, %rax267; X64-NEXT:    shrq $32, %rax268; X64-NEXT:    andl $1, %eax269; X64-NEXT:    # kill: def $al killed $al killed $rax270; X64-NEXT:    retq271;272; X32-LABEL: opaque_constant:273; X32:       # %bb.0:274; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax275; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax276; X32-NEXT:    andl $1, %eax277; X32-NEXT:    # kill: def $al killed $al killed $eax278; X32-NEXT:    retl279  %andx = and i48 %x, 4294967296280  %andy = and i48 %y, 4294967296281  %cmp1 = icmp ne i48 %andx, 0282  %cmp2 = icmp ne i48 %andy, 0283  %r = xor i1 %cmp1, %cmp2284  ret i1 %r285}286 287