1; RUN: llc -march=mips64el -mcpu=mips64r2 -mattr=n64 < %s | FileCheck %s 2 3%struct.S = type <{ [4 x float] }> 4%struct.S2 = type <{ [4 x double] }> 5%struct.S3 = type <{ i8, float }> 6 7@s = external global [4 x %struct.S] 8@gf = external global float 9@gd = external global double 10@s2 = external global [4 x %struct.S2] 11@s3 = external global %struct.S3 12 13define float @foo0(float* nocapture %b, i32 %o) nounwind readonly { 14entry: 15; CHECK: lwxc1 16 %idxprom = zext i32 %o to i64 17 %arrayidx = getelementptr inbounds float* %b, i64 %idxprom 18 %0 = load float* %arrayidx, align 4 19 ret float %0 20} 21 22define double @foo1(double* nocapture %b, i32 %o) nounwind readonly { 23entry: 24; CHECK: ldxc1 25 %idxprom = zext i32 %o to i64 26 %arrayidx = getelementptr inbounds double* %b, i64 %idxprom 27 %0 = load double* %arrayidx, align 8 28 ret double %0 29} 30 31define float @foo2(i32 %b, i32 %c) nounwind readonly { 32entry: 33; CHECK-NOT: luxc1 34 %idxprom = zext i32 %c to i64 35 %idxprom1 = zext i32 %b to i64 36 %arrayidx2 = getelementptr inbounds [4 x %struct.S]* @s, i64 0, i64 %idxprom1, i32 0, i64 %idxprom 37 %0 = load float* %arrayidx2, align 1 38 ret float %0 39} 40 41define void @foo3(float* nocapture %b, i32 %o) nounwind { 42entry: 43; CHECK: swxc1 44 %0 = load float* @gf, align 4 45 %idxprom = zext i32 %o to i64 46 %arrayidx = getelementptr inbounds float* %b, i64 %idxprom 47 store float %0, float* %arrayidx, align 4 48 ret void 49} 50 51define void @foo4(double* nocapture %b, i32 %o) nounwind { 52entry: 53; CHECK: sdxc1 54 %0 = load double* @gd, align 8 55 %idxprom = zext i32 %o to i64 56 %arrayidx = getelementptr inbounds double* %b, i64 %idxprom 57 store double %0, double* %arrayidx, align 8 58 ret void 59} 60 61define void @foo5(i32 %b, i32 %c) nounwind { 62entry: 63; CHECK-NOT: suxc1 64 %0 = load float* @gf, align 4 65 %idxprom = zext i32 %c to i64 66 %idxprom1 = zext i32 %b to i64 67 %arrayidx2 = getelementptr inbounds [4 x %struct.S]* @s, i64 0, i64 %idxprom1, i32 0, i64 %idxprom 68 store float %0, float* %arrayidx2, align 1 69 ret void 70} 71 72define double @foo6(i32 %b, i32 %c) nounwind readonly { 73entry: 74; CHECK: foo6 75; CHECK-NOT: luxc1 76 %idxprom = zext i32 %c to i64 77 %idxprom1 = zext i32 %b to i64 78 %arrayidx2 = getelementptr inbounds [4 x %struct.S2]* @s2, i64 0, i64 %idxprom1, i32 0, i64 %idxprom 79 %0 = load double* %arrayidx2, align 1 80 ret double %0 81} 82 83define void @foo7(i32 %b, i32 %c) nounwind { 84entry: 85; CHECK: foo7 86; CHECK-NOT: suxc1 87 %0 = load double* @gd, align 8 88 %idxprom = zext i32 %c to i64 89 %idxprom1 = zext i32 %b to i64 90 %arrayidx2 = getelementptr inbounds [4 x %struct.S2]* @s2, i64 0, i64 %idxprom1, i32 0, i64 %idxprom 91 store double %0, double* %arrayidx2, align 1 92 ret void 93} 94 95define float @foo8() nounwind readonly { 96entry: 97; CHECK: foo8 98; CHECK-NOT: luxc1 99 %0 = load float* getelementptr inbounds (%struct.S3* @s3, i64 0, i32 1), align 1 100 ret float %0 101} 102 103define void @foo9(float %f) nounwind { 104entry: 105; CHECK: foo9 106; CHECK-NOT: suxc1 107 store float %f, float* getelementptr inbounds (%struct.S3* @s3, i64 0, i32 1), align 1 108 ret void 109} 110 111