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 13 define float @foo0(float* nocapture %b, i32 %o) nounwind readonly { 14 entry: 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 22 define double @foo1(double* nocapture %b, i32 %o) nounwind readonly { 23 entry: 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 31 define float @foo2(i32 %b, i32 %c) nounwind readonly { 32 entry: 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 41 define void @foo3(float* nocapture %b, i32 %o) nounwind { 42 entry: 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 51 define void @foo4(double* nocapture %b, i32 %o) nounwind { 52 entry: 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 61 define void @foo5(i32 %b, i32 %c) nounwind { 62 entry: 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 72 define double @foo6(i32 %b, i32 %c) nounwind readonly { 73 entry: 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 83 define void @foo7(i32 %b, i32 %c) nounwind { 84 entry: 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 95 define float @foo8() nounwind readonly { 96 entry: 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 103 define void @foo9(float %f) nounwind { 104 entry: 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