brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.0 KiB · 9ae4492 Raw
375 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefixes=X644 5;6; fixed avg(x,y) = add(and(x,y),lshr(xor(x,y),1))7;8; lsb avg(x,y) = add(lshr(x,1),lshr(y,1),and(x,y,1))9;10; ext avg(x,y) = trunc(lshr(add(zext(x),zext(y)),1))11;12 13define i8 @test_fixed_i8(i8 %a0, i8 %a1) nounwind {14; X86-LABEL: test_fixed_i8:15; X86:       # %bb.0:16; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx17; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax18; X86-NEXT:    addl %ecx, %eax19; X86-NEXT:    shrl %eax20; X86-NEXT:    # kill: def $al killed $al killed $eax21; X86-NEXT:    retl22;23; X64-LABEL: test_fixed_i8:24; X64:       # %bb.0:25; X64-NEXT:    movzbl %sil, %ecx26; X64-NEXT:    movzbl %dil, %eax27; X64-NEXT:    addl %ecx, %eax28; X64-NEXT:    shrl %eax29; X64-NEXT:    # kill: def $al killed $al killed $eax30; X64-NEXT:    retq31  %and = and i8 %a0, %a132  %xor = xor i8 %a0, %a133  %shift = lshr i8 %xor, 134  %res = add i8 %and, %shift35  ret i8 %res36}37 38define i8 @test_lsb_i8(i8 %a0, i8 %a1) nounwind {39; X86-LABEL: test_lsb_i8:40; X86:       # %bb.0:41; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx42; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax43; X86-NEXT:    movl %eax, %edx44; X86-NEXT:    shrb %dl45; X86-NEXT:    andb %cl, %al46; X86-NEXT:    shrb %cl47; X86-NEXT:    addb %dl, %cl48; X86-NEXT:    andb $1, %al49; X86-NEXT:    addb %cl, %al50; X86-NEXT:    retl51;52; X64-LABEL: test_lsb_i8:53; X64:       # %bb.0:54; X64-NEXT:    movl %edi, %eax55; X64-NEXT:    shrb %al56; X64-NEXT:    andb %sil, %dil57; X64-NEXT:    shrb %sil58; X64-NEXT:    addb %sil, %al59; X64-NEXT:    andb $1, %dil60; X64-NEXT:    addb %dil, %al61; X64-NEXT:    retq62  %s0 = lshr i8 %a0, 163  %s1 = lshr i8 %a1, 164  %m0 = and i8 %a0, 165  %m1 = and i8 %m0, %a166  %r0 = add i8 %s0, %s167  %r1 = add i8 %r0, %m168  ret i8 %r169}70 71define i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {72; X86-LABEL: test_ext_i8:73; X86:       # %bb.0:74; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx75; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax76; X86-NEXT:    addl %ecx, %eax77; X86-NEXT:    shrl %eax78; X86-NEXT:    # kill: def $al killed $al killed $eax79; X86-NEXT:    retl80;81; X64-LABEL: test_ext_i8:82; X64:       # %bb.0:83; X64-NEXT:    movzbl %sil, %ecx84; X64-NEXT:    movzbl %dil, %eax85; X64-NEXT:    addl %ecx, %eax86; X64-NEXT:    shrl %eax87; X64-NEXT:    # kill: def $al killed $al killed $eax88; X64-NEXT:    retq89  %x0 = zext i8 %a0 to i1690  %x1 = zext i8 %a1 to i1691  %sum = add i16 %x0, %x192  %shift = lshr i16 %sum, 193  %res = trunc i16 %shift to i894  ret i8 %res95}96 97define i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {98; X86-LABEL: test_fixed_i16:99; X86:       # %bb.0:100; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx101; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax102; X86-NEXT:    addl %ecx, %eax103; X86-NEXT:    shrl %eax104; X86-NEXT:    # kill: def $ax killed $ax killed $eax105; X86-NEXT:    retl106;107; X64-LABEL: test_fixed_i16:108; X64:       # %bb.0:109; X64-NEXT:    movzwl %si, %ecx110; X64-NEXT:    movzwl %di, %eax111; X64-NEXT:    addl %ecx, %eax112; X64-NEXT:    shrl %eax113; X64-NEXT:    # kill: def $ax killed $ax killed $eax114; X64-NEXT:    retq115  %and = and i16 %a0, %a1116  %xor = xor i16 %a0, %a1117  %shift = lshr i16 %xor, 1118  %res = add i16 %and, %shift119  ret i16 %res120}121 122define i16 @test_lsb_i16(i16 %a0, i16 %a1) nounwind {123; X86-LABEL: test_lsb_i16:124; X86:       # %bb.0:125; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx126; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax127; X86-NEXT:    movl %eax, %edx128; X86-NEXT:    shrl %edx129; X86-NEXT:    andl %ecx, %eax130; X86-NEXT:    shrl %ecx131; X86-NEXT:    addl %edx, %ecx132; X86-NEXT:    andl $1, %eax133; X86-NEXT:    addl %ecx, %eax134; X86-NEXT:    # kill: def $ax killed $ax killed $eax135; X86-NEXT:    retl136;137; X64-LABEL: test_lsb_i16:138; X64:       # %bb.0:139; X64-NEXT:    movzwl %si, %eax140; X64-NEXT:    movzwl %di, %ecx141; X64-NEXT:    shrl %ecx142; X64-NEXT:    shrl %eax143; X64-NEXT:    addl %ecx, %eax144; X64-NEXT:    andl %esi, %edi145; X64-NEXT:    andl $1, %edi146; X64-NEXT:    addl %edi, %eax147; X64-NEXT:    # kill: def $ax killed $ax killed $eax148; X64-NEXT:    retq149  %s0 = lshr i16 %a0, 1150  %s1 = lshr i16 %a1, 1151  %m0 = and i16 %a0, %a1152  %m1 = and i16 %m0, 1153  %r0 = add i16 %s0, %s1154  %r1 = add i16 %r0, %m1155  ret i16 %r1156}157 158define i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {159; X86-LABEL: test_ext_i16:160; X86:       # %bb.0:161; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx162; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax163; X86-NEXT:    addl %ecx, %eax164; X86-NEXT:    shrl %eax165; X86-NEXT:    # kill: def $ax killed $ax killed $eax166; X86-NEXT:    retl167;168; X64-LABEL: test_ext_i16:169; X64:       # %bb.0:170; X64-NEXT:    movzwl %si, %ecx171; X64-NEXT:    movzwl %di, %eax172; X64-NEXT:    addl %ecx, %eax173; X64-NEXT:    shrl %eax174; X64-NEXT:    # kill: def $ax killed $ax killed $eax175; X64-NEXT:    retq176  %x0 = zext i16 %a0 to i32177  %x1 = zext i16 %a1 to i32178  %sum = add i32 %x0, %x1179  %shift = lshr i32 %sum, 1180  %res = trunc i32 %shift to i16181  ret i16 %res182}183 184define i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {185; X86-LABEL: test_fixed_i32:186; X86:       # %bb.0:187; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx188; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax189; X86-NEXT:    movl %eax, %edx190; X86-NEXT:    andl %ecx, %edx191; X86-NEXT:    xorl %ecx, %eax192; X86-NEXT:    shrl %eax193; X86-NEXT:    addl %edx, %eax194; X86-NEXT:    retl195;196; X64-LABEL: test_fixed_i32:197; X64:       # %bb.0:198; X64-NEXT:    movl %esi, %ecx199; X64-NEXT:    movl %edi, %eax200; X64-NEXT:    addq %rcx, %rax201; X64-NEXT:    shrq %rax202; X64-NEXT:    # kill: def $eax killed $eax killed $rax203; X64-NEXT:    retq204  %and = and i32 %a0, %a1205  %xor = xor i32 %a1, %a0206  %shift = lshr i32 %xor, 1207  %res = add i32 %and, %shift208  ret i32 %res209}210 211define i32 @test_lsb_i32(i32 %a0, i32 %a1) nounwind {212; X86-LABEL: test_lsb_i32:213; X86:       # %bb.0:214; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx215; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax216; X86-NEXT:    movl %eax, %edx217; X86-NEXT:    shrl %edx218; X86-NEXT:    andl %ecx, %eax219; X86-NEXT:    shrl %ecx220; X86-NEXT:    addl %edx, %ecx221; X86-NEXT:    andl $1, %eax222; X86-NEXT:    addl %ecx, %eax223; X86-NEXT:    retl224;225; X64-LABEL: test_lsb_i32:226; X64:       # %bb.0:227; X64-NEXT:    movl %edi, %eax228; X64-NEXT:    shrl %eax229; X64-NEXT:    andl %esi, %edi230; X64-NEXT:    shrl %esi231; X64-NEXT:    addl %esi, %eax232; X64-NEXT:    andl $1, %edi233; X64-NEXT:    addl %edi, %eax234; X64-NEXT:    retq235  %s0 = lshr i32 %a0, 1236  %s1 = lshr i32 %a1, 1237  %m0 = and i32 %a0, %a1238  %m1 = and i32 %m0, 1239  %r0 = add i32 %s0, %m1240  %r1 = add i32 %r0, %s1241  ret i32 %r1242}243 244define i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {245; X86-LABEL: test_ext_i32:246; X86:       # %bb.0:247; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx248; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax249; X86-NEXT:    movl %eax, %edx250; X86-NEXT:    andl %ecx, %edx251; X86-NEXT:    xorl %ecx, %eax252; X86-NEXT:    shrl %eax253; X86-NEXT:    addl %edx, %eax254; X86-NEXT:    retl255;256; X64-LABEL: test_ext_i32:257; X64:       # %bb.0:258; X64-NEXT:    movl %esi, %ecx259; X64-NEXT:    movl %edi, %eax260; X64-NEXT:    addq %rcx, %rax261; X64-NEXT:    shrq %rax262; X64-NEXT:    # kill: def $eax killed $eax killed $rax263; X64-NEXT:    retq264  %x0 = zext i32 %a0 to i64265  %x1 = zext i32 %a1 to i64266  %sum = add i64 %x0, %x1267  %shift = lshr i64 %sum, 1268  %res = trunc i64 %shift to i32269  ret i32 %res270}271 272define i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {273; X86-LABEL: test_fixed_i64:274; X86:       # %bb.0:275; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx276; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax277; X86-NEXT:    addl {{[0-9]+}}(%esp), %ecx278; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax279; X86-NEXT:    setb %dl280; X86-NEXT:    movzbl %dl, %edx281; X86-NEXT:    shldl $31, %eax, %edx282; X86-NEXT:    shldl $31, %ecx, %eax283; X86-NEXT:    retl284;285; X64-LABEL: test_fixed_i64:286; X64:       # %bb.0:287; X64-NEXT:    movq %rdi, %rax288; X64-NEXT:    andq %rsi, %rax289; X64-NEXT:    xorq %rsi, %rdi290; X64-NEXT:    shrq %rdi291; X64-NEXT:    addq %rdi, %rax292; X64-NEXT:    retq293  %and = and i64 %a0, %a1294  %xor = xor i64 %a1, %a0295  %shift = lshr i64 %xor, 1296  %res = add i64 %and, %shift297  ret i64 %res298}299 300define i64 @test_lsb_i64(i64 %a0, i64 %a1) nounwind {301; X86-LABEL: test_lsb_i64:302; X86:       # %bb.0:303; X86-NEXT:    pushl %ebx304; X86-NEXT:    pushl %edi305; X86-NEXT:    pushl %esi306; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi307; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx308; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax309; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi310; X86-NEXT:    movl %edi, %ebx311; X86-NEXT:    shrl %ebx312; X86-NEXT:    shldl $31, %eax, %edi313; X86-NEXT:    movl %ecx, %edx314; X86-NEXT:    shrl %edx315; X86-NEXT:    shldl $31, %esi, %ecx316; X86-NEXT:    addl %edi, %ecx317; X86-NEXT:    adcl %ebx, %edx318; X86-NEXT:    andl %esi, %eax319; X86-NEXT:    andl $1, %eax320; X86-NEXT:    addl %ecx, %eax321; X86-NEXT:    adcl $0, %edx322; X86-NEXT:    popl %esi323; X86-NEXT:    popl %edi324; X86-NEXT:    popl %ebx325; X86-NEXT:    retl326;327; X64-LABEL: test_lsb_i64:328; X64:       # %bb.0:329; X64-NEXT:    movq %rdi, %rcx330; X64-NEXT:    shrq %rcx331; X64-NEXT:    andl %esi, %edi332; X64-NEXT:    movq %rsi, %rax333; X64-NEXT:    shrq %rax334; X64-NEXT:    addq %rcx, %rax335; X64-NEXT:    andl $1, %edi336; X64-NEXT:    addq %rdi, %rax337; X64-NEXT:    retq338  %s0 = lshr i64 %a0, 1339  %s1 = lshr i64 %a1, 1340  %s = add i64 %s1, %s0341  %m0 = and i64 %a0, 1342  %m1 = and i64 %m0, %a1343  %res = add i64 %s, %m1344  ret i64 %res345}346 347define i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {348; X86-LABEL: test_ext_i64:349; X86:       # %bb.0:350; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx351; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax352; X86-NEXT:    addl {{[0-9]+}}(%esp), %ecx353; X86-NEXT:    adcl {{[0-9]+}}(%esp), %eax354; X86-NEXT:    setb %dl355; X86-NEXT:    movzbl %dl, %edx356; X86-NEXT:    shldl $31, %eax, %edx357; X86-NEXT:    shldl $31, %ecx, %eax358; X86-NEXT:    retl359;360; X64-LABEL: test_ext_i64:361; X64:       # %bb.0:362; X64-NEXT:    movq %rdi, %rax363; X64-NEXT:    andq %rsi, %rax364; X64-NEXT:    xorq %rsi, %rdi365; X64-NEXT:    shrq %rdi366; X64-NEXT:    addq %rdi, %rax367; X64-NEXT:    retq368  %x0 = zext i64 %a0 to i128369  %x1 = zext i64 %a1 to i128370  %sum = add i128 %x0, %x1371  %shift = lshr i128 %sum, 1372  %res = trunc i128 %shift to i64373  ret i64 %res374}375