148 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=-bmi | FileCheck %s3 4; Use h-register extract and zero-extend.5 6define double @foo8(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {7; CHECK-LABEL: foo8:8; CHECK: # %bb.0:9; CHECK-NEXT: movq %rsi, %rax10; CHECK-NEXT: movzbl %ah, %eax11; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero12; CHECK-NEXT: retq13 %t0 = lshr i64 %x, 814 %t1 = and i64 %t0, 25515 %t2 = getelementptr double, ptr %p, i64 %t116 %t3 = load double, ptr %t2, align 817 ret double %t318}19 20define float @foo4(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {21; CHECK-LABEL: foo4:22; CHECK: # %bb.0:23; CHECK-NEXT: movq %rsi, %rax24; CHECK-NEXT: movzbl %ah, %eax25; CHECK-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero26; CHECK-NEXT: retq27 %t0 = lshr i64 %x, 828 %t1 = and i64 %t0, 25529 %t2 = getelementptr float, ptr %p, i64 %t130 %t3 = load float, ptr %t2, align 831 ret float %t332}33 34define i16 @foo2(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {35; CHECK-LABEL: foo2:36; CHECK: # %bb.0:37; CHECK-NEXT: movq %rsi, %rax38; CHECK-NEXT: movzbl %ah, %eax39; CHECK-NEXT: movzwl (%rdi,%rax,2), %eax40; CHECK-NEXT: retq41 %t0 = lshr i64 %x, 842 %t1 = and i64 %t0, 25543 %t2 = getelementptr i16, ptr %p, i64 %t144 %t3 = load i16, ptr %t2, align 845 ret i16 %t346}47 48define i8 @foo1(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {49; CHECK-LABEL: foo1:50; CHECK: # %bb.0:51; CHECK-NEXT: movq %rsi, %rax52; CHECK-NEXT: movzbl %ah, %eax53; CHECK-NEXT: movzbl (%rdi,%rax), %eax54; CHECK-NEXT: retq55 %t0 = lshr i64 %x, 856 %t1 = and i64 %t0, 25557 %t2 = getelementptr i8, ptr %p, i64 %t158 %t3 = load i8, ptr %t2, align 859 ret i8 %t360}61 62define i8 @bar8(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {63; CHECK-LABEL: bar8:64; CHECK: # %bb.0:65; CHECK-NEXT: movq %rsi, %rax66; CHECK-NEXT: movzbl %ah, %eax67; CHECK-NEXT: movzbl (%rdi,%rax,8), %eax68; CHECK-NEXT: retq69 %t0 = lshr i64 %x, 570 %t1 = and i64 %t0, 204071 %t2 = getelementptr i8, ptr %p, i64 %t172 %t3 = load i8, ptr %t2, align 873 ret i8 %t374}75 76define i8 @bar4(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {77; CHECK-LABEL: bar4:78; CHECK: # %bb.0:79; CHECK-NEXT: movq %rsi, %rax80; CHECK-NEXT: movzbl %ah, %eax81; CHECK-NEXT: movzbl (%rdi,%rax,4), %eax82; CHECK-NEXT: retq83 %t0 = lshr i64 %x, 684 %t1 = and i64 %t0, 102085 %t2 = getelementptr i8, ptr %p, i64 %t186 %t3 = load i8, ptr %t2, align 887 ret i8 %t388}89 90define i8 @bar2(ptr nocapture inreg %p, i64 inreg %x) nounwind readonly {91; CHECK-LABEL: bar2:92; CHECK: # %bb.0:93; CHECK-NEXT: movq %rsi, %rax94; CHECK-NEXT: movzbl %ah, %eax95; CHECK-NEXT: movzbl (%rdi,%rax,2), %eax96; CHECK-NEXT: retq97 %t0 = lshr i64 %x, 798 %t1 = and i64 %t0, 51099 %t2 = getelementptr i8, ptr %p, i64 %t1100 %t3 = load i8, ptr %t2, align 8101 ret i8 %t3102}103 104define double @ext8(ptr nocapture inreg %p, i32 inreg %x) nounwind readonly {105; CHECK-LABEL: ext8:106; CHECK: # %bb.0:107; CHECK-NEXT: movl %esi, %eax108; CHECK-NEXT: movzbl %ah, %eax109; CHECK-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero110; CHECK-NEXT: retq111 %t0 = lshr i32 %x, 5112 %t1 = and i32 %t0, 2040113 %t2 = zext i32 %t1 to i64114 %t3 = getelementptr i8, ptr %p, i64 %t2115 %t4 = load double, ptr %t3, align 8116 ret double %t4117}118 119define float @ext4(ptr nocapture inreg %p, i32 inreg %x) nounwind readonly {120; CHECK-LABEL: ext4:121; CHECK: # %bb.0:122; CHECK-NEXT: movl %esi, %eax123; CHECK-NEXT: movzbl %ah, %eax124; CHECK-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero125; CHECK-NEXT: retq126 %t0 = lshr i32 %x, 6127 %t1 = and i32 %t0, 1020128 %t2 = zext i32 %t1 to i64129 %t3 = getelementptr i8, ptr %p, i64 %t2130 %t4 = load float, ptr %t3, align 8131 ret float %t4132}133 134define i8 @ext2(ptr nocapture inreg %p, i32 inreg %x) nounwind readonly {135; CHECK-LABEL: ext2:136; CHECK: # %bb.0:137; CHECK-NEXT: movl %esi, %eax138; CHECK-NEXT: movzbl %ah, %eax139; CHECK-NEXT: movzbl (%rdi,%rax,2), %eax140; CHECK-NEXT: retq141 %t0 = lshr i32 %x, 7142 %t1 = and i32 %t0, 510143 %t2 = zext i32 %t1 to i64144 %t3 = getelementptr i8, ptr %p, i64 %t2145 %t4 = load i8, ptr %t3, align 8146 ret i8 %t4147}148