746 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s3 4; Don't optimize away zext-inreg and sext-inreg on the loop induction5; variable, because it isn't safe to do so in these cases.6 7define void @count_up(ptr %d, i64 %n) nounwind {8; CHECK-LABEL: count_up:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: movl $10, %eax11; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]12; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]13; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]14; CHECK-NEXT: .p2align 415; CHECK-NEXT: .LBB0_1: # %loop16; CHECK-NEXT: # =>This Inner Loop Header: Depth=117; CHECK-NEXT: movzbl %al, %ecx18; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero19; CHECK-NEXT: mulsd %xmm0, %xmm320; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)21; CHECK-NEXT: movl %eax, %ecx22; CHECK-NEXT: andl $16777215, %ecx # imm = 0xFFFFFF23; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero24; CHECK-NEXT: mulsd %xmm1, %xmm325; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)26; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero27; CHECK-NEXT: mulsd %xmm2, %xmm328; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)29; CHECK-NEXT: incq %rax30; CHECK-NEXT: jne .LBB0_131; CHECK-NEXT: # %bb.2: # %return32; CHECK-NEXT: retq33entry:34 br label %loop35 36loop:37 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]38 %indvar.i8 = and i64 %indvar, 25539 %t0 = getelementptr double, ptr %d, i64 %indvar.i840 %t1 = load double, ptr %t041 %t2 = fmul double %t1, 0.142 store double %t2, ptr %t043 %indvar.i24 = and i64 %indvar, 1677721544 %t3 = getelementptr double, ptr %d, i64 %indvar.i2445 %t4 = load double, ptr %t346 %t5 = fmul double %t4, 2.347 store double %t5, ptr %t348 %t6 = getelementptr double, ptr %d, i64 %indvar49 %t7 = load double, ptr %t650 %t8 = fmul double %t7, 4.551 store double %t8, ptr %t652 %indvar.next = add i64 %indvar, 153 %exitcond = icmp eq i64 %indvar.next, 054 br i1 %exitcond, label %return, label %loop55 56return:57 ret void58}59 60define void @count_down(ptr %d, i64 %n) nounwind {61; CHECK-LABEL: count_down:62; CHECK: # %bb.0: # %entry63; CHECK-NEXT: movl $10, %eax64; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]65; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]66; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]67; CHECK-NEXT: .p2align 468; CHECK-NEXT: .LBB1_1: # %loop69; CHECK-NEXT: # =>This Inner Loop Header: Depth=170; CHECK-NEXT: movzbl %al, %ecx71; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero72; CHECK-NEXT: mulsd %xmm0, %xmm373; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)74; CHECK-NEXT: movl %eax, %ecx75; CHECK-NEXT: andl $16777215, %ecx # imm = 0xFFFFFF76; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero77; CHECK-NEXT: mulsd %xmm1, %xmm378; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)79; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero80; CHECK-NEXT: mulsd %xmm2, %xmm381; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)82; CHECK-NEXT: decq %rax83; CHECK-NEXT: cmpq $20, %rax84; CHECK-NEXT: jne .LBB1_185; CHECK-NEXT: # %bb.2: # %return86; CHECK-NEXT: retq87entry:88 br label %loop89 90loop:91 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]92 %indvar.i8 = and i64 %indvar, 25593 %t0 = getelementptr double, ptr %d, i64 %indvar.i894 %t1 = load double, ptr %t095 %t2 = fmul double %t1, 0.196 store double %t2, ptr %t097 %indvar.i24 = and i64 %indvar, 1677721598 %t3 = getelementptr double, ptr %d, i64 %indvar.i2499 %t4 = load double, ptr %t3100 %t5 = fmul double %t4, 2.3101 store double %t5, ptr %t3102 %t6 = getelementptr double, ptr %d, i64 %indvar103 %t7 = load double, ptr %t6104 %t8 = fmul double %t7, 4.5105 store double %t8, ptr %t6106 %indvar.next = sub i64 %indvar, 1107 %exitcond = icmp eq i64 %indvar.next, 20108 br i1 %exitcond, label %return, label %loop109 110return:111 ret void112}113 114define void @count_up_signed(ptr %d, i64 %n) nounwind {115; CHECK-LABEL: count_up_signed:116; CHECK: # %bb.0: # %entry117; CHECK-NEXT: movl $10, %eax118; CHECK-NEXT: movl $167772160, %ecx # imm = 0xA000000119; CHECK-NEXT: movl $2560, %edx # imm = 0xA00120; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]121; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]122; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]123; CHECK-NEXT: .p2align 4124; CHECK-NEXT: .LBB2_1: # %loop125; CHECK-NEXT: # =>This Inner Loop Header: Depth=1126; CHECK-NEXT: movq %rdx, %rsi127; CHECK-NEXT: sarq $8, %rsi128; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero129; CHECK-NEXT: mulsd %xmm0, %xmm3130; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)131; CHECK-NEXT: movq %rcx, %rsi132; CHECK-NEXT: sarq $24, %rsi133; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero134; CHECK-NEXT: mulsd %xmm1, %xmm3135; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)136; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero137; CHECK-NEXT: mulsd %xmm2, %xmm3138; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)139; CHECK-NEXT: addq $16777216, %rcx # imm = 0x1000000140; CHECK-NEXT: addq $256, %rdx # imm = 0x100141; CHECK-NEXT: incq %rax142; CHECK-NEXT: jne .LBB2_1143; CHECK-NEXT: # %bb.2: # %return144; CHECK-NEXT: retq145entry:146 br label %loop147 148loop:149 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]150 %s0 = shl i64 %indvar, 8151 %indvar.i8 = ashr i64 %s0, 8152 %t0 = getelementptr double, ptr %d, i64 %indvar.i8153 %t1 = load double, ptr %t0154 %t2 = fmul double %t1, 0.1155 store double %t2, ptr %t0156 %s1 = shl i64 %indvar, 24157 %indvar.i24 = ashr i64 %s1, 24158 %t3 = getelementptr double, ptr %d, i64 %indvar.i24159 %t4 = load double, ptr %t3160 %t5 = fmul double %t4, 2.3161 store double %t5, ptr %t3162 %t6 = getelementptr double, ptr %d, i64 %indvar163 %t7 = load double, ptr %t6164 %t8 = fmul double %t7, 4.5165 store double %t8, ptr %t6166 %indvar.next = add i64 %indvar, 1167 %exitcond = icmp eq i64 %indvar.next, 0168 br i1 %exitcond, label %return, label %loop169 170return:171 ret void172}173 174define void @count_down_signed(ptr %d, i64 %n) nounwind {175; CHECK-LABEL: count_down_signed:176; CHECK: # %bb.0: # %entry177; CHECK-NEXT: movq $-10, %rax178; CHECK-NEXT: movl $167772160, %ecx # imm = 0xA000000179; CHECK-NEXT: movl $2560, %edx # imm = 0xA00180; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]181; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]182; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]183; CHECK-NEXT: .p2align 4184; CHECK-NEXT: .LBB3_1: # %loop185; CHECK-NEXT: # =>This Inner Loop Header: Depth=1186; CHECK-NEXT: movq %rdx, %rsi187; CHECK-NEXT: sarq $8, %rsi188; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero189; CHECK-NEXT: mulsd %xmm0, %xmm3190; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)191; CHECK-NEXT: movq %rcx, %rsi192; CHECK-NEXT: sarq $24, %rsi193; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero194; CHECK-NEXT: mulsd %xmm1, %xmm3195; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)196; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero197; CHECK-NEXT: mulsd %xmm2, %xmm3198; CHECK-NEXT: movsd %xmm3, 160(%rdi,%rax,8)199; CHECK-NEXT: addq $-16777216, %rcx # imm = 0xFF000000200; CHECK-NEXT: addq $-256, %rdx201; CHECK-NEXT: decq %rax202; CHECK-NEXT: jne .LBB3_1203; CHECK-NEXT: # %bb.2: # %return204; CHECK-NEXT: retq205entry:206 br label %loop207 208loop:209 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]210 %s0 = shl i64 %indvar, 8211 %indvar.i8 = ashr i64 %s0, 8212 %t0 = getelementptr double, ptr %d, i64 %indvar.i8213 %t1 = load double, ptr %t0214 %t2 = fmul double %t1, 0.1215 store double %t2, ptr %t0216 %s1 = shl i64 %indvar, 24217 %indvar.i24 = ashr i64 %s1, 24218 %t3 = getelementptr double, ptr %d, i64 %indvar.i24219 %t4 = load double, ptr %t3220 %t5 = fmul double %t4, 2.3221 store double %t5, ptr %t3222 %t6 = getelementptr double, ptr %d, i64 %indvar223 %t7 = load double, ptr %t6224 %t8 = fmul double %t7, 4.5225 store double %t8, ptr %t6226 %indvar.next = sub i64 %indvar, 1227 %exitcond = icmp eq i64 %indvar.next, 20228 br i1 %exitcond, label %return, label %loop229 230return:231 ret void232}233 234define void @another_count_up(ptr %d, i64 %n) nounwind {235; CHECK-LABEL: another_count_up:236; CHECK: # %bb.0: # %entry237; CHECK-NEXT: xorl %eax, %eax238; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]239; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]240; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]241; CHECK-NEXT: .p2align 4242; CHECK-NEXT: .LBB4_1: # %loop243; CHECK-NEXT: # =>This Inner Loop Header: Depth=1244; CHECK-NEXT: movzbl %al, %ecx245; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero246; CHECK-NEXT: mulsd %xmm0, %xmm3247; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)248; CHECK-NEXT: movl %eax, %ecx249; CHECK-NEXT: andl $16777215, %ecx # imm = 0xFFFFFF250; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero251; CHECK-NEXT: mulsd %xmm1, %xmm3252; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)253; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero254; CHECK-NEXT: mulsd %xmm2, %xmm3255; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)256; CHECK-NEXT: incq %rax257; CHECK-NEXT: cmpq %rax, %rsi258; CHECK-NEXT: jne .LBB4_1259; CHECK-NEXT: # %bb.2: # %return260; CHECK-NEXT: retq261entry:262 br label %loop263 264loop:265 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]266 %indvar.i8 = and i64 %indvar, 255267 %t0 = getelementptr double, ptr %d, i64 %indvar.i8268 %t1 = load double, ptr %t0269 %t2 = fmul double %t1, 0.1270 store double %t2, ptr %t0271 %indvar.i24 = and i64 %indvar, 16777215272 %t3 = getelementptr double, ptr %d, i64 %indvar.i24273 %t4 = load double, ptr %t3274 %t5 = fmul double %t4, 2.3275 store double %t5, ptr %t3276 %t6 = getelementptr double, ptr %d, i64 %indvar277 %t7 = load double, ptr %t6278 %t8 = fmul double %t7, 4.5279 store double %t8, ptr %t6280 %indvar.next = add i64 %indvar, 1281 %exitcond = icmp eq i64 %indvar.next, %n282 br i1 %exitcond, label %return, label %loop283 284return:285 ret void286}287 288define void @another_count_down(ptr %d, i64 %n) nounwind {289; CHECK-LABEL: another_count_down:290; CHECK: # %bb.0: # %entry291; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]292; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]293; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]294; CHECK-NEXT: .p2align 4295; CHECK-NEXT: .LBB5_1: # %loop296; CHECK-NEXT: # =>This Inner Loop Header: Depth=1297; CHECK-NEXT: movzbl %sil, %eax298; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero299; CHECK-NEXT: mulsd %xmm0, %xmm3300; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)301; CHECK-NEXT: movl %esi, %eax302; CHECK-NEXT: andl $16777215, %eax # imm = 0xFFFFFF303; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero304; CHECK-NEXT: mulsd %xmm1, %xmm3305; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)306; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero307; CHECK-NEXT: mulsd %xmm2, %xmm3308; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)309; CHECK-NEXT: decq %rsi310; CHECK-NEXT: cmpq $10, %rsi311; CHECK-NEXT: jne .LBB5_1312; CHECK-NEXT: # %bb.2: # %return313; CHECK-NEXT: retq314entry:315 br label %loop316 317loop:318 %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %loop ]319 %indvar.i8 = and i64 %indvar, 255320 %t0 = getelementptr double, ptr %d, i64 %indvar.i8321 %t1 = load double, ptr %t0322 %t2 = fmul double %t1, 0.1323 store double %t2, ptr %t0324 %indvar.i24 = and i64 %indvar, 16777215325 %t3 = getelementptr double, ptr %d, i64 %indvar.i24326 %t4 = load double, ptr %t3327 %t5 = fmul double %t4, 2.3328 store double %t5, ptr %t3329 %t6 = getelementptr double, ptr %d, i64 %indvar330 %t7 = load double, ptr %t6331 %t8 = fmul double %t7, 4.5332 store double %t8, ptr %t6333 %indvar.next = sub i64 %indvar, 1334 %exitcond = icmp eq i64 %indvar.next, 10335 br i1 %exitcond, label %return, label %loop336 337return:338 ret void339}340 341define void @another_count_up_signed(ptr %d, i64 %n) nounwind {342; CHECK-LABEL: another_count_up_signed:343; CHECK: # %bb.0: # %entry344; CHECK-NEXT: xorl %eax, %eax345; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]346; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]347; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]348; CHECK-NEXT: xorl %ecx, %ecx349; CHECK-NEXT: movq %rdi, %rdx350; CHECK-NEXT: .p2align 4351; CHECK-NEXT: .LBB6_1: # %loop352; CHECK-NEXT: # =>This Inner Loop Header: Depth=1353; CHECK-NEXT: movq %rax, %r8354; CHECK-NEXT: sarq $8, %r8355; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero356; CHECK-NEXT: mulsd %xmm0, %xmm3357; CHECK-NEXT: movsd %xmm3, (%rdi,%r8,8)358; CHECK-NEXT: movq %rcx, %r8359; CHECK-NEXT: sarq $24, %r8360; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero361; CHECK-NEXT: mulsd %xmm1, %xmm3362; CHECK-NEXT: movsd %xmm3, (%rdi,%r8,8)363; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero364; CHECK-NEXT: mulsd %xmm2, %xmm3365; CHECK-NEXT: movsd %xmm3, (%rdx)366; CHECK-NEXT: addq $8, %rdx367; CHECK-NEXT: addq $16777216, %rcx # imm = 0x1000000368; CHECK-NEXT: addq $256, %rax # imm = 0x100369; CHECK-NEXT: decq %rsi370; CHECK-NEXT: jne .LBB6_1371; CHECK-NEXT: # %bb.2: # %return372; CHECK-NEXT: retq373entry:374 br label %loop375 376loop:377 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]378 %s0 = shl i64 %indvar, 8379 %indvar.i8 = ashr i64 %s0, 8380 %t0 = getelementptr double, ptr %d, i64 %indvar.i8381 %t1 = load double, ptr %t0382 %t2 = fmul double %t1, 0.1383 store double %t2, ptr %t0384 %s1 = shl i64 %indvar, 24385 %indvar.i24 = ashr i64 %s1, 24386 %t3 = getelementptr double, ptr %d, i64 %indvar.i24387 %t4 = load double, ptr %t3388 %t5 = fmul double %t4, 2.3389 store double %t5, ptr %t3390 %t6 = getelementptr double, ptr %d, i64 %indvar391 %t7 = load double, ptr %t6392 %t8 = fmul double %t7, 4.5393 store double %t8, ptr %t6394 %indvar.next = add i64 %indvar, 1395 %exitcond = icmp eq i64 %indvar.next, %n396 br i1 %exitcond, label %return, label %loop397 398return:399 ret void400}401 402define void @another_count_down_signed(ptr %d, i64 %n) nounwind {403; CHECK-LABEL: another_count_down_signed:404; CHECK: # %bb.0: # %entry405; CHECK-NEXT: leaq -10(%rsi), %rax406; CHECK-NEXT: movq %rsi, %rcx407; CHECK-NEXT: shlq $24, %rcx408; CHECK-NEXT: shlq $8, %rsi409; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]410; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]411; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]412; CHECK-NEXT: .p2align 4413; CHECK-NEXT: .LBB7_1: # %loop414; CHECK-NEXT: # =>This Inner Loop Header: Depth=1415; CHECK-NEXT: movq %rsi, %rdx416; CHECK-NEXT: sarq $8, %rdx417; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero418; CHECK-NEXT: mulsd %xmm0, %xmm3419; CHECK-NEXT: movsd %xmm3, (%rdi,%rdx,8)420; CHECK-NEXT: movq %rcx, %rdx421; CHECK-NEXT: sarq $24, %rdx422; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero423; CHECK-NEXT: mulsd %xmm1, %xmm3424; CHECK-NEXT: movsd %xmm3, (%rdi,%rdx,8)425; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero426; CHECK-NEXT: mulsd %xmm2, %xmm3427; CHECK-NEXT: movsd %xmm3, 80(%rdi,%rax,8)428; CHECK-NEXT: addq $-16777216, %rcx # imm = 0xFF000000429; CHECK-NEXT: addq $-256, %rsi430; CHECK-NEXT: decq %rax431; CHECK-NEXT: jne .LBB7_1432; CHECK-NEXT: # %bb.2: # %return433; CHECK-NEXT: retq434entry:435 br label %loop436 437loop:438 %indvar = phi i64 [ %n, %entry ], [ %indvar.next, %loop ]439 %s0 = shl i64 %indvar, 8440 %indvar.i8 = ashr i64 %s0, 8441 %t0 = getelementptr double, ptr %d, i64 %indvar.i8442 %t1 = load double, ptr %t0443 %t2 = fmul double %t1, 0.1444 store double %t2, ptr %t0445 %s1 = shl i64 %indvar, 24446 %indvar.i24 = ashr i64 %s1, 24447 %t3 = getelementptr double, ptr %d, i64 %indvar.i24448 %t4 = load double, ptr %t3449 %t5 = fmul double %t4, 2.3450 store double %t5, ptr %t3451 %t6 = getelementptr double, ptr %d, i64 %indvar452 %t7 = load double, ptr %t6453 %t8 = fmul double %t7, 4.5454 store double %t8, ptr %t6455 %indvar.next = sub i64 %indvar, 1456 %exitcond = icmp eq i64 %indvar.next, 10457 br i1 %exitcond, label %return, label %loop458 459return:460 ret void461}462 463define void @yet_another_count_down(ptr %d, i64 %n) nounwind {464; CHECK-LABEL: yet_another_count_down:465; CHECK: # %bb.0: # %entry466; CHECK-NEXT: movq $-2040, %rax # imm = 0xF808467; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]468; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]469; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]470; CHECK-NEXT: movq %rdi, %rcx471; CHECK-NEXT: movq %rdi, %rdx472; CHECK-NEXT: .p2align 4473; CHECK-NEXT: .LBB8_1: # %loop474; CHECK-NEXT: # =>This Inner Loop Header: Depth=1475; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero476; CHECK-NEXT: mulsd %xmm0, %xmm3477; CHECK-NEXT: movsd %xmm3, 2040(%rdi,%rax)478; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero479; CHECK-NEXT: mulsd %xmm1, %xmm3480; CHECK-NEXT: movsd %xmm3, (%rcx)481; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero482; CHECK-NEXT: mulsd %xmm2, %xmm3483; CHECK-NEXT: movsd %xmm3, (%rdx)484; CHECK-NEXT: addq $-8, %rdx485; CHECK-NEXT: addq $134217720, %rcx # imm = 0x7FFFFF8486; CHECK-NEXT: addq $2040, %rax # imm = 0x7F8487; CHECK-NEXT: jne .LBB8_1488; CHECK-NEXT: # %bb.2: # %return489; CHECK-NEXT: retq490entry:491 br label %loop492 493loop:494 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]495 %indvar.i8 = and i64 %indvar, 255496 %t0 = getelementptr double, ptr %d, i64 %indvar.i8497 %t1 = load double, ptr %t0498 %t2 = fmul double %t1, 0.1499 store double %t2, ptr %t0500 %indvar.i24 = and i64 %indvar, 16777215501 %t3 = getelementptr double, ptr %d, i64 %indvar.i24502 %t4 = load double, ptr %t3503 %t5 = fmul double %t4, 2.3504 store double %t5, ptr %t3505 %t6 = getelementptr double, ptr %d, i64 %indvar506 %t7 = load double, ptr %t6507 %t8 = fmul double %t7, 4.5508 store double %t8, ptr %t6509 %indvar.next = sub i64 %indvar, 1510 %exitcond = icmp eq i64 %indvar.next, 18446744073709551615511 br i1 %exitcond, label %return, label %loop512 513return:514 ret void515}516 517define void @yet_another_count_up(ptr %d, i64 %n) nounwind {518; CHECK-LABEL: yet_another_count_up:519; CHECK: # %bb.0: # %entry520; CHECK-NEXT: xorl %eax, %eax521; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]522; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]523; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]524; CHECK-NEXT: .p2align 4525; CHECK-NEXT: .LBB9_1: # %loop526; CHECK-NEXT: # =>This Inner Loop Header: Depth=1527; CHECK-NEXT: movzbl %al, %ecx528; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero529; CHECK-NEXT: mulsd %xmm0, %xmm3530; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)531; CHECK-NEXT: movl %eax, %ecx532; CHECK-NEXT: andl $16777215, %ecx # imm = 0xFFFFFF533; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero534; CHECK-NEXT: mulsd %xmm1, %xmm3535; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)536; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero537; CHECK-NEXT: mulsd %xmm2, %xmm3538; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)539; CHECK-NEXT: addq $3, %rax540; CHECK-NEXT: cmpq $10, %rax541; CHECK-NEXT: jne .LBB9_1542; CHECK-NEXT: # %bb.2: # %return543; CHECK-NEXT: retq544entry:545 br label %loop546 547loop:548 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]549 %indvar.i8 = and i64 %indvar, 255550 %t0 = getelementptr double, ptr %d, i64 %indvar.i8551 %t1 = load double, ptr %t0552 %t2 = fmul double %t1, 0.1553 store double %t2, ptr %t0554 %indvar.i24 = and i64 %indvar, 16777215555 %t3 = getelementptr double, ptr %d, i64 %indvar.i24556 %t4 = load double, ptr %t3557 %t5 = fmul double %t4, 2.3558 store double %t5, ptr %t3559 %t6 = getelementptr double, ptr %d, i64 %indvar560 %t7 = load double, ptr %t6561 %t8 = fmul double %t7, 4.5562 store double %t8, ptr %t6563 %indvar.next = add i64 %indvar, 3564 %exitcond = icmp eq i64 %indvar.next, 10565 br i1 %exitcond, label %return, label %loop566 567return:568 ret void569}570 571define void @still_another_count_down(ptr %d, i64 %n) nounwind {572; CHECK-LABEL: still_another_count_down:573; CHECK: # %bb.0: # %entry574; CHECK-NEXT: movl $10, %eax575; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]576; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]577; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]578; CHECK-NEXT: .p2align 4579; CHECK-NEXT: .LBB10_1: # %loop580; CHECK-NEXT: # =>This Inner Loop Header: Depth=1581; CHECK-NEXT: movzbl %al, %ecx582; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero583; CHECK-NEXT: mulsd %xmm0, %xmm3584; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)585; CHECK-NEXT: movl %eax, %ecx586; CHECK-NEXT: andl $16777215, %ecx # imm = 0xFFFFFF587; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero588; CHECK-NEXT: mulsd %xmm1, %xmm3589; CHECK-NEXT: movsd %xmm3, (%rdi,%rcx,8)590; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero591; CHECK-NEXT: mulsd %xmm2, %xmm3592; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)593; CHECK-NEXT: addq $-3, %rax594; CHECK-NEXT: jne .LBB10_1595; CHECK-NEXT: # %bb.2: # %return596; CHECK-NEXT: retq597entry:598 br label %loop599 600loop:601 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]602 %indvar.i8 = and i64 %indvar, 255603 %t0 = getelementptr double, ptr %d, i64 %indvar.i8604 %t1 = load double, ptr %t0605 %t2 = fmul double %t1, 0.1606 store double %t2, ptr %t0607 %indvar.i24 = and i64 %indvar, 16777215608 %t3 = getelementptr double, ptr %d, i64 %indvar.i24609 %t4 = load double, ptr %t3610 %t5 = fmul double %t4, 2.3611 store double %t5, ptr %t3612 %t6 = getelementptr double, ptr %d, i64 %indvar613 %t7 = load double, ptr %t6614 %t8 = fmul double %t7, 4.5615 store double %t8, ptr %t6616 %indvar.next = sub i64 %indvar, 3617 %exitcond = icmp eq i64 %indvar.next, 0618 br i1 %exitcond, label %return, label %loop619 620return:621 ret void622}623 624define void @yet_another_count_up_signed(ptr %d, i64 %n) nounwind {625; CHECK-LABEL: yet_another_count_up_signed:626; CHECK: # %bb.0: # %entry627; CHECK-NEXT: movq $-10, %rax628; CHECK-NEXT: xorl %ecx, %ecx629; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]630; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]631; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]632; CHECK-NEXT: xorl %edx, %edx633; CHECK-NEXT: .p2align 4634; CHECK-NEXT: .LBB11_1: # %loop635; CHECK-NEXT: # =>This Inner Loop Header: Depth=1636; CHECK-NEXT: movq %rcx, %rsi637; CHECK-NEXT: sarq $8, %rsi638; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero639; CHECK-NEXT: mulsd %xmm0, %xmm3640; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)641; CHECK-NEXT: movq %rdx, %rsi642; CHECK-NEXT: sarq $24, %rsi643; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero644; CHECK-NEXT: mulsd %xmm1, %xmm3645; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)646; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero647; CHECK-NEXT: mulsd %xmm2, %xmm3648; CHECK-NEXT: movsd %xmm3, 80(%rdi,%rax,8)649; CHECK-NEXT: addq $50331648, %rdx # imm = 0x3000000650; CHECK-NEXT: addq $768, %rcx # imm = 0x300651; CHECK-NEXT: addq $3, %rax652; CHECK-NEXT: jne .LBB11_1653; CHECK-NEXT: # %bb.2: # %return654; CHECK-NEXT: retq655entry:656 br label %loop657 658loop:659 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop ]660 %s0 = shl i64 %indvar, 8661 %indvar.i8 = ashr i64 %s0, 8662 %t0 = getelementptr double, ptr %d, i64 %indvar.i8663 %t1 = load double, ptr %t0664 %t2 = fmul double %t1, 0.1665 store double %t2, ptr %t0666 %s1 = shl i64 %indvar, 24667 %indvar.i24 = ashr i64 %s1, 24668 %t3 = getelementptr double, ptr %d, i64 %indvar.i24669 %t4 = load double, ptr %t3670 %t5 = fmul double %t4, 2.3671 store double %t5, ptr %t3672 %t6 = getelementptr double, ptr %d, i64 %indvar673 %t7 = load double, ptr %t6674 %t8 = fmul double %t7, 4.5675 store double %t8, ptr %t6676 %indvar.next = add i64 %indvar, 3677 %exitcond = icmp eq i64 %indvar.next, 10678 br i1 %exitcond, label %return, label %loop679 680return:681 ret void682}683 684define void @yet_another_count_down_signed(ptr %d, i64 %n) nounwind {685; CHECK-LABEL: yet_another_count_down_signed:686; CHECK: # %bb.0: # %entry687; CHECK-NEXT: movl $10, %eax688; CHECK-NEXT: movl $167772160, %ecx # imm = 0xA000000689; CHECK-NEXT: movl $2560, %edx # imm = 0xA00690; CHECK-NEXT: movsd {{.*#+}} xmm0 = [1.0000000000000001E-1,0.0E+0]691; CHECK-NEXT: movsd {{.*#+}} xmm1 = [2.2999999999999998E+0,0.0E+0]692; CHECK-NEXT: movsd {{.*#+}} xmm2 = [4.5E+0,0.0E+0]693; CHECK-NEXT: .p2align 4694; CHECK-NEXT: .LBB12_1: # %loop695; CHECK-NEXT: # =>This Inner Loop Header: Depth=1696; CHECK-NEXT: movq %rdx, %rsi697; CHECK-NEXT: sarq $8, %rsi698; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero699; CHECK-NEXT: mulsd %xmm0, %xmm3700; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)701; CHECK-NEXT: movq %rcx, %rsi702; CHECK-NEXT: sarq $24, %rsi703; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero704; CHECK-NEXT: mulsd %xmm1, %xmm3705; CHECK-NEXT: movsd %xmm3, (%rdi,%rsi,8)706; CHECK-NEXT: movsd {{.*#+}} xmm3 = mem[0],zero707; CHECK-NEXT: mulsd %xmm2, %xmm3708; CHECK-NEXT: movsd %xmm3, (%rdi,%rax,8)709; CHECK-NEXT: addq $-50331648, %rcx # imm = 0xFD000000710; CHECK-NEXT: addq $-768, %rdx # imm = 0xFD00711; CHECK-NEXT: addq $-3, %rax712; CHECK-NEXT: jne .LBB12_1713; CHECK-NEXT: # %bb.2: # %return714; CHECK-NEXT: retq715entry:716 br label %loop717 718loop:719 %indvar = phi i64 [ 10, %entry ], [ %indvar.next, %loop ]720 %s0 = shl i64 %indvar, 8721 %indvar.i8 = ashr i64 %s0, 8722 %t0 = getelementptr double, ptr %d, i64 %indvar.i8723 %t1 = load double, ptr %t0724 %t2 = fmul double %t1, 0.1725 store double %t2, ptr %t0726 %s1 = shl i64 %indvar, 24727 %indvar.i24 = ashr i64 %s1, 24728 %t3 = getelementptr double, ptr %d, i64 %indvar.i24729 %t4 = load double, ptr %t3730 %t5 = fmul double %t4, 2.3731 store double %t5, ptr %t3732 %t6 = getelementptr double, ptr %d, i64 %indvar733 %t7 = load double, ptr %t6734 %t8 = fmul double %t7, 4.5735 store double %t8, ptr %t6736 %indvar.next = sub i64 %indvar, 3737 %exitcond = icmp eq i64 %indvar.next, 0738 br i1 %exitcond, label %return, label %loop739 740return:741 ret void742}743 744 745 746