brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.5 KiB · 03c7fe2 Raw
257 lines · plain
1; RUN: llc < %s -mtriple=arm64-apple-ios -asm-verbose=false | FileCheck %s2 3define float @load0(ptr nocapture readonly %a) nounwind {4; CHECK-LABEL: load0:5; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0]6; CHECK-NEXT: fcvt s0, [[HREG]]7; CHECK-NEXT: ret8 9  %tmp = load i16, ptr %a, align 210  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)11  ret float %tmp112}13 14define double @load1(ptr nocapture readonly %a) nounwind {15; CHECK-LABEL: load1:16; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0]17; CHECK-NEXT: fcvt d0, [[HREG]]18; CHECK-NEXT: ret19 20  %tmp = load i16, ptr %a, align 221  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)22  ret double %conv23}24 25define float @load2(ptr nocapture readonly %a, i32 %i) nounwind {26; CHECK-LABEL: load2:27; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1]28; CHECK-NEXT: fcvt s0, [[HREG]]29; CHECK-NEXT: ret30 31  %idxprom = sext i32 %i to i6432  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom33  %tmp = load i16, ptr %arrayidx, align 234  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)35  ret float %tmp136}37 38define double @load3(ptr nocapture readonly %a, i32 %i) nounwind {39; CHECK-LABEL: load3:40; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, w1, sxtw #1]41; CHECK-NEXT: fcvt d0, [[HREG]]42; CHECK-NEXT: ret43 44  %idxprom = sext i32 %i to i6445  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom46  %tmp = load i16, ptr %arrayidx, align 247  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)48  ret double %conv49}50 51define float @load4(ptr nocapture readonly %a, i64 %i) nounwind {52; CHECK-LABEL: load4:53; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1]54; CHECK-NEXT: fcvt s0, [[HREG]]55; CHECK-NEXT: ret56 57  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %i58  %tmp = load i16, ptr %arrayidx, align 259  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)60  ret float %tmp161}62 63define double @load5(ptr nocapture readonly %a, i64 %i) nounwind {64; CHECK-LABEL: load5:65; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, x1, lsl #1]66; CHECK-NEXT: fcvt d0, [[HREG]]67; CHECK-NEXT: ret68 69  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %i70  %tmp = load i16, ptr %arrayidx, align 271  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)72  ret double %conv73}74 75define float @load6(ptr nocapture readonly %a) nounwind {76; CHECK-LABEL: load6:77; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20]78; CHECK-NEXT: fcvt s0, [[HREG]]79; CHECK-NEXT: ret80 81  %arrayidx = getelementptr inbounds i16, ptr %a, i64 1082  %tmp = load i16, ptr %arrayidx, align 283  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)84  ret float %tmp185}86 87define double @load7(ptr nocapture readonly %a) nounwind {88; CHECK-LABEL: load7:89; CHECK-NEXT: ldr [[HREG:h[0-9]+]], [x0, #20]90; CHECK-NEXT: fcvt d0, [[HREG]]91; CHECK-NEXT: ret92 93  %arrayidx = getelementptr inbounds i16, ptr %a, i64 1094  %tmp = load i16, ptr %arrayidx, align 295  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)96  ret double %conv97}98 99define float @load8(ptr nocapture readonly %a) nounwind {100; CHECK-LABEL: load8:101; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20]102; CHECK-NEXT: fcvt s0, [[HREG]]103; CHECK-NEXT: ret104 105  %arrayidx = getelementptr inbounds i16, ptr %a, i64 -10106  %tmp = load i16, ptr %arrayidx, align 2107  %tmp1 = tail call float @llvm.convert.from.fp16.f32(i16 %tmp)108  ret float %tmp1109}110 111define double @load9(ptr nocapture readonly %a) nounwind {112; CHECK-LABEL: load9:113; CHECK-NEXT: ldur [[HREG:h[0-9]+]], [x0, #-20]114; CHECK-NEXT: fcvt d0, [[HREG]]115; CHECK-NEXT: ret116 117  %arrayidx = getelementptr inbounds i16, ptr %a, i64 -10118  %tmp = load i16, ptr %arrayidx, align 2119  %conv = tail call double @llvm.convert.from.fp16.f64(i16 %tmp)120  ret double %conv121}122 123define void @store0(ptr nocapture %a, float %val) nounwind {124; CHECK-LABEL: store0:125; CHECK-NEXT: fcvt h0, s0126; CHECK-NEXT: str  h0, [x0]127; CHECK-NEXT: ret128 129  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)130  store i16 %tmp, ptr %a, align 2131  ret void132}133 134define void @store1(ptr nocapture %a, double %val) nounwind {135; CHECK-LABEL: store1:136; CHECK-NEXT: fcvt s0, d0137; CHECK-NEXT: fcvt h0, s0138; CHECK-NEXT: str  h0, [x0]139; CHECK-NEXT: ret140 141  %conv = fptrunc double %val to float142  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)143  store i16 %tmp, ptr %a, align 2144  ret void145}146 147define void @store2(ptr nocapture %a, i32 %i, float %val) nounwind {148; CHECK-LABEL: store2:149; CHECK-NEXT: fcvt h0, s0150; CHECK-NEXT: str h0, [x0, w1, sxtw #1]151; CHECK-NEXT: ret152 153  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)154  %idxprom = sext i32 %i to i64155  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom156  store i16 %tmp, ptr %arrayidx, align 2157  ret void158}159 160define void @store3(ptr nocapture %a, i32 %i, double %val) nounwind {161; CHECK-LABEL: store3:162; CHECK-NEXT: fcvt s0, d0163; CHECK-NEXT: fcvt h0, s0164; CHECK-NEXT: str h0, [x0, w1, sxtw #1]165; CHECK-NEXT: ret166 167  %conv = fptrunc double %val to float168  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)169  %idxprom = sext i32 %i to i64170  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %idxprom171  store i16 %tmp, ptr %arrayidx, align 2172  ret void173}174 175define void @store4(ptr nocapture %a, i64 %i, float %val) nounwind {176; CHECK-LABEL: store4:177; CHECK-NEXT: fcvt h0, s0178; CHECK-NEXT: str h0, [x0, x1, lsl #1]179; CHECK-NEXT: ret180 181  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)182  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %i183  store i16 %tmp, ptr %arrayidx, align 2184  ret void185}186 187define void @store5(ptr nocapture %a, i64 %i, double %val) nounwind {188; CHECK-LABEL: store5:189; CHECK-NEXT: fcvt s0, d0190; CHECK-NEXT: fcvt h0, s0191; CHECK-NEXT: str h0, [x0, x1, lsl #1]192; CHECK-NEXT: ret193 194  %conv = fptrunc double %val to float195  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)196  %arrayidx = getelementptr inbounds i16, ptr %a, i64 %i197  store i16 %tmp, ptr %arrayidx, align 2198  ret void199}200 201define void @store6(ptr nocapture %a, float %val) nounwind {202; CHECK-LABEL: store6:203; CHECK-NEXT: fcvt h0, s0204; CHECK-NEXT: str h0, [x0, #20]205; CHECK-NEXT: ret206 207  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)208  %arrayidx = getelementptr inbounds i16, ptr %a, i64 10209  store i16 %tmp, ptr %arrayidx, align 2210  ret void211}212 213define void @store7(ptr nocapture %a, double %val) nounwind {214; CHECK-LABEL: store7:215; CHECK-NEXT: fcvt s0, d0216; CHECK-NEXT: fcvt h0, s0217; CHECK-NEXT: str h0, [x0, #20]218; CHECK-NEXT: ret219 220  %conv = fptrunc double %val to float221  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)222  %arrayidx = getelementptr inbounds i16, ptr %a, i64 10223  store i16 %tmp, ptr %arrayidx, align 2224  ret void225}226 227define void @store8(ptr nocapture %a, float %val) nounwind {228; CHECK-LABEL: store8:229; CHECK-NEXT: fcvt h0, s0230; CHECK-NEXT: stur h0, [x0, #-20]231; CHECK-NEXT: ret232 233  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %val)234  %arrayidx = getelementptr inbounds i16, ptr %a, i64 -10235  store i16 %tmp, ptr %arrayidx, align 2236  ret void237}238 239define void @store9(ptr nocapture %a, double %val) nounwind {240; CHECK-LABEL: store9:241; CHECK-NEXT: fcvt s0, d0242; CHECK-NEXT: fcvt h0, s0243; CHECK-NEXT: stur h0, [x0, #-20]244; CHECK-NEXT: ret245 246  %conv = fptrunc double %val to float247  %tmp = tail call i16 @llvm.convert.to.fp16.f32(float %conv)248  %arrayidx = getelementptr inbounds i16, ptr %a, i64 -10249  store i16 %tmp, ptr %arrayidx, align 2250  ret void251}252 253declare i16 @llvm.convert.to.fp16.f32(float) nounwind readnone254declare float @llvm.convert.from.fp16.f32(i16) nounwind readnone255declare i16 @llvm.convert.to.fp16.f64(double) nounwind readnone256declare double @llvm.convert.from.fp16.f64(i16) nounwind readnone257