355 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 -o - %s -mattr=+neon,+fullfp16 | FileCheck %s3 4define double @t1(double %x) {5; CHECK-LABEL: t1:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: fcvtzs d0, d08; CHECK-NEXT: scvtf d0, d09; CHECK-NEXT: ret10entry:11 %conv = fptosi double %x to i6412 %conv1 = sitofp i64 %conv to double13 ret double %conv114}15 16define float @t2(float %x) {17; CHECK-LABEL: t2:18; CHECK: // %bb.0: // %entry19; CHECK-NEXT: fcvtzs s0, s020; CHECK-NEXT: scvtf s0, s021; CHECK-NEXT: ret22entry:23 %conv = fptosi float %x to i3224 %conv1 = sitofp i32 %conv to float25 ret float %conv126}27 28define half @t3(half %x) {29; CHECK-LABEL: t3:30; CHECK: // %bb.0: // %entry31; CHECK-NEXT: fcvtzs h0, h032; CHECK-NEXT: scvtf h0, h033; CHECK-NEXT: ret34entry:35 %conv = fptosi half %x to i3236 %conv1 = sitofp i32 %conv to half37 ret half %conv138}39 40define double @t4(double %x) {41; CHECK-LABEL: t4:42; CHECK: // %bb.0: // %entry43; CHECK-NEXT: fcvtzu d0, d044; CHECK-NEXT: ucvtf d0, d045; CHECK-NEXT: ret46entry:47 %conv = fptoui double %x to i6448 %conv1 = uitofp i64 %conv to double49 ret double %conv150}51 52define float @t5(float %x) {53; CHECK-LABEL: t5:54; CHECK: // %bb.0: // %entry55; CHECK-NEXT: fcvtzu s0, s056; CHECK-NEXT: ucvtf s0, s057; CHECK-NEXT: ret58entry:59 %conv = fptoui float %x to i3260 %conv1 = uitofp i32 %conv to float61 ret float %conv162}63 64define half @t6(half %x) {65; CHECK-LABEL: t6:66; CHECK: // %bb.0: // %entry67; CHECK-NEXT: fcvtzu h0, h068; CHECK-NEXT: ucvtf h0, h069; CHECK-NEXT: ret70entry:71 %conv = fptoui half %x to i3272 %conv1 = uitofp i32 %conv to half73 ret half %conv174}75 76define bfloat @t7(bfloat %x) {77; CHECK-LABEL: t7:78; CHECK: // %bb.0: // %entry79; CHECK-NEXT: // kill: def $h0 killed $h0 def $d080; CHECK-NEXT: mov w8, #32767 // =0x7fff81; CHECK-NEXT: shll v0.4s, v0.4h, #1682; CHECK-NEXT: fcvtzs w9, s083; CHECK-NEXT: scvtf d0, w984; CHECK-NEXT: fcvtxn s0, d085; CHECK-NEXT: fmov w9, s086; CHECK-NEXT: ubfx w10, w9, #16, #187; CHECK-NEXT: add w8, w9, w888; CHECK-NEXT: add w8, w10, w889; CHECK-NEXT: lsr w8, w8, #1690; CHECK-NEXT: fmov s0, w891; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s092; CHECK-NEXT: ret93entry:94 %conv = fptosi bfloat %x to i3295 %conv1 = sitofp i32 %conv to bfloat96 ret bfloat %conv197}98 99define bfloat @t8(bfloat %x) {100; CHECK-LABEL: t8:101; CHECK: // %bb.0: // %entry102; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0103; CHECK-NEXT: mov w8, #32767 // =0x7fff104; CHECK-NEXT: shll v0.4s, v0.4h, #16105; CHECK-NEXT: fcvtzu w9, s0106; CHECK-NEXT: ucvtf d0, w9107; CHECK-NEXT: fcvtxn s0, d0108; CHECK-NEXT: fmov w9, s0109; CHECK-NEXT: ubfx w10, w9, #16, #1110; CHECK-NEXT: add w8, w9, w8111; CHECK-NEXT: add w8, w10, w8112; CHECK-NEXT: lsr w8, w8, #16113; CHECK-NEXT: fmov s0, w8114; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0115; CHECK-NEXT: ret116entry:117 %conv = fptoui bfloat %x to i32118 %conv1 = uitofp i32 %conv to bfloat119 ret bfloat %conv1120}121 122define i64 @testu_f64_multiuse(double %x) {123; CHECK-LABEL: testu_f64_multiuse:124; CHECK: // %bb.0: // %entry125; CHECK-NEXT: fcvtzu x8, d0126; CHECK-NEXT: ucvtf d1, x8127; CHECK-NEXT: fcmp d0, d1128; CHECK-NEXT: csel x0, x8, xzr, eq129; CHECK-NEXT: ret130entry:131 %conv = fptoui double %x to i64132 %conv1 = uitofp i64 %conv to double133 %cmp = fcmp oeq double %x, %conv1134 %cond = select i1 %cmp, i64 %conv, i64 0135 ret i64 %cond136}137 138define i32 @testu_f32_multiuse(float %x) {139; CHECK-LABEL: testu_f32_multiuse:140; CHECK: // %bb.0: // %entry141; CHECK-NEXT: fcvtzu w8, s0142; CHECK-NEXT: ucvtf s1, w8143; CHECK-NEXT: fcmp s0, s1144; CHECK-NEXT: csel w0, w8, wzr, eq145; CHECK-NEXT: ret146entry:147 %conv = fptoui float %x to i32148 %conv1 = uitofp i32 %conv to float149 %cmp = fcmp oeq float %x, %conv1150 %cond = select i1 %cmp, i32 %conv, i32 0151 ret i32 %cond152}153 154define i32 @testu_f16_multiuse(half %x) {155; CHECK-LABEL: testu_f16_multiuse:156; CHECK: // %bb.0: // %entry157; CHECK-NEXT: fcvtzu w8, h0158; CHECK-NEXT: ucvtf h1, w8159; CHECK-NEXT: fcmp h0, h1160; CHECK-NEXT: csel w0, w8, wzr, eq161; CHECK-NEXT: ret162entry:163 %conv = fptoui half %x to i32164 %conv1 = uitofp i32 %conv to half165 %cmp = fcmp oeq half %x, %conv1166 %cond = select i1 %cmp, i32 %conv, i32 0167 ret i32 %cond168}169 170define i64 @tests_f64_multiuse(double %x) {171; CHECK-LABEL: tests_f64_multiuse:172; CHECK: // %bb.0: // %entry173; CHECK-NEXT: fcvtzs x8, d0174; CHECK-NEXT: scvtf d1, x8175; CHECK-NEXT: fcmp d0, d1176; CHECK-NEXT: csel x0, x8, xzr, eq177; CHECK-NEXT: ret178entry:179 %conv = fptosi double %x to i64180 %conv1 = sitofp i64 %conv to double181 %cmp = fcmp oeq double %x, %conv1182 %cond = select i1 %cmp, i64 %conv, i64 0183 ret i64 %cond184}185 186define i32 @tests_f32_multiuse(float %x) {187; CHECK-LABEL: tests_f32_multiuse:188; CHECK: // %bb.0: // %entry189; CHECK-NEXT: fcvtzs w8, s0190; CHECK-NEXT: scvtf s1, w8191; CHECK-NEXT: fcmp s0, s1192; CHECK-NEXT: csel w0, w8, wzr, eq193; CHECK-NEXT: ret194entry:195 %conv = fptosi float %x to i32196 %conv1 = sitofp i32 %conv to float197 %cmp = fcmp oeq float %x, %conv1198 %cond = select i1 %cmp, i32 %conv, i32 0199 ret i32 %cond200}201 202define i32 @tests_f16_multiuse(half %x) {203; CHECK-LABEL: tests_f16_multiuse:204; CHECK: // %bb.0: // %entry205; CHECK-NEXT: fcvtzs w8, h0206; CHECK-NEXT: scvtf h1, w8207; CHECK-NEXT: fcmp h0, h1208; CHECK-NEXT: csel w0, w8, wzr, eq209; CHECK-NEXT: ret210entry:211 %conv = fptosi half %x to i32212 %conv1 = sitofp i32 %conv to half213 %cmp = fcmp oeq half %x, %conv1214 %cond = select i1 %cmp, i32 %conv, i32 0215 ret i32 %cond216}217 218 219define double @t1_strict(double %x) #0 {220; CHECK-LABEL: t1_strict:221; CHECK: // %bb.0: // %entry222; CHECK-NEXT: fcvtzs d0, d0223; CHECK-NEXT: scvtf d0, d0224; CHECK-NEXT: ret225entry:226 %conv = call i64 @llvm.experimental.constrained.fptosi.i64.f64(double %x, metadata !"fpexcept.strict") #0227 %conv1 = call double @llvm.experimental.constrained.sitofp.f64.i64(i64 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0228 ret double %conv1229}230 231define float @t2_strict(float %x) #0 {232; CHECK-LABEL: t2_strict:233; CHECK: // %bb.0: // %entry234; CHECK-NEXT: fcvtzs s0, s0235; CHECK-NEXT: scvtf s0, s0236; CHECK-NEXT: ret237entry:238 %conv = call i32 @llvm.experimental.constrained.fptosi.i32.f32(float %x, metadata !"fpexcept.strict") #0239 %conv1 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0240 ret float %conv1241}242 243define half @t3_strict(half %x) #0 {244; CHECK-LABEL: t3_strict:245; CHECK: // %bb.0: // %entry246; CHECK-NEXT: fcvtzs h0, h0247; CHECK-NEXT: scvtf h0, h0248; CHECK-NEXT: ret249entry:250 %conv = call i32 @llvm.experimental.constrained.fptosi.i32.f16(half %x, metadata !"fpexcept.strict") #0251 %conv1 = call half @llvm.experimental.constrained.sitofp.f16.i32(i32 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0252 ret half %conv1253}254 255define double @t4_strict(double %x) #0 {256; CHECK-LABEL: t4_strict:257; CHECK: // %bb.0: // %entry258; CHECK-NEXT: fcvtzu d0, d0259; CHECK-NEXT: ucvtf d0, d0260; CHECK-NEXT: ret261entry:262 %conv = call i64 @llvm.experimental.constrained.fptoui.i64.f64(double %x, metadata !"fpexcept.strict") #0263 %conv1 = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0264 ret double %conv1265}266 267define float @t5_strict(float %x) #0 {268; CHECK-LABEL: t5_strict:269; CHECK: // %bb.0: // %entry270; CHECK-NEXT: fcvtzu s0, s0271; CHECK-NEXT: ucvtf s0, s0272; CHECK-NEXT: ret273entry:274 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f32(float %x, metadata !"fpexcept.strict") #0275 %conv1 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0276 ret float %conv1277}278 279define half @t6_strict(half %x) #0 {280; CHECK-LABEL: t6_strict:281; CHECK: // %bb.0: // %entry282; CHECK-NEXT: fcvtzu h0, h0283; CHECK-NEXT: ucvtf h0, h0284; CHECK-NEXT: ret285entry:286 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.f16(half %x, metadata !"fpexcept.strict") #0287 %conv1 = call half @llvm.experimental.constrained.uitofp.f16.i32(i32 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0288 ret half %conv1289}290 291define bfloat @t7_strict(bfloat %x) #0 {292; CHECK-LABEL: t7_strict:293; CHECK: // %bb.0: // %entry294; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0295; CHECK-NEXT: mov w8, #32767 // =0x7fff296; CHECK-NEXT: shll v0.4s, v0.4h, #16297; CHECK-NEXT: fcvtzs w9, s0298; CHECK-NEXT: scvtf d0, w9299; CHECK-NEXT: fcvtxn s0, d0300; CHECK-NEXT: fmov w9, s0301; CHECK-NEXT: ubfx w10, w9, #16, #1302; CHECK-NEXT: add w8, w9, w8303; CHECK-NEXT: add w8, w10, w8304; CHECK-NEXT: lsr w8, w8, #16305; CHECK-NEXT: fmov s0, w8306; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0307; CHECK-NEXT: ret308entry:309 %conv = call i32 @llvm.experimental.constrained.fptosi.i32.bf16(bfloat %x, metadata !"fpexcept.strict") #0310 %conv1 = call bfloat @llvm.experimental.constrained.sitofp.bf16.i32(i32 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0311 ret bfloat %conv1312}313 314define bfloat @t8_strict(bfloat %x) #0 {315; CHECK-LABEL: t8_strict:316; CHECK: // %bb.0: // %entry317; CHECK-NEXT: // kill: def $h0 killed $h0 def $d0318; CHECK-NEXT: mov w8, #32767 // =0x7fff319; CHECK-NEXT: shll v0.4s, v0.4h, #16320; CHECK-NEXT: fcvtzu w9, s0321; CHECK-NEXT: ucvtf d0, w9322; CHECK-NEXT: fcvtxn s0, d0323; CHECK-NEXT: fmov w9, s0324; CHECK-NEXT: ubfx w10, w9, #16, #1325; CHECK-NEXT: add w8, w9, w8326; CHECK-NEXT: add w8, w10, w8327; CHECK-NEXT: lsr w8, w8, #16328; CHECK-NEXT: fmov s0, w8329; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0330; CHECK-NEXT: ret331entry:332 %conv = call i32 @llvm.experimental.constrained.fptoui.i32.bf16(bfloat %x, metadata !"fpexcept.strict") #0333 %conv1 = call bfloat @llvm.experimental.constrained.uitofp.bf16.i32(i32 %conv, metadata !"round.tonearest", metadata !"fpexcept.strict") #0334 ret bfloat %conv1335}336 337attributes #0 = { strictfp }338 339declare i32 @llvm.experimental.constrained.fptosi.i32.bf16(bfloat, metadata)340declare i32 @llvm.experimental.constrained.fptoui.i32.bf16(bfloat, metadata)341declare i32 @llvm.experimental.constrained.fptosi.i32.f16(half, metadata)342declare i32 @llvm.experimental.constrained.fptoui.i32.f16(half, metadata)343declare i32 @llvm.experimental.constrained.fptosi.i32.f32(float, metadata)344declare i32 @llvm.experimental.constrained.fptoui.i32.f32(float, metadata)345declare i64 @llvm.experimental.constrained.fptosi.i64.f64(double, metadata)346declare i64 @llvm.experimental.constrained.fptoui.i64.f64(double, metadata)347declare bfloat @llvm.experimental.constrained.sitofp.bf16.i32(i32, metadata, metadata)348declare bfloat @llvm.experimental.constrained.uitofp.bf16.i32(i32, metadata, metadata)349declare half @llvm.experimental.constrained.sitofp.f16.i32(i32, metadata, metadata)350declare half @llvm.experimental.constrained.uitofp.f16.i32(i32, metadata, metadata)351declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)352declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata)353declare double @llvm.experimental.constrained.sitofp.f64.i64(i64, metadata, metadata)354declare double @llvm.experimental.constrained.uitofp.f64.i64(i64, metadata, metadata)355