1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -mattr=+sme2p2 -force-streaming-compatible < %s | FileCheck %s --check-prefix=USE-NEON-NO-GPRS 5; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 6 7target triple = "aarch64-unknown-linux-gnu" 8 9define double @t1(double %x) { 10; CHECK-LABEL: t1: 11; CHECK: // %bb.0: // %entry 12; CHECK-NEXT: ptrue p0.d 13; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 14; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 15; CHECK-NEXT: scvtf z0.d, p0/m, z0.d 16; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 17; CHECK-NEXT: ret 18; 19; USE-NEON-NO-GPRS-LABEL: t1: 20; USE-NEON-NO-GPRS: // %bb.0: // %entry 21; USE-NEON-NO-GPRS-NEXT: fcvtzs d0, d0 22; USE-NEON-NO-GPRS-NEXT: scvtf d0, d0 23; USE-NEON-NO-GPRS-NEXT: ret 24; 25; NONEON-NOSVE-LABEL: t1: 26; NONEON-NOSVE: // %bb.0: // %entry 27; NONEON-NOSVE-NEXT: fcvtzs x8, d0 28; NONEON-NOSVE-NEXT: scvtf d0, x8 29; NONEON-NOSVE-NEXT: ret 30entry: 31 %conv = fptosi double %x to i64 32 %conv1 = sitofp i64 %conv to double 33 ret double %conv1 34} 35 36define float @t2(float %x) { 37; CHECK-LABEL: t2: 38; CHECK: // %bb.0: // %entry 39; CHECK-NEXT: ptrue p0.s 40; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0 41; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 42; CHECK-NEXT: scvtf z0.s, p0/m, z0.s 43; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 44; CHECK-NEXT: ret 45; 46; USE-NEON-NO-GPRS-LABEL: t2: 47; USE-NEON-NO-GPRS: // %bb.0: // %entry 48; USE-NEON-NO-GPRS-NEXT: fcvtzs s0, s0 49; USE-NEON-NO-GPRS-NEXT: scvtf s0, s0 50; USE-NEON-NO-GPRS-NEXT: ret 51; 52; NONEON-NOSVE-LABEL: t2: 53; NONEON-NOSVE: // %bb.0: // %entry 54; NONEON-NOSVE-NEXT: fcvtzs w8, s0 55; NONEON-NOSVE-NEXT: scvtf s0, w8 56; NONEON-NOSVE-NEXT: ret 57entry: 58 %conv = fptosi float %x to i32 59 %conv1 = sitofp i32 %conv to float 60 ret float %conv1 61} 62 63define half @t3(half %x) { 64; CHECK-LABEL: t3: 65; CHECK: // %bb.0: // %entry 66; CHECK-NEXT: ptrue p0.s 67; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0 68; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h 69; CHECK-NEXT: scvtf z0.h, p0/m, z0.s 70; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 71; CHECK-NEXT: ret 72; 73; NONEON-NOSVE-LABEL: t3: 74; NONEON-NOSVE: // %bb.0: // %entry 75; NONEON-NOSVE-NEXT: fcvt s0, h0 76; NONEON-NOSVE-NEXT: fcvtzs w8, s0 77; NONEON-NOSVE-NEXT: scvtf s0, w8 78; NONEON-NOSVE-NEXT: fcvt h0, s0 79; NONEON-NOSVE-NEXT: ret 80entry: 81 %conv = fptosi half %x to i32 82 %conv1 = sitofp i32 %conv to half 83 ret half %conv1 84} 85 86define double @t4(double %x) { 87; CHECK-LABEL: t4: 88; CHECK: // %bb.0: // %entry 89; CHECK-NEXT: ptrue p0.d 90; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 91; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 92; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d 93; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 94; CHECK-NEXT: ret 95; 96; USE-NEON-NO-GPRS-LABEL: t4: 97; USE-NEON-NO-GPRS: // %bb.0: // %entry 98; USE-NEON-NO-GPRS-NEXT: fcvtzu d0, d0 99; USE-NEON-NO-GPRS-NEXT: ucvtf d0, d0 100; USE-NEON-NO-GPRS-NEXT: ret 101; 102; NONEON-NOSVE-LABEL: t4: 103; NONEON-NOSVE: // %bb.0: // %entry 104; NONEON-NOSVE-NEXT: fcvtzu x8, d0 105; NONEON-NOSVE-NEXT: ucvtf d0, x8 106; NONEON-NOSVE-NEXT: ret 107entry: 108 %conv = fptoui double %x to i64 109 %conv1 = uitofp i64 %conv to double 110 ret double %conv1 111} 112 113define float @t5(float %x) { 114; CHECK-LABEL: t5: 115; CHECK: // %bb.0: // %entry 116; CHECK-NEXT: ptrue p0.s 117; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0 118; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 119; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s 120; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0 121; CHECK-NEXT: ret 122; 123; USE-NEON-NO-GPRS-LABEL: t5: 124; USE-NEON-NO-GPRS: // %bb.0: // %entry 125; USE-NEON-NO-GPRS-NEXT: fcvtzu s0, s0 126; USE-NEON-NO-GPRS-NEXT: ucvtf s0, s0 127; USE-NEON-NO-GPRS-NEXT: ret 128; 129; NONEON-NOSVE-LABEL: t5: 130; NONEON-NOSVE: // %bb.0: // %entry 131; NONEON-NOSVE-NEXT: fcvtzu w8, s0 132; NONEON-NOSVE-NEXT: ucvtf s0, w8 133; NONEON-NOSVE-NEXT: ret 134entry: 135 %conv = fptoui float %x to i32 136 %conv1 = uitofp i32 %conv to float 137 ret float %conv1 138} 139 140define half @t6(half %x) { 141; CHECK-LABEL: t6: 142; CHECK: // %bb.0: // %entry 143; CHECK-NEXT: ptrue p0.s 144; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0 145; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h 146; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s 147; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0 148; CHECK-NEXT: ret 149; 150; NONEON-NOSVE-LABEL: t6: 151; NONEON-NOSVE: // %bb.0: // %entry 152; NONEON-NOSVE-NEXT: fcvt s0, h0 153; NONEON-NOSVE-NEXT: fcvtzu w8, s0 154; NONEON-NOSVE-NEXT: ucvtf s0, w8 155; NONEON-NOSVE-NEXT: fcvt h0, s0 156; NONEON-NOSVE-NEXT: ret 157entry: 158 %conv = fptoui half %x to i32 159 %conv1 = uitofp i32 %conv to half 160 ret half %conv1 161} 162