brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · f81851a Raw
226 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+slow-3ops-lea | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-- -mattr=-slow-3ops-lea | FileCheck %s4 5define i16 @and_i8_zext_shl_add_i16(i16 %t0, i8 %t1) {6; CHECK-LABEL: and_i8_zext_shl_add_i16:7; CHECK:       # %bb.0:8; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi9; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi10; CHECK-NEXT:    andl $8, %esi11; CHECK-NEXT:    leal (%rdi,%rsi,4), %eax12; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax13; CHECK-NEXT:    retq14  %t4 = and i8 %t1, 815  %t5 = zext i8 %t4 to i1616  %sh = shl i16 %t5, 217  %t6 = add i16 %sh, %t018  ret i16 %t619}20 21define i16 @and_i8_shl_zext_add_i16(i16 %t0, i8 %t1) {22; CHECK-LABEL: and_i8_shl_zext_add_i16:23; CHECK:       # %bb.0:24; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi25; CHECK-NEXT:    andb $8, %sil26; CHECK-NEXT:    movzbl %sil, %eax27; CHECK-NEXT:    leal (%rdi,%rax,4), %eax28; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax29; CHECK-NEXT:    retq30  %t4 = and i8 %t1, 831  %sh = shl i8 %t4, 232  %t5 = zext i8 %sh to i1633  %t6 = add i16 %t5, %t034  ret i16 %t635}36 37define i32 @and_i8_zext_shl_add_i32(i32 %t0, i8 %t1) {38; CHECK-LABEL: and_i8_zext_shl_add_i32:39; CHECK:       # %bb.0:40; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi41; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi42; CHECK-NEXT:    andl $8, %esi43; CHECK-NEXT:    leal (%rdi,%rsi,8), %eax44; CHECK-NEXT:    retq45  %t4 = and i8 %t1, 846  %t5 = zext i8 %t4 to i3247  %sh = shl i32 %t5, 348  %t6 = add i32 %sh, %t049  ret i32 %t650}51 52define i32 @and_i8_shl_zext_add_i32(i32 %t0, i8 %t1) {53; CHECK-LABEL: and_i8_shl_zext_add_i32:54; CHECK:       # %bb.0:55; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi56; CHECK-NEXT:    andb $8, %sil57; CHECK-NEXT:    movzbl %sil, %eax58; CHECK-NEXT:    leal (%rdi,%rax,8), %eax59; CHECK-NEXT:    retq60  %t4 = and i8 %t1, 861  %sh = shl i8 %t4, 362  %t5 = zext i8 %sh to i3263  %t6 = add i32 %t5, %t064  ret i32 %t665}66 67define i32 @and_i16_zext_shl_add_i32(i32 %t0, i16 %t1) {68; CHECK-LABEL: and_i16_zext_shl_add_i32:69; CHECK:       # %bb.0:70; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi71; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi72; CHECK-NEXT:    andl $8, %esi73; CHECK-NEXT:    leal (%rdi,%rsi,4), %eax74; CHECK-NEXT:    retq75  %t4 = and i16 %t1, 876  %t5 = zext i16 %t4 to i3277  %sh = shl i32 %t5, 278  %t6 = add i32 %sh, %t079  ret i32 %t680}81 82define i32 @and_i16_shl_zext_add_i32(i32 %t0, i16 %t1) {83; CHECK-LABEL: and_i16_shl_zext_add_i32:84; CHECK:       # %bb.0:85; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi86; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi87; CHECK-NEXT:    andl $8, %esi88; CHECK-NEXT:    leal (%rdi,%rsi,4), %eax89; CHECK-NEXT:    retq90  %t4 = and i16 %t1, 891  %sh = shl i16 %t4, 292  %t5 = zext i16 %sh to i3293  %t6 = add i32 %t5, %t094  ret i32 %t695}96 97define i64 @and_i8_zext_shl_add_i64(i64 %t0, i8 %t1) {98; CHECK-LABEL: and_i8_zext_shl_add_i64:99; CHECK:       # %bb.0:100; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi101; CHECK-NEXT:    andl $8, %esi102; CHECK-NEXT:    leaq (%rdi,%rsi,2), %rax103; CHECK-NEXT:    retq104  %t4 = and i8 %t1, 8105  %t5 = zext i8 %t4 to i64106  %sh = shl i64 %t5, 1107  %t6 = add i64 %sh, %t0108  ret i64 %t6109}110 111define i64 @and_i8_shl_zext_add_i64(i64 %t0, i8 %t1) {112; CHECK-LABEL: and_i8_shl_zext_add_i64:113; CHECK:       # %bb.0:114; CHECK-NEXT:    andb $8, %sil115; CHECK-NEXT:    movzbl %sil, %eax116; CHECK-NEXT:    leaq (%rdi,%rax,2), %rax117; CHECK-NEXT:    retq118  %t4 = and i8 %t1, 8119  %sh = shl i8 %t4, 1120  %t5 = zext i8 %sh to i64121  %t6 = add i64 %t5, %t0122  ret i64 %t6123}124 125define i64 @and_i32_zext_shl_add_i64(i64 %t0, i32 %t1) {126; CHECK-LABEL: and_i32_zext_shl_add_i64:127; CHECK:       # %bb.0:128; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi129; CHECK-NEXT:    andl $8, %esi130; CHECK-NEXT:    leaq (%rdi,%rsi,8), %rax131; CHECK-NEXT:    retq132  %t4 = and i32 %t1, 8133  %t5 = zext i32 %t4 to i64134  %sh = shl i64 %t5, 3135  %t6 = add i64 %sh, %t0136  ret i64 %t6137}138 139define i64 @and_i32_shl_zext_add_i64(i64 %t0, i32 %t1) {140; CHECK-LABEL: and_i32_shl_zext_add_i64:141; CHECK:       # %bb.0:142; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi143; CHECK-NEXT:    andl $8, %esi144; CHECK-NEXT:    leaq (%rdi,%rsi,8), %rax145; CHECK-NEXT:    retq146  %t4 = and i32 %t1, 8147  %sh = shl i32 %t4, 3148  %t5 = zext i32 %sh to i64149  %t6 = add i64 %t5, %t0150  ret i64 %t6151}152 153define i64 @shl_and_i8_zext_add_i64(i64 %t0, i8 %t1) {154; CHECK-LABEL: shl_and_i8_zext_add_i64:155; CHECK:       # %bb.0:156; CHECK-NEXT:    andb $15, %sil157; CHECK-NEXT:    movzbl %sil, %eax158; CHECK-NEXT:    leaq (%rdi,%rax,4), %rax159; CHECK-NEXT:    retq160  %s = shl i8 %t1, 2161  %m = and i8 %s, 60162  %z = zext i8 %m to i64163  %a = add i64 %t0, %z164  ret i64 %a165}166 167define i64 @shl_and_i16_zext_add_i64(i64 %t0, i16 %t1) {168; CHECK-LABEL: shl_and_i16_zext_add_i64:169; CHECK:       # %bb.0:170; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi171; CHECK-NEXT:    andl $8, %esi172; CHECK-NEXT:    leaq (%rdi,%rsi,2), %rax173; CHECK-NEXT:    retq174  %s = shl i16 %t1, 1175  %m = and i16 %s, 17176  %z = zext i16 %m to i64177  %a = add i64 %t0, %z178  ret i64 %a179}180 181define i64 @shl_and_i32_zext_add_i64(i64 %t0, i32 %t1) {182; CHECK-LABEL: shl_and_i32_zext_add_i64:183; CHECK:       # %bb.0:184; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi185; CHECK-NEXT:    andl $749, %esi # imm = 0x2ED186; CHECK-NEXT:    leaq (%rdi,%rsi,8), %rax187; CHECK-NEXT:    retq188  %s = shl i32 %t1, 3189  %m = and i32 %s, 5999190  %z = zext i32 %m to i64191  %a = add i64 %t0, %z192  ret i64 %a193}194 195; Negative test - shift can't be converted to scale factor.196 197define i64 @and_i32_zext_shl_add_i64_overshift(i64 %t0, i32 %t1) {198; CHECK-LABEL: and_i32_zext_shl_add_i64_overshift:199; CHECK:       # %bb.0:200; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi201; CHECK-NEXT:    andl $8, %esi202; CHECK-NEXT:    shll $4, %esi203; CHECK-NEXT:    leaq (%rsi,%rdi), %rax204; CHECK-NEXT:    retq205  %t4 = and i32 %t1, 8206  %t5 = zext i32 %t4 to i64207  %sh = shl i64 %t5, 4208  %t6 = add i64 %sh, %t0209  ret i64 %t6210}211 212define i64 @and_i32_shl_zext_add_i64_overshift(i64 %t0, i32 %t1) {213; CHECK-LABEL: and_i32_shl_zext_add_i64_overshift:214; CHECK:       # %bb.0:215; CHECK-NEXT:    # kill: def $esi killed $esi def $rsi216; CHECK-NEXT:    andl $8, %esi217; CHECK-NEXT:    shll $4, %esi218; CHECK-NEXT:    leaq (%rsi,%rdi), %rax219; CHECK-NEXT:    retq220  %t4 = and i32 %t1, 8221  %sh = shl i32 %t4, 4222  %t5 = zext i32 %sh to i64223  %t6 = add i64 %t5, %t0224  ret i64 %t6225}226