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