399 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2;; These test functions previously triggered the following error when emitting machine code:3;; LLVM ERROR: Attempting to emit UCVTFv1i64 instruction but the Feature_HasNEON predicate(s) are not met4; RUN: llc -mtriple=aarch64 -mattr=+neon,+fullfp16,+alternate-sextload-cvt-f32-pattern < %s | FileCheck %s --check-prefixes=CHECK,NEON-ENABLED5; RUN: llc -mtriple=aarch64 -mattr=-neon,+fullfp16,+alternate-sextload-cvt-f32-pattern < %s | FileCheck %s --check-prefixes=CHECK,NEON-DISABLED6;; Emit an object file so that verifyPredicates is called (it is not used for ASM output).7; RUN: llc -mtriple=aarch64 -mattr=-neon,+fullfp16 -o /dev/null %s --asm-show-inst -filetype=obj8 9define double @ui8_to_double(ptr %i, ptr %f) {10; NEON-ENABLED-LABEL: ui8_to_double:11; NEON-ENABLED: // %bb.0: // %entry12; NEON-ENABLED-NEXT: ldr b0, [x0]13; NEON-ENABLED-NEXT: ucvtf d0, d014; NEON-ENABLED-NEXT: ret15;16; NEON-DISABLED-LABEL: ui8_to_double:17; NEON-DISABLED: // %bb.0: // %entry18; NEON-DISABLED-NEXT: ldrb w8, [x0]19; NEON-DISABLED-NEXT: ucvtf d0, w820; NEON-DISABLED-NEXT: ret21entry:22 %ld = load i8, ptr %i, align 123 %conv = uitofp i8 %ld to double24 ret double %conv25}26 27define float @ui8_to_float(ptr %i, ptr %f) {28; NEON-ENABLED-LABEL: ui8_to_float:29; NEON-ENABLED: // %bb.0: // %entry30; NEON-ENABLED-NEXT: ldr b0, [x0]31; NEON-ENABLED-NEXT: ucvtf s0, s032; NEON-ENABLED-NEXT: ret33;34; NEON-DISABLED-LABEL: ui8_to_float:35; NEON-DISABLED: // %bb.0: // %entry36; NEON-DISABLED-NEXT: ldrb w8, [x0]37; NEON-DISABLED-NEXT: ucvtf s0, w838; NEON-DISABLED-NEXT: ret39entry:40 %ld = load i8, ptr %i, align 141 %conv = uitofp i8 %ld to float42 ret float %conv43}44 45define half @ui8_to_half(ptr %i, ptr %f) {46; NEON-ENABLED-LABEL: ui8_to_half:47; NEON-ENABLED: // %bb.0: // %entry48; NEON-ENABLED-NEXT: ldr b0, [x0]49; NEON-ENABLED-NEXT: ucvtf h0, h050; NEON-ENABLED-NEXT: ret51;52; NEON-DISABLED-LABEL: ui8_to_half:53; NEON-DISABLED: // %bb.0: // %entry54; NEON-DISABLED-NEXT: ldrb w8, [x0]55; NEON-DISABLED-NEXT: ucvtf h0, w856; NEON-DISABLED-NEXT: ret57entry:58 %ld = load i8, ptr %i, align 159 %conv = uitofp i8 %ld to half60 ret half %conv61}62 63define double @ui16_to_double(ptr %i, ptr %f) {64; NEON-ENABLED-LABEL: ui16_to_double:65; NEON-ENABLED: // %bb.0: // %entry66; NEON-ENABLED-NEXT: ldr h0, [x0]67; NEON-ENABLED-NEXT: ucvtf d0, d068; NEON-ENABLED-NEXT: ret69;70; NEON-DISABLED-LABEL: ui16_to_double:71; NEON-DISABLED: // %bb.0: // %entry72; NEON-DISABLED-NEXT: ldrh w8, [x0]73; NEON-DISABLED-NEXT: ucvtf d0, w874; NEON-DISABLED-NEXT: ret75entry:76 %ld = load i16, ptr %i, align 177 %conv = uitofp i16 %ld to double78 ret double %conv79}80 81define float @ui16_to_float(ptr %i, ptr %f) {82; NEON-ENABLED-LABEL: ui16_to_float:83; NEON-ENABLED: // %bb.0: // %entry84; NEON-ENABLED-NEXT: ldr h0, [x0]85; NEON-ENABLED-NEXT: ucvtf s0, s086; NEON-ENABLED-NEXT: ret87;88; NEON-DISABLED-LABEL: ui16_to_float:89; NEON-DISABLED: // %bb.0: // %entry90; NEON-DISABLED-NEXT: ldrh w8, [x0]91; NEON-DISABLED-NEXT: ucvtf s0, w892; NEON-DISABLED-NEXT: ret93entry:94 %ld = load i16, ptr %i, align 195 %conv = uitofp i16 %ld to float96 ret float %conv97}98 99define half @ui16_to_half(ptr %i, ptr %f) {100; NEON-ENABLED-LABEL: ui16_to_half:101; NEON-ENABLED: // %bb.0: // %entry102; NEON-ENABLED-NEXT: ldr h0, [x0]103; NEON-ENABLED-NEXT: ucvtf h0, h0104; NEON-ENABLED-NEXT: ret105;106; NEON-DISABLED-LABEL: ui16_to_half:107; NEON-DISABLED: // %bb.0: // %entry108; NEON-DISABLED-NEXT: ldrh w8, [x0]109; NEON-DISABLED-NEXT: ucvtf h0, w8110; NEON-DISABLED-NEXT: ret111entry:112 %ld = load i16, ptr %i, align 1113 %conv = uitofp i16 %ld to half114 ret half %conv115}116 117define double @ui32_to_double(ptr %i, ptr %f) {118; NEON-ENABLED-LABEL: ui32_to_double:119; NEON-ENABLED: // %bb.0: // %entry120; NEON-ENABLED-NEXT: ldr s0, [x0]121; NEON-ENABLED-NEXT: ucvtf d0, d0122; NEON-ENABLED-NEXT: ret123;124; NEON-DISABLED-LABEL: ui32_to_double:125; NEON-DISABLED: // %bb.0: // %entry126; NEON-DISABLED-NEXT: ldr w8, [x0]127; NEON-DISABLED-NEXT: ucvtf d0, w8128; NEON-DISABLED-NEXT: ret129entry:130 %ld = load i32, ptr %i, align 1131 %conv = uitofp i32 %ld to double132 ret double %conv133}134 135define float @ui32_to_float(ptr %i, ptr %f) {136; NEON-ENABLED-LABEL: ui32_to_float:137; NEON-ENABLED: // %bb.0: // %entry138; NEON-ENABLED-NEXT: ldr s0, [x0]139; NEON-ENABLED-NEXT: ucvtf s0, s0140; NEON-ENABLED-NEXT: ret141;142; NEON-DISABLED-LABEL: ui32_to_float:143; NEON-DISABLED: // %bb.0: // %entry144; NEON-DISABLED-NEXT: ldr w8, [x0]145; NEON-DISABLED-NEXT: ucvtf s0, w8146; NEON-DISABLED-NEXT: ret147entry:148 %ld = load i32, ptr %i, align 1149 %conv = uitofp i32 %ld to float150 ret float %conv151}152 153define half @ui32_to_half(ptr %i, ptr %f) {154; CHECK-LABEL: ui32_to_half:155; CHECK: // %bb.0: // %entry156; CHECK-NEXT: ldr w8, [x0]157; CHECK-NEXT: ucvtf h0, w8158; CHECK-NEXT: ret159entry:160 %ld = load i32, ptr %i, align 1161 %conv = uitofp i32 %ld to half162 ret half %conv163}164 165define double @ui64_to_double(ptr %i, ptr %f) {166; NEON-ENABLED-LABEL: ui64_to_double:167; NEON-ENABLED: // %bb.0: // %entry168; NEON-ENABLED-NEXT: ldr d0, [x0]169; NEON-ENABLED-NEXT: ucvtf d0, d0170; NEON-ENABLED-NEXT: ret171;172; NEON-DISABLED-LABEL: ui64_to_double:173; NEON-DISABLED: // %bb.0: // %entry174; NEON-DISABLED-NEXT: ldr x8, [x0]175; NEON-DISABLED-NEXT: ucvtf d0, x8176; NEON-DISABLED-NEXT: ret177entry:178 %ld = load i64, ptr %i, align 1179 %conv = uitofp i64 %ld to double180 ret double %conv181}182 183define float @ui64_to_float(ptr %i, ptr %f) {184; CHECK-LABEL: ui64_to_float:185; CHECK: // %bb.0: // %entry186; CHECK-NEXT: ldr x8, [x0]187; CHECK-NEXT: ucvtf s0, x8188; CHECK-NEXT: ret189entry:190 %ld = load i64, ptr %i, align 1191 %conv = uitofp i64 %ld to float192 ret float %conv193}194 195define half @ui64_to_half(ptr %i, ptr %f) {196; CHECK-LABEL: ui64_to_half:197; CHECK: // %bb.0: // %entry198; CHECK-NEXT: ldr x8, [x0]199; CHECK-NEXT: ucvtf h0, x8200; CHECK-NEXT: ret201entry:202 %ld = load i64, ptr %i, align 1203 %conv = uitofp i64 %ld to half204 ret half %conv205}206 207 208define double @si8_to_double(ptr %i, ptr %f) {209; CHECK-LABEL: si8_to_double:210; CHECK: // %bb.0: // %entry211; CHECK-NEXT: ldrsb w8, [x0]212; CHECK-NEXT: scvtf d0, w8213; CHECK-NEXT: ret214entry:215 %ld = load i8, ptr %i, align 1216 %conv = sitofp i8 %ld to double217 ret double %conv218}219 220define float @si8_to_float(ptr %i, ptr %f) {221; NEON-ENABLED-LABEL: si8_to_float:222; NEON-ENABLED: // %bb.0: // %entry223; NEON-ENABLED-NEXT: ldr b0, [x0]224; NEON-ENABLED-NEXT: sshll v0.8h, v0.8b, #0225; NEON-ENABLED-NEXT: sshll v0.4s, v0.4h, #0226; NEON-ENABLED-NEXT: scvtf s0, s0227; NEON-ENABLED-NEXT: ret228;229; NEON-DISABLED-LABEL: si8_to_float:230; NEON-DISABLED: // %bb.0: // %entry231; NEON-DISABLED-NEXT: ldrsb w8, [x0]232; NEON-DISABLED-NEXT: scvtf s0, w8233; NEON-DISABLED-NEXT: ret234entry:235 %ld = load i8, ptr %i, align 1236 %conv = sitofp i8 %ld to float237 ret float %conv238}239 240define half @si8_to_half(ptr %i, ptr %f) {241; CHECK-LABEL: si8_to_half:242; CHECK: // %bb.0: // %entry243; CHECK-NEXT: ldrsb w8, [x0]244; CHECK-NEXT: scvtf h0, w8245; CHECK-NEXT: ret246entry:247 %ld = load i8, ptr %i, align 1248 %conv = sitofp i8 %ld to half249 ret half %conv250}251 252define double @si16_to_double(ptr %i, ptr %f) {253; NEON-ENABLED-LABEL: si16_to_double:254; NEON-ENABLED: // %bb.0: // %entry255; NEON-ENABLED-NEXT: ldr h0, [x0]256; NEON-ENABLED-NEXT: sshll v0.4s, v0.4h, #0257; NEON-ENABLED-NEXT: sshll v0.2d, v0.2s, #0258; NEON-ENABLED-NEXT: scvtf d0, d0259; NEON-ENABLED-NEXT: ret260;261; NEON-DISABLED-LABEL: si16_to_double:262; NEON-DISABLED: // %bb.0: // %entry263; NEON-DISABLED-NEXT: ldrsh w8, [x0]264; NEON-DISABLED-NEXT: scvtf d0, w8265; NEON-DISABLED-NEXT: ret266entry:267 %ld = load i16, ptr %i, align 1268 %conv = sitofp i16 %ld to double269 ret double %conv270}271 272define float @si16_to_float(ptr %i, ptr %f) {273; NEON-ENABLED-LABEL: si16_to_float:274; NEON-ENABLED: // %bb.0: // %entry275; NEON-ENABLED-NEXT: ldr h0, [x0]276; NEON-ENABLED-NEXT: sshll v0.4s, v0.4h, #0277; NEON-ENABLED-NEXT: scvtf s0, s0278; NEON-ENABLED-NEXT: ret279;280; NEON-DISABLED-LABEL: si16_to_float:281; NEON-DISABLED: // %bb.0: // %entry282; NEON-DISABLED-NEXT: ldrsh w8, [x0]283; NEON-DISABLED-NEXT: scvtf s0, w8284; NEON-DISABLED-NEXT: ret285entry:286 %ld = load i16, ptr %i, align 1287 %conv = sitofp i16 %ld to float288 ret float %conv289}290 291define half @si16_to_half(ptr %i, ptr %f) {292; NEON-ENABLED-LABEL: si16_to_half:293; NEON-ENABLED: // %bb.0: // %entry294; NEON-ENABLED-NEXT: ldr h0, [x0]295; NEON-ENABLED-NEXT: scvtf h0, h0296; NEON-ENABLED-NEXT: ret297;298; NEON-DISABLED-LABEL: si16_to_half:299; NEON-DISABLED: // %bb.0: // %entry300; NEON-DISABLED-NEXT: ldrsh w8, [x0]301; NEON-DISABLED-NEXT: scvtf h0, w8302; NEON-DISABLED-NEXT: ret303entry:304 %ld = load i16, ptr %i, align 1305 %conv = sitofp i16 %ld to half306 ret half %conv307}308 309define double @si32_to_double(ptr %i, ptr %f) {310; NEON-ENABLED-LABEL: si32_to_double:311; NEON-ENABLED: // %bb.0: // %entry312; NEON-ENABLED-NEXT: ldr s0, [x0]313; NEON-ENABLED-NEXT: sshll v0.2d, v0.2s, #0314; NEON-ENABLED-NEXT: scvtf d0, d0315; NEON-ENABLED-NEXT: ret316;317; NEON-DISABLED-LABEL: si32_to_double:318; NEON-DISABLED: // %bb.0: // %entry319; NEON-DISABLED-NEXT: ldr w8, [x0]320; NEON-DISABLED-NEXT: scvtf d0, w8321; NEON-DISABLED-NEXT: ret322entry:323 %ld = load i32, ptr %i, align 1324 %conv = sitofp i32 %ld to double325 ret double %conv326}327 328define float @si32_to_float(ptr %i, ptr %f) {329; NEON-ENABLED-LABEL: si32_to_float:330; NEON-ENABLED: // %bb.0: // %entry331; NEON-ENABLED-NEXT: ldr s0, [x0]332; NEON-ENABLED-NEXT: scvtf s0, s0333; NEON-ENABLED-NEXT: ret334;335; NEON-DISABLED-LABEL: si32_to_float:336; NEON-DISABLED: // %bb.0: // %entry337; NEON-DISABLED-NEXT: ldr w8, [x0]338; NEON-DISABLED-NEXT: scvtf s0, w8339; NEON-DISABLED-NEXT: ret340entry:341 %ld = load i32, ptr %i, align 1342 %conv = sitofp i32 %ld to float343 ret float %conv344}345 346define half @si32_to_half(ptr %i, ptr %f) {347; CHECK-LABEL: si32_to_half:348; CHECK: // %bb.0: // %entry349; CHECK-NEXT: ldr w8, [x0]350; CHECK-NEXT: scvtf h0, w8351; CHECK-NEXT: ret352entry:353 %ld = load i32, ptr %i, align 1354 %conv = sitofp i32 %ld to half355 ret half %conv356}357 358define double @si64_to_double(ptr %i, ptr %f) {359; NEON-ENABLED-LABEL: si64_to_double:360; NEON-ENABLED: // %bb.0: // %entry361; NEON-ENABLED-NEXT: ldr d0, [x0]362; NEON-ENABLED-NEXT: scvtf d0, d0363; NEON-ENABLED-NEXT: ret364;365; NEON-DISABLED-LABEL: si64_to_double:366; NEON-DISABLED: // %bb.0: // %entry367; NEON-DISABLED-NEXT: ldr x8, [x0]368; NEON-DISABLED-NEXT: scvtf d0, x8369; NEON-DISABLED-NEXT: ret370entry:371 %ld = load i64, ptr %i, align 1372 %conv = sitofp i64 %ld to double373 ret double %conv374}375 376define float @si64_to_float(ptr %i, ptr %f) {377; CHECK-LABEL: si64_to_float:378; CHECK: // %bb.0: // %entry379; CHECK-NEXT: ldr x8, [x0]380; CHECK-NEXT: scvtf s0, x8381; CHECK-NEXT: ret382entry:383 %ld = load i64, ptr %i, align 1384 %conv = sitofp i64 %ld to float385 ret float %conv386}387 388define half @si64_to_half(ptr %i, ptr %f) {389; CHECK-LABEL: si64_to_half:390; CHECK: // %bb.0: // %entry391; CHECK-NEXT: ldr x8, [x0]392; CHECK-NEXT: scvtf h0, x8393; CHECK-NEXT: ret394entry:395 %ld = load i64, ptr %i, align 1396 %conv = sitofp i64 %ld to half397 ret half %conv398}399