1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16 3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16 4; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16 5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16 6 7define fp128 @stofp_i128_f128(i128 %a) { 8; CHECK-SD-LABEL: stofp_i128_f128: 9; CHECK-SD: // %bb.0: // %entry 10; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 11; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 12; CHECK-SD-NEXT: .cfi_offset w30, -16 13; CHECK-SD-NEXT: bl __floattitf 14; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 15; CHECK-SD-NEXT: ret 16; 17; CHECK-GI-LABEL: stofp_i128_f128: 18; CHECK-GI: // %bb.0: // %entry 19; CHECK-GI-NEXT: b __floattitf 20entry: 21 %c = sitofp i128 %a to fp128 22 ret fp128 %c 23} 24 25define fp128 @utofp_i128_f128(i128 %a) { 26; CHECK-SD-LABEL: utofp_i128_f128: 27; CHECK-SD: // %bb.0: // %entry 28; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 29; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 30; CHECK-SD-NEXT: .cfi_offset w30, -16 31; CHECK-SD-NEXT: bl __floatuntitf 32; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 33; CHECK-SD-NEXT: ret 34; 35; CHECK-GI-LABEL: utofp_i128_f128: 36; CHECK-GI: // %bb.0: // %entry 37; CHECK-GI-NEXT: b __floatuntitf 38entry: 39 %c = uitofp i128 %a to fp128 40 ret fp128 %c 41} 42 43define fp128 @stofp_i64_f128(i64 %a) { 44; CHECK-SD-LABEL: stofp_i64_f128: 45; CHECK-SD: // %bb.0: // %entry 46; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 47; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 48; CHECK-SD-NEXT: .cfi_offset w30, -16 49; CHECK-SD-NEXT: bl __floatditf 50; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 51; CHECK-SD-NEXT: ret 52; 53; CHECK-GI-LABEL: stofp_i64_f128: 54; CHECK-GI: // %bb.0: // %entry 55; CHECK-GI-NEXT: b __floatditf 56entry: 57 %c = sitofp i64 %a to fp128 58 ret fp128 %c 59} 60 61define fp128 @utofp_i64_f128(i64 %a) { 62; CHECK-SD-LABEL: utofp_i64_f128: 63; CHECK-SD: // %bb.0: // %entry 64; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 65; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 66; CHECK-SD-NEXT: .cfi_offset w30, -16 67; CHECK-SD-NEXT: bl __floatunditf 68; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 69; CHECK-SD-NEXT: ret 70; 71; CHECK-GI-LABEL: utofp_i64_f128: 72; CHECK-GI: // %bb.0: // %entry 73; CHECK-GI-NEXT: b __floatunditf 74entry: 75 %c = uitofp i64 %a to fp128 76 ret fp128 %c 77} 78 79define fp128 @stofp_i32_f128(i32 %a) { 80; CHECK-SD-LABEL: stofp_i32_f128: 81; CHECK-SD: // %bb.0: // %entry 82; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 83; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 84; CHECK-SD-NEXT: .cfi_offset w30, -16 85; CHECK-SD-NEXT: bl __floatsitf 86; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 87; CHECK-SD-NEXT: ret 88; 89; CHECK-GI-LABEL: stofp_i32_f128: 90; CHECK-GI: // %bb.0: // %entry 91; CHECK-GI-NEXT: b __floatsitf 92entry: 93 %c = sitofp i32 %a to fp128 94 ret fp128 %c 95} 96 97define fp128 @utofp_i32_f128(i32 %a) { 98; CHECK-SD-LABEL: utofp_i32_f128: 99; CHECK-SD: // %bb.0: // %entry 100; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 101; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 102; CHECK-SD-NEXT: .cfi_offset w30, -16 103; CHECK-SD-NEXT: bl __floatunsitf 104; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 105; CHECK-SD-NEXT: ret 106; 107; CHECK-GI-LABEL: utofp_i32_f128: 108; CHECK-GI: // %bb.0: // %entry 109; CHECK-GI-NEXT: b __floatunsitf 110entry: 111 %c = uitofp i32 %a to fp128 112 ret fp128 %c 113} 114 115define fp128 @stofp_i16_f128(i16 %a) { 116; CHECK-SD-LABEL: stofp_i16_f128: 117; CHECK-SD: // %bb.0: // %entry 118; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 119; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 120; CHECK-SD-NEXT: .cfi_offset w30, -16 121; CHECK-SD-NEXT: sxth w0, w0 122; CHECK-SD-NEXT: bl __floatsitf 123; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 124; CHECK-SD-NEXT: ret 125; 126; CHECK-GI-LABEL: stofp_i16_f128: 127; CHECK-GI: // %bb.0: // %entry 128; CHECK-GI-NEXT: sxth w0, w0 129; CHECK-GI-NEXT: b __floatsitf 130entry: 131 %c = sitofp i16 %a to fp128 132 ret fp128 %c 133} 134 135define fp128 @utofp_i16_f128(i16 %a) { 136; CHECK-SD-LABEL: utofp_i16_f128: 137; CHECK-SD: // %bb.0: // %entry 138; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 139; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 140; CHECK-SD-NEXT: .cfi_offset w30, -16 141; CHECK-SD-NEXT: and w0, w0, #0xffff 142; CHECK-SD-NEXT: bl __floatunsitf 143; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 144; CHECK-SD-NEXT: ret 145; 146; CHECK-GI-LABEL: utofp_i16_f128: 147; CHECK-GI: // %bb.0: // %entry 148; CHECK-GI-NEXT: and w0, w0, #0xffff 149; CHECK-GI-NEXT: b __floatunsitf 150entry: 151 %c = uitofp i16 %a to fp128 152 ret fp128 %c 153} 154 155define fp128 @stofp_i8_f128(i8 %a) { 156; CHECK-SD-LABEL: stofp_i8_f128: 157; CHECK-SD: // %bb.0: // %entry 158; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 159; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 160; CHECK-SD-NEXT: .cfi_offset w30, -16 161; CHECK-SD-NEXT: sxtb w0, w0 162; CHECK-SD-NEXT: bl __floatsitf 163; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 164; CHECK-SD-NEXT: ret 165; 166; CHECK-GI-LABEL: stofp_i8_f128: 167; CHECK-GI: // %bb.0: // %entry 168; CHECK-GI-NEXT: sxtb w0, w0 169; CHECK-GI-NEXT: b __floatsitf 170entry: 171 %c = sitofp i8 %a to fp128 172 ret fp128 %c 173} 174 175define fp128 @utofp_i8_f128(i8 %a) { 176; CHECK-SD-LABEL: utofp_i8_f128: 177; CHECK-SD: // %bb.0: // %entry 178; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 179; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 180; CHECK-SD-NEXT: .cfi_offset w30, -16 181; CHECK-SD-NEXT: and w0, w0, #0xff 182; CHECK-SD-NEXT: bl __floatunsitf 183; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 184; CHECK-SD-NEXT: ret 185; 186; CHECK-GI-LABEL: utofp_i8_f128: 187; CHECK-GI: // %bb.0: // %entry 188; CHECK-GI-NEXT: and w0, w0, #0xff 189; CHECK-GI-NEXT: b __floatunsitf 190entry: 191 %c = uitofp i8 %a to fp128 192 ret fp128 %c 193} 194 195define double @stofp_i128_f64(i128 %a) { 196; CHECK-SD-LABEL: stofp_i128_f64: 197; CHECK-SD: // %bb.0: // %entry 198; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 199; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 200; CHECK-SD-NEXT: .cfi_offset w30, -16 201; CHECK-SD-NEXT: bl __floattidf 202; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 203; CHECK-SD-NEXT: ret 204; 205; CHECK-GI-LABEL: stofp_i128_f64: 206; CHECK-GI: // %bb.0: // %entry 207; CHECK-GI-NEXT: b __floattidf 208entry: 209 %c = sitofp i128 %a to double 210 ret double %c 211} 212 213define double @utofp_i128_f64(i128 %a) { 214; CHECK-SD-LABEL: utofp_i128_f64: 215; CHECK-SD: // %bb.0: // %entry 216; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 217; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 218; CHECK-SD-NEXT: .cfi_offset w30, -16 219; CHECK-SD-NEXT: bl __floatuntidf 220; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 221; CHECK-SD-NEXT: ret 222; 223; CHECK-GI-LABEL: utofp_i128_f64: 224; CHECK-GI: // %bb.0: // %entry 225; CHECK-GI-NEXT: b __floatuntidf 226entry: 227 %c = uitofp i128 %a to double 228 ret double %c 229} 230 231define double @stofp_i64_f64(i64 %a) { 232; CHECK-LABEL: stofp_i64_f64: 233; CHECK: // %bb.0: // %entry 234; CHECK-NEXT: scvtf d0, x0 235; CHECK-NEXT: ret 236entry: 237 %c = sitofp i64 %a to double 238 ret double %c 239} 240 241define double @utofp_i64_f64(i64 %a) { 242; CHECK-LABEL: utofp_i64_f64: 243; CHECK: // %bb.0: // %entry 244; CHECK-NEXT: ucvtf d0, x0 245; CHECK-NEXT: ret 246entry: 247 %c = uitofp i64 %a to double 248 ret double %c 249} 250 251define double @stofp_i32_f64(i32 %a) { 252; CHECK-LABEL: stofp_i32_f64: 253; CHECK: // %bb.0: // %entry 254; CHECK-NEXT: scvtf d0, w0 255; CHECK-NEXT: ret 256entry: 257 %c = sitofp i32 %a to double 258 ret double %c 259} 260 261define double @utofp_i32_f64(i32 %a) { 262; CHECK-LABEL: utofp_i32_f64: 263; CHECK: // %bb.0: // %entry 264; CHECK-NEXT: ucvtf d0, w0 265; CHECK-NEXT: ret 266entry: 267 %c = uitofp i32 %a to double 268 ret double %c 269} 270 271define double @stofp_i16_f64(i16 %a) { 272; CHECK-LABEL: stofp_i16_f64: 273; CHECK: // %bb.0: // %entry 274; CHECK-NEXT: sxth w8, w0 275; CHECK-NEXT: scvtf d0, w8 276; CHECK-NEXT: ret 277entry: 278 %c = sitofp i16 %a to double 279 ret double %c 280} 281 282define double @utofp_i16_f64(i16 %a) { 283; CHECK-LABEL: utofp_i16_f64: 284; CHECK: // %bb.0: // %entry 285; CHECK-NEXT: and w8, w0, #0xffff 286; CHECK-NEXT: ucvtf d0, w8 287; CHECK-NEXT: ret 288entry: 289 %c = uitofp i16 %a to double 290 ret double %c 291} 292 293define double @stofp_i8_f64(i8 %a) { 294; CHECK-LABEL: stofp_i8_f64: 295; CHECK: // %bb.0: // %entry 296; CHECK-NEXT: sxtb w8, w0 297; CHECK-NEXT: scvtf d0, w8 298; CHECK-NEXT: ret 299entry: 300 %c = sitofp i8 %a to double 301 ret double %c 302} 303 304define double @utofp_i8_f64(i8 %a) { 305; CHECK-LABEL: utofp_i8_f64: 306; CHECK: // %bb.0: // %entry 307; CHECK-NEXT: and w8, w0, #0xff 308; CHECK-NEXT: ucvtf d0, w8 309; CHECK-NEXT: ret 310entry: 311 %c = uitofp i8 %a to double 312 ret double %c 313} 314 315define float @stofp_i128_f32(i128 %a) { 316; CHECK-SD-LABEL: stofp_i128_f32: 317; CHECK-SD: // %bb.0: // %entry 318; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 319; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 320; CHECK-SD-NEXT: .cfi_offset w30, -16 321; CHECK-SD-NEXT: bl __floattisf 322; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 323; CHECK-SD-NEXT: ret 324; 325; CHECK-GI-LABEL: stofp_i128_f32: 326; CHECK-GI: // %bb.0: // %entry 327; CHECK-GI-NEXT: b __floattisf 328entry: 329 %c = sitofp i128 %a to float 330 ret float %c 331} 332 333define float @utofp_i128_f32(i128 %a) { 334; CHECK-SD-LABEL: utofp_i128_f32: 335; CHECK-SD: // %bb.0: // %entry 336; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 337; CHECK-SD-NEXT: .cfi_def_cfa_offset 16 338; CHECK-SD-NEXT: .cfi_offset w30, -16 339; CHECK-SD-NEXT: bl __floatuntisf 340; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 341; CHECK-SD-NEXT: ret 342; 343; CHECK-GI-LABEL: utofp_i128_f32: 344; CHECK-GI: // %bb.0: // %entry 345; CHECK-GI-NEXT: b __floatuntisf 346entry: 347 %c = uitofp i128 %a to float 348 ret float %c 349} 350 351define float @stofp_i64_f32(i64 %a) { 352; CHECK-LABEL: stofp_i64_f32: 353; CHECK: // %bb.0: // %entry 354; CHECK-NEXT: scvtf s0, x0 355; CHECK-NEXT: ret 356entry: 357 %c = sitofp i64 %a to float 358 ret float %c 359} 360 361define float @utofp_i64_f32(i64 %a) { 362; CHECK-LABEL: utofp_i64_f32: 363; CHECK: // %bb.0: // %entry 364; CHECK-NEXT: ucvtf s0, x0 365; CHECK-NEXT: ret 366entry: 367 %c = uitofp i64 %a to float 368 ret float %c 369} 370 371define float @stofp_i32_f32(i32 %a) { 372; CHECK-LABEL: stofp_i32_f32: 373; CHECK: // %bb.0: // %entry 374; CHECK-NEXT: scvtf s0, w0 375; CHECK-NEXT: ret 376entry: 377 %c = sitofp i32 %a to float 378 ret float %c 379} 380 381define float @utofp_i32_f32(i32 %a) { 382; CHECK-LABEL: utofp_i32_f32: 383; CHECK: // %bb.0: // %entry 384; CHECK-NEXT: ucvtf s0, w0 385; CHECK-NEXT: ret 386entry: 387 %c = uitofp i32 %a to float 388 ret float %c 389} 390 391define float @stofp_i16_f32(i16 %a) { 392; CHECK-LABEL: stofp_i16_f32: 393; CHECK: // %bb.0: // %entry 394; CHECK-NEXT: sxth w8, w0 395; CHECK-NEXT: scvtf s0, w8 396; CHECK-NEXT: ret 397entry: 398 %c = sitofp i16 %a to float 399 ret float %c 400} 401 402define float @utofp_i16_f32(i16 %a) { 403; CHECK-LABEL: utofp_i16_f32: 404; CHECK: // %bb.0: // %entry 405; CHECK-NEXT: and w8, w0, #0xffff 406; CHECK-NEXT: ucvtf s0, w8 407; CHECK-NEXT: ret 408entry: 409 %c = uitofp i16 %a to float 410 ret float %c 411} 412 413define float @stofp_i8_f32(i8 %a) { 414; CHECK-LABEL: stofp_i8_f32: 415; CHECK: // %bb.0: // %entry 416; CHECK-NEXT: sxtb w8, w0 417; CHECK-NEXT: scvtf s0, w8 418; CHECK-NEXT: ret 419entry: 420 %c = sitofp i8 %a to float 421 ret float %c 422} 423 424define float @utofp_i8_f32(i8 %a) { 425; CHECK-LABEL: utofp_i8_f32: 426; CHECK: // %bb.0: // %entry 427; CHECK-NEXT: and w8, w0, #0xff 428; CHECK-NEXT: ucvtf s0, w8 429; CHECK-NEXT: ret 430entry: 431 %c = uitofp i8 %a to float 432 ret float %c 433} 434 435define half @stofp_i128_f16(i128 %a) { 436; CHECK-SD-NOFP16-LABEL: stofp_i128_f16: 437; CHECK-SD-NOFP16: // %bb.0: // %entry 438; CHECK-SD-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 439; CHECK-SD-NOFP16-NEXT: .cfi_def_cfa_offset 16 440; CHECK-SD-NOFP16-NEXT: .cfi_offset w30, -16 441; CHECK-SD-NOFP16-NEXT: bl __floattisf 442; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 443; CHECK-SD-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 444; CHECK-SD-NOFP16-NEXT: ret 445; 446; CHECK-SD-FP16-LABEL: stofp_i128_f16: 447; CHECK-SD-FP16: // %bb.0: // %entry 448; CHECK-SD-FP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 449; CHECK-SD-FP16-NEXT: .cfi_def_cfa_offset 16 450; CHECK-SD-FP16-NEXT: .cfi_offset w30, -16 451; CHECK-SD-FP16-NEXT: bl __floattihf 452; CHECK-SD-FP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 453; CHECK-SD-FP16-NEXT: ret 454; 455; CHECK-GI-NOFP16-LABEL: stofp_i128_f16: 456; CHECK-GI-NOFP16: // %bb.0: // %entry 457; CHECK-GI-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 458; CHECK-GI-NOFP16-NEXT: .cfi_def_cfa_offset 16 459; CHECK-GI-NOFP16-NEXT: .cfi_offset w30, -16 460; CHECK-GI-NOFP16-NEXT: bl __floattisf 461; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 462; CHECK-GI-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 463; CHECK-GI-NOFP16-NEXT: ret 464; 465; CHECK-GI-FP16-LABEL: stofp_i128_f16: 466; CHECK-GI-FP16: // %bb.0: // %entry 467; CHECK-GI-FP16-NEXT: b __floattihf 468entry: 469 %c = sitofp i128 %a to half 470 ret half %c 471} 472 473define half @utofp_i128_f16(i128 %a) { 474; CHECK-SD-NOFP16-LABEL: utofp_i128_f16: 475; CHECK-SD-NOFP16: // %bb.0: // %entry 476; CHECK-SD-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 477; CHECK-SD-NOFP16-NEXT: .cfi_def_cfa_offset 16 478; CHECK-SD-NOFP16-NEXT: .cfi_offset w30, -16 479; CHECK-SD-NOFP16-NEXT: bl __floatuntisf 480; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 481; CHECK-SD-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 482; CHECK-SD-NOFP16-NEXT: ret 483; 484; CHECK-SD-FP16-LABEL: utofp_i128_f16: 485; CHECK-SD-FP16: // %bb.0: // %entry 486; CHECK-SD-FP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 487; CHECK-SD-FP16-NEXT: .cfi_def_cfa_offset 16 488; CHECK-SD-FP16-NEXT: .cfi_offset w30, -16 489; CHECK-SD-FP16-NEXT: bl __floatuntihf 490; CHECK-SD-FP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 491; CHECK-SD-FP16-NEXT: ret 492; 493; CHECK-GI-NOFP16-LABEL: utofp_i128_f16: 494; CHECK-GI-NOFP16: // %bb.0: // %entry 495; CHECK-GI-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 496; CHECK-GI-NOFP16-NEXT: .cfi_def_cfa_offset 16 497; CHECK-GI-NOFP16-NEXT: .cfi_offset w30, -16 498; CHECK-GI-NOFP16-NEXT: bl __floatuntisf 499; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 500; CHECK-GI-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 501; CHECK-GI-NOFP16-NEXT: ret 502; 503; CHECK-GI-FP16-LABEL: utofp_i128_f16: 504; CHECK-GI-FP16: // %bb.0: // %entry 505; CHECK-GI-FP16-NEXT: b __floatuntihf 506entry: 507 %c = uitofp i128 %a to half 508 ret half %c 509} 510 511define half @stofp_i64_f16(i64 %a) { 512; CHECK-SD-NOFP16-LABEL: stofp_i64_f16: 513; CHECK-SD-NOFP16: // %bb.0: // %entry 514; CHECK-SD-NOFP16-NEXT: scvtf s0, x0 515; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 516; CHECK-SD-NOFP16-NEXT: ret 517; 518; CHECK-SD-FP16-LABEL: stofp_i64_f16: 519; CHECK-SD-FP16: // %bb.0: // %entry 520; CHECK-SD-FP16-NEXT: scvtf h0, x0 521; CHECK-SD-FP16-NEXT: ret 522; 523; CHECK-GI-NOFP16-LABEL: stofp_i64_f16: 524; CHECK-GI-NOFP16: // %bb.0: // %entry 525; CHECK-GI-NOFP16-NEXT: scvtf s0, x0 526; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 527; CHECK-GI-NOFP16-NEXT: ret 528; 529; CHECK-GI-FP16-LABEL: stofp_i64_f16: 530; CHECK-GI-FP16: // %bb.0: // %entry 531; CHECK-GI-FP16-NEXT: scvtf h0, x0 532; CHECK-GI-FP16-NEXT: ret 533entry: 534 %c = sitofp i64 %a to half 535 ret half %c 536} 537 538define half @utofp_i64_f16(i64 %a) { 539; CHECK-SD-NOFP16-LABEL: utofp_i64_f16: 540; CHECK-SD-NOFP16: // %bb.0: // %entry 541; CHECK-SD-NOFP16-NEXT: ucvtf s0, x0 542; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 543; CHECK-SD-NOFP16-NEXT: ret 544; 545; CHECK-SD-FP16-LABEL: utofp_i64_f16: 546; CHECK-SD-FP16: // %bb.0: // %entry 547; CHECK-SD-FP16-NEXT: ucvtf h0, x0 548; CHECK-SD-FP16-NEXT: ret 549; 550; CHECK-GI-NOFP16-LABEL: utofp_i64_f16: 551; CHECK-GI-NOFP16: // %bb.0: // %entry 552; CHECK-GI-NOFP16-NEXT: ucvtf s0, x0 553; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 554; CHECK-GI-NOFP16-NEXT: ret 555; 556; CHECK-GI-FP16-LABEL: utofp_i64_f16: 557; CHECK-GI-FP16: // %bb.0: // %entry 558; CHECK-GI-FP16-NEXT: ucvtf h0, x0 559; CHECK-GI-FP16-NEXT: ret 560entry: 561 %c = uitofp i64 %a to half 562 ret half %c 563} 564 565define half @stofp_i32_f16(i32 %a) { 566; CHECK-SD-NOFP16-LABEL: stofp_i32_f16: 567; CHECK-SD-NOFP16: // %bb.0: // %entry 568; CHECK-SD-NOFP16-NEXT: scvtf s0, w0 569; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 570; CHECK-SD-NOFP16-NEXT: ret 571; 572; CHECK-SD-FP16-LABEL: stofp_i32_f16: 573; CHECK-SD-FP16: // %bb.0: // %entry 574; CHECK-SD-FP16-NEXT: scvtf h0, w0 575; CHECK-SD-FP16-NEXT: ret 576; 577; CHECK-GI-NOFP16-LABEL: stofp_i32_f16: 578; CHECK-GI-NOFP16: // %bb.0: // %entry 579; CHECK-GI-NOFP16-NEXT: scvtf s0, w0 580; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 581; CHECK-GI-NOFP16-NEXT: ret 582; 583; CHECK-GI-FP16-LABEL: stofp_i32_f16: 584; CHECK-GI-FP16: // %bb.0: // %entry 585; CHECK-GI-FP16-NEXT: scvtf h0, w0 586; CHECK-GI-FP16-NEXT: ret 587entry: 588 %c = sitofp i32 %a to half 589 ret half %c 590} 591 592define half @utofp_i32_f16(i32 %a) { 593; CHECK-SD-NOFP16-LABEL: utofp_i32_f16: 594; CHECK-SD-NOFP16: // %bb.0: // %entry 595; CHECK-SD-NOFP16-NEXT: ucvtf s0, w0 596; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 597; CHECK-SD-NOFP16-NEXT: ret 598; 599; CHECK-SD-FP16-LABEL: utofp_i32_f16: 600; CHECK-SD-FP16: // %bb.0: // %entry 601; CHECK-SD-FP16-NEXT: ucvtf h0, w0 602; CHECK-SD-FP16-NEXT: ret 603; 604; CHECK-GI-NOFP16-LABEL: utofp_i32_f16: 605; CHECK-GI-NOFP16: // %bb.0: // %entry 606; CHECK-GI-NOFP16-NEXT: ucvtf s0, w0 607; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 608; CHECK-GI-NOFP16-NEXT: ret 609; 610; CHECK-GI-FP16-LABEL: utofp_i32_f16: 611; CHECK-GI-FP16: // %bb.0: // %entry 612; CHECK-GI-FP16-NEXT: ucvtf h0, w0 613; CHECK-GI-FP16-NEXT: ret 614entry: 615 %c = uitofp i32 %a to half 616 ret half %c 617} 618 619define half @stofp_i16_f16(i16 %a) { 620; CHECK-SD-NOFP16-LABEL: stofp_i16_f16: 621; CHECK-SD-NOFP16: // %bb.0: // %entry 622; CHECK-SD-NOFP16-NEXT: sxth w8, w0 623; CHECK-SD-NOFP16-NEXT: scvtf s0, w8 624; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 625; CHECK-SD-NOFP16-NEXT: ret 626; 627; CHECK-SD-FP16-LABEL: stofp_i16_f16: 628; CHECK-SD-FP16: // %bb.0: // %entry 629; CHECK-SD-FP16-NEXT: sxth w8, w0 630; CHECK-SD-FP16-NEXT: scvtf h0, w8 631; CHECK-SD-FP16-NEXT: ret 632; 633; CHECK-GI-NOFP16-LABEL: stofp_i16_f16: 634; CHECK-GI-NOFP16: // %bb.0: // %entry 635; CHECK-GI-NOFP16-NEXT: sxth w8, w0 636; CHECK-GI-NOFP16-NEXT: scvtf s0, w8 637; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 638; CHECK-GI-NOFP16-NEXT: ret 639; 640; CHECK-GI-FP16-LABEL: stofp_i16_f16: 641; CHECK-GI-FP16: // %bb.0: // %entry 642; CHECK-GI-FP16-NEXT: sxth w8, w0 643; CHECK-GI-FP16-NEXT: scvtf h0, w8 644; CHECK-GI-FP16-NEXT: ret 645entry: 646 %c = sitofp i16 %a to half 647 ret half %c 648} 649 650define half @utofp_i16_f16(i16 %a) { 651; CHECK-SD-NOFP16-LABEL: utofp_i16_f16: 652; CHECK-SD-NOFP16: // %bb.0: // %entry 653; CHECK-SD-NOFP16-NEXT: and w8, w0, #0xffff 654; CHECK-SD-NOFP16-NEXT: ucvtf s0, w8 655; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 656; CHECK-SD-NOFP16-NEXT: ret 657; 658; CHECK-SD-FP16-LABEL: utofp_i16_f16: 659; CHECK-SD-FP16: // %bb.0: // %entry 660; CHECK-SD-FP16-NEXT: and w8, w0, #0xffff 661; CHECK-SD-FP16-NEXT: ucvtf h0, w8 662; CHECK-SD-FP16-NEXT: ret 663; 664; CHECK-GI-NOFP16-LABEL: utofp_i16_f16: 665; CHECK-GI-NOFP16: // %bb.0: // %entry 666; CHECK-GI-NOFP16-NEXT: and w8, w0, #0xffff 667; CHECK-GI-NOFP16-NEXT: ucvtf s0, w8 668; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 669; CHECK-GI-NOFP16-NEXT: ret 670; 671; CHECK-GI-FP16-LABEL: utofp_i16_f16: 672; CHECK-GI-FP16: // %bb.0: // %entry 673; CHECK-GI-FP16-NEXT: and w8, w0, #0xffff 674; CHECK-GI-FP16-NEXT: ucvtf h0, w8 675; CHECK-GI-FP16-NEXT: ret 676entry: 677 %c = uitofp i16 %a to half 678 ret half %c 679} 680 681define half @stofp_i8_f16(i8 %a) { 682; CHECK-SD-NOFP16-LABEL: stofp_i8_f16: 683; CHECK-SD-NOFP16: // %bb.0: // %entry 684; CHECK-SD-NOFP16-NEXT: sxtb w8, w0 685; CHECK-SD-NOFP16-NEXT: scvtf s0, w8 686; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 687; CHECK-SD-NOFP16-NEXT: ret 688; 689; CHECK-SD-FP16-LABEL: stofp_i8_f16: 690; CHECK-SD-FP16: // %bb.0: // %entry 691; CHECK-SD-FP16-NEXT: sxtb w8, w0 692; CHECK-SD-FP16-NEXT: scvtf h0, w8 693; CHECK-SD-FP16-NEXT: ret 694; 695; CHECK-GI-NOFP16-LABEL: stofp_i8_f16: 696; CHECK-GI-NOFP16: // %bb.0: // %entry 697; CHECK-GI-NOFP16-NEXT: sxtb w8, w0 698; CHECK-GI-NOFP16-NEXT: scvtf s0, w8 699; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 700; CHECK-GI-NOFP16-NEXT: ret 701; 702; CHECK-GI-FP16-LABEL: stofp_i8_f16: 703; CHECK-GI-FP16: // %bb.0: // %entry 704; CHECK-GI-FP16-NEXT: sxtb w8, w0 705; CHECK-GI-FP16-NEXT: scvtf h0, w8 706; CHECK-GI-FP16-NEXT: ret 707entry: 708 %c = sitofp i8 %a to half 709 ret half %c 710} 711 712define half @utofp_i8_f16(i8 %a) { 713; CHECK-SD-NOFP16-LABEL: utofp_i8_f16: 714; CHECK-SD-NOFP16: // %bb.0: // %entry 715; CHECK-SD-NOFP16-NEXT: and w8, w0, #0xff 716; CHECK-SD-NOFP16-NEXT: ucvtf s0, w8 717; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 718; CHECK-SD-NOFP16-NEXT: ret 719; 720; CHECK-SD-FP16-LABEL: utofp_i8_f16: 721; CHECK-SD-FP16: // %bb.0: // %entry 722; CHECK-SD-FP16-NEXT: and w8, w0, #0xff 723; CHECK-SD-FP16-NEXT: ucvtf h0, w8 724; CHECK-SD-FP16-NEXT: ret 725; 726; CHECK-GI-NOFP16-LABEL: utofp_i8_f16: 727; CHECK-GI-NOFP16: // %bb.0: // %entry 728; CHECK-GI-NOFP16-NEXT: and w8, w0, #0xff 729; CHECK-GI-NOFP16-NEXT: ucvtf s0, w8 730; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 731; CHECK-GI-NOFP16-NEXT: ret 732; 733; CHECK-GI-FP16-LABEL: utofp_i8_f16: 734; CHECK-GI-FP16: // %bb.0: // %entry 735; CHECK-GI-FP16-NEXT: and w8, w0, #0xff 736; CHECK-GI-FP16-NEXT: ucvtf h0, w8 737; CHECK-GI-FP16-NEXT: ret 738entry: 739 %c = uitofp i8 %a to half 740 ret half %c 741} 742 743define <2 x fp128> @stofp_v2i128_v2f128(<2 x i128> %a) { 744; CHECK-SD-LABEL: stofp_v2i128_v2f128: 745; CHECK-SD: // %bb.0: // %entry 746; CHECK-SD-NEXT: sub sp, sp, #48 747; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 748; CHECK-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 749; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 750; CHECK-SD-NEXT: .cfi_offset w19, -8 751; CHECK-SD-NEXT: .cfi_offset w20, -16 752; CHECK-SD-NEXT: .cfi_offset w30, -32 753; CHECK-SD-NEXT: mov x19, x3 754; CHECK-SD-NEXT: mov x20, x2 755; CHECK-SD-NEXT: bl __floattitf 756; CHECK-SD-NEXT: mov x0, x20 757; CHECK-SD-NEXT: mov x1, x19 758; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 759; CHECK-SD-NEXT: bl __floattitf 760; CHECK-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 761; CHECK-SD-NEXT: mov v1.16b, v0.16b 762; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 763; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 764; CHECK-SD-NEXT: add sp, sp, #48 765; CHECK-SD-NEXT: ret 766; 767; CHECK-GI-LABEL: stofp_v2i128_v2f128: 768; CHECK-GI: // %bb.0: // %entry 769; CHECK-GI-NEXT: sub sp, sp, #48 770; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 771; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 772; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 773; CHECK-GI-NEXT: .cfi_offset w19, -8 774; CHECK-GI-NEXT: .cfi_offset w20, -16 775; CHECK-GI-NEXT: .cfi_offset w30, -32 776; CHECK-GI-NEXT: mov x19, x2 777; CHECK-GI-NEXT: mov x20, x3 778; CHECK-GI-NEXT: bl __floattitf 779; CHECK-GI-NEXT: mov x0, x19 780; CHECK-GI-NEXT: mov x1, x20 781; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 782; CHECK-GI-NEXT: bl __floattitf 783; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 784; CHECK-GI-NEXT: mov v1.16b, v0.16b 785; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 786; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 787; CHECK-GI-NEXT: add sp, sp, #48 788; CHECK-GI-NEXT: ret 789entry: 790 %c = sitofp <2 x i128> %a to <2 x fp128> 791 ret <2 x fp128> %c 792} 793 794define <2 x fp128> @utofp_v2i128_v2f128(<2 x i128> %a) { 795; CHECK-SD-LABEL: utofp_v2i128_v2f128: 796; CHECK-SD: // %bb.0: // %entry 797; CHECK-SD-NEXT: sub sp, sp, #48 798; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 799; CHECK-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 800; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 801; CHECK-SD-NEXT: .cfi_offset w19, -8 802; CHECK-SD-NEXT: .cfi_offset w20, -16 803; CHECK-SD-NEXT: .cfi_offset w30, -32 804; CHECK-SD-NEXT: mov x19, x3 805; CHECK-SD-NEXT: mov x20, x2 806; CHECK-SD-NEXT: bl __floatuntitf 807; CHECK-SD-NEXT: mov x0, x20 808; CHECK-SD-NEXT: mov x1, x19 809; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 810; CHECK-SD-NEXT: bl __floatuntitf 811; CHECK-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 812; CHECK-SD-NEXT: mov v1.16b, v0.16b 813; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 814; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 815; CHECK-SD-NEXT: add sp, sp, #48 816; CHECK-SD-NEXT: ret 817; 818; CHECK-GI-LABEL: utofp_v2i128_v2f128: 819; CHECK-GI: // %bb.0: // %entry 820; CHECK-GI-NEXT: sub sp, sp, #48 821; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 822; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 823; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 824; CHECK-GI-NEXT: .cfi_offset w19, -8 825; CHECK-GI-NEXT: .cfi_offset w20, -16 826; CHECK-GI-NEXT: .cfi_offset w30, -32 827; CHECK-GI-NEXT: mov x19, x2 828; CHECK-GI-NEXT: mov x20, x3 829; CHECK-GI-NEXT: bl __floatuntitf 830; CHECK-GI-NEXT: mov x0, x19 831; CHECK-GI-NEXT: mov x1, x20 832; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 833; CHECK-GI-NEXT: bl __floatuntitf 834; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 835; CHECK-GI-NEXT: mov v1.16b, v0.16b 836; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 837; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 838; CHECK-GI-NEXT: add sp, sp, #48 839; CHECK-GI-NEXT: ret 840entry: 841 %c = uitofp <2 x i128> %a to <2 x fp128> 842 ret <2 x fp128> %c 843} 844 845define <3 x fp128> @stofp_v3i128_v3f128(<3 x i128> %a) { 846; CHECK-SD-LABEL: stofp_v3i128_v3f128: 847; CHECK-SD: // %bb.0: // %entry 848; CHECK-SD-NEXT: sub sp, sp, #80 849; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 850; CHECK-SD-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 851; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 852; CHECK-SD-NEXT: .cfi_def_cfa_offset 80 853; CHECK-SD-NEXT: .cfi_offset w19, -8 854; CHECK-SD-NEXT: .cfi_offset w20, -16 855; CHECK-SD-NEXT: .cfi_offset w21, -24 856; CHECK-SD-NEXT: .cfi_offset w22, -32 857; CHECK-SD-NEXT: .cfi_offset w30, -48 858; CHECK-SD-NEXT: mov x19, x5 859; CHECK-SD-NEXT: mov x20, x4 860; CHECK-SD-NEXT: mov x21, x3 861; CHECK-SD-NEXT: mov x22, x2 862; CHECK-SD-NEXT: bl __floattitf 863; CHECK-SD-NEXT: mov x0, x22 864; CHECK-SD-NEXT: mov x1, x21 865; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 866; CHECK-SD-NEXT: bl __floattitf 867; CHECK-SD-NEXT: mov x0, x20 868; CHECK-SD-NEXT: mov x1, x19 869; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 870; CHECK-SD-NEXT: bl __floattitf 871; CHECK-SD-NEXT: mov v2.16b, v0.16b 872; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 873; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 874; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 875; CHECK-SD-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 876; CHECK-SD-NEXT: add sp, sp, #80 877; CHECK-SD-NEXT: ret 878; 879; CHECK-GI-LABEL: stofp_v3i128_v3f128: 880; CHECK-GI: // %bb.0: // %entry 881; CHECK-GI-NEXT: sub sp, sp, #80 882; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 883; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 884; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 885; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 886; CHECK-GI-NEXT: .cfi_offset w19, -8 887; CHECK-GI-NEXT: .cfi_offset w20, -16 888; CHECK-GI-NEXT: .cfi_offset w21, -24 889; CHECK-GI-NEXT: .cfi_offset w22, -32 890; CHECK-GI-NEXT: .cfi_offset w30, -48 891; CHECK-GI-NEXT: mov x19, x2 892; CHECK-GI-NEXT: mov x20, x3 893; CHECK-GI-NEXT: mov x21, x4 894; CHECK-GI-NEXT: mov x22, x5 895; CHECK-GI-NEXT: bl __floattitf 896; CHECK-GI-NEXT: mov x0, x19 897; CHECK-GI-NEXT: mov x1, x20 898; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 899; CHECK-GI-NEXT: bl __floattitf 900; CHECK-GI-NEXT: mov x0, x21 901; CHECK-GI-NEXT: mov x1, x22 902; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 903; CHECK-GI-NEXT: bl __floattitf 904; CHECK-GI-NEXT: mov v2.16b, v0.16b 905; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 906; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 907; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 908; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 909; CHECK-GI-NEXT: add sp, sp, #80 910; CHECK-GI-NEXT: ret 911entry: 912 %c = sitofp <3 x i128> %a to <3 x fp128> 913 ret <3 x fp128> %c 914} 915 916define <3 x fp128> @utofp_v3i128_v3f128(<3 x i128> %a) { 917; CHECK-SD-LABEL: utofp_v3i128_v3f128: 918; CHECK-SD: // %bb.0: // %entry 919; CHECK-SD-NEXT: sub sp, sp, #80 920; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 921; CHECK-SD-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 922; CHECK-SD-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 923; CHECK-SD-NEXT: .cfi_def_cfa_offset 80 924; CHECK-SD-NEXT: .cfi_offset w19, -8 925; CHECK-SD-NEXT: .cfi_offset w20, -16 926; CHECK-SD-NEXT: .cfi_offset w21, -24 927; CHECK-SD-NEXT: .cfi_offset w22, -32 928; CHECK-SD-NEXT: .cfi_offset w30, -48 929; CHECK-SD-NEXT: mov x19, x5 930; CHECK-SD-NEXT: mov x20, x4 931; CHECK-SD-NEXT: mov x21, x3 932; CHECK-SD-NEXT: mov x22, x2 933; CHECK-SD-NEXT: bl __floatuntitf 934; CHECK-SD-NEXT: mov x0, x22 935; CHECK-SD-NEXT: mov x1, x21 936; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 937; CHECK-SD-NEXT: bl __floatuntitf 938; CHECK-SD-NEXT: mov x0, x20 939; CHECK-SD-NEXT: mov x1, x19 940; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 941; CHECK-SD-NEXT: bl __floatuntitf 942; CHECK-SD-NEXT: mov v2.16b, v0.16b 943; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 944; CHECK-SD-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 945; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 946; CHECK-SD-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 947; CHECK-SD-NEXT: add sp, sp, #80 948; CHECK-SD-NEXT: ret 949; 950; CHECK-GI-LABEL: utofp_v3i128_v3f128: 951; CHECK-GI: // %bb.0: // %entry 952; CHECK-GI-NEXT: sub sp, sp, #80 953; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 954; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 955; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 956; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 957; CHECK-GI-NEXT: .cfi_offset w19, -8 958; CHECK-GI-NEXT: .cfi_offset w20, -16 959; CHECK-GI-NEXT: .cfi_offset w21, -24 960; CHECK-GI-NEXT: .cfi_offset w22, -32 961; CHECK-GI-NEXT: .cfi_offset w30, -48 962; CHECK-GI-NEXT: mov x19, x2 963; CHECK-GI-NEXT: mov x20, x3 964; CHECK-GI-NEXT: mov x21, x4 965; CHECK-GI-NEXT: mov x22, x5 966; CHECK-GI-NEXT: bl __floatuntitf 967; CHECK-GI-NEXT: mov x0, x19 968; CHECK-GI-NEXT: mov x1, x20 969; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 970; CHECK-GI-NEXT: bl __floatuntitf 971; CHECK-GI-NEXT: mov x0, x21 972; CHECK-GI-NEXT: mov x1, x22 973; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 974; CHECK-GI-NEXT: bl __floatuntitf 975; CHECK-GI-NEXT: mov v2.16b, v0.16b 976; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 977; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 978; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 979; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 980; CHECK-GI-NEXT: add sp, sp, #80 981; CHECK-GI-NEXT: ret 982entry: 983 %c = uitofp <3 x i128> %a to <3 x fp128> 984 ret <3 x fp128> %c 985} 986 987define <2 x fp128> @stofp_v2i64_v2f128(<2 x i64> %a) { 988; CHECK-SD-LABEL: stofp_v2i64_v2f128: 989; CHECK-SD: // %bb.0: // %entry 990; CHECK-SD-NEXT: sub sp, sp, #48 991; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 992; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 993; CHECK-SD-NEXT: .cfi_offset w30, -16 994; CHECK-SD-NEXT: fmov x0, d0 995; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 996; CHECK-SD-NEXT: bl __floatditf 997; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 998; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 999; CHECK-SD-NEXT: mov x0, v0.d[1] 1000; CHECK-SD-NEXT: bl __floatditf 1001; CHECK-SD-NEXT: mov v1.16b, v0.16b 1002; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1003; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 1004; CHECK-SD-NEXT: add sp, sp, #48 1005; CHECK-SD-NEXT: ret 1006; 1007; CHECK-GI-LABEL: stofp_v2i64_v2f128: 1008; CHECK-GI: // %bb.0: // %entry 1009; CHECK-GI-NEXT: sub sp, sp, #32 1010; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 1011; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 1012; CHECK-GI-NEXT: .cfi_def_cfa_offset 32 1013; CHECK-GI-NEXT: .cfi_offset w30, -8 1014; CHECK-GI-NEXT: .cfi_offset b8, -16 1015; CHECK-GI-NEXT: fmov x0, d0 1016; CHECK-GI-NEXT: mov d8, v0.d[1] 1017; CHECK-GI-NEXT: bl __floatditf 1018; CHECK-GI-NEXT: fmov x0, d8 1019; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1020; CHECK-GI-NEXT: bl __floatditf 1021; CHECK-GI-NEXT: mov v1.16b, v0.16b 1022; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1023; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 1024; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 1025; CHECK-GI-NEXT: add sp, sp, #32 1026; CHECK-GI-NEXT: ret 1027entry: 1028 %c = sitofp <2 x i64> %a to <2 x fp128> 1029 ret <2 x fp128> %c 1030} 1031 1032define <2 x fp128> @utofp_v2i64_v2f128(<2 x i64> %a) { 1033; CHECK-SD-LABEL: utofp_v2i64_v2f128: 1034; CHECK-SD: // %bb.0: // %entry 1035; CHECK-SD-NEXT: sub sp, sp, #48 1036; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 1037; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 1038; CHECK-SD-NEXT: .cfi_offset w30, -16 1039; CHECK-SD-NEXT: fmov x0, d0 1040; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1041; CHECK-SD-NEXT: bl __floatunditf 1042; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1043; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1044; CHECK-SD-NEXT: mov x0, v0.d[1] 1045; CHECK-SD-NEXT: bl __floatunditf 1046; CHECK-SD-NEXT: mov v1.16b, v0.16b 1047; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1048; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 1049; CHECK-SD-NEXT: add sp, sp, #48 1050; CHECK-SD-NEXT: ret 1051; 1052; CHECK-GI-LABEL: utofp_v2i64_v2f128: 1053; CHECK-GI: // %bb.0: // %entry 1054; CHECK-GI-NEXT: sub sp, sp, #32 1055; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 1056; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 1057; CHECK-GI-NEXT: .cfi_def_cfa_offset 32 1058; CHECK-GI-NEXT: .cfi_offset w30, -8 1059; CHECK-GI-NEXT: .cfi_offset b8, -16 1060; CHECK-GI-NEXT: fmov x0, d0 1061; CHECK-GI-NEXT: mov d8, v0.d[1] 1062; CHECK-GI-NEXT: bl __floatunditf 1063; CHECK-GI-NEXT: fmov x0, d8 1064; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1065; CHECK-GI-NEXT: bl __floatunditf 1066; CHECK-GI-NEXT: mov v1.16b, v0.16b 1067; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1068; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 1069; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 1070; CHECK-GI-NEXT: add sp, sp, #32 1071; CHECK-GI-NEXT: ret 1072entry: 1073 %c = uitofp <2 x i64> %a to <2 x fp128> 1074 ret <2 x fp128> %c 1075} 1076 1077define <3 x fp128> @stofp_v3i64_v3f128(<3 x i64> %a) { 1078; CHECK-SD-LABEL: stofp_v3i64_v3f128: 1079; CHECK-SD: // %bb.0: // %entry 1080; CHECK-SD-NEXT: sub sp, sp, #64 1081; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1082; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1083; CHECK-SD-NEXT: .cfi_offset w30, -16 1084; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1085; CHECK-SD-NEXT: fmov x0, d0 1086; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1087; CHECK-SD-NEXT: str q2, [sp, #32] // 16-byte Folded Spill 1088; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1089; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill 1090; CHECK-SD-NEXT: bl __floatditf 1091; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1092; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1093; CHECK-SD-NEXT: fmov x0, d0 1094; CHECK-SD-NEXT: bl __floatditf 1095; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1096; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1097; CHECK-SD-NEXT: fmov x0, d0 1098; CHECK-SD-NEXT: bl __floatditf 1099; CHECK-SD-NEXT: mov v2.16b, v0.16b 1100; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 1101; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1102; CHECK-SD-NEXT: add sp, sp, #64 1103; CHECK-SD-NEXT: ret 1104; 1105; CHECK-GI-LABEL: stofp_v3i64_v3f128: 1106; CHECK-GI: // %bb.0: // %entry 1107; CHECK-GI-NEXT: sub sp, sp, #64 1108; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 1109; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1110; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1111; CHECK-GI-NEXT: .cfi_offset w30, -16 1112; CHECK-GI-NEXT: .cfi_offset b8, -24 1113; CHECK-GI-NEXT: .cfi_offset b9, -32 1114; CHECK-GI-NEXT: fmov x0, d0 1115; CHECK-GI-NEXT: fmov d8, d1 1116; CHECK-GI-NEXT: fmov d9, d2 1117; CHECK-GI-NEXT: bl __floatditf 1118; CHECK-GI-NEXT: fmov x0, d8 1119; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1120; CHECK-GI-NEXT: bl __floatditf 1121; CHECK-GI-NEXT: fmov x0, d9 1122; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1123; CHECK-GI-NEXT: bl __floatditf 1124; CHECK-GI-NEXT: mov v2.16b, v0.16b 1125; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 1126; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 1127; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1128; CHECK-GI-NEXT: add sp, sp, #64 1129; CHECK-GI-NEXT: ret 1130entry: 1131 %c = sitofp <3 x i64> %a to <3 x fp128> 1132 ret <3 x fp128> %c 1133} 1134 1135define <3 x fp128> @utofp_v3i64_v2f128(<3 x i64> %a) { 1136; CHECK-SD-LABEL: utofp_v3i64_v2f128: 1137; CHECK-SD: // %bb.0: // %entry 1138; CHECK-SD-NEXT: sub sp, sp, #64 1139; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1140; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1141; CHECK-SD-NEXT: .cfi_offset w30, -16 1142; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1143; CHECK-SD-NEXT: fmov x0, d0 1144; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1145; CHECK-SD-NEXT: str q2, [sp, #32] // 16-byte Folded Spill 1146; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1147; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill 1148; CHECK-SD-NEXT: bl __floatunditf 1149; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1150; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1151; CHECK-SD-NEXT: fmov x0, d0 1152; CHECK-SD-NEXT: bl __floatunditf 1153; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1154; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1155; CHECK-SD-NEXT: fmov x0, d0 1156; CHECK-SD-NEXT: bl __floatunditf 1157; CHECK-SD-NEXT: mov v2.16b, v0.16b 1158; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 1159; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1160; CHECK-SD-NEXT: add sp, sp, #64 1161; CHECK-SD-NEXT: ret 1162; 1163; CHECK-GI-LABEL: utofp_v3i64_v2f128: 1164; CHECK-GI: // %bb.0: // %entry 1165; CHECK-GI-NEXT: sub sp, sp, #64 1166; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 1167; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1168; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1169; CHECK-GI-NEXT: .cfi_offset w30, -16 1170; CHECK-GI-NEXT: .cfi_offset b8, -24 1171; CHECK-GI-NEXT: .cfi_offset b9, -32 1172; CHECK-GI-NEXT: fmov x0, d0 1173; CHECK-GI-NEXT: fmov d8, d1 1174; CHECK-GI-NEXT: fmov d9, d2 1175; CHECK-GI-NEXT: bl __floatunditf 1176; CHECK-GI-NEXT: fmov x0, d8 1177; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1178; CHECK-GI-NEXT: bl __floatunditf 1179; CHECK-GI-NEXT: fmov x0, d9 1180; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1181; CHECK-GI-NEXT: bl __floatunditf 1182; CHECK-GI-NEXT: mov v2.16b, v0.16b 1183; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 1184; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 1185; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1186; CHECK-GI-NEXT: add sp, sp, #64 1187; CHECK-GI-NEXT: ret 1188entry: 1189 %c = uitofp <3 x i64> %a to <3 x fp128> 1190 ret <3 x fp128> %c 1191} 1192 1193define <2 x double> @stofp_v2i128_v2f64(<2 x i128> %a) { 1194; CHECK-SD-LABEL: stofp_v2i128_v2f64: 1195; CHECK-SD: // %bb.0: // %entry 1196; CHECK-SD-NEXT: sub sp, sp, #48 1197; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1198; CHECK-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 1199; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 1200; CHECK-SD-NEXT: .cfi_offset w19, -8 1201; CHECK-SD-NEXT: .cfi_offset w20, -16 1202; CHECK-SD-NEXT: .cfi_offset w30, -32 1203; CHECK-SD-NEXT: mov x19, x1 1204; CHECK-SD-NEXT: mov x20, x0 1205; CHECK-SD-NEXT: mov x0, x2 1206; CHECK-SD-NEXT: mov x1, x3 1207; CHECK-SD-NEXT: bl __floattidf 1208; CHECK-SD-NEXT: mov x0, x20 1209; CHECK-SD-NEXT: mov x1, x19 1210; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1211; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1212; CHECK-SD-NEXT: bl __floattidf 1213; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 1214; CHECK-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 1215; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1216; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1217; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1218; CHECK-SD-NEXT: add sp, sp, #48 1219; CHECK-SD-NEXT: ret 1220; 1221; CHECK-GI-LABEL: stofp_v2i128_v2f64: 1222; CHECK-GI: // %bb.0: // %entry 1223; CHECK-GI-NEXT: sub sp, sp, #48 1224; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1225; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 1226; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 1227; CHECK-GI-NEXT: .cfi_offset w19, -8 1228; CHECK-GI-NEXT: .cfi_offset w20, -16 1229; CHECK-GI-NEXT: .cfi_offset w30, -32 1230; CHECK-GI-NEXT: mov x19, x2 1231; CHECK-GI-NEXT: mov x20, x3 1232; CHECK-GI-NEXT: bl __floattidf 1233; CHECK-GI-NEXT: mov x0, x19 1234; CHECK-GI-NEXT: mov x1, x20 1235; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1236; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1237; CHECK-GI-NEXT: bl __floattidf 1238; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 1239; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1240; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 1241; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1242; CHECK-GI-NEXT: mov v1.d[1], v0.d[0] 1243; CHECK-GI-NEXT: mov v0.16b, v1.16b 1244; CHECK-GI-NEXT: add sp, sp, #48 1245; CHECK-GI-NEXT: ret 1246entry: 1247 %c = sitofp <2 x i128> %a to <2 x double> 1248 ret <2 x double> %c 1249} 1250 1251define <2 x double> @utofp_v2i128_v2f64(<2 x i128> %a) { 1252; CHECK-SD-LABEL: utofp_v2i128_v2f64: 1253; CHECK-SD: // %bb.0: // %entry 1254; CHECK-SD-NEXT: sub sp, sp, #48 1255; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1256; CHECK-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 1257; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 1258; CHECK-SD-NEXT: .cfi_offset w19, -8 1259; CHECK-SD-NEXT: .cfi_offset w20, -16 1260; CHECK-SD-NEXT: .cfi_offset w30, -32 1261; CHECK-SD-NEXT: mov x19, x1 1262; CHECK-SD-NEXT: mov x20, x0 1263; CHECK-SD-NEXT: mov x0, x2 1264; CHECK-SD-NEXT: mov x1, x3 1265; CHECK-SD-NEXT: bl __floatuntidf 1266; CHECK-SD-NEXT: mov x0, x20 1267; CHECK-SD-NEXT: mov x1, x19 1268; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1269; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1270; CHECK-SD-NEXT: bl __floatuntidf 1271; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 1272; CHECK-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 1273; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1274; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1275; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1276; CHECK-SD-NEXT: add sp, sp, #48 1277; CHECK-SD-NEXT: ret 1278; 1279; CHECK-GI-LABEL: utofp_v2i128_v2f64: 1280; CHECK-GI: // %bb.0: // %entry 1281; CHECK-GI-NEXT: sub sp, sp, #48 1282; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1283; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 1284; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 1285; CHECK-GI-NEXT: .cfi_offset w19, -8 1286; CHECK-GI-NEXT: .cfi_offset w20, -16 1287; CHECK-GI-NEXT: .cfi_offset w30, -32 1288; CHECK-GI-NEXT: mov x19, x2 1289; CHECK-GI-NEXT: mov x20, x3 1290; CHECK-GI-NEXT: bl __floatuntidf 1291; CHECK-GI-NEXT: mov x0, x19 1292; CHECK-GI-NEXT: mov x1, x20 1293; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1294; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1295; CHECK-GI-NEXT: bl __floatuntidf 1296; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 1297; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1298; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 1299; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1300; CHECK-GI-NEXT: mov v1.d[1], v0.d[0] 1301; CHECK-GI-NEXT: mov v0.16b, v1.16b 1302; CHECK-GI-NEXT: add sp, sp, #48 1303; CHECK-GI-NEXT: ret 1304entry: 1305 %c = uitofp <2 x i128> %a to <2 x double> 1306 ret <2 x double> %c 1307} 1308 1309define <3 x double> @stofp_v3i128_v3f64(<3 x i128> %a) { 1310; CHECK-SD-LABEL: stofp_v3i128_v3f64: 1311; CHECK-SD: // %bb.0: // %entry 1312; CHECK-SD-NEXT: stp d9, d8, [sp, #-64]! // 16-byte Folded Spill 1313; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1314; CHECK-SD-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 1315; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 1316; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1317; CHECK-SD-NEXT: .cfi_offset w19, -8 1318; CHECK-SD-NEXT: .cfi_offset w20, -16 1319; CHECK-SD-NEXT: .cfi_offset w21, -24 1320; CHECK-SD-NEXT: .cfi_offset w22, -32 1321; CHECK-SD-NEXT: .cfi_offset w30, -48 1322; CHECK-SD-NEXT: .cfi_offset b8, -56 1323; CHECK-SD-NEXT: .cfi_offset b9, -64 1324; CHECK-SD-NEXT: mov x19, x5 1325; CHECK-SD-NEXT: mov x20, x4 1326; CHECK-SD-NEXT: mov x21, x3 1327; CHECK-SD-NEXT: mov x22, x2 1328; CHECK-SD-NEXT: bl __floattidf 1329; CHECK-SD-NEXT: mov x0, x22 1330; CHECK-SD-NEXT: mov x1, x21 1331; CHECK-SD-NEXT: fmov d8, d0 1332; CHECK-SD-NEXT: bl __floattidf 1333; CHECK-SD-NEXT: mov x0, x20 1334; CHECK-SD-NEXT: mov x1, x19 1335; CHECK-SD-NEXT: fmov d9, d0 1336; CHECK-SD-NEXT: bl __floattidf 1337; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 1338; CHECK-SD-NEXT: fmov d2, d0 1339; CHECK-SD-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 1340; CHECK-SD-NEXT: fmov d0, d8 1341; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1342; CHECK-SD-NEXT: fmov d1, d9 1343; CHECK-SD-NEXT: ldp d9, d8, [sp], #64 // 16-byte Folded Reload 1344; CHECK-SD-NEXT: ret 1345; 1346; CHECK-GI-LABEL: stofp_v3i128_v3f64: 1347; CHECK-GI: // %bb.0: // %entry 1348; CHECK-GI-NEXT: stp d9, d8, [sp, #-64]! // 16-byte Folded Spill 1349; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1350; CHECK-GI-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 1351; CHECK-GI-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 1352; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1353; CHECK-GI-NEXT: .cfi_offset w19, -8 1354; CHECK-GI-NEXT: .cfi_offset w20, -16 1355; CHECK-GI-NEXT: .cfi_offset w21, -24 1356; CHECK-GI-NEXT: .cfi_offset w22, -32 1357; CHECK-GI-NEXT: .cfi_offset w30, -48 1358; CHECK-GI-NEXT: .cfi_offset b8, -56 1359; CHECK-GI-NEXT: .cfi_offset b9, -64 1360; CHECK-GI-NEXT: mov x19, x2 1361; CHECK-GI-NEXT: mov x20, x3 1362; CHECK-GI-NEXT: mov x21, x4 1363; CHECK-GI-NEXT: mov x22, x5 1364; CHECK-GI-NEXT: bl __floattidf 1365; CHECK-GI-NEXT: mov x0, x19 1366; CHECK-GI-NEXT: mov x1, x20 1367; CHECK-GI-NEXT: fmov d8, d0 1368; CHECK-GI-NEXT: bl __floattidf 1369; CHECK-GI-NEXT: mov x0, x21 1370; CHECK-GI-NEXT: mov x1, x22 1371; CHECK-GI-NEXT: fmov d9, d0 1372; CHECK-GI-NEXT: bl __floattidf 1373; CHECK-GI-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 1374; CHECK-GI-NEXT: fmov d2, d0 1375; CHECK-GI-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 1376; CHECK-GI-NEXT: fmov d0, d8 1377; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1378; CHECK-GI-NEXT: fmov d1, d9 1379; CHECK-GI-NEXT: ldp d9, d8, [sp], #64 // 16-byte Folded Reload 1380; CHECK-GI-NEXT: ret 1381entry: 1382 %c = sitofp <3 x i128> %a to <3 x double> 1383 ret <3 x double> %c 1384} 1385 1386define <3 x double> @utofp_v3i128_v3f64(<3 x i128> %a) { 1387; CHECK-SD-LABEL: utofp_v3i128_v3f64: 1388; CHECK-SD: // %bb.0: // %entry 1389; CHECK-SD-NEXT: stp d9, d8, [sp, #-64]! // 16-byte Folded Spill 1390; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1391; CHECK-SD-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 1392; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 1393; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1394; CHECK-SD-NEXT: .cfi_offset w19, -8 1395; CHECK-SD-NEXT: .cfi_offset w20, -16 1396; CHECK-SD-NEXT: .cfi_offset w21, -24 1397; CHECK-SD-NEXT: .cfi_offset w22, -32 1398; CHECK-SD-NEXT: .cfi_offset w30, -48 1399; CHECK-SD-NEXT: .cfi_offset b8, -56 1400; CHECK-SD-NEXT: .cfi_offset b9, -64 1401; CHECK-SD-NEXT: mov x19, x5 1402; CHECK-SD-NEXT: mov x20, x4 1403; CHECK-SD-NEXT: mov x21, x3 1404; CHECK-SD-NEXT: mov x22, x2 1405; CHECK-SD-NEXT: bl __floatuntidf 1406; CHECK-SD-NEXT: mov x0, x22 1407; CHECK-SD-NEXT: mov x1, x21 1408; CHECK-SD-NEXT: fmov d8, d0 1409; CHECK-SD-NEXT: bl __floatuntidf 1410; CHECK-SD-NEXT: mov x0, x20 1411; CHECK-SD-NEXT: mov x1, x19 1412; CHECK-SD-NEXT: fmov d9, d0 1413; CHECK-SD-NEXT: bl __floatuntidf 1414; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 1415; CHECK-SD-NEXT: fmov d2, d0 1416; CHECK-SD-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 1417; CHECK-SD-NEXT: fmov d0, d8 1418; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1419; CHECK-SD-NEXT: fmov d1, d9 1420; CHECK-SD-NEXT: ldp d9, d8, [sp], #64 // 16-byte Folded Reload 1421; CHECK-SD-NEXT: ret 1422; 1423; CHECK-GI-LABEL: utofp_v3i128_v3f64: 1424; CHECK-GI: // %bb.0: // %entry 1425; CHECK-GI-NEXT: stp d9, d8, [sp, #-64]! // 16-byte Folded Spill 1426; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1427; CHECK-GI-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 1428; CHECK-GI-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 1429; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1430; CHECK-GI-NEXT: .cfi_offset w19, -8 1431; CHECK-GI-NEXT: .cfi_offset w20, -16 1432; CHECK-GI-NEXT: .cfi_offset w21, -24 1433; CHECK-GI-NEXT: .cfi_offset w22, -32 1434; CHECK-GI-NEXT: .cfi_offset w30, -48 1435; CHECK-GI-NEXT: .cfi_offset b8, -56 1436; CHECK-GI-NEXT: .cfi_offset b9, -64 1437; CHECK-GI-NEXT: mov x19, x2 1438; CHECK-GI-NEXT: mov x20, x3 1439; CHECK-GI-NEXT: mov x21, x4 1440; CHECK-GI-NEXT: mov x22, x5 1441; CHECK-GI-NEXT: bl __floatuntidf 1442; CHECK-GI-NEXT: mov x0, x19 1443; CHECK-GI-NEXT: mov x1, x20 1444; CHECK-GI-NEXT: fmov d8, d0 1445; CHECK-GI-NEXT: bl __floatuntidf 1446; CHECK-GI-NEXT: mov x0, x21 1447; CHECK-GI-NEXT: mov x1, x22 1448; CHECK-GI-NEXT: fmov d9, d0 1449; CHECK-GI-NEXT: bl __floatuntidf 1450; CHECK-GI-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 1451; CHECK-GI-NEXT: fmov d2, d0 1452; CHECK-GI-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 1453; CHECK-GI-NEXT: fmov d0, d8 1454; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1455; CHECK-GI-NEXT: fmov d1, d9 1456; CHECK-GI-NEXT: ldp d9, d8, [sp], #64 // 16-byte Folded Reload 1457; CHECK-GI-NEXT: ret 1458entry: 1459 %c = uitofp <3 x i128> %a to <3 x double> 1460 ret <3 x double> %c 1461} 1462 1463define <2 x double> @stofp_v2i64_v2f64(<2 x i64> %a) { 1464; CHECK-LABEL: stofp_v2i64_v2f64: 1465; CHECK: // %bb.0: // %entry 1466; CHECK-NEXT: scvtf v0.2d, v0.2d 1467; CHECK-NEXT: ret 1468entry: 1469 %c = sitofp <2 x i64> %a to <2 x double> 1470 ret <2 x double> %c 1471} 1472 1473define <2 x double> @utofp_v2i64_v2f64(<2 x i64> %a) { 1474; CHECK-LABEL: utofp_v2i64_v2f64: 1475; CHECK: // %bb.0: // %entry 1476; CHECK-NEXT: ucvtf v0.2d, v0.2d 1477; CHECK-NEXT: ret 1478entry: 1479 %c = uitofp <2 x i64> %a to <2 x double> 1480 ret <2 x double> %c 1481} 1482 1483define <3 x double> @stofp_v3i64_v3f64(<3 x i64> %a) { 1484; CHECK-SD-LABEL: stofp_v3i64_v3f64: 1485; CHECK-SD: // %bb.0: // %entry 1486; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1487; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1488; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1489; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1490; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 1491; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 1492; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 1493; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1494; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1495; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1496; CHECK-SD-NEXT: ret 1497; 1498; CHECK-GI-LABEL: stofp_v3i64_v3f64: 1499; CHECK-GI: // %bb.0: // %entry 1500; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1501; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1502; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 1503; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1504; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 1505; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 1506; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 1507; CHECK-GI-NEXT: mov d1, v0.d[1] 1508; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1509; CHECK-GI-NEXT: ret 1510entry: 1511 %c = sitofp <3 x i64> %a to <3 x double> 1512 ret <3 x double> %c 1513} 1514 1515define <3 x double> @utofp_v3i64_v3f64(<3 x i64> %a) { 1516; CHECK-SD-LABEL: utofp_v3i64_v3f64: 1517; CHECK-SD: // %bb.0: // %entry 1518; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1519; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1520; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1521; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1522; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 1523; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 1524; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 1525; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1526; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1527; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1528; CHECK-SD-NEXT: ret 1529; 1530; CHECK-GI-LABEL: utofp_v3i64_v3f64: 1531; CHECK-GI: // %bb.0: // %entry 1532; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1533; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1534; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 1535; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1536; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 1537; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 1538; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 1539; CHECK-GI-NEXT: mov d1, v0.d[1] 1540; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1541; CHECK-GI-NEXT: ret 1542entry: 1543 %c = uitofp <3 x i64> %a to <3 x double> 1544 ret <3 x double> %c 1545} 1546 1547define <4 x double> @stofp_v4i64_v4f64(<4 x i64> %a) { 1548; CHECK-LABEL: stofp_v4i64_v4f64: 1549; CHECK: // %bb.0: // %entry 1550; CHECK-NEXT: scvtf v0.2d, v0.2d 1551; CHECK-NEXT: scvtf v1.2d, v1.2d 1552; CHECK-NEXT: ret 1553entry: 1554 %c = sitofp <4 x i64> %a to <4 x double> 1555 ret <4 x double> %c 1556} 1557 1558define <4 x double> @utofp_v4i64_v4f64(<4 x i64> %a) { 1559; CHECK-LABEL: utofp_v4i64_v4f64: 1560; CHECK: // %bb.0: // %entry 1561; CHECK-NEXT: ucvtf v0.2d, v0.2d 1562; CHECK-NEXT: ucvtf v1.2d, v1.2d 1563; CHECK-NEXT: ret 1564entry: 1565 %c = uitofp <4 x i64> %a to <4 x double> 1566 ret <4 x double> %c 1567} 1568 1569define <8 x double> @stofp_v8i64_v8f64(<8 x i64> %a) { 1570; CHECK-LABEL: stofp_v8i64_v8f64: 1571; CHECK: // %bb.0: // %entry 1572; CHECK-NEXT: scvtf v0.2d, v0.2d 1573; CHECK-NEXT: scvtf v1.2d, v1.2d 1574; CHECK-NEXT: scvtf v2.2d, v2.2d 1575; CHECK-NEXT: scvtf v3.2d, v3.2d 1576; CHECK-NEXT: ret 1577entry: 1578 %c = sitofp <8 x i64> %a to <8 x double> 1579 ret <8 x double> %c 1580} 1581 1582define <8 x double> @utofp_v8i64_v8f64(<8 x i64> %a) { 1583; CHECK-LABEL: utofp_v8i64_v8f64: 1584; CHECK: // %bb.0: // %entry 1585; CHECK-NEXT: ucvtf v0.2d, v0.2d 1586; CHECK-NEXT: ucvtf v1.2d, v1.2d 1587; CHECK-NEXT: ucvtf v2.2d, v2.2d 1588; CHECK-NEXT: ucvtf v3.2d, v3.2d 1589; CHECK-NEXT: ret 1590entry: 1591 %c = uitofp <8 x i64> %a to <8 x double> 1592 ret <8 x double> %c 1593} 1594 1595define <16 x double> @stofp_v16i64_v16f64(<16 x i64> %a) { 1596; CHECK-LABEL: stofp_v16i64_v16f64: 1597; CHECK: // %bb.0: // %entry 1598; CHECK-NEXT: scvtf v0.2d, v0.2d 1599; CHECK-NEXT: scvtf v1.2d, v1.2d 1600; CHECK-NEXT: scvtf v2.2d, v2.2d 1601; CHECK-NEXT: scvtf v3.2d, v3.2d 1602; CHECK-NEXT: scvtf v4.2d, v4.2d 1603; CHECK-NEXT: scvtf v5.2d, v5.2d 1604; CHECK-NEXT: scvtf v6.2d, v6.2d 1605; CHECK-NEXT: scvtf v7.2d, v7.2d 1606; CHECK-NEXT: ret 1607entry: 1608 %c = sitofp <16 x i64> %a to <16 x double> 1609 ret <16 x double> %c 1610} 1611 1612define <16 x double> @utofp_v16i64_v16f64(<16 x i64> %a) { 1613; CHECK-LABEL: utofp_v16i64_v16f64: 1614; CHECK: // %bb.0: // %entry 1615; CHECK-NEXT: ucvtf v0.2d, v0.2d 1616; CHECK-NEXT: ucvtf v1.2d, v1.2d 1617; CHECK-NEXT: ucvtf v2.2d, v2.2d 1618; CHECK-NEXT: ucvtf v3.2d, v3.2d 1619; CHECK-NEXT: ucvtf v4.2d, v4.2d 1620; CHECK-NEXT: ucvtf v5.2d, v5.2d 1621; CHECK-NEXT: ucvtf v6.2d, v6.2d 1622; CHECK-NEXT: ucvtf v7.2d, v7.2d 1623; CHECK-NEXT: ret 1624entry: 1625 %c = uitofp <16 x i64> %a to <16 x double> 1626 ret <16 x double> %c 1627} 1628 1629define <32 x double> @stofp_v32i64_v32f64(<32 x i64> %a) { 1630; CHECK-SD-LABEL: stofp_v32i64_v32f64: 1631; CHECK-SD: // %bb.0: // %entry 1632; CHECK-SD-NEXT: ldp q17, q16, [sp, #96] 1633; CHECK-SD-NEXT: scvtf v7.2d, v7.2d 1634; CHECK-SD-NEXT: ldp q19, q18, [sp, #64] 1635; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 1636; CHECK-SD-NEXT: ldp q21, q20, [sp, #32] 1637; CHECK-SD-NEXT: scvtf v5.2d, v5.2d 1638; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 1639; CHECK-SD-NEXT: scvtf v17.2d, v17.2d 1640; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 1641; CHECK-SD-NEXT: scvtf v18.2d, v18.2d 1642; CHECK-SD-NEXT: scvtf v19.2d, v19.2d 1643; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 1644; CHECK-SD-NEXT: scvtf v20.2d, v20.2d 1645; CHECK-SD-NEXT: scvtf v21.2d, v21.2d 1646; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 1647; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 1648; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 1649; CHECK-SD-NEXT: stp q5, q6, [x8, #80] 1650; CHECK-SD-NEXT: str q16, [x8, #240] 1651; CHECK-SD-NEXT: ldp q22, q16, [sp] 1652; CHECK-SD-NEXT: stp q3, q4, [x8, #48] 1653; CHECK-SD-NEXT: stp q20, q19, [x8, #176] 1654; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 1655; CHECK-SD-NEXT: stp q1, q2, [x8, #16] 1656; CHECK-SD-NEXT: stp q18, q17, [x8, #208] 1657; CHECK-SD-NEXT: scvtf v17.2d, v22.2d 1658; CHECK-SD-NEXT: str q0, [x8] 1659; CHECK-SD-NEXT: stp q16, q21, [x8, #144] 1660; CHECK-SD-NEXT: stp q7, q17, [x8, #112] 1661; CHECK-SD-NEXT: ret 1662; 1663; CHECK-GI-LABEL: stofp_v32i64_v32f64: 1664; CHECK-GI: // %bb.0: // %entry 1665; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 1666; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 1667; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 1668; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 1669; CHECK-GI-NEXT: scvtf v4.2d, v4.2d 1670; CHECK-GI-NEXT: stp q0, q1, [x8] 1671; CHECK-GI-NEXT: scvtf v0.2d, v5.2d 1672; CHECK-GI-NEXT: scvtf v1.2d, v6.2d 1673; CHECK-GI-NEXT: str q2, [x8, #32] 1674; CHECK-GI-NEXT: ldp q2, q5, [sp] 1675; CHECK-GI-NEXT: scvtf v6.2d, v7.2d 1676; CHECK-GI-NEXT: stp q3, q4, [x8, #48] 1677; CHECK-GI-NEXT: ldp q3, q4, [sp, #32] 1678; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 1679; CHECK-GI-NEXT: scvtf v5.2d, v5.2d 1680; CHECK-GI-NEXT: stp q0, q1, [x8, #80] 1681; CHECK-GI-NEXT: scvtf v0.2d, v3.2d 1682; CHECK-GI-NEXT: ldp q1, q3, [sp, #64] 1683; CHECK-GI-NEXT: scvtf v4.2d, v4.2d 1684; CHECK-GI-NEXT: stp q6, q2, [x8, #112] 1685; CHECK-GI-NEXT: ldp q2, q6, [sp, #96] 1686; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 1687; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 1688; CHECK-GI-NEXT: stp q5, q0, [x8, #144] 1689; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 1690; CHECK-GI-NEXT: scvtf v0.2d, v6.2d 1691; CHECK-GI-NEXT: stp q4, q1, [x8, #176] 1692; CHECK-GI-NEXT: stp q3, q2, [x8, #208] 1693; CHECK-GI-NEXT: str q0, [x8, #240] 1694; CHECK-GI-NEXT: ret 1695entry: 1696 %c = sitofp <32 x i64> %a to <32 x double> 1697 ret <32 x double> %c 1698} 1699 1700define <32 x double> @utofp_v32i64_v32f64(<32 x i64> %a) { 1701; CHECK-SD-LABEL: utofp_v32i64_v32f64: 1702; CHECK-SD: // %bb.0: // %entry 1703; CHECK-SD-NEXT: ldp q17, q16, [sp, #96] 1704; CHECK-SD-NEXT: ucvtf v7.2d, v7.2d 1705; CHECK-SD-NEXT: ldp q19, q18, [sp, #64] 1706; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 1707; CHECK-SD-NEXT: ldp q21, q20, [sp, #32] 1708; CHECK-SD-NEXT: ucvtf v5.2d, v5.2d 1709; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 1710; CHECK-SD-NEXT: ucvtf v17.2d, v17.2d 1711; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 1712; CHECK-SD-NEXT: ucvtf v18.2d, v18.2d 1713; CHECK-SD-NEXT: ucvtf v19.2d, v19.2d 1714; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 1715; CHECK-SD-NEXT: ucvtf v20.2d, v20.2d 1716; CHECK-SD-NEXT: ucvtf v21.2d, v21.2d 1717; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 1718; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 1719; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 1720; CHECK-SD-NEXT: stp q5, q6, [x8, #80] 1721; CHECK-SD-NEXT: str q16, [x8, #240] 1722; CHECK-SD-NEXT: ldp q22, q16, [sp] 1723; CHECK-SD-NEXT: stp q3, q4, [x8, #48] 1724; CHECK-SD-NEXT: stp q20, q19, [x8, #176] 1725; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 1726; CHECK-SD-NEXT: stp q1, q2, [x8, #16] 1727; CHECK-SD-NEXT: stp q18, q17, [x8, #208] 1728; CHECK-SD-NEXT: ucvtf v17.2d, v22.2d 1729; CHECK-SD-NEXT: str q0, [x8] 1730; CHECK-SD-NEXT: stp q16, q21, [x8, #144] 1731; CHECK-SD-NEXT: stp q7, q17, [x8, #112] 1732; CHECK-SD-NEXT: ret 1733; 1734; CHECK-GI-LABEL: utofp_v32i64_v32f64: 1735; CHECK-GI: // %bb.0: // %entry 1736; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 1737; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 1738; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 1739; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 1740; CHECK-GI-NEXT: ucvtf v4.2d, v4.2d 1741; CHECK-GI-NEXT: stp q0, q1, [x8] 1742; CHECK-GI-NEXT: ucvtf v0.2d, v5.2d 1743; CHECK-GI-NEXT: ucvtf v1.2d, v6.2d 1744; CHECK-GI-NEXT: str q2, [x8, #32] 1745; CHECK-GI-NEXT: ldp q2, q5, [sp] 1746; CHECK-GI-NEXT: ucvtf v6.2d, v7.2d 1747; CHECK-GI-NEXT: stp q3, q4, [x8, #48] 1748; CHECK-GI-NEXT: ldp q3, q4, [sp, #32] 1749; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 1750; CHECK-GI-NEXT: ucvtf v5.2d, v5.2d 1751; CHECK-GI-NEXT: stp q0, q1, [x8, #80] 1752; CHECK-GI-NEXT: ucvtf v0.2d, v3.2d 1753; CHECK-GI-NEXT: ldp q1, q3, [sp, #64] 1754; CHECK-GI-NEXT: ucvtf v4.2d, v4.2d 1755; CHECK-GI-NEXT: stp q6, q2, [x8, #112] 1756; CHECK-GI-NEXT: ldp q2, q6, [sp, #96] 1757; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 1758; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 1759; CHECK-GI-NEXT: stp q5, q0, [x8, #144] 1760; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 1761; CHECK-GI-NEXT: ucvtf v0.2d, v6.2d 1762; CHECK-GI-NEXT: stp q4, q1, [x8, #176] 1763; CHECK-GI-NEXT: stp q3, q2, [x8, #208] 1764; CHECK-GI-NEXT: str q0, [x8, #240] 1765; CHECK-GI-NEXT: ret 1766entry: 1767 %c = uitofp <32 x i64> %a to <32 x double> 1768 ret <32 x double> %c 1769} 1770 1771define <2 x fp128> @stofp_v2i32_v2f128(<2 x i32> %a) { 1772; CHECK-SD-LABEL: stofp_v2i32_v2f128: 1773; CHECK-SD: // %bb.0: // %entry 1774; CHECK-SD-NEXT: sub sp, sp, #32 1775; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1776; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1777; CHECK-SD-NEXT: .cfi_offset w30, -16 1778; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1779; CHECK-SD-NEXT: fmov w0, s0 1780; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1781; CHECK-SD-NEXT: bl __floatsitf 1782; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 1783; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1784; CHECK-SD-NEXT: mov w0, v1.s[1] 1785; CHECK-SD-NEXT: bl __floatsitf 1786; CHECK-SD-NEXT: mov v1.16b, v0.16b 1787; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1788; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1789; CHECK-SD-NEXT: add sp, sp, #32 1790; CHECK-SD-NEXT: ret 1791; 1792; CHECK-GI-LABEL: stofp_v2i32_v2f128: 1793; CHECK-GI: // %bb.0: // %entry 1794; CHECK-GI-NEXT: sub sp, sp, #32 1795; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 1796; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 1797; CHECK-GI-NEXT: .cfi_def_cfa_offset 32 1798; CHECK-GI-NEXT: .cfi_offset w30, -8 1799; CHECK-GI-NEXT: .cfi_offset b8, -16 1800; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1801; CHECK-GI-NEXT: fmov w0, s0 1802; CHECK-GI-NEXT: mov s8, v0.s[1] 1803; CHECK-GI-NEXT: bl __floatsitf 1804; CHECK-GI-NEXT: fmov w0, s8 1805; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1806; CHECK-GI-NEXT: bl __floatsitf 1807; CHECK-GI-NEXT: mov v1.16b, v0.16b 1808; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1809; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 1810; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 1811; CHECK-GI-NEXT: add sp, sp, #32 1812; CHECK-GI-NEXT: ret 1813entry: 1814 %c = sitofp <2 x i32> %a to <2 x fp128> 1815 ret <2 x fp128> %c 1816} 1817 1818define <2 x fp128> @utofp_v2i32_v2f128(<2 x i32> %a) { 1819; CHECK-SD-LABEL: utofp_v2i32_v2f128: 1820; CHECK-SD: // %bb.0: // %entry 1821; CHECK-SD-NEXT: sub sp, sp, #32 1822; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 1823; CHECK-SD-NEXT: .cfi_def_cfa_offset 32 1824; CHECK-SD-NEXT: .cfi_offset w30, -16 1825; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1826; CHECK-SD-NEXT: fmov w0, s0 1827; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1828; CHECK-SD-NEXT: bl __floatunsitf 1829; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 1830; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1831; CHECK-SD-NEXT: mov w0, v1.s[1] 1832; CHECK-SD-NEXT: bl __floatunsitf 1833; CHECK-SD-NEXT: mov v1.16b, v0.16b 1834; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1835; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 1836; CHECK-SD-NEXT: add sp, sp, #32 1837; CHECK-SD-NEXT: ret 1838; 1839; CHECK-GI-LABEL: utofp_v2i32_v2f128: 1840; CHECK-GI: // %bb.0: // %entry 1841; CHECK-GI-NEXT: sub sp, sp, #32 1842; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 1843; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 1844; CHECK-GI-NEXT: .cfi_def_cfa_offset 32 1845; CHECK-GI-NEXT: .cfi_offset w30, -8 1846; CHECK-GI-NEXT: .cfi_offset b8, -16 1847; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1848; CHECK-GI-NEXT: fmov w0, s0 1849; CHECK-GI-NEXT: mov s8, v0.s[1] 1850; CHECK-GI-NEXT: bl __floatunsitf 1851; CHECK-GI-NEXT: fmov w0, s8 1852; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1853; CHECK-GI-NEXT: bl __floatunsitf 1854; CHECK-GI-NEXT: mov v1.16b, v0.16b 1855; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1856; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 1857; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 1858; CHECK-GI-NEXT: add sp, sp, #32 1859; CHECK-GI-NEXT: ret 1860entry: 1861 %c = uitofp <2 x i32> %a to <2 x fp128> 1862 ret <2 x fp128> %c 1863} 1864 1865define <3 x fp128> @stofp_v3i32_v3f128(<3 x i32> %a) { 1866; CHECK-SD-LABEL: stofp_v3i32_v3f128: 1867; CHECK-SD: // %bb.0: // %entry 1868; CHECK-SD-NEXT: sub sp, sp, #64 1869; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1870; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1871; CHECK-SD-NEXT: .cfi_offset w30, -16 1872; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1873; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1874; CHECK-SD-NEXT: fmov w0, s1 1875; CHECK-SD-NEXT: bl __floatsitf 1876; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1877; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1878; CHECK-SD-NEXT: fmov w0, s0 1879; CHECK-SD-NEXT: bl __floatsitf 1880; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1881; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1882; CHECK-SD-NEXT: mov w0, v0.s[1] 1883; CHECK-SD-NEXT: bl __floatsitf 1884; CHECK-SD-NEXT: mov v1.16b, v0.16b 1885; CHECK-SD-NEXT: ldp q0, q2, [sp] // 32-byte Folded Reload 1886; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1887; CHECK-SD-NEXT: add sp, sp, #64 1888; CHECK-SD-NEXT: ret 1889; 1890; CHECK-GI-LABEL: stofp_v3i32_v3f128: 1891; CHECK-GI: // %bb.0: // %entry 1892; CHECK-GI-NEXT: sub sp, sp, #64 1893; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 1894; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1895; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1896; CHECK-GI-NEXT: .cfi_offset w30, -16 1897; CHECK-GI-NEXT: .cfi_offset b8, -24 1898; CHECK-GI-NEXT: .cfi_offset b9, -32 1899; CHECK-GI-NEXT: fmov w0, s0 1900; CHECK-GI-NEXT: mov s8, v0.s[1] 1901; CHECK-GI-NEXT: mov s9, v0.s[2] 1902; CHECK-GI-NEXT: bl __floatsitf 1903; CHECK-GI-NEXT: fmov w0, s8 1904; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1905; CHECK-GI-NEXT: bl __floatsitf 1906; CHECK-GI-NEXT: fmov w0, s9 1907; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1908; CHECK-GI-NEXT: bl __floatsitf 1909; CHECK-GI-NEXT: mov v2.16b, v0.16b 1910; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 1911; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 1912; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1913; CHECK-GI-NEXT: add sp, sp, #64 1914; CHECK-GI-NEXT: ret 1915entry: 1916 %c = sitofp <3 x i32> %a to <3 x fp128> 1917 ret <3 x fp128> %c 1918} 1919 1920define <3 x fp128> @utofp_v3i32_v3f128(<3 x i32> %a) { 1921; CHECK-SD-LABEL: utofp_v3i32_v3f128: 1922; CHECK-SD: // %bb.0: // %entry 1923; CHECK-SD-NEXT: sub sp, sp, #64 1924; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1925; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1926; CHECK-SD-NEXT: .cfi_offset w30, -16 1927; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1928; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1929; CHECK-SD-NEXT: fmov w0, s1 1930; CHECK-SD-NEXT: bl __floatunsitf 1931; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1932; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1933; CHECK-SD-NEXT: fmov w0, s0 1934; CHECK-SD-NEXT: bl __floatunsitf 1935; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1936; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 1937; CHECK-SD-NEXT: mov w0, v0.s[1] 1938; CHECK-SD-NEXT: bl __floatunsitf 1939; CHECK-SD-NEXT: mov v1.16b, v0.16b 1940; CHECK-SD-NEXT: ldp q0, q2, [sp] // 32-byte Folded Reload 1941; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1942; CHECK-SD-NEXT: add sp, sp, #64 1943; CHECK-SD-NEXT: ret 1944; 1945; CHECK-GI-LABEL: utofp_v3i32_v3f128: 1946; CHECK-GI: // %bb.0: // %entry 1947; CHECK-GI-NEXT: sub sp, sp, #64 1948; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 1949; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 1950; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 1951; CHECK-GI-NEXT: .cfi_offset w30, -16 1952; CHECK-GI-NEXT: .cfi_offset b8, -24 1953; CHECK-GI-NEXT: .cfi_offset b9, -32 1954; CHECK-GI-NEXT: fmov w0, s0 1955; CHECK-GI-NEXT: mov s8, v0.s[1] 1956; CHECK-GI-NEXT: mov s9, v0.s[2] 1957; CHECK-GI-NEXT: bl __floatunsitf 1958; CHECK-GI-NEXT: fmov w0, s8 1959; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1960; CHECK-GI-NEXT: bl __floatunsitf 1961; CHECK-GI-NEXT: fmov w0, s9 1962; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1963; CHECK-GI-NEXT: bl __floatunsitf 1964; CHECK-GI-NEXT: mov v2.16b, v0.16b 1965; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 1966; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 1967; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 1968; CHECK-GI-NEXT: add sp, sp, #64 1969; CHECK-GI-NEXT: ret 1970entry: 1971 %c = uitofp <3 x i32> %a to <3 x fp128> 1972 ret <3 x fp128> %c 1973} 1974 1975define <2 x double> @stofp_v2i32_v2f64(<2 x i32> %a) { 1976; CHECK-LABEL: stofp_v2i32_v2f64: 1977; CHECK: // %bb.0: // %entry 1978; CHECK-NEXT: sshll v0.2d, v0.2s, #0 1979; CHECK-NEXT: scvtf v0.2d, v0.2d 1980; CHECK-NEXT: ret 1981entry: 1982 %c = sitofp <2 x i32> %a to <2 x double> 1983 ret <2 x double> %c 1984} 1985 1986define <2 x double> @utofp_v2i32_v2f64(<2 x i32> %a) { 1987; CHECK-LABEL: utofp_v2i32_v2f64: 1988; CHECK: // %bb.0: // %entry 1989; CHECK-NEXT: ushll v0.2d, v0.2s, #0 1990; CHECK-NEXT: ucvtf v0.2d, v0.2d 1991; CHECK-NEXT: ret 1992entry: 1993 %c = uitofp <2 x i32> %a to <2 x double> 1994 ret <2 x double> %c 1995} 1996 1997define <3 x double> @stofp_v3i32_v3f64(<3 x i32> %a) { 1998; CHECK-SD-LABEL: stofp_v3i32_v3f64: 1999; CHECK-SD: // %bb.0: // %entry 2000; CHECK-SD-NEXT: sshll v1.2d, v0.2s, #0 2001; CHECK-SD-NEXT: sshll2 v0.2d, v0.4s, #0 2002; CHECK-SD-NEXT: scvtf v3.2d, v1.2d 2003; CHECK-SD-NEXT: scvtf v2.2d, v0.2d 2004; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 2005; CHECK-SD-NEXT: fmov d0, d3 2006; CHECK-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8 2007; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 2008; CHECK-SD-NEXT: ret 2009; 2010; CHECK-GI-LABEL: stofp_v3i32_v3f64: 2011; CHECK-GI: // %bb.0: // %entry 2012; CHECK-GI-NEXT: sshll v1.2d, v0.2s, #0 2013; CHECK-GI-NEXT: sshll2 v0.2d, v0.4s, #0 2014; CHECK-GI-NEXT: scvtf v3.2d, v1.2d 2015; CHECK-GI-NEXT: scvtf v2.2d, v0.2d 2016; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 2017; CHECK-GI-NEXT: mov d1, v3.d[1] 2018; CHECK-GI-NEXT: fmov d0, d3 2019; CHECK-GI-NEXT: ret 2020entry: 2021 %c = sitofp <3 x i32> %a to <3 x double> 2022 ret <3 x double> %c 2023} 2024 2025define <3 x double> @utofp_v3i32_v3f64(<3 x i32> %a) { 2026; CHECK-SD-LABEL: utofp_v3i32_v3f64: 2027; CHECK-SD: // %bb.0: // %entry 2028; CHECK-SD-NEXT: ushll v1.2d, v0.2s, #0 2029; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0 2030; CHECK-SD-NEXT: ucvtf v3.2d, v1.2d 2031; CHECK-SD-NEXT: ucvtf v2.2d, v0.2d 2032; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 2033; CHECK-SD-NEXT: fmov d0, d3 2034; CHECK-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8 2035; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 2036; CHECK-SD-NEXT: ret 2037; 2038; CHECK-GI-LABEL: utofp_v3i32_v3f64: 2039; CHECK-GI: // %bb.0: // %entry 2040; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0 2041; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 2042; CHECK-GI-NEXT: ucvtf v3.2d, v1.2d 2043; CHECK-GI-NEXT: ucvtf v2.2d, v0.2d 2044; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 2045; CHECK-GI-NEXT: mov d1, v3.d[1] 2046; CHECK-GI-NEXT: fmov d0, d3 2047; CHECK-GI-NEXT: ret 2048entry: 2049 %c = uitofp <3 x i32> %a to <3 x double> 2050 ret <3 x double> %c 2051} 2052 2053define <4 x double> @stofp_v4i32_v4f64(<4 x i32> %a) { 2054; CHECK-SD-LABEL: stofp_v4i32_v4f64: 2055; CHECK-SD: // %bb.0: // %entry 2056; CHECK-SD-NEXT: sshll2 v1.2d, v0.4s, #0 2057; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 2058; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 2059; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2060; CHECK-SD-NEXT: ret 2061; 2062; CHECK-GI-LABEL: stofp_v4i32_v4f64: 2063; CHECK-GI: // %bb.0: // %entry 2064; CHECK-GI-NEXT: sshll v1.2d, v0.2s, #0 2065; CHECK-GI-NEXT: sshll2 v2.2d, v0.4s, #0 2066; CHECK-GI-NEXT: scvtf v0.2d, v1.2d 2067; CHECK-GI-NEXT: scvtf v1.2d, v2.2d 2068; CHECK-GI-NEXT: ret 2069entry: 2070 %c = sitofp <4 x i32> %a to <4 x double> 2071 ret <4 x double> %c 2072} 2073 2074define <4 x double> @utofp_v4i32_v4f64(<4 x i32> %a) { 2075; CHECK-SD-LABEL: utofp_v4i32_v4f64: 2076; CHECK-SD: // %bb.0: // %entry 2077; CHECK-SD-NEXT: ushll2 v1.2d, v0.4s, #0 2078; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 2079; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 2080; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 2081; CHECK-SD-NEXT: ret 2082; 2083; CHECK-GI-LABEL: utofp_v4i32_v4f64: 2084; CHECK-GI: // %bb.0: // %entry 2085; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0 2086; CHECK-GI-NEXT: ushll2 v2.2d, v0.4s, #0 2087; CHECK-GI-NEXT: ucvtf v0.2d, v1.2d 2088; CHECK-GI-NEXT: ucvtf v1.2d, v2.2d 2089; CHECK-GI-NEXT: ret 2090entry: 2091 %c = uitofp <4 x i32> %a to <4 x double> 2092 ret <4 x double> %c 2093} 2094 2095define <8 x double> @stofp_v8i32_v8f64(<8 x i32> %a) { 2096; CHECK-SD-LABEL: stofp_v8i32_v8f64: 2097; CHECK-SD: // %bb.0: // %entry 2098; CHECK-SD-NEXT: sshll v2.2d, v0.2s, #0 2099; CHECK-SD-NEXT: sshll2 v3.2d, v0.4s, #0 2100; CHECK-SD-NEXT: sshll2 v4.2d, v1.4s, #0 2101; CHECK-SD-NEXT: sshll v5.2d, v1.2s, #0 2102; CHECK-SD-NEXT: scvtf v0.2d, v2.2d 2103; CHECK-SD-NEXT: scvtf v1.2d, v3.2d 2104; CHECK-SD-NEXT: scvtf v3.2d, v4.2d 2105; CHECK-SD-NEXT: scvtf v2.2d, v5.2d 2106; CHECK-SD-NEXT: ret 2107; 2108; CHECK-GI-LABEL: stofp_v8i32_v8f64: 2109; CHECK-GI: // %bb.0: // %entry 2110; CHECK-GI-NEXT: sshll v2.2d, v0.2s, #0 2111; CHECK-GI-NEXT: sshll2 v3.2d, v0.4s, #0 2112; CHECK-GI-NEXT: sshll v4.2d, v1.2s, #0 2113; CHECK-GI-NEXT: sshll2 v5.2d, v1.4s, #0 2114; CHECK-GI-NEXT: scvtf v0.2d, v2.2d 2115; CHECK-GI-NEXT: scvtf v1.2d, v3.2d 2116; CHECK-GI-NEXT: scvtf v2.2d, v4.2d 2117; CHECK-GI-NEXT: scvtf v3.2d, v5.2d 2118; CHECK-GI-NEXT: ret 2119entry: 2120 %c = sitofp <8 x i32> %a to <8 x double> 2121 ret <8 x double> %c 2122} 2123 2124define <8 x double> @utofp_v8i32_v8f64(<8 x i32> %a) { 2125; CHECK-SD-LABEL: utofp_v8i32_v8f64: 2126; CHECK-SD: // %bb.0: // %entry 2127; CHECK-SD-NEXT: ushll v2.2d, v0.2s, #0 2128; CHECK-SD-NEXT: ushll2 v3.2d, v0.4s, #0 2129; CHECK-SD-NEXT: ushll2 v4.2d, v1.4s, #0 2130; CHECK-SD-NEXT: ushll v5.2d, v1.2s, #0 2131; CHECK-SD-NEXT: ucvtf v0.2d, v2.2d 2132; CHECK-SD-NEXT: ucvtf v1.2d, v3.2d 2133; CHECK-SD-NEXT: ucvtf v3.2d, v4.2d 2134; CHECK-SD-NEXT: ucvtf v2.2d, v5.2d 2135; CHECK-SD-NEXT: ret 2136; 2137; CHECK-GI-LABEL: utofp_v8i32_v8f64: 2138; CHECK-GI: // %bb.0: // %entry 2139; CHECK-GI-NEXT: ushll v2.2d, v0.2s, #0 2140; CHECK-GI-NEXT: ushll2 v3.2d, v0.4s, #0 2141; CHECK-GI-NEXT: ushll v4.2d, v1.2s, #0 2142; CHECK-GI-NEXT: ushll2 v5.2d, v1.4s, #0 2143; CHECK-GI-NEXT: ucvtf v0.2d, v2.2d 2144; CHECK-GI-NEXT: ucvtf v1.2d, v3.2d 2145; CHECK-GI-NEXT: ucvtf v2.2d, v4.2d 2146; CHECK-GI-NEXT: ucvtf v3.2d, v5.2d 2147; CHECK-GI-NEXT: ret 2148entry: 2149 %c = uitofp <8 x i32> %a to <8 x double> 2150 ret <8 x double> %c 2151} 2152 2153define <16 x double> @stofp_v16i32_v16f64(<16 x i32> %a) { 2154; CHECK-SD-LABEL: stofp_v16i32_v16f64: 2155; CHECK-SD: // %bb.0: // %entry 2156; CHECK-SD-NEXT: sshll2 v4.2d, v0.4s, #0 2157; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 2158; CHECK-SD-NEXT: sshll2 v5.2d, v1.4s, #0 2159; CHECK-SD-NEXT: sshll v6.2d, v1.2s, #0 2160; CHECK-SD-NEXT: sshll v7.2d, v2.2s, #0 2161; CHECK-SD-NEXT: sshll2 v16.2d, v2.4s, #0 2162; CHECK-SD-NEXT: sshll2 v17.2d, v3.4s, #0 2163; CHECK-SD-NEXT: sshll v18.2d, v3.2s, #0 2164; CHECK-SD-NEXT: scvtf v1.2d, v4.2d 2165; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2166; CHECK-SD-NEXT: scvtf v3.2d, v5.2d 2167; CHECK-SD-NEXT: scvtf v2.2d, v6.2d 2168; CHECK-SD-NEXT: scvtf v4.2d, v7.2d 2169; CHECK-SD-NEXT: scvtf v5.2d, v16.2d 2170; CHECK-SD-NEXT: scvtf v7.2d, v17.2d 2171; CHECK-SD-NEXT: scvtf v6.2d, v18.2d 2172; CHECK-SD-NEXT: ret 2173; 2174; CHECK-GI-LABEL: stofp_v16i32_v16f64: 2175; CHECK-GI: // %bb.0: // %entry 2176; CHECK-GI-NEXT: sshll v4.2d, v0.2s, #0 2177; CHECK-GI-NEXT: sshll2 v5.2d, v0.4s, #0 2178; CHECK-GI-NEXT: sshll v6.2d, v1.2s, #0 2179; CHECK-GI-NEXT: sshll2 v7.2d, v1.4s, #0 2180; CHECK-GI-NEXT: sshll v16.2d, v2.2s, #0 2181; CHECK-GI-NEXT: sshll2 v17.2d, v2.4s, #0 2182; CHECK-GI-NEXT: sshll v18.2d, v3.2s, #0 2183; CHECK-GI-NEXT: sshll2 v19.2d, v3.4s, #0 2184; CHECK-GI-NEXT: scvtf v0.2d, v4.2d 2185; CHECK-GI-NEXT: scvtf v1.2d, v5.2d 2186; CHECK-GI-NEXT: scvtf v2.2d, v6.2d 2187; CHECK-GI-NEXT: scvtf v3.2d, v7.2d 2188; CHECK-GI-NEXT: scvtf v4.2d, v16.2d 2189; CHECK-GI-NEXT: scvtf v5.2d, v17.2d 2190; CHECK-GI-NEXT: scvtf v6.2d, v18.2d 2191; CHECK-GI-NEXT: scvtf v7.2d, v19.2d 2192; CHECK-GI-NEXT: ret 2193entry: 2194 %c = sitofp <16 x i32> %a to <16 x double> 2195 ret <16 x double> %c 2196} 2197 2198define <16 x double> @utofp_v16i32_v16f64(<16 x i32> %a) { 2199; CHECK-SD-LABEL: utofp_v16i32_v16f64: 2200; CHECK-SD: // %bb.0: // %entry 2201; CHECK-SD-NEXT: ushll2 v4.2d, v0.4s, #0 2202; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 2203; CHECK-SD-NEXT: ushll2 v5.2d, v1.4s, #0 2204; CHECK-SD-NEXT: ushll v6.2d, v1.2s, #0 2205; CHECK-SD-NEXT: ushll v7.2d, v2.2s, #0 2206; CHECK-SD-NEXT: ushll2 v16.2d, v2.4s, #0 2207; CHECK-SD-NEXT: ushll2 v17.2d, v3.4s, #0 2208; CHECK-SD-NEXT: ushll v18.2d, v3.2s, #0 2209; CHECK-SD-NEXT: ucvtf v1.2d, v4.2d 2210; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 2211; CHECK-SD-NEXT: ucvtf v3.2d, v5.2d 2212; CHECK-SD-NEXT: ucvtf v2.2d, v6.2d 2213; CHECK-SD-NEXT: ucvtf v4.2d, v7.2d 2214; CHECK-SD-NEXT: ucvtf v5.2d, v16.2d 2215; CHECK-SD-NEXT: ucvtf v7.2d, v17.2d 2216; CHECK-SD-NEXT: ucvtf v6.2d, v18.2d 2217; CHECK-SD-NEXT: ret 2218; 2219; CHECK-GI-LABEL: utofp_v16i32_v16f64: 2220; CHECK-GI: // %bb.0: // %entry 2221; CHECK-GI-NEXT: ushll v4.2d, v0.2s, #0 2222; CHECK-GI-NEXT: ushll2 v5.2d, v0.4s, #0 2223; CHECK-GI-NEXT: ushll v6.2d, v1.2s, #0 2224; CHECK-GI-NEXT: ushll2 v7.2d, v1.4s, #0 2225; CHECK-GI-NEXT: ushll v16.2d, v2.2s, #0 2226; CHECK-GI-NEXT: ushll2 v17.2d, v2.4s, #0 2227; CHECK-GI-NEXT: ushll v18.2d, v3.2s, #0 2228; CHECK-GI-NEXT: ushll2 v19.2d, v3.4s, #0 2229; CHECK-GI-NEXT: ucvtf v0.2d, v4.2d 2230; CHECK-GI-NEXT: ucvtf v1.2d, v5.2d 2231; CHECK-GI-NEXT: ucvtf v2.2d, v6.2d 2232; CHECK-GI-NEXT: ucvtf v3.2d, v7.2d 2233; CHECK-GI-NEXT: ucvtf v4.2d, v16.2d 2234; CHECK-GI-NEXT: ucvtf v5.2d, v17.2d 2235; CHECK-GI-NEXT: ucvtf v6.2d, v18.2d 2236; CHECK-GI-NEXT: ucvtf v7.2d, v19.2d 2237; CHECK-GI-NEXT: ret 2238entry: 2239 %c = uitofp <16 x i32> %a to <16 x double> 2240 ret <16 x double> %c 2241} 2242 2243define <32 x double> @stofp_v32i32_v32f64(<32 x i32> %a) { 2244; CHECK-SD-LABEL: stofp_v32i32_v32f64: 2245; CHECK-SD: // %bb.0: // %entry 2246; CHECK-SD-NEXT: sshll2 v16.2d, v7.4s, #0 2247; CHECK-SD-NEXT: sshll v7.2d, v7.2s, #0 2248; CHECK-SD-NEXT: sshll2 v17.2d, v6.4s, #0 2249; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0 2250; CHECK-SD-NEXT: sshll2 v19.2d, v4.4s, #0 2251; CHECK-SD-NEXT: sshll v4.2d, v4.2s, #0 2252; CHECK-SD-NEXT: sshll2 v18.2d, v5.4s, #0 2253; CHECK-SD-NEXT: sshll v5.2d, v5.2s, #0 2254; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 2255; CHECK-SD-NEXT: scvtf v7.2d, v7.2d 2256; CHECK-SD-NEXT: scvtf v17.2d, v17.2d 2257; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 2258; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 2259; CHECK-SD-NEXT: scvtf v18.2d, v18.2d 2260; CHECK-SD-NEXT: scvtf v5.2d, v5.2d 2261; CHECK-SD-NEXT: stp q7, q16, [x8, #224] 2262; CHECK-SD-NEXT: sshll2 v16.2d, v3.4s, #0 2263; CHECK-SD-NEXT: sshll v3.2d, v3.2s, #0 2264; CHECK-SD-NEXT: scvtf v7.2d, v19.2d 2265; CHECK-SD-NEXT: stp q6, q17, [x8, #192] 2266; CHECK-SD-NEXT: sshll2 v17.2d, v2.4s, #0 2267; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 2268; CHECK-SD-NEXT: stp q5, q18, [x8, #160] 2269; CHECK-SD-NEXT: scvtf v6.2d, v16.2d 2270; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 2271; CHECK-SD-NEXT: sshll2 v16.2d, v1.4s, #0 2272; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 2273; CHECK-SD-NEXT: scvtf v5.2d, v17.2d 2274; CHECK-SD-NEXT: stp q4, q7, [x8, #128] 2275; CHECK-SD-NEXT: sshll2 v7.2d, v0.4s, #0 2276; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 2277; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 2278; CHECK-SD-NEXT: scvtf v4.2d, v16.2d 2279; CHECK-SD-NEXT: stp q3, q6, [x8, #96] 2280; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 2281; CHECK-SD-NEXT: scvtf v3.2d, v7.2d 2282; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2283; CHECK-SD-NEXT: stp q2, q5, [x8, #64] 2284; CHECK-SD-NEXT: stp q1, q4, [x8, #32] 2285; CHECK-SD-NEXT: stp q0, q3, [x8] 2286; CHECK-SD-NEXT: ret 2287; 2288; CHECK-GI-LABEL: stofp_v32i32_v32f64: 2289; CHECK-GI: // %bb.0: // %entry 2290; CHECK-GI-NEXT: sshll v16.2d, v0.2s, #0 2291; CHECK-GI-NEXT: sshll2 v0.2d, v0.4s, #0 2292; CHECK-GI-NEXT: sshll v17.2d, v1.2s, #0 2293; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 2294; CHECK-GI-NEXT: sshll v18.2d, v2.2s, #0 2295; CHECK-GI-NEXT: sshll2 v2.2d, v2.4s, #0 2296; CHECK-GI-NEXT: sshll v19.2d, v3.2s, #0 2297; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 2298; CHECK-GI-NEXT: scvtf v16.2d, v16.2d 2299; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 2300; CHECK-GI-NEXT: scvtf v17.2d, v17.2d 2301; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 2302; CHECK-GI-NEXT: scvtf v18.2d, v18.2d 2303; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 2304; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 2305; CHECK-GI-NEXT: stp q16, q0, [x8] 2306; CHECK-GI-NEXT: sshll v16.2d, v4.2s, #0 2307; CHECK-GI-NEXT: sshll2 v0.2d, v4.4s, #0 2308; CHECK-GI-NEXT: scvtf v4.2d, v19.2d 2309; CHECK-GI-NEXT: stp q17, q1, [x8, #32] 2310; CHECK-GI-NEXT: sshll v17.2d, v5.2s, #0 2311; CHECK-GI-NEXT: sshll2 v1.2d, v5.4s, #0 2312; CHECK-GI-NEXT: stp q18, q2, [x8, #64] 2313; CHECK-GI-NEXT: sshll2 v2.2d, v6.4s, #0 2314; CHECK-GI-NEXT: scvtf v5.2d, v16.2d 2315; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 2316; CHECK-GI-NEXT: sshll v16.2d, v6.2s, #0 2317; CHECK-GI-NEXT: scvtf v6.2d, v17.2d 2318; CHECK-GI-NEXT: stp q4, q3, [x8, #96] 2319; CHECK-GI-NEXT: sshll v4.2d, v7.2s, #0 2320; CHECK-GI-NEXT: sshll2 v3.2d, v7.4s, #0 2321; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 2322; CHECK-GI-NEXT: scvtf v7.2d, v16.2d 2323; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 2324; CHECK-GI-NEXT: stp q5, q0, [x8, #128] 2325; CHECK-GI-NEXT: scvtf v0.2d, v4.2d 2326; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 2327; CHECK-GI-NEXT: stp q6, q1, [x8, #160] 2328; CHECK-GI-NEXT: stp q7, q2, [x8, #192] 2329; CHECK-GI-NEXT: stp q0, q3, [x8, #224] 2330; CHECK-GI-NEXT: ret 2331entry: 2332 %c = sitofp <32 x i32> %a to <32 x double> 2333 ret <32 x double> %c 2334} 2335 2336define <32 x double> @utofp_v32i32_v32f64(<32 x i32> %a) { 2337; CHECK-SD-LABEL: utofp_v32i32_v32f64: 2338; CHECK-SD: // %bb.0: // %entry 2339; CHECK-SD-NEXT: ushll2 v16.2d, v7.4s, #0 2340; CHECK-SD-NEXT: ushll v7.2d, v7.2s, #0 2341; CHECK-SD-NEXT: ushll2 v17.2d, v6.4s, #0 2342; CHECK-SD-NEXT: ushll v6.2d, v6.2s, #0 2343; CHECK-SD-NEXT: ushll2 v19.2d, v4.4s, #0 2344; CHECK-SD-NEXT: ushll v4.2d, v4.2s, #0 2345; CHECK-SD-NEXT: ushll2 v18.2d, v5.4s, #0 2346; CHECK-SD-NEXT: ushll v5.2d, v5.2s, #0 2347; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 2348; CHECK-SD-NEXT: ucvtf v7.2d, v7.2d 2349; CHECK-SD-NEXT: ucvtf v17.2d, v17.2d 2350; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 2351; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 2352; CHECK-SD-NEXT: ucvtf v18.2d, v18.2d 2353; CHECK-SD-NEXT: ucvtf v5.2d, v5.2d 2354; CHECK-SD-NEXT: stp q7, q16, [x8, #224] 2355; CHECK-SD-NEXT: ushll2 v16.2d, v3.4s, #0 2356; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #0 2357; CHECK-SD-NEXT: ucvtf v7.2d, v19.2d 2358; CHECK-SD-NEXT: stp q6, q17, [x8, #192] 2359; CHECK-SD-NEXT: ushll2 v17.2d, v2.4s, #0 2360; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 2361; CHECK-SD-NEXT: stp q5, q18, [x8, #160] 2362; CHECK-SD-NEXT: ucvtf v6.2d, v16.2d 2363; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 2364; CHECK-SD-NEXT: ushll2 v16.2d, v1.4s, #0 2365; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 2366; CHECK-SD-NEXT: ucvtf v5.2d, v17.2d 2367; CHECK-SD-NEXT: stp q4, q7, [x8, #128] 2368; CHECK-SD-NEXT: ushll2 v7.2d, v0.4s, #0 2369; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 2370; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 2371; CHECK-SD-NEXT: ucvtf v4.2d, v16.2d 2372; CHECK-SD-NEXT: stp q3, q6, [x8, #96] 2373; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 2374; CHECK-SD-NEXT: ucvtf v3.2d, v7.2d 2375; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 2376; CHECK-SD-NEXT: stp q2, q5, [x8, #64] 2377; CHECK-SD-NEXT: stp q1, q4, [x8, #32] 2378; CHECK-SD-NEXT: stp q0, q3, [x8] 2379; CHECK-SD-NEXT: ret 2380; 2381; CHECK-GI-LABEL: utofp_v32i32_v32f64: 2382; CHECK-GI: // %bb.0: // %entry 2383; CHECK-GI-NEXT: ushll v16.2d, v0.2s, #0 2384; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 2385; CHECK-GI-NEXT: ushll v17.2d, v1.2s, #0 2386; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 2387; CHECK-GI-NEXT: ushll v18.2d, v2.2s, #0 2388; CHECK-GI-NEXT: ushll2 v2.2d, v2.4s, #0 2389; CHECK-GI-NEXT: ushll v19.2d, v3.2s, #0 2390; CHECK-GI-NEXT: ushll2 v3.2d, v3.4s, #0 2391; CHECK-GI-NEXT: ucvtf v16.2d, v16.2d 2392; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 2393; CHECK-GI-NEXT: ucvtf v17.2d, v17.2d 2394; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 2395; CHECK-GI-NEXT: ucvtf v18.2d, v18.2d 2396; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 2397; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 2398; CHECK-GI-NEXT: stp q16, q0, [x8] 2399; CHECK-GI-NEXT: ushll v16.2d, v4.2s, #0 2400; CHECK-GI-NEXT: ushll2 v0.2d, v4.4s, #0 2401; CHECK-GI-NEXT: ucvtf v4.2d, v19.2d 2402; CHECK-GI-NEXT: stp q17, q1, [x8, #32] 2403; CHECK-GI-NEXT: ushll v17.2d, v5.2s, #0 2404; CHECK-GI-NEXT: ushll2 v1.2d, v5.4s, #0 2405; CHECK-GI-NEXT: stp q18, q2, [x8, #64] 2406; CHECK-GI-NEXT: ushll2 v2.2d, v6.4s, #0 2407; CHECK-GI-NEXT: ucvtf v5.2d, v16.2d 2408; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 2409; CHECK-GI-NEXT: ushll v16.2d, v6.2s, #0 2410; CHECK-GI-NEXT: ucvtf v6.2d, v17.2d 2411; CHECK-GI-NEXT: stp q4, q3, [x8, #96] 2412; CHECK-GI-NEXT: ushll v4.2d, v7.2s, #0 2413; CHECK-GI-NEXT: ushll2 v3.2d, v7.4s, #0 2414; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 2415; CHECK-GI-NEXT: ucvtf v7.2d, v16.2d 2416; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 2417; CHECK-GI-NEXT: stp q5, q0, [x8, #128] 2418; CHECK-GI-NEXT: ucvtf v0.2d, v4.2d 2419; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 2420; CHECK-GI-NEXT: stp q6, q1, [x8, #160] 2421; CHECK-GI-NEXT: stp q7, q2, [x8, #192] 2422; CHECK-GI-NEXT: stp q0, q3, [x8, #224] 2423; CHECK-GI-NEXT: ret 2424entry: 2425 %c = uitofp <32 x i32> %a to <32 x double> 2426 ret <32 x double> %c 2427} 2428 2429define <2 x fp128> @stofp_v2i16_v2f128(<2 x i16> %a) { 2430; CHECK-LABEL: stofp_v2i16_v2f128: 2431; CHECK: // %bb.0: // %entry 2432; CHECK-NEXT: sub sp, sp, #32 2433; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 2434; CHECK-NEXT: .cfi_def_cfa_offset 32 2435; CHECK-NEXT: .cfi_offset w30, -16 2436; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 2437; CHECK-NEXT: fmov w8, s0 2438; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 2439; CHECK-NEXT: sxth w0, w8 2440; CHECK-NEXT: bl __floatsitf 2441; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 2442; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 2443; CHECK-NEXT: mov w8, v1.s[1] 2444; CHECK-NEXT: sxth w0, w8 2445; CHECK-NEXT: bl __floatsitf 2446; CHECK-NEXT: mov v1.16b, v0.16b 2447; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 2448; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 2449; CHECK-NEXT: add sp, sp, #32 2450; CHECK-NEXT: ret 2451entry: 2452 %c = sitofp <2 x i16> %a to <2 x fp128> 2453 ret <2 x fp128> %c 2454} 2455 2456define <2 x fp128> @utofp_v2i16_v2f128(<2 x i16> %a) { 2457; CHECK-LABEL: utofp_v2i16_v2f128: 2458; CHECK: // %bb.0: // %entry 2459; CHECK-NEXT: sub sp, sp, #32 2460; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 2461; CHECK-NEXT: .cfi_def_cfa_offset 32 2462; CHECK-NEXT: .cfi_offset w30, -16 2463; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 2464; CHECK-NEXT: fmov w8, s0 2465; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 2466; CHECK-NEXT: and w0, w8, #0xffff 2467; CHECK-NEXT: bl __floatunsitf 2468; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 2469; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 2470; CHECK-NEXT: mov w8, v1.s[1] 2471; CHECK-NEXT: and w0, w8, #0xffff 2472; CHECK-NEXT: bl __floatunsitf 2473; CHECK-NEXT: mov v1.16b, v0.16b 2474; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 2475; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 2476; CHECK-NEXT: add sp, sp, #32 2477; CHECK-NEXT: ret 2478entry: 2479 %c = uitofp <2 x i16> %a to <2 x fp128> 2480 ret <2 x fp128> %c 2481} 2482 2483define <3 x fp128> @stofp_v3i16_v3f128(<3 x i16> %a) { 2484; CHECK-LABEL: stofp_v3i16_v3f128: 2485; CHECK: // %bb.0: // %entry 2486; CHECK-NEXT: sub sp, sp, #48 2487; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 2488; CHECK-NEXT: .cfi_def_cfa_offset 48 2489; CHECK-NEXT: .cfi_offset w30, -16 2490; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 2491; CHECK-NEXT: smov w0, v0.h[0] 2492; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 2493; CHECK-NEXT: bl __floatsitf 2494; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 2495; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 2496; CHECK-NEXT: smov w0, v1.h[1] 2497; CHECK-NEXT: bl __floatsitf 2498; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 2499; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 2500; CHECK-NEXT: smov w0, v1.h[2] 2501; CHECK-NEXT: bl __floatsitf 2502; CHECK-NEXT: mov v2.16b, v0.16b 2503; CHECK-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 2504; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 2505; CHECK-NEXT: add sp, sp, #48 2506; CHECK-NEXT: ret 2507entry: 2508 %c = sitofp <3 x i16> %a to <3 x fp128> 2509 ret <3 x fp128> %c 2510} 2511 2512define <3 x fp128> @utofp_v3i16_v3f128(<3 x i16> %a) { 2513; CHECK-LABEL: utofp_v3i16_v3f128: 2514; CHECK: // %bb.0: // %entry 2515; CHECK-NEXT: sub sp, sp, #48 2516; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 2517; CHECK-NEXT: .cfi_def_cfa_offset 48 2518; CHECK-NEXT: .cfi_offset w30, -16 2519; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 2520; CHECK-NEXT: umov w0, v0.h[0] 2521; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 2522; CHECK-NEXT: bl __floatunsitf 2523; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 2524; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 2525; CHECK-NEXT: umov w0, v1.h[1] 2526; CHECK-NEXT: bl __floatunsitf 2527; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 2528; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 2529; CHECK-NEXT: umov w0, v1.h[2] 2530; CHECK-NEXT: bl __floatunsitf 2531; CHECK-NEXT: mov v2.16b, v0.16b 2532; CHECK-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload 2533; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 2534; CHECK-NEXT: add sp, sp, #48 2535; CHECK-NEXT: ret 2536entry: 2537 %c = uitofp <3 x i16> %a to <3 x fp128> 2538 ret <3 x fp128> %c 2539} 2540 2541define <2 x double> @stofp_v2i16_v2f64(<2 x i16> %a) { 2542; CHECK-SD-LABEL: stofp_v2i16_v2f64: 2543; CHECK-SD: // %bb.0: // %entry 2544; CHECK-SD-NEXT: shl v0.2s, v0.2s, #16 2545; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #16 2546; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 2547; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2548; CHECK-SD-NEXT: ret 2549; 2550; CHECK-GI-LABEL: stofp_v2i16_v2f64: 2551; CHECK-GI: // %bb.0: // %entry 2552; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #0 2553; CHECK-GI-NEXT: shl v0.2d, v0.2d, #48 2554; CHECK-GI-NEXT: sshr v0.2d, v0.2d, #48 2555; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 2556; CHECK-GI-NEXT: ret 2557entry: 2558 %c = sitofp <2 x i16> %a to <2 x double> 2559 ret <2 x double> %c 2560} 2561 2562define <2 x double> @utofp_v2i16_v2f64(<2 x i16> %a) { 2563; CHECK-SD-LABEL: utofp_v2i16_v2f64: 2564; CHECK-SD: // %bb.0: // %entry 2565; CHECK-SD-NEXT: movi d1, #0x00ffff0000ffff 2566; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b 2567; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 2568; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 2569; CHECK-SD-NEXT: ret 2570; 2571; CHECK-GI-LABEL: utofp_v2i16_v2f64: 2572; CHECK-GI: // %bb.0: // %entry 2573; CHECK-GI-NEXT: movi v1.2d, #0x0000000000ffff 2574; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #0 2575; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b 2576; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 2577; CHECK-GI-NEXT: ret 2578entry: 2579 %c = uitofp <2 x i16> %a to <2 x double> 2580 ret <2 x double> %c 2581} 2582 2583define <3 x double> @stofp_v3i16_v3f64(<3 x i16> %a) { 2584; CHECK-SD-LABEL: stofp_v3i16_v3f64: 2585; CHECK-SD: // %bb.0: // %entry 2586; CHECK-SD-NEXT: sshll v1.4s, v0.4h, #0 2587; CHECK-SD-NEXT: sshll v0.2d, v1.2s, #0 2588; CHECK-SD-NEXT: sshll2 v1.2d, v1.4s, #0 2589; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2590; CHECK-SD-NEXT: scvtf v2.2d, v1.2d 2591; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 2592; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 2593; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 2594; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 2595; CHECK-SD-NEXT: ret 2596; 2597; CHECK-GI-LABEL: stofp_v3i16_v3f64: 2598; CHECK-GI: // %bb.0: // %entry 2599; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 2600; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0 2601; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 2602; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 2603; CHECK-GI-NEXT: scvtf v2.2d, v1.2d 2604; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 2605; CHECK-GI-NEXT: mov d1, v0.d[1] 2606; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 2607; CHECK-GI-NEXT: ret 2608entry: 2609 %c = sitofp <3 x i16> %a to <3 x double> 2610 ret <3 x double> %c 2611} 2612 2613define <3 x double> @utofp_v3i16_v3f64(<3 x i16> %a) { 2614; CHECK-SD-LABEL: utofp_v3i16_v3f64: 2615; CHECK-SD: // %bb.0: // %entry 2616; CHECK-SD-NEXT: ushll v1.4s, v0.4h, #0 2617; CHECK-SD-NEXT: ushll v0.2d, v1.2s, #0 2618; CHECK-SD-NEXT: ushll2 v1.2d, v1.4s, #0 2619; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 2620; CHECK-SD-NEXT: ucvtf v2.2d, v1.2d 2621; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 2622; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 2623; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 2624; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 2625; CHECK-SD-NEXT: ret 2626; 2627; CHECK-GI-LABEL: utofp_v3i16_v3f64: 2628; CHECK-GI: // %bb.0: // %entry 2629; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 2630; CHECK-GI-NEXT: ushll v0.2d, v1.2s, #0 2631; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 2632; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 2633; CHECK-GI-NEXT: ucvtf v2.2d, v1.2d 2634; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 2635; CHECK-GI-NEXT: mov d1, v0.d[1] 2636; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 2637; CHECK-GI-NEXT: ret 2638entry: 2639 %c = uitofp <3 x i16> %a to <3 x double> 2640 ret <3 x double> %c 2641} 2642 2643define <4 x double> @stofp_v4i16_v4f64(<4 x i16> %a) { 2644; CHECK-SD-LABEL: stofp_v4i16_v4f64: 2645; CHECK-SD: // %bb.0: // %entry 2646; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 2647; CHECK-SD-NEXT: sshll2 v1.2d, v0.4s, #0 2648; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 2649; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 2650; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2651; CHECK-SD-NEXT: ret 2652; 2653; CHECK-GI-LABEL: stofp_v4i16_v4f64: 2654; CHECK-GI: // %bb.0: // %entry 2655; CHECK-GI-NEXT: sshll v0.4s, v0.4h, #0 2656; CHECK-GI-NEXT: sshll v1.2d, v0.2s, #0 2657; CHECK-GI-NEXT: sshll2 v2.2d, v0.4s, #0 2658; CHECK-GI-NEXT: scvtf v0.2d, v1.2d 2659; CHECK-GI-NEXT: scvtf v1.2d, v2.2d 2660; CHECK-GI-NEXT: ret 2661entry: 2662 %c = sitofp <4 x i16> %a to <4 x double> 2663 ret <4 x double> %c 2664} 2665 2666define <4 x double> @utofp_v4i16_v4f64(<4 x i16> %a) { 2667; CHECK-SD-LABEL: utofp_v4i16_v4f64: 2668; CHECK-SD: // %bb.0: // %entry 2669; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 2670; CHECK-SD-NEXT: ushll2 v1.2d, v0.4s, #0 2671; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 2672; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 2673; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 2674; CHECK-SD-NEXT: ret 2675; 2676; CHECK-GI-LABEL: utofp_v4i16_v4f64: 2677; CHECK-GI: // %bb.0: // %entry 2678; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 2679; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0 2680; CHECK-GI-NEXT: ushll2 v2.2d, v0.4s, #0 2681; CHECK-GI-NEXT: ucvtf v0.2d, v1.2d 2682; CHECK-GI-NEXT: ucvtf v1.2d, v2.2d 2683; CHECK-GI-NEXT: ret 2684entry: 2685 %c = uitofp <4 x i16> %a to <4 x double> 2686 ret <4 x double> %c 2687} 2688 2689define <8 x double> @stofp_v8i16_v8f64(<8 x i16> %a) { 2690; CHECK-SD-LABEL: stofp_v8i16_v8f64: 2691; CHECK-SD: // %bb.0: // %entry 2692; CHECK-SD-NEXT: sshll v1.4s, v0.4h, #0 2693; CHECK-SD-NEXT: sshll2 v0.4s, v0.8h, #0 2694; CHECK-SD-NEXT: sshll v2.2d, v1.2s, #0 2695; CHECK-SD-NEXT: sshll2 v3.2d, v0.4s, #0 2696; CHECK-SD-NEXT: sshll2 v1.2d, v1.4s, #0 2697; CHECK-SD-NEXT: sshll v4.2d, v0.2s, #0 2698; CHECK-SD-NEXT: scvtf v0.2d, v2.2d 2699; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 2700; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 2701; CHECK-SD-NEXT: scvtf v2.2d, v4.2d 2702; CHECK-SD-NEXT: ret 2703; 2704; CHECK-GI-LABEL: stofp_v8i16_v8f64: 2705; CHECK-GI: // %bb.0: // %entry 2706; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 2707; CHECK-GI-NEXT: sshll2 v0.4s, v0.8h, #0 2708; CHECK-GI-NEXT: sshll v2.2d, v1.2s, #0 2709; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 2710; CHECK-GI-NEXT: sshll v3.2d, v0.2s, #0 2711; CHECK-GI-NEXT: sshll2 v4.2d, v0.4s, #0 2712; CHECK-GI-NEXT: scvtf v0.2d, v2.2d 2713; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 2714; CHECK-GI-NEXT: scvtf v2.2d, v3.2d 2715; CHECK-GI-NEXT: scvtf v3.2d, v4.2d 2716; CHECK-GI-NEXT: ret 2717entry: 2718 %c = sitofp <8 x i16> %a to <8 x double> 2719 ret <8 x double> %c 2720} 2721 2722define <8 x double> @utofp_v8i16_v8f64(<8 x i16> %a) { 2723; CHECK-SD-LABEL: utofp_v8i16_v8f64: 2724; CHECK-SD: // %bb.0: // %entry 2725; CHECK-SD-NEXT: ushll v1.4s, v0.4h, #0 2726; CHECK-SD-NEXT: ushll2 v0.4s, v0.8h, #0 2727; CHECK-SD-NEXT: ushll v2.2d, v1.2s, #0 2728; CHECK-SD-NEXT: ushll2 v3.2d, v0.4s, #0 2729; CHECK-SD-NEXT: ushll2 v1.2d, v1.4s, #0 2730; CHECK-SD-NEXT: ushll v4.2d, v0.2s, #0 2731; CHECK-SD-NEXT: ucvtf v0.2d, v2.2d 2732; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 2733; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 2734; CHECK-SD-NEXT: ucvtf v2.2d, v4.2d 2735; CHECK-SD-NEXT: ret 2736; 2737; CHECK-GI-LABEL: utofp_v8i16_v8f64: 2738; CHECK-GI: // %bb.0: // %entry 2739; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 2740; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 2741; CHECK-GI-NEXT: ushll v2.2d, v1.2s, #0 2742; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 2743; CHECK-GI-NEXT: ushll v3.2d, v0.2s, #0 2744; CHECK-GI-NEXT: ushll2 v4.2d, v0.4s, #0 2745; CHECK-GI-NEXT: ucvtf v0.2d, v2.2d 2746; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 2747; CHECK-GI-NEXT: ucvtf v2.2d, v3.2d 2748; CHECK-GI-NEXT: ucvtf v3.2d, v4.2d 2749; CHECK-GI-NEXT: ret 2750entry: 2751 %c = uitofp <8 x i16> %a to <8 x double> 2752 ret <8 x double> %c 2753} 2754 2755define <16 x double> @stofp_v16i16_v16f64(<16 x i16> %a) { 2756; CHECK-SD-LABEL: stofp_v16i16_v16f64: 2757; CHECK-SD: // %bb.0: // %entry 2758; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0 2759; CHECK-SD-NEXT: sshll2 v0.4s, v0.8h, #0 2760; CHECK-SD-NEXT: sshll v3.4s, v1.4h, #0 2761; CHECK-SD-NEXT: sshll2 v1.4s, v1.8h, #0 2762; CHECK-SD-NEXT: sshll2 v4.2d, v2.4s, #0 2763; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 2764; CHECK-SD-NEXT: sshll2 v5.2d, v0.4s, #0 2765; CHECK-SD-NEXT: sshll v6.2d, v0.2s, #0 2766; CHECK-SD-NEXT: sshll v7.2d, v3.2s, #0 2767; CHECK-SD-NEXT: sshll2 v16.2d, v1.4s, #0 2768; CHECK-SD-NEXT: sshll2 v17.2d, v3.4s, #0 2769; CHECK-SD-NEXT: sshll v18.2d, v1.2s, #0 2770; CHECK-SD-NEXT: scvtf v1.2d, v4.2d 2771; CHECK-SD-NEXT: scvtf v0.2d, v2.2d 2772; CHECK-SD-NEXT: scvtf v3.2d, v5.2d 2773; CHECK-SD-NEXT: scvtf v2.2d, v6.2d 2774; CHECK-SD-NEXT: scvtf v4.2d, v7.2d 2775; CHECK-SD-NEXT: scvtf v7.2d, v16.2d 2776; CHECK-SD-NEXT: scvtf v5.2d, v17.2d 2777; CHECK-SD-NEXT: scvtf v6.2d, v18.2d 2778; CHECK-SD-NEXT: ret 2779; 2780; CHECK-GI-LABEL: stofp_v16i16_v16f64: 2781; CHECK-GI: // %bb.0: // %entry 2782; CHECK-GI-NEXT: sshll v2.4s, v0.4h, #0 2783; CHECK-GI-NEXT: sshll2 v0.4s, v0.8h, #0 2784; CHECK-GI-NEXT: sshll v3.4s, v1.4h, #0 2785; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 2786; CHECK-GI-NEXT: sshll v4.2d, v2.2s, #0 2787; CHECK-GI-NEXT: sshll2 v2.2d, v2.4s, #0 2788; CHECK-GI-NEXT: sshll v5.2d, v0.2s, #0 2789; CHECK-GI-NEXT: sshll2 v6.2d, v0.4s, #0 2790; CHECK-GI-NEXT: sshll v7.2d, v3.2s, #0 2791; CHECK-GI-NEXT: sshll2 v16.2d, v3.4s, #0 2792; CHECK-GI-NEXT: sshll v17.2d, v1.2s, #0 2793; CHECK-GI-NEXT: sshll2 v18.2d, v1.4s, #0 2794; CHECK-GI-NEXT: scvtf v0.2d, v4.2d 2795; CHECK-GI-NEXT: scvtf v1.2d, v2.2d 2796; CHECK-GI-NEXT: scvtf v2.2d, v5.2d 2797; CHECK-GI-NEXT: scvtf v3.2d, v6.2d 2798; CHECK-GI-NEXT: scvtf v4.2d, v7.2d 2799; CHECK-GI-NEXT: scvtf v5.2d, v16.2d 2800; CHECK-GI-NEXT: scvtf v6.2d, v17.2d 2801; CHECK-GI-NEXT: scvtf v7.2d, v18.2d 2802; CHECK-GI-NEXT: ret 2803entry: 2804 %c = sitofp <16 x i16> %a to <16 x double> 2805 ret <16 x double> %c 2806} 2807 2808define <16 x double> @utofp_v16i16_v16f64(<16 x i16> %a) { 2809; CHECK-SD-LABEL: utofp_v16i16_v16f64: 2810; CHECK-SD: // %bb.0: // %entry 2811; CHECK-SD-NEXT: ushll v2.4s, v0.4h, #0 2812; CHECK-SD-NEXT: ushll2 v0.4s, v0.8h, #0 2813; CHECK-SD-NEXT: ushll v3.4s, v1.4h, #0 2814; CHECK-SD-NEXT: ushll2 v1.4s, v1.8h, #0 2815; CHECK-SD-NEXT: ushll2 v4.2d, v2.4s, #0 2816; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 2817; CHECK-SD-NEXT: ushll2 v5.2d, v0.4s, #0 2818; CHECK-SD-NEXT: ushll v6.2d, v0.2s, #0 2819; CHECK-SD-NEXT: ushll v7.2d, v3.2s, #0 2820; CHECK-SD-NEXT: ushll2 v16.2d, v1.4s, #0 2821; CHECK-SD-NEXT: ushll2 v17.2d, v3.4s, #0 2822; CHECK-SD-NEXT: ushll v18.2d, v1.2s, #0 2823; CHECK-SD-NEXT: ucvtf v1.2d, v4.2d 2824; CHECK-SD-NEXT: ucvtf v0.2d, v2.2d 2825; CHECK-SD-NEXT: ucvtf v3.2d, v5.2d 2826; CHECK-SD-NEXT: ucvtf v2.2d, v6.2d 2827; CHECK-SD-NEXT: ucvtf v4.2d, v7.2d 2828; CHECK-SD-NEXT: ucvtf v7.2d, v16.2d 2829; CHECK-SD-NEXT: ucvtf v5.2d, v17.2d 2830; CHECK-SD-NEXT: ucvtf v6.2d, v18.2d 2831; CHECK-SD-NEXT: ret 2832; 2833; CHECK-GI-LABEL: utofp_v16i16_v16f64: 2834; CHECK-GI: // %bb.0: // %entry 2835; CHECK-GI-NEXT: ushll v2.4s, v0.4h, #0 2836; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 2837; CHECK-GI-NEXT: ushll v3.4s, v1.4h, #0 2838; CHECK-GI-NEXT: ushll2 v1.4s, v1.8h, #0 2839; CHECK-GI-NEXT: ushll v4.2d, v2.2s, #0 2840; CHECK-GI-NEXT: ushll2 v2.2d, v2.4s, #0 2841; CHECK-GI-NEXT: ushll v5.2d, v0.2s, #0 2842; CHECK-GI-NEXT: ushll2 v6.2d, v0.4s, #0 2843; CHECK-GI-NEXT: ushll v7.2d, v3.2s, #0 2844; CHECK-GI-NEXT: ushll2 v16.2d, v3.4s, #0 2845; CHECK-GI-NEXT: ushll v17.2d, v1.2s, #0 2846; CHECK-GI-NEXT: ushll2 v18.2d, v1.4s, #0 2847; CHECK-GI-NEXT: ucvtf v0.2d, v4.2d 2848; CHECK-GI-NEXT: ucvtf v1.2d, v2.2d 2849; CHECK-GI-NEXT: ucvtf v2.2d, v5.2d 2850; CHECK-GI-NEXT: ucvtf v3.2d, v6.2d 2851; CHECK-GI-NEXT: ucvtf v4.2d, v7.2d 2852; CHECK-GI-NEXT: ucvtf v5.2d, v16.2d 2853; CHECK-GI-NEXT: ucvtf v6.2d, v17.2d 2854; CHECK-GI-NEXT: ucvtf v7.2d, v18.2d 2855; CHECK-GI-NEXT: ret 2856entry: 2857 %c = uitofp <16 x i16> %a to <16 x double> 2858 ret <16 x double> %c 2859} 2860 2861define <32 x double> @stofp_v32i16_v32f64(<32 x i16> %a) { 2862; CHECK-SD-LABEL: stofp_v32i16_v32f64: 2863; CHECK-SD: // %bb.0: // %entry 2864; CHECK-SD-NEXT: sshll2 v4.4s, v3.8h, #0 2865; CHECK-SD-NEXT: sshll2 v5.4s, v2.8h, #0 2866; CHECK-SD-NEXT: sshll2 v7.4s, v1.8h, #0 2867; CHECK-SD-NEXT: sshll2 v17.4s, v0.8h, #0 2868; CHECK-SD-NEXT: sshll v3.4s, v3.4h, #0 2869; CHECK-SD-NEXT: sshll v1.4s, v1.4h, #0 2870; CHECK-SD-NEXT: sshll v2.4s, v2.4h, #0 2871; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 2872; CHECK-SD-NEXT: sshll2 v6.2d, v4.4s, #0 2873; CHECK-SD-NEXT: sshll v4.2d, v4.2s, #0 2874; CHECK-SD-NEXT: sshll2 v16.2d, v5.4s, #0 2875; CHECK-SD-NEXT: sshll v5.2d, v5.2s, #0 2876; CHECK-SD-NEXT: sshll2 v18.2d, v7.4s, #0 2877; CHECK-SD-NEXT: sshll v7.2d, v7.2s, #0 2878; CHECK-SD-NEXT: sshll2 v19.2d, v17.4s, #0 2879; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 2880; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 2881; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 2882; CHECK-SD-NEXT: scvtf v5.2d, v5.2d 2883; CHECK-SD-NEXT: scvtf v7.2d, v7.2d 2884; CHECK-SD-NEXT: stp q4, q6, [x8, #224] 2885; CHECK-SD-NEXT: sshll v6.2d, v17.2s, #0 2886; CHECK-SD-NEXT: scvtf v17.2d, v18.2d 2887; CHECK-SD-NEXT: sshll2 v4.2d, v3.4s, #0 2888; CHECK-SD-NEXT: stp q5, q16, [x8, #160] 2889; CHECK-SD-NEXT: sshll v3.2d, v3.2s, #0 2890; CHECK-SD-NEXT: scvtf v16.2d, v19.2d 2891; CHECK-SD-NEXT: scvtf v5.2d, v6.2d 2892; CHECK-SD-NEXT: sshll2 v6.2d, v2.4s, #0 2893; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 2894; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 2895; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 2896; CHECK-SD-NEXT: stp q7, q17, [x8, #96] 2897; CHECK-SD-NEXT: sshll2 v7.2d, v1.4s, #0 2898; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 2899; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 2900; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 2901; CHECK-SD-NEXT: stp q5, q16, [x8, #32] 2902; CHECK-SD-NEXT: sshll2 v5.2d, v0.4s, #0 2903; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 2904; CHECK-SD-NEXT: scvtf v7.2d, v7.2d 2905; CHECK-SD-NEXT: stp q3, q4, [x8, #192] 2906; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 2907; CHECK-SD-NEXT: scvtf v3.2d, v5.2d 2908; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 2909; CHECK-SD-NEXT: stp q2, q6, [x8, #128] 2910; CHECK-SD-NEXT: stp q1, q7, [x8, #64] 2911; CHECK-SD-NEXT: stp q0, q3, [x8] 2912; CHECK-SD-NEXT: ret 2913; 2914; CHECK-GI-LABEL: stofp_v32i16_v32f64: 2915; CHECK-GI: // %bb.0: // %entry 2916; CHECK-GI-NEXT: sshll v4.4s, v0.4h, #0 2917; CHECK-GI-NEXT: sshll2 v0.4s, v0.8h, #0 2918; CHECK-GI-NEXT: sshll v6.4s, v1.4h, #0 2919; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 2920; CHECK-GI-NEXT: sshll v16.4s, v2.4h, #0 2921; CHECK-GI-NEXT: sshll2 v2.4s, v2.8h, #0 2922; CHECK-GI-NEXT: sshll v18.4s, v3.4h, #0 2923; CHECK-GI-NEXT: sshll2 v3.4s, v3.8h, #0 2924; CHECK-GI-NEXT: sshll v5.2d, v4.2s, #0 2925; CHECK-GI-NEXT: sshll2 v4.2d, v4.4s, #0 2926; CHECK-GI-NEXT: sshll v7.2d, v0.2s, #0 2927; CHECK-GI-NEXT: sshll2 v0.2d, v0.4s, #0 2928; CHECK-GI-NEXT: sshll v17.2d, v6.2s, #0 2929; CHECK-GI-NEXT: sshll2 v6.2d, v6.4s, #0 2930; CHECK-GI-NEXT: sshll v19.2d, v1.2s, #0 2931; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 2932; CHECK-GI-NEXT: scvtf v5.2d, v5.2d 2933; CHECK-GI-NEXT: scvtf v4.2d, v4.2d 2934; CHECK-GI-NEXT: scvtf v7.2d, v7.2d 2935; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 2936; CHECK-GI-NEXT: scvtf v6.2d, v6.2d 2937; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 2938; CHECK-GI-NEXT: stp q5, q4, [x8] 2939; CHECK-GI-NEXT: scvtf v5.2d, v17.2d 2940; CHECK-GI-NEXT: sshll v4.2d, v16.2s, #0 2941; CHECK-GI-NEXT: stp q7, q0, [x8, #32] 2942; CHECK-GI-NEXT: sshll2 v7.2d, v16.4s, #0 2943; CHECK-GI-NEXT: scvtf v16.2d, v19.2d 2944; CHECK-GI-NEXT: sshll v0.2d, v2.2s, #0 2945; CHECK-GI-NEXT: sshll2 v2.2d, v2.4s, #0 2946; CHECK-GI-NEXT: scvtf v4.2d, v4.2d 2947; CHECK-GI-NEXT: stp q5, q6, [x8, #64] 2948; CHECK-GI-NEXT: scvtf v6.2d, v7.2d 2949; CHECK-GI-NEXT: sshll v5.2d, v18.2s, #0 2950; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 2951; CHECK-GI-NEXT: stp q16, q1, [x8, #96] 2952; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 2953; CHECK-GI-NEXT: sshll2 v7.2d, v18.4s, #0 2954; CHECK-GI-NEXT: sshll v1.2d, v3.2s, #0 2955; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 2956; CHECK-GI-NEXT: scvtf v5.2d, v5.2d 2957; CHECK-GI-NEXT: stp q4, q6, [x8, #128] 2958; CHECK-GI-NEXT: scvtf v4.2d, v7.2d 2959; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 2960; CHECK-GI-NEXT: stp q0, q2, [x8, #160] 2961; CHECK-GI-NEXT: scvtf v0.2d, v3.2d 2962; CHECK-GI-NEXT: stp q5, q4, [x8, #192] 2963; CHECK-GI-NEXT: stp q1, q0, [x8, #224] 2964; CHECK-GI-NEXT: ret 2965entry: 2966 %c = sitofp <32 x i16> %a to <32 x double> 2967 ret <32 x double> %c 2968} 2969 2970define <32 x double> @utofp_v32i16_v32f64(<32 x i16> %a) { 2971; CHECK-SD-LABEL: utofp_v32i16_v32f64: 2972; CHECK-SD: // %bb.0: // %entry 2973; CHECK-SD-NEXT: ushll2 v4.4s, v3.8h, #0 2974; CHECK-SD-NEXT: ushll2 v5.4s, v2.8h, #0 2975; CHECK-SD-NEXT: ushll2 v7.4s, v1.8h, #0 2976; CHECK-SD-NEXT: ushll2 v17.4s, v0.8h, #0 2977; CHECK-SD-NEXT: ushll v3.4s, v3.4h, #0 2978; CHECK-SD-NEXT: ushll v1.4s, v1.4h, #0 2979; CHECK-SD-NEXT: ushll v2.4s, v2.4h, #0 2980; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 2981; CHECK-SD-NEXT: ushll2 v6.2d, v4.4s, #0 2982; CHECK-SD-NEXT: ushll v4.2d, v4.2s, #0 2983; CHECK-SD-NEXT: ushll2 v16.2d, v5.4s, #0 2984; CHECK-SD-NEXT: ushll v5.2d, v5.2s, #0 2985; CHECK-SD-NEXT: ushll2 v18.2d, v7.4s, #0 2986; CHECK-SD-NEXT: ushll v7.2d, v7.2s, #0 2987; CHECK-SD-NEXT: ushll2 v19.2d, v17.4s, #0 2988; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 2989; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 2990; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 2991; CHECK-SD-NEXT: ucvtf v5.2d, v5.2d 2992; CHECK-SD-NEXT: ucvtf v7.2d, v7.2d 2993; CHECK-SD-NEXT: stp q4, q6, [x8, #224] 2994; CHECK-SD-NEXT: ushll v6.2d, v17.2s, #0 2995; CHECK-SD-NEXT: ucvtf v17.2d, v18.2d 2996; CHECK-SD-NEXT: ushll2 v4.2d, v3.4s, #0 2997; CHECK-SD-NEXT: stp q5, q16, [x8, #160] 2998; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #0 2999; CHECK-SD-NEXT: ucvtf v16.2d, v19.2d 3000; CHECK-SD-NEXT: ucvtf v5.2d, v6.2d 3001; CHECK-SD-NEXT: ushll2 v6.2d, v2.4s, #0 3002; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 3003; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 3004; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 3005; CHECK-SD-NEXT: stp q7, q17, [x8, #96] 3006; CHECK-SD-NEXT: ushll2 v7.2d, v1.4s, #0 3007; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 3008; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 3009; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 3010; CHECK-SD-NEXT: stp q5, q16, [x8, #32] 3011; CHECK-SD-NEXT: ushll2 v5.2d, v0.4s, #0 3012; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 3013; CHECK-SD-NEXT: ucvtf v7.2d, v7.2d 3014; CHECK-SD-NEXT: stp q3, q4, [x8, #192] 3015; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 3016; CHECK-SD-NEXT: ucvtf v3.2d, v5.2d 3017; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 3018; CHECK-SD-NEXT: stp q2, q6, [x8, #128] 3019; CHECK-SD-NEXT: stp q1, q7, [x8, #64] 3020; CHECK-SD-NEXT: stp q0, q3, [x8] 3021; CHECK-SD-NEXT: ret 3022; 3023; CHECK-GI-LABEL: utofp_v32i16_v32f64: 3024; CHECK-GI: // %bb.0: // %entry 3025; CHECK-GI-NEXT: ushll v4.4s, v0.4h, #0 3026; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 3027; CHECK-GI-NEXT: ushll v6.4s, v1.4h, #0 3028; CHECK-GI-NEXT: ushll2 v1.4s, v1.8h, #0 3029; CHECK-GI-NEXT: ushll v16.4s, v2.4h, #0 3030; CHECK-GI-NEXT: ushll2 v2.4s, v2.8h, #0 3031; CHECK-GI-NEXT: ushll v18.4s, v3.4h, #0 3032; CHECK-GI-NEXT: ushll2 v3.4s, v3.8h, #0 3033; CHECK-GI-NEXT: ushll v5.2d, v4.2s, #0 3034; CHECK-GI-NEXT: ushll2 v4.2d, v4.4s, #0 3035; CHECK-GI-NEXT: ushll v7.2d, v0.2s, #0 3036; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 3037; CHECK-GI-NEXT: ushll v17.2d, v6.2s, #0 3038; CHECK-GI-NEXT: ushll2 v6.2d, v6.4s, #0 3039; CHECK-GI-NEXT: ushll v19.2d, v1.2s, #0 3040; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 3041; CHECK-GI-NEXT: ucvtf v5.2d, v5.2d 3042; CHECK-GI-NEXT: ucvtf v4.2d, v4.2d 3043; CHECK-GI-NEXT: ucvtf v7.2d, v7.2d 3044; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 3045; CHECK-GI-NEXT: ucvtf v6.2d, v6.2d 3046; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 3047; CHECK-GI-NEXT: stp q5, q4, [x8] 3048; CHECK-GI-NEXT: ucvtf v5.2d, v17.2d 3049; CHECK-GI-NEXT: ushll v4.2d, v16.2s, #0 3050; CHECK-GI-NEXT: stp q7, q0, [x8, #32] 3051; CHECK-GI-NEXT: ushll2 v7.2d, v16.4s, #0 3052; CHECK-GI-NEXT: ucvtf v16.2d, v19.2d 3053; CHECK-GI-NEXT: ushll v0.2d, v2.2s, #0 3054; CHECK-GI-NEXT: ushll2 v2.2d, v2.4s, #0 3055; CHECK-GI-NEXT: ucvtf v4.2d, v4.2d 3056; CHECK-GI-NEXT: stp q5, q6, [x8, #64] 3057; CHECK-GI-NEXT: ucvtf v6.2d, v7.2d 3058; CHECK-GI-NEXT: ushll v5.2d, v18.2s, #0 3059; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 3060; CHECK-GI-NEXT: stp q16, q1, [x8, #96] 3061; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 3062; CHECK-GI-NEXT: ushll2 v7.2d, v18.4s, #0 3063; CHECK-GI-NEXT: ushll v1.2d, v3.2s, #0 3064; CHECK-GI-NEXT: ushll2 v3.2d, v3.4s, #0 3065; CHECK-GI-NEXT: ucvtf v5.2d, v5.2d 3066; CHECK-GI-NEXT: stp q4, q6, [x8, #128] 3067; CHECK-GI-NEXT: ucvtf v4.2d, v7.2d 3068; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 3069; CHECK-GI-NEXT: stp q0, q2, [x8, #160] 3070; CHECK-GI-NEXT: ucvtf v0.2d, v3.2d 3071; CHECK-GI-NEXT: stp q5, q4, [x8, #192] 3072; CHECK-GI-NEXT: stp q1, q0, [x8, #224] 3073; CHECK-GI-NEXT: ret 3074entry: 3075 %c = uitofp <32 x i16> %a to <32 x double> 3076 ret <32 x double> %c 3077} 3078 3079define <2 x fp128> @stofp_v2i8_v2f128(<2 x i8> %a) { 3080; CHECK-LABEL: stofp_v2i8_v2f128: 3081; CHECK: // %bb.0: // %entry 3082; CHECK-NEXT: sub sp, sp, #32 3083; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 3084; CHECK-NEXT: .cfi_def_cfa_offset 32 3085; CHECK-NEXT: .cfi_offset w30, -16 3086; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 3087; CHECK-NEXT: fmov w8, s0 3088; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 3089; CHECK-NEXT: sxtb w0, w8 3090; CHECK-NEXT: bl __floatsitf 3091; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 3092; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 3093; CHECK-NEXT: mov w8, v1.s[1] 3094; CHECK-NEXT: sxtb w0, w8 3095; CHECK-NEXT: bl __floatsitf 3096; CHECK-NEXT: mov v1.16b, v0.16b 3097; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 3098; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 3099; CHECK-NEXT: add sp, sp, #32 3100; CHECK-NEXT: ret 3101entry: 3102 %c = sitofp <2 x i8> %a to <2 x fp128> 3103 ret <2 x fp128> %c 3104} 3105 3106define <2 x fp128> @utofp_v2i8_v2f128(<2 x i8> %a) { 3107; CHECK-LABEL: utofp_v2i8_v2f128: 3108; CHECK: // %bb.0: // %entry 3109; CHECK-NEXT: sub sp, sp, #32 3110; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 3111; CHECK-NEXT: .cfi_def_cfa_offset 32 3112; CHECK-NEXT: .cfi_offset w30, -16 3113; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 3114; CHECK-NEXT: fmov w8, s0 3115; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 3116; CHECK-NEXT: and w0, w8, #0xff 3117; CHECK-NEXT: bl __floatunsitf 3118; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 3119; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 3120; CHECK-NEXT: mov w8, v1.s[1] 3121; CHECK-NEXT: and w0, w8, #0xff 3122; CHECK-NEXT: bl __floatunsitf 3123; CHECK-NEXT: mov v1.16b, v0.16b 3124; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 3125; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 3126; CHECK-NEXT: add sp, sp, #32 3127; CHECK-NEXT: ret 3128entry: 3129 %c = uitofp <2 x i8> %a to <2 x fp128> 3130 ret <2 x fp128> %c 3131} 3132 3133define <3 x fp128> @stofp_v2i8_v3f128(<3 x i8> %a) { 3134; CHECK-SD-LABEL: stofp_v2i8_v3f128: 3135; CHECK-SD: // %bb.0: // %entry 3136; CHECK-SD-NEXT: sub sp, sp, #64 3137; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 3138; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 3139; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 3140; CHECK-SD-NEXT: .cfi_offset w19, -8 3141; CHECK-SD-NEXT: .cfi_offset w20, -16 3142; CHECK-SD-NEXT: .cfi_offset w30, -32 3143; CHECK-SD-NEXT: sxtb w0, w0 3144; CHECK-SD-NEXT: mov w19, w2 3145; CHECK-SD-NEXT: mov w20, w1 3146; CHECK-SD-NEXT: bl __floatsitf 3147; CHECK-SD-NEXT: sxtb w0, w20 3148; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 3149; CHECK-SD-NEXT: bl __floatsitf 3150; CHECK-SD-NEXT: sxtb w0, w19 3151; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 3152; CHECK-SD-NEXT: bl __floatsitf 3153; CHECK-SD-NEXT: mov v2.16b, v0.16b 3154; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 3155; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 3156; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 3157; CHECK-SD-NEXT: add sp, sp, #64 3158; CHECK-SD-NEXT: ret 3159; 3160; CHECK-GI-LABEL: stofp_v2i8_v3f128: 3161; CHECK-GI: // %bb.0: // %entry 3162; CHECK-GI-NEXT: sub sp, sp, #64 3163; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 3164; CHECK-GI-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 3165; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 3166; CHECK-GI-NEXT: .cfi_offset w19, -8 3167; CHECK-GI-NEXT: .cfi_offset w20, -16 3168; CHECK-GI-NEXT: .cfi_offset w30, -32 3169; CHECK-GI-NEXT: sxtb w0, w0 3170; CHECK-GI-NEXT: mov w19, w1 3171; CHECK-GI-NEXT: mov w20, w2 3172; CHECK-GI-NEXT: bl __floatsitf 3173; CHECK-GI-NEXT: sxtb w0, w19 3174; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 3175; CHECK-GI-NEXT: bl __floatsitf 3176; CHECK-GI-NEXT: sxtb w0, w20 3177; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 3178; CHECK-GI-NEXT: bl __floatsitf 3179; CHECK-GI-NEXT: mov v2.16b, v0.16b 3180; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 3181; CHECK-GI-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 3182; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 3183; CHECK-GI-NEXT: add sp, sp, #64 3184; CHECK-GI-NEXT: ret 3185entry: 3186 %c = sitofp <3 x i8> %a to <3 x fp128> 3187 ret <3 x fp128> %c 3188} 3189 3190define <3 x fp128> @utofp_v2i8_v3f128(<3 x i8> %a) { 3191; CHECK-SD-LABEL: utofp_v2i8_v3f128: 3192; CHECK-SD: // %bb.0: // %entry 3193; CHECK-SD-NEXT: sub sp, sp, #64 3194; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 3195; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 3196; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 3197; CHECK-SD-NEXT: .cfi_offset w19, -8 3198; CHECK-SD-NEXT: .cfi_offset w20, -16 3199; CHECK-SD-NEXT: .cfi_offset w30, -32 3200; CHECK-SD-NEXT: and w0, w0, #0xff 3201; CHECK-SD-NEXT: mov w19, w2 3202; CHECK-SD-NEXT: mov w20, w1 3203; CHECK-SD-NEXT: bl __floatunsitf 3204; CHECK-SD-NEXT: and w0, w20, #0xff 3205; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 3206; CHECK-SD-NEXT: bl __floatunsitf 3207; CHECK-SD-NEXT: and w0, w19, #0xff 3208; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 3209; CHECK-SD-NEXT: bl __floatunsitf 3210; CHECK-SD-NEXT: mov v2.16b, v0.16b 3211; CHECK-SD-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 3212; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 3213; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 3214; CHECK-SD-NEXT: add sp, sp, #64 3215; CHECK-SD-NEXT: ret 3216; 3217; CHECK-GI-LABEL: utofp_v2i8_v3f128: 3218; CHECK-GI: // %bb.0: // %entry 3219; CHECK-GI-NEXT: sub sp, sp, #64 3220; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 3221; CHECK-GI-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 3222; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 3223; CHECK-GI-NEXT: .cfi_offset w19, -8 3224; CHECK-GI-NEXT: .cfi_offset w20, -16 3225; CHECK-GI-NEXT: .cfi_offset w30, -32 3226; CHECK-GI-NEXT: and w0, w0, #0xff 3227; CHECK-GI-NEXT: mov w19, w1 3228; CHECK-GI-NEXT: mov w20, w2 3229; CHECK-GI-NEXT: bl __floatunsitf 3230; CHECK-GI-NEXT: and w0, w19, #0xff 3231; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 3232; CHECK-GI-NEXT: bl __floatunsitf 3233; CHECK-GI-NEXT: and w0, w20, #0xff 3234; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 3235; CHECK-GI-NEXT: bl __floatunsitf 3236; CHECK-GI-NEXT: mov v2.16b, v0.16b 3237; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload 3238; CHECK-GI-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 3239; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 3240; CHECK-GI-NEXT: add sp, sp, #64 3241; CHECK-GI-NEXT: ret 3242entry: 3243 %c = uitofp <3 x i8> %a to <3 x fp128> 3244 ret <3 x fp128> %c 3245} 3246 3247define <2 x double> @stofp_v2i8_v2f64(<2 x i8> %a) { 3248; CHECK-SD-LABEL: stofp_v2i8_v2f64: 3249; CHECK-SD: // %bb.0: // %entry 3250; CHECK-SD-NEXT: shl v0.2s, v0.2s, #24 3251; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #24 3252; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 3253; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 3254; CHECK-SD-NEXT: ret 3255; 3256; CHECK-GI-LABEL: stofp_v2i8_v2f64: 3257; CHECK-GI: // %bb.0: // %entry 3258; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #0 3259; CHECK-GI-NEXT: shl v0.2d, v0.2d, #56 3260; CHECK-GI-NEXT: sshr v0.2d, v0.2d, #56 3261; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 3262; CHECK-GI-NEXT: ret 3263entry: 3264 %c = sitofp <2 x i8> %a to <2 x double> 3265 ret <2 x double> %c 3266} 3267 3268define <2 x double> @utofp_v2i8_v2f64(<2 x i8> %a) { 3269; CHECK-SD-LABEL: utofp_v2i8_v2f64: 3270; CHECK-SD: // %bb.0: // %entry 3271; CHECK-SD-NEXT: movi d1, #0x0000ff000000ff 3272; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b 3273; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 3274; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 3275; CHECK-SD-NEXT: ret 3276; 3277; CHECK-GI-LABEL: utofp_v2i8_v2f64: 3278; CHECK-GI: // %bb.0: // %entry 3279; CHECK-GI-NEXT: movi v1.2d, #0x000000000000ff 3280; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #0 3281; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b 3282; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 3283; CHECK-GI-NEXT: ret 3284entry: 3285 %c = uitofp <2 x i8> %a to <2 x double> 3286 ret <2 x double> %c 3287} 3288 3289define <3 x double> @stofp_v3i8_v3f64(<3 x i8> %a) { 3290; CHECK-SD-LABEL: stofp_v3i8_v3f64: 3291; CHECK-SD: // %bb.0: // %entry 3292; CHECK-SD-NEXT: fmov s0, w0 3293; CHECK-SD-NEXT: fmov s1, w2 3294; CHECK-SD-NEXT: mov v0.s[1], w1 3295; CHECK-SD-NEXT: shl v1.2s, v1.2s, #24 3296; CHECK-SD-NEXT: sshr v1.2s, v1.2s, #24 3297; CHECK-SD-NEXT: shl v0.2s, v0.2s, #24 3298; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 3299; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #24 3300; CHECK-SD-NEXT: scvtf v2.2d, v1.2d 3301; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 3302; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 3303; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 3304; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 3305; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 3306; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 3307; CHECK-SD-NEXT: ret 3308; 3309; CHECK-GI-LABEL: stofp_v3i8_v3f64: 3310; CHECK-GI: // %bb.0: // %entry 3311; CHECK-GI-NEXT: fmov s0, w0 3312; CHECK-GI-NEXT: mov v0.h[1], w1 3313; CHECK-GI-NEXT: mov v0.h[2], w2 3314; CHECK-GI-NEXT: shl v0.4h, v0.4h, #8 3315; CHECK-GI-NEXT: sshr v0.4h, v0.4h, #8 3316; CHECK-GI-NEXT: smov x8, v0.h[0] 3317; CHECK-GI-NEXT: smov x9, v0.h[1] 3318; CHECK-GI-NEXT: mov v1.d[0], x8 3319; CHECK-GI-NEXT: smov x8, v0.h[2] 3320; CHECK-GI-NEXT: mov v1.d[1], x9 3321; CHECK-GI-NEXT: smov x9, v0.h[3] 3322; CHECK-GI-NEXT: mov v2.d[0], x8 3323; CHECK-GI-NEXT: scvtf v0.2d, v1.2d 3324; CHECK-GI-NEXT: mov v2.d[1], x9 3325; CHECK-GI-NEXT: mov d1, v0.d[1] 3326; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 3327; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 3328; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 3329; CHECK-GI-NEXT: ret 3330entry: 3331 %c = sitofp <3 x i8> %a to <3 x double> 3332 ret <3 x double> %c 3333} 3334 3335define <3 x double> @utofp_v3i8_v3f64(<3 x i8> %a) { 3336; CHECK-SD-LABEL: utofp_v3i8_v3f64: 3337; CHECK-SD: // %bb.0: // %entry 3338; CHECK-SD-NEXT: fmov s0, w0 3339; CHECK-SD-NEXT: movi d1, #0x0000ff000000ff 3340; CHECK-SD-NEXT: fmov s2, w2 3341; CHECK-SD-NEXT: mov v0.s[1], w1 3342; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b 3343; CHECK-SD-NEXT: and v1.8b, v2.8b, v1.8b 3344; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 3345; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 3346; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 3347; CHECK-SD-NEXT: ucvtf v2.2d, v1.2d 3348; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 3349; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 3350; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 3351; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 3352; CHECK-SD-NEXT: ret 3353; 3354; CHECK-GI-LABEL: utofp_v3i8_v3f64: 3355; CHECK-GI: // %bb.0: // %entry 3356; CHECK-GI-NEXT: fmov s0, w0 3357; CHECK-GI-NEXT: movi d1, #0xff00ff00ff00ff 3358; CHECK-GI-NEXT: mov v0.h[1], w1 3359; CHECK-GI-NEXT: mov v0.h[2], w2 3360; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b 3361; CHECK-GI-NEXT: umov w8, v0.h[0] 3362; CHECK-GI-NEXT: umov w9, v0.h[1] 3363; CHECK-GI-NEXT: mov v1.d[0], x8 3364; CHECK-GI-NEXT: umov w8, v0.h[2] 3365; CHECK-GI-NEXT: mov v1.d[1], x9 3366; CHECK-GI-NEXT: umov w9, v0.h[3] 3367; CHECK-GI-NEXT: mov v2.d[0], x8 3368; CHECK-GI-NEXT: ucvtf v0.2d, v1.2d 3369; CHECK-GI-NEXT: mov v2.d[1], x9 3370; CHECK-GI-NEXT: mov d1, v0.d[1] 3371; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 3372; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 3373; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2 3374; CHECK-GI-NEXT: ret 3375entry: 3376 %c = uitofp <3 x i8> %a to <3 x double> 3377 ret <3 x double> %c 3378} 3379 3380define <4 x double> @stofp_v4i8_v4f64(<4 x i8> %a) { 3381; CHECK-SD-LABEL: stofp_v4i8_v4f64: 3382; CHECK-SD: // %bb.0: // %entry 3383; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 3384; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 3385; CHECK-SD-NEXT: shl v0.2s, v0.2s, #24 3386; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #24 3387; CHECK-SD-NEXT: shl v1.2s, v1.2s, #24 3388; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 3389; CHECK-SD-NEXT: sshr v1.2s, v1.2s, #24 3390; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 3391; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 3392; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 3393; CHECK-SD-NEXT: ret 3394; 3395; CHECK-GI-LABEL: stofp_v4i8_v4f64: 3396; CHECK-GI: // %bb.0: // %entry 3397; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 3398; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0 3399; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 3400; CHECK-GI-NEXT: shl v1.2d, v1.2d, #56 3401; CHECK-GI-NEXT: shl v0.2d, v0.2d, #56 3402; CHECK-GI-NEXT: sshr v1.2d, v1.2d, #56 3403; CHECK-GI-NEXT: sshr v2.2d, v0.2d, #56 3404; CHECK-GI-NEXT: scvtf v0.2d, v1.2d 3405; CHECK-GI-NEXT: scvtf v1.2d, v2.2d 3406; CHECK-GI-NEXT: ret 3407entry: 3408 %c = sitofp <4 x i8> %a to <4 x double> 3409 ret <4 x double> %c 3410} 3411 3412define <4 x double> @utofp_v4i8_v4f64(<4 x i8> %a) { 3413; CHECK-SD-LABEL: utofp_v4i8_v4f64: 3414; CHECK-SD: // %bb.0: // %entry 3415; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 3416; CHECK-SD-NEXT: movi d1, #0x0000ff000000ff 3417; CHECK-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8 3418; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b 3419; CHECK-SD-NEXT: and v1.8b, v2.8b, v1.8b 3420; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 3421; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 3422; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 3423; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 3424; CHECK-SD-NEXT: ret 3425; 3426; CHECK-GI-LABEL: utofp_v4i8_v4f64: 3427; CHECK-GI: // %bb.0: // %entry 3428; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 3429; CHECK-GI-NEXT: movi v1.2d, #0x000000000000ff 3430; CHECK-GI-NEXT: ushll v2.2d, v0.2s, #0 3431; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 3432; CHECK-GI-NEXT: and v2.16b, v2.16b, v1.16b 3433; CHECK-GI-NEXT: and v1.16b, v0.16b, v1.16b 3434; CHECK-GI-NEXT: ucvtf v0.2d, v2.2d 3435; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 3436; CHECK-GI-NEXT: ret 3437entry: 3438 %c = uitofp <4 x i8> %a to <4 x double> 3439 ret <4 x double> %c 3440} 3441 3442define <8 x double> @stofp_v8i8_v8f64(<8 x i8> %a) { 3443; CHECK-SD-LABEL: stofp_v8i8_v8f64: 3444; CHECK-SD: // %bb.0: // %entry 3445; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 3446; CHECK-SD-NEXT: umov w8, v0.b[0] 3447; CHECK-SD-NEXT: umov w9, v0.b[2] 3448; CHECK-SD-NEXT: umov w11, v0.b[4] 3449; CHECK-SD-NEXT: umov w12, v0.b[6] 3450; CHECK-SD-NEXT: umov w10, v0.b[1] 3451; CHECK-SD-NEXT: umov w13, v0.b[3] 3452; CHECK-SD-NEXT: umov w14, v0.b[5] 3453; CHECK-SD-NEXT: umov w15, v0.b[7] 3454; CHECK-SD-NEXT: fmov s0, w8 3455; CHECK-SD-NEXT: fmov s1, w9 3456; CHECK-SD-NEXT: fmov s2, w11 3457; CHECK-SD-NEXT: fmov s3, w12 3458; CHECK-SD-NEXT: mov v0.s[1], w10 3459; CHECK-SD-NEXT: mov v1.s[1], w13 3460; CHECK-SD-NEXT: mov v2.s[1], w14 3461; CHECK-SD-NEXT: mov v3.s[1], w15 3462; CHECK-SD-NEXT: shl v0.2s, v0.2s, #24 3463; CHECK-SD-NEXT: shl v1.2s, v1.2s, #24 3464; CHECK-SD-NEXT: shl v2.2s, v2.2s, #24 3465; CHECK-SD-NEXT: shl v3.2s, v3.2s, #24 3466; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #24 3467; CHECK-SD-NEXT: sshr v1.2s, v1.2s, #24 3468; CHECK-SD-NEXT: sshr v2.2s, v2.2s, #24 3469; CHECK-SD-NEXT: sshr v3.2s, v3.2s, #24 3470; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 3471; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 3472; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 3473; CHECK-SD-NEXT: sshll v3.2d, v3.2s, #0 3474; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 3475; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 3476; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 3477; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 3478; CHECK-SD-NEXT: ret 3479; 3480; CHECK-GI-LABEL: stofp_v8i8_v8f64: 3481; CHECK-GI: // %bb.0: // %entry 3482; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0 3483; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 3484; CHECK-GI-NEXT: sshll2 v0.4s, v0.8h, #0 3485; CHECK-GI-NEXT: sshll v2.2d, v1.2s, #0 3486; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 3487; CHECK-GI-NEXT: sshll v3.2d, v0.2s, #0 3488; CHECK-GI-NEXT: sshll2 v4.2d, v0.4s, #0 3489; CHECK-GI-NEXT: scvtf v0.2d, v2.2d 3490; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 3491; CHECK-GI-NEXT: scvtf v2.2d, v3.2d 3492; CHECK-GI-NEXT: scvtf v3.2d, v4.2d 3493; CHECK-GI-NEXT: ret 3494entry: 3495 %c = sitofp <8 x i8> %a to <8 x double> 3496 ret <8 x double> %c 3497} 3498 3499define <8 x double> @utofp_v8i8_v8f64(<8 x i8> %a) { 3500; CHECK-SD-LABEL: utofp_v8i8_v8f64: 3501; CHECK-SD: // %bb.0: // %entry 3502; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 3503; CHECK-SD-NEXT: umov w8, v0.b[0] 3504; CHECK-SD-NEXT: umov w9, v0.b[2] 3505; CHECK-SD-NEXT: umov w11, v0.b[4] 3506; CHECK-SD-NEXT: umov w12, v0.b[6] 3507; CHECK-SD-NEXT: umov w10, v0.b[1] 3508; CHECK-SD-NEXT: umov w13, v0.b[3] 3509; CHECK-SD-NEXT: umov w14, v0.b[5] 3510; CHECK-SD-NEXT: umov w15, v0.b[7] 3511; CHECK-SD-NEXT: movi d1, #0x0000ff000000ff 3512; CHECK-SD-NEXT: fmov s0, w8 3513; CHECK-SD-NEXT: fmov s2, w9 3514; CHECK-SD-NEXT: fmov s3, w11 3515; CHECK-SD-NEXT: fmov s4, w12 3516; CHECK-SD-NEXT: mov v0.s[1], w10 3517; CHECK-SD-NEXT: mov v2.s[1], w13 3518; CHECK-SD-NEXT: mov v3.s[1], w14 3519; CHECK-SD-NEXT: mov v4.s[1], w15 3520; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b 3521; CHECK-SD-NEXT: and v2.8b, v2.8b, v1.8b 3522; CHECK-SD-NEXT: and v3.8b, v3.8b, v1.8b 3523; CHECK-SD-NEXT: and v1.8b, v4.8b, v1.8b 3524; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 3525; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 3526; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #0 3527; CHECK-SD-NEXT: ushll v4.2d, v1.2s, #0 3528; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 3529; CHECK-SD-NEXT: ucvtf v1.2d, v2.2d 3530; CHECK-SD-NEXT: ucvtf v2.2d, v3.2d 3531; CHECK-SD-NEXT: ucvtf v3.2d, v4.2d 3532; CHECK-SD-NEXT: ret 3533; 3534; CHECK-GI-LABEL: utofp_v8i8_v8f64: 3535; CHECK-GI: // %bb.0: // %entry 3536; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0 3537; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 3538; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 3539; CHECK-GI-NEXT: ushll v2.2d, v1.2s, #0 3540; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 3541; CHECK-GI-NEXT: ushll v3.2d, v0.2s, #0 3542; CHECK-GI-NEXT: ushll2 v4.2d, v0.4s, #0 3543; CHECK-GI-NEXT: ucvtf v0.2d, v2.2d 3544; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 3545; CHECK-GI-NEXT: ucvtf v2.2d, v3.2d 3546; CHECK-GI-NEXT: ucvtf v3.2d, v4.2d 3547; CHECK-GI-NEXT: ret 3548entry: 3549 %c = uitofp <8 x i8> %a to <8 x double> 3550 ret <8 x double> %c 3551} 3552 3553define <16 x double> @stofp_v16i8_v16f64(<16 x i8> %a) { 3554; CHECK-SD-LABEL: stofp_v16i8_v16f64: 3555; CHECK-SD: // %bb.0: // %entry 3556; CHECK-SD-NEXT: umov w8, v0.b[0] 3557; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 3558; CHECK-SD-NEXT: umov w9, v0.b[1] 3559; CHECK-SD-NEXT: umov w10, v0.b[2] 3560; CHECK-SD-NEXT: umov w12, v0.b[4] 3561; CHECK-SD-NEXT: umov w14, v0.b[6] 3562; CHECK-SD-NEXT: umov w11, v0.b[3] 3563; CHECK-SD-NEXT: umov w13, v0.b[5] 3564; CHECK-SD-NEXT: fmov s2, w8 3565; CHECK-SD-NEXT: umov w15, v1.b[0] 3566; CHECK-SD-NEXT: umov w17, v1.b[2] 3567; CHECK-SD-NEXT: umov w0, v1.b[4] 3568; CHECK-SD-NEXT: umov w16, v1.b[1] 3569; CHECK-SD-NEXT: umov w18, v1.b[3] 3570; CHECK-SD-NEXT: umov w8, v0.b[7] 3571; CHECK-SD-NEXT: fmov s0, w10 3572; CHECK-SD-NEXT: umov w10, v1.b[5] 3573; CHECK-SD-NEXT: mov v2.s[1], w9 3574; CHECK-SD-NEXT: umov w9, v1.b[6] 3575; CHECK-SD-NEXT: fmov s3, w12 3576; CHECK-SD-NEXT: umov w12, v1.b[7] 3577; CHECK-SD-NEXT: fmov s1, w14 3578; CHECK-SD-NEXT: fmov s4, w15 3579; CHECK-SD-NEXT: fmov s5, w17 3580; CHECK-SD-NEXT: fmov s6, w0 3581; CHECK-SD-NEXT: mov v0.s[1], w11 3582; CHECK-SD-NEXT: mov v3.s[1], w13 3583; CHECK-SD-NEXT: fmov s7, w9 3584; CHECK-SD-NEXT: mov v1.s[1], w8 3585; CHECK-SD-NEXT: mov v4.s[1], w16 3586; CHECK-SD-NEXT: mov v5.s[1], w18 3587; CHECK-SD-NEXT: mov v6.s[1], w10 3588; CHECK-SD-NEXT: shl v2.2s, v2.2s, #24 3589; CHECK-SD-NEXT: shl v0.2s, v0.2s, #24 3590; CHECK-SD-NEXT: mov v7.s[1], w12 3591; CHECK-SD-NEXT: shl v3.2s, v3.2s, #24 3592; CHECK-SD-NEXT: shl v1.2s, v1.2s, #24 3593; CHECK-SD-NEXT: shl v4.2s, v4.2s, #24 3594; CHECK-SD-NEXT: sshr v2.2s, v2.2s, #24 3595; CHECK-SD-NEXT: shl v5.2s, v5.2s, #24 3596; CHECK-SD-NEXT: shl v6.2s, v6.2s, #24 3597; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #24 3598; CHECK-SD-NEXT: sshr v3.2s, v3.2s, #24 3599; CHECK-SD-NEXT: shl v7.2s, v7.2s, #24 3600; CHECK-SD-NEXT: sshr v4.2s, v4.2s, #24 3601; CHECK-SD-NEXT: sshr v1.2s, v1.2s, #24 3602; CHECK-SD-NEXT: sshr v5.2s, v5.2s, #24 3603; CHECK-SD-NEXT: sshr v6.2s, v6.2s, #24 3604; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 3605; CHECK-SD-NEXT: sshll v16.2d, v0.2s, #0 3606; CHECK-SD-NEXT: sshll v3.2d, v3.2s, #0 3607; CHECK-SD-NEXT: sshr v7.2s, v7.2s, #24 3608; CHECK-SD-NEXT: sshll v4.2d, v4.2s, #0 3609; CHECK-SD-NEXT: sshll v17.2d, v1.2s, #0 3610; CHECK-SD-NEXT: sshll v5.2d, v5.2s, #0 3611; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0 3612; CHECK-SD-NEXT: scvtf v0.2d, v2.2d 3613; CHECK-SD-NEXT: scvtf v1.2d, v16.2d 3614; CHECK-SD-NEXT: scvtf v2.2d, v3.2d 3615; CHECK-SD-NEXT: sshll v7.2d, v7.2s, #0 3616; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 3617; CHECK-SD-NEXT: scvtf v3.2d, v17.2d 3618; CHECK-SD-NEXT: scvtf v5.2d, v5.2d 3619; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 3620; CHECK-SD-NEXT: scvtf v7.2d, v7.2d 3621; CHECK-SD-NEXT: ret 3622; 3623; CHECK-GI-LABEL: stofp_v16i8_v16f64: 3624; CHECK-GI: // %bb.0: // %entry 3625; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0 3626; CHECK-GI-NEXT: sshll2 v0.8h, v0.16b, #0 3627; CHECK-GI-NEXT: sshll v2.4s, v1.4h, #0 3628; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 3629; CHECK-GI-NEXT: sshll v3.4s, v0.4h, #0 3630; CHECK-GI-NEXT: sshll2 v0.4s, v0.8h, #0 3631; CHECK-GI-NEXT: sshll v4.2d, v2.2s, #0 3632; CHECK-GI-NEXT: sshll2 v2.2d, v2.4s, #0 3633; CHECK-GI-NEXT: sshll v5.2d, v1.2s, #0 3634; CHECK-GI-NEXT: sshll2 v6.2d, v1.4s, #0 3635; CHECK-GI-NEXT: sshll v7.2d, v3.2s, #0 3636; CHECK-GI-NEXT: sshll2 v16.2d, v3.4s, #0 3637; CHECK-GI-NEXT: sshll v17.2d, v0.2s, #0 3638; CHECK-GI-NEXT: sshll2 v18.2d, v0.4s, #0 3639; CHECK-GI-NEXT: scvtf v0.2d, v4.2d 3640; CHECK-GI-NEXT: scvtf v1.2d, v2.2d 3641; CHECK-GI-NEXT: scvtf v2.2d, v5.2d 3642; CHECK-GI-NEXT: scvtf v3.2d, v6.2d 3643; CHECK-GI-NEXT: scvtf v4.2d, v7.2d 3644; CHECK-GI-NEXT: scvtf v5.2d, v16.2d 3645; CHECK-GI-NEXT: scvtf v6.2d, v17.2d 3646; CHECK-GI-NEXT: scvtf v7.2d, v18.2d 3647; CHECK-GI-NEXT: ret 3648entry: 3649 %c = sitofp <16 x i8> %a to <16 x double> 3650 ret <16 x double> %c 3651} 3652 3653define <16 x double> @utofp_v16i8_v16f64(<16 x i8> %a) { 3654; CHECK-SD-LABEL: utofp_v16i8_v16f64: 3655; CHECK-SD: // %bb.0: // %entry 3656; CHECK-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8 3657; CHECK-SD-NEXT: umov w8, v0.b[0] 3658; CHECK-SD-NEXT: umov w10, v0.b[2] 3659; CHECK-SD-NEXT: umov w9, v0.b[1] 3660; CHECK-SD-NEXT: umov w12, v0.b[4] 3661; CHECK-SD-NEXT: umov w11, v0.b[3] 3662; CHECK-SD-NEXT: umov w13, v0.b[5] 3663; CHECK-SD-NEXT: umov w18, v0.b[6] 3664; CHECK-SD-NEXT: movi d1, #0x0000ff000000ff 3665; CHECK-SD-NEXT: umov w14, v2.b[0] 3666; CHECK-SD-NEXT: umov w16, v2.b[2] 3667; CHECK-SD-NEXT: umov w0, v2.b[4] 3668; CHECK-SD-NEXT: fmov s3, w8 3669; CHECK-SD-NEXT: umov w8, v0.b[7] 3670; CHECK-SD-NEXT: fmov s0, w10 3671; CHECK-SD-NEXT: umov w10, v2.b[6] 3672; CHECK-SD-NEXT: umov w15, v2.b[1] 3673; CHECK-SD-NEXT: umov w17, v2.b[3] 3674; CHECK-SD-NEXT: fmov s4, w12 3675; CHECK-SD-NEXT: umov w12, v2.b[5] 3676; CHECK-SD-NEXT: fmov s7, w18 3677; CHECK-SD-NEXT: mov v3.s[1], w9 3678; CHECK-SD-NEXT: umov w9, v2.b[7] 3679; CHECK-SD-NEXT: fmov s2, w14 3680; CHECK-SD-NEXT: fmov s5, w16 3681; CHECK-SD-NEXT: fmov s6, w0 3682; CHECK-SD-NEXT: mov v0.s[1], w11 3683; CHECK-SD-NEXT: fmov s16, w10 3684; CHECK-SD-NEXT: mov v4.s[1], w13 3685; CHECK-SD-NEXT: mov v7.s[1], w8 3686; CHECK-SD-NEXT: mov v2.s[1], w15 3687; CHECK-SD-NEXT: mov v5.s[1], w17 3688; CHECK-SD-NEXT: mov v6.s[1], w12 3689; CHECK-SD-NEXT: and v3.8b, v3.8b, v1.8b 3690; CHECK-SD-NEXT: mov v16.s[1], w9 3691; CHECK-SD-NEXT: and v0.8b, v0.8b, v1.8b 3692; CHECK-SD-NEXT: and v4.8b, v4.8b, v1.8b 3693; CHECK-SD-NEXT: and v7.8b, v7.8b, v1.8b 3694; CHECK-SD-NEXT: and v2.8b, v2.8b, v1.8b 3695; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #0 3696; CHECK-SD-NEXT: and v5.8b, v5.8b, v1.8b 3697; CHECK-SD-NEXT: and v6.8b, v6.8b, v1.8b 3698; CHECK-SD-NEXT: and v1.8b, v16.8b, v1.8b 3699; CHECK-SD-NEXT: ushll v16.2d, v0.2s, #0 3700; CHECK-SD-NEXT: ushll v17.2d, v4.2s, #0 3701; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 3702; CHECK-SD-NEXT: ushll v7.2d, v7.2s, #0 3703; CHECK-SD-NEXT: ucvtf v0.2d, v3.2d 3704; CHECK-SD-NEXT: ushll v5.2d, v5.2s, #0 3705; CHECK-SD-NEXT: ushll v6.2d, v6.2s, #0 3706; CHECK-SD-NEXT: ushll v18.2d, v1.2s, #0 3707; CHECK-SD-NEXT: ucvtf v1.2d, v16.2d 3708; CHECK-SD-NEXT: ucvtf v4.2d, v2.2d 3709; CHECK-SD-NEXT: ucvtf v2.2d, v17.2d 3710; CHECK-SD-NEXT: ucvtf v3.2d, v7.2d 3711; CHECK-SD-NEXT: ucvtf v5.2d, v5.2d 3712; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 3713; CHECK-SD-NEXT: ucvtf v7.2d, v18.2d 3714; CHECK-SD-NEXT: ret 3715; 3716; CHECK-GI-LABEL: utofp_v16i8_v16f64: 3717; CHECK-GI: // %bb.0: // %entry 3718; CHECK-GI-NEXT: ushll v1.8h, v0.8b, #0 3719; CHECK-GI-NEXT: ushll2 v0.8h, v0.16b, #0 3720; CHECK-GI-NEXT: ushll v2.4s, v1.4h, #0 3721; CHECK-GI-NEXT: ushll2 v1.4s, v1.8h, #0 3722; CHECK-GI-NEXT: ushll v3.4s, v0.4h, #0 3723; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 3724; CHECK-GI-NEXT: ushll v4.2d, v2.2s, #0 3725; CHECK-GI-NEXT: ushll2 v2.2d, v2.4s, #0 3726; CHECK-GI-NEXT: ushll v5.2d, v1.2s, #0 3727; CHECK-GI-NEXT: ushll2 v6.2d, v1.4s, #0 3728; CHECK-GI-NEXT: ushll v7.2d, v3.2s, #0 3729; CHECK-GI-NEXT: ushll2 v16.2d, v3.4s, #0 3730; CHECK-GI-NEXT: ushll v17.2d, v0.2s, #0 3731; CHECK-GI-NEXT: ushll2 v18.2d, v0.4s, #0 3732; CHECK-GI-NEXT: ucvtf v0.2d, v4.2d 3733; CHECK-GI-NEXT: ucvtf v1.2d, v2.2d 3734; CHECK-GI-NEXT: ucvtf v2.2d, v5.2d 3735; CHECK-GI-NEXT: ucvtf v3.2d, v6.2d 3736; CHECK-GI-NEXT: ucvtf v4.2d, v7.2d 3737; CHECK-GI-NEXT: ucvtf v5.2d, v16.2d 3738; CHECK-GI-NEXT: ucvtf v6.2d, v17.2d 3739; CHECK-GI-NEXT: ucvtf v7.2d, v18.2d 3740; CHECK-GI-NEXT: ret 3741entry: 3742 %c = uitofp <16 x i8> %a to <16 x double> 3743 ret <16 x double> %c 3744} 3745 3746define <32 x double> @stofp_v32i8_v32f64(<32 x i8> %a) { 3747; CHECK-SD-LABEL: stofp_v32i8_v32f64: 3748; CHECK-SD: // %bb.0: // %entry 3749; CHECK-SD-NEXT: ext v3.16b, v0.16b, v0.16b, #8 3750; CHECK-SD-NEXT: ext v2.16b, v1.16b, v1.16b, #8 3751; CHECK-SD-NEXT: umov w9, v3.b[0] 3752; CHECK-SD-NEXT: umov w11, v3.b[4] 3753; CHECK-SD-NEXT: umov w13, v3.b[6] 3754; CHECK-SD-NEXT: umov w18, v2.b[2] 3755; CHECK-SD-NEXT: umov w10, v3.b[2] 3756; CHECK-SD-NEXT: umov w12, v3.b[1] 3757; CHECK-SD-NEXT: umov w16, v2.b[0] 3758; CHECK-SD-NEXT: umov w14, v3.b[3] 3759; CHECK-SD-NEXT: umov w15, v3.b[5] 3760; CHECK-SD-NEXT: umov w17, v3.b[7] 3761; CHECK-SD-NEXT: fmov s6, w9 3762; CHECK-SD-NEXT: fmov s5, w11 3763; CHECK-SD-NEXT: fmov s7, w13 3764; CHECK-SD-NEXT: umov w13, v2.b[4] 3765; CHECK-SD-NEXT: umov w11, v2.b[3] 3766; CHECK-SD-NEXT: umov w9, v2.b[6] 3767; CHECK-SD-NEXT: fmov s17, w18 3768; CHECK-SD-NEXT: fmov s4, w10 3769; CHECK-SD-NEXT: umov w10, v2.b[1] 3770; CHECK-SD-NEXT: mov v6.s[1], w12 3771; CHECK-SD-NEXT: fmov s3, w16 3772; CHECK-SD-NEXT: umov w12, v2.b[5] 3773; CHECK-SD-NEXT: mov v5.s[1], w15 3774; CHECK-SD-NEXT: umov w15, v1.b[0] 3775; CHECK-SD-NEXT: umov w16, v0.b[6] 3776; CHECK-SD-NEXT: fmov s16, w13 3777; CHECK-SD-NEXT: umov w13, v1.b[2] 3778; CHECK-SD-NEXT: mov v17.s[1], w11 3779; CHECK-SD-NEXT: umov w11, v1.b[6] 3780; CHECK-SD-NEXT: fmov s18, w9 3781; CHECK-SD-NEXT: umov w9, v1.b[4] 3782; CHECK-SD-NEXT: mov v3.s[1], w10 3783; CHECK-SD-NEXT: umov w10, v0.b[0] 3784; CHECK-SD-NEXT: mov v4.s[1], w14 3785; CHECK-SD-NEXT: mov v16.s[1], w12 3786; CHECK-SD-NEXT: umov w12, v1.b[7] 3787; CHECK-SD-NEXT: umov w14, v1.b[5] 3788; CHECK-SD-NEXT: fmov s20, w13 3789; CHECK-SD-NEXT: umov w13, v1.b[3] 3790; CHECK-SD-NEXT: fmov s22, w15 3791; CHECK-SD-NEXT: fmov s21, w11 3792; CHECK-SD-NEXT: umov w11, v1.b[1] 3793; CHECK-SD-NEXT: fmov s1, w9 3794; CHECK-SD-NEXT: fmov s19, w10 3795; CHECK-SD-NEXT: umov w10, v0.b[4] 3796; CHECK-SD-NEXT: umov w9, v0.b[7] 3797; CHECK-SD-NEXT: fmov s23, w16 3798; CHECK-SD-NEXT: mov v7.s[1], w17 3799; CHECK-SD-NEXT: shl v17.2s, v17.2s, #24 3800; CHECK-SD-NEXT: mov v21.s[1], w12 3801; CHECK-SD-NEXT: mov v1.s[1], w14 3802; CHECK-SD-NEXT: umov w14, v0.b[5] 3803; CHECK-SD-NEXT: umov w12, v0.b[1] 3804; CHECK-SD-NEXT: mov v20.s[1], w13 3805; CHECK-SD-NEXT: umov w13, v0.b[2] 3806; CHECK-SD-NEXT: mov v22.s[1], w11 3807; CHECK-SD-NEXT: umov w11, v0.b[3] 3808; CHECK-SD-NEXT: fmov s0, w10 3809; CHECK-SD-NEXT: mov v23.s[1], w9 3810; CHECK-SD-NEXT: umov w9, v2.b[7] 3811; CHECK-SD-NEXT: shl v16.2s, v16.2s, #24 3812; CHECK-SD-NEXT: shl v21.2s, v21.2s, #24 3813; CHECK-SD-NEXT: shl v1.2s, v1.2s, #24 3814; CHECK-SD-NEXT: sshr v17.2s, v17.2s, #24 3815; CHECK-SD-NEXT: mov v0.s[1], w14 3816; CHECK-SD-NEXT: fmov s24, w13 3817; CHECK-SD-NEXT: mov v19.s[1], w12 3818; CHECK-SD-NEXT: sshr v16.2s, v16.2s, #24 3819; CHECK-SD-NEXT: shl v6.2s, v6.2s, #24 3820; CHECK-SD-NEXT: shl v20.2s, v20.2s, #24 3821; CHECK-SD-NEXT: sshr v21.2s, v21.2s, #24 3822; CHECK-SD-NEXT: sshr v1.2s, v1.2s, #24 3823; CHECK-SD-NEXT: shl v2.2s, v23.2s, #24 3824; CHECK-SD-NEXT: mov v18.s[1], w9 3825; CHECK-SD-NEXT: mov v24.s[1], w11 3826; CHECK-SD-NEXT: shl v22.2s, v22.2s, #24 3827; CHECK-SD-NEXT: shl v0.2s, v0.2s, #24 3828; CHECK-SD-NEXT: shl v4.2s, v4.2s, #24 3829; CHECK-SD-NEXT: shl v5.2s, v5.2s, #24 3830; CHECK-SD-NEXT: sshll v21.2d, v21.2s, #0 3831; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 3832; CHECK-SD-NEXT: sshr v2.2s, v2.2s, #24 3833; CHECK-SD-NEXT: shl v7.2s, v7.2s, #24 3834; CHECK-SD-NEXT: shl v19.2s, v19.2s, #24 3835; CHECK-SD-NEXT: sshr v20.2s, v20.2s, #24 3836; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #24 3837; CHECK-SD-NEXT: shl v18.2s, v18.2s, #24 3838; CHECK-SD-NEXT: shl v23.2s, v24.2s, #24 3839; CHECK-SD-NEXT: scvtf v21.2d, v21.2d 3840; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 3841; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 3842; CHECK-SD-NEXT: sshr v22.2s, v22.2s, #24 3843; CHECK-SD-NEXT: sshr v19.2s, v19.2s, #24 3844; CHECK-SD-NEXT: sshr v5.2s, v5.2s, #24 3845; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 3846; CHECK-SD-NEXT: sshr v23.2s, v23.2s, #24 3847; CHECK-SD-NEXT: sshr v4.2s, v4.2s, #24 3848; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 3849; CHECK-SD-NEXT: sshr v6.2s, v6.2s, #24 3850; CHECK-SD-NEXT: sshll v20.2d, v20.2s, #0 3851; CHECK-SD-NEXT: stp q1, q21, [x8, #160] 3852; CHECK-SD-NEXT: shl v1.2s, v3.2s, #24 3853; CHECK-SD-NEXT: sshr v3.2s, v18.2s, #24 3854; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 3855; CHECK-SD-NEXT: sshll v22.2d, v22.2s, #0 3856; CHECK-SD-NEXT: sshll v18.2d, v23.2s, #0 3857; CHECK-SD-NEXT: sshll v19.2d, v19.2s, #0 3858; CHECK-SD-NEXT: sshll v5.2d, v5.2s, #0 3859; CHECK-SD-NEXT: sshll v4.2d, v4.2s, #0 3860; CHECK-SD-NEXT: sshr v1.2s, v1.2s, #24 3861; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0 3862; CHECK-SD-NEXT: scvtf v20.2d, v20.2d 3863; CHECK-SD-NEXT: scvtf v22.2d, v22.2d 3864; CHECK-SD-NEXT: stp q0, q2, [x8, #32] 3865; CHECK-SD-NEXT: sshll v2.2d, v3.2s, #0 3866; CHECK-SD-NEXT: sshll v3.2d, v16.2s, #0 3867; CHECK-SD-NEXT: sshll v16.2d, v17.2s, #0 3868; CHECK-SD-NEXT: sshll v1.2d, v1.2s, #0 3869; CHECK-SD-NEXT: sshr v0.2s, v7.2s, #24 3870; CHECK-SD-NEXT: scvtf v7.2d, v18.2d 3871; CHECK-SD-NEXT: scvtf v17.2d, v19.2d 3872; CHECK-SD-NEXT: stp q22, q20, [x8, #128] 3873; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 3874; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 3875; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 3876; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 3877; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 3878; CHECK-SD-NEXT: stp q17, q7, [x8] 3879; CHECK-SD-NEXT: stp q3, q2, [x8, #224] 3880; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 3881; CHECK-SD-NEXT: scvtf v2.2d, v5.2d 3882; CHECK-SD-NEXT: stp q1, q16, [x8, #192] 3883; CHECK-SD-NEXT: scvtf v3.2d, v4.2d 3884; CHECK-SD-NEXT: scvtf v1.2d, v6.2d 3885; CHECK-SD-NEXT: stp q2, q0, [x8, #96] 3886; CHECK-SD-NEXT: stp q1, q3, [x8, #64] 3887; CHECK-SD-NEXT: ret 3888; 3889; CHECK-GI-LABEL: stofp_v32i8_v32f64: 3890; CHECK-GI: // %bb.0: // %entry 3891; CHECK-GI-NEXT: sshll v2.8h, v0.8b, #0 3892; CHECK-GI-NEXT: sshll2 v0.8h, v0.16b, #0 3893; CHECK-GI-NEXT: sshll v4.8h, v1.8b, #0 3894; CHECK-GI-NEXT: sshll2 v1.8h, v1.16b, #0 3895; CHECK-GI-NEXT: sshll v3.4s, v2.4h, #0 3896; CHECK-GI-NEXT: sshll2 v2.4s, v2.8h, #0 3897; CHECK-GI-NEXT: sshll v6.4s, v0.4h, #0 3898; CHECK-GI-NEXT: sshll2 v0.4s, v0.8h, #0 3899; CHECK-GI-NEXT: sshll v16.4s, v4.4h, #0 3900; CHECK-GI-NEXT: sshll2 v4.4s, v4.8h, #0 3901; CHECK-GI-NEXT: sshll v18.4s, v1.4h, #0 3902; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 3903; CHECK-GI-NEXT: sshll v5.2d, v3.2s, #0 3904; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 3905; CHECK-GI-NEXT: sshll v7.2d, v2.2s, #0 3906; CHECK-GI-NEXT: sshll2 v2.2d, v2.4s, #0 3907; CHECK-GI-NEXT: sshll v17.2d, v6.2s, #0 3908; CHECK-GI-NEXT: sshll2 v6.2d, v6.4s, #0 3909; CHECK-GI-NEXT: sshll v19.2d, v0.2s, #0 3910; CHECK-GI-NEXT: sshll2 v0.2d, v0.4s, #0 3911; CHECK-GI-NEXT: sshll v20.2d, v16.2s, #0 3912; CHECK-GI-NEXT: scvtf v5.2d, v5.2d 3913; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 3914; CHECK-GI-NEXT: scvtf v7.2d, v7.2d 3915; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 3916; CHECK-GI-NEXT: scvtf v17.2d, v17.2d 3917; CHECK-GI-NEXT: scvtf v6.2d, v6.2d 3918; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 3919; CHECK-GI-NEXT: stp q5, q3, [x8] 3920; CHECK-GI-NEXT: sshll2 v5.2d, v16.4s, #0 3921; CHECK-GI-NEXT: scvtf v16.2d, v19.2d 3922; CHECK-GI-NEXT: stp q7, q2, [x8, #32] 3923; CHECK-GI-NEXT: scvtf v2.2d, v20.2d 3924; CHECK-GI-NEXT: sshll v3.2d, v4.2s, #0 3925; CHECK-GI-NEXT: stp q17, q6, [x8, #64] 3926; CHECK-GI-NEXT: sshll2 v4.2d, v4.4s, #0 3927; CHECK-GI-NEXT: sshll v6.2d, v18.2s, #0 3928; CHECK-GI-NEXT: scvtf v5.2d, v5.2d 3929; CHECK-GI-NEXT: sshll2 v7.2d, v18.4s, #0 3930; CHECK-GI-NEXT: stp q16, q0, [x8, #96] 3931; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0 3932; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 3933; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 3934; CHECK-GI-NEXT: scvtf v4.2d, v4.2d 3935; CHECK-GI-NEXT: scvtf v6.2d, v6.2d 3936; CHECK-GI-NEXT: stp q2, q5, [x8, #128] 3937; CHECK-GI-NEXT: scvtf v2.2d, v7.2d 3938; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 3939; CHECK-GI-NEXT: scvtf v1.2d, v1.2d 3940; CHECK-GI-NEXT: stp q3, q4, [x8, #160] 3941; CHECK-GI-NEXT: stp q6, q2, [x8, #192] 3942; CHECK-GI-NEXT: stp q0, q1, [x8, #224] 3943; CHECK-GI-NEXT: ret 3944entry: 3945 %c = sitofp <32 x i8> %a to <32 x double> 3946 ret <32 x double> %c 3947} 3948 3949define <32 x double> @utofp_v32i8_v32f64(<32 x i8> %a) { 3950; CHECK-SD-LABEL: utofp_v32i8_v32f64: 3951; CHECK-SD: // %bb.0: // %entry 3952; CHECK-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8 3953; CHECK-SD-NEXT: ext v16.16b, v1.16b, v1.16b, #8 3954; CHECK-SD-NEXT: movi d3, #0x0000ff000000ff 3955; CHECK-SD-NEXT: umov w11, v2.b[0] 3956; CHECK-SD-NEXT: umov w14, v2.b[4] 3957; CHECK-SD-NEXT: umov w12, v2.b[2] 3958; CHECK-SD-NEXT: umov w15, v2.b[6] 3959; CHECK-SD-NEXT: umov w16, v2.b[1] 3960; CHECK-SD-NEXT: umov w13, v16.b[2] 3961; CHECK-SD-NEXT: umov w17, v16.b[0] 3962; CHECK-SD-NEXT: umov w9, v2.b[3] 3963; CHECK-SD-NEXT: umov w10, v2.b[5] 3964; CHECK-SD-NEXT: fmov s4, w11 3965; CHECK-SD-NEXT: fmov s6, w14 3966; CHECK-SD-NEXT: umov w14, v16.b[6] 3967; CHECK-SD-NEXT: fmov s5, w12 3968; CHECK-SD-NEXT: umov w12, v16.b[4] 3969; CHECK-SD-NEXT: umov w11, v16.b[1] 3970; CHECK-SD-NEXT: fmov s7, w15 3971; CHECK-SD-NEXT: umov w15, v16.b[7] 3972; CHECK-SD-NEXT: fmov s18, w13 3973; CHECK-SD-NEXT: mov v4.s[1], w16 3974; CHECK-SD-NEXT: umov w16, v1.b[4] 3975; CHECK-SD-NEXT: umov w13, v1.b[6] 3976; CHECK-SD-NEXT: fmov s17, w17 3977; CHECK-SD-NEXT: fmov s20, w14 3978; CHECK-SD-NEXT: mov v5.s[1], w9 3979; CHECK-SD-NEXT: umov w9, v1.b[7] 3980; CHECK-SD-NEXT: fmov s19, w12 3981; CHECK-SD-NEXT: mov v6.s[1], w10 3982; CHECK-SD-NEXT: umov w10, v1.b[2] 3983; CHECK-SD-NEXT: umov w12, v0.b[6] 3984; CHECK-SD-NEXT: umov w14, v1.b[0] 3985; CHECK-SD-NEXT: mov v17.s[1], w11 3986; CHECK-SD-NEXT: mov v20.s[1], w15 3987; CHECK-SD-NEXT: umov w11, v1.b[5] 3988; CHECK-SD-NEXT: umov w15, v1.b[3] 3989; CHECK-SD-NEXT: fmov s21, w16 3990; CHECK-SD-NEXT: umov w16, v1.b[1] 3991; CHECK-SD-NEXT: fmov s1, w13 3992; CHECK-SD-NEXT: umov w13, v0.b[4] 3993; CHECK-SD-NEXT: and v6.8b, v6.8b, v3.8b 3994; CHECK-SD-NEXT: fmov s22, w10 3995; CHECK-SD-NEXT: fmov s23, w12 3996; CHECK-SD-NEXT: fmov s24, w14 3997; CHECK-SD-NEXT: mov v21.s[1], w11 3998; CHECK-SD-NEXT: umov w10, v0.b[5] 3999; CHECK-SD-NEXT: umov w12, v0.b[0] 4000; CHECK-SD-NEXT: mov v1.s[1], w9 4001; CHECK-SD-NEXT: umov w9, v0.b[7] 4002; CHECK-SD-NEXT: umov w11, v16.b[3] 4003; CHECK-SD-NEXT: mov v22.s[1], w15 4004; CHECK-SD-NEXT: mov v24.s[1], w16 4005; CHECK-SD-NEXT: fmov s25, w13 4006; CHECK-SD-NEXT: umov w13, v0.b[3] 4007; CHECK-SD-NEXT: and v20.8b, v20.8b, v3.8b 4008; CHECK-SD-NEXT: and v5.8b, v5.8b, v3.8b 4009; CHECK-SD-NEXT: and v21.8b, v21.8b, v3.8b 4010; CHECK-SD-NEXT: mov v23.s[1], w9 4011; CHECK-SD-NEXT: umov w9, v0.b[2] 4012; CHECK-SD-NEXT: and v1.8b, v1.8b, v3.8b 4013; CHECK-SD-NEXT: mov v25.s[1], w10 4014; CHECK-SD-NEXT: umov w10, v0.b[1] 4015; CHECK-SD-NEXT: and v0.8b, v22.8b, v3.8b 4016; CHECK-SD-NEXT: fmov s22, w12 4017; CHECK-SD-NEXT: and v24.8b, v24.8b, v3.8b 4018; CHECK-SD-NEXT: umov w12, v16.b[5] 4019; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 4020; CHECK-SD-NEXT: ushll v21.2d, v21.2s, #0 4021; CHECK-SD-NEXT: mov v18.s[1], w11 4022; CHECK-SD-NEXT: and v16.8b, v23.8b, v3.8b 4023; CHECK-SD-NEXT: fmov s23, w9 4024; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 4025; CHECK-SD-NEXT: and v25.8b, v25.8b, v3.8b 4026; CHECK-SD-NEXT: ushll v24.2d, v24.2s, #0 4027; CHECK-SD-NEXT: mov v22.s[1], w10 4028; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 4029; CHECK-SD-NEXT: ucvtf v21.2d, v21.2d 4030; CHECK-SD-NEXT: umov w9, v2.b[7] 4031; CHECK-SD-NEXT: mov v23.s[1], w13 4032; CHECK-SD-NEXT: ushll v16.2d, v16.2s, #0 4033; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 4034; CHECK-SD-NEXT: ushll v2.2d, v25.2s, #0 4035; CHECK-SD-NEXT: mov v19.s[1], w12 4036; CHECK-SD-NEXT: ucvtf v24.2d, v24.2d 4037; CHECK-SD-NEXT: and v18.8b, v18.8b, v3.8b 4038; CHECK-SD-NEXT: stp q21, q1, [x8, #160] 4039; CHECK-SD-NEXT: and v1.8b, v22.8b, v3.8b 4040; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 4041; CHECK-SD-NEXT: and v23.8b, v23.8b, v3.8b 4042; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 4043; CHECK-SD-NEXT: mov v7.s[1], w9 4044; CHECK-SD-NEXT: stp q24, q0, [x8, #128] 4045; CHECK-SD-NEXT: and v0.8b, v19.8b, v3.8b 4046; CHECK-SD-NEXT: ushll v18.2d, v18.2s, #0 4047; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 4048; CHECK-SD-NEXT: ushll v19.2d, v23.2s, #0 4049; CHECK-SD-NEXT: stp q2, q16, [x8, #32] 4050; CHECK-SD-NEXT: and v16.8b, v17.8b, v3.8b 4051; CHECK-SD-NEXT: ushll v17.2d, v20.2s, #0 4052; CHECK-SD-NEXT: and v2.8b, v7.8b, v3.8b 4053; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 4054; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 4055; CHECK-SD-NEXT: ucvtf v7.2d, v19.2d 4056; CHECK-SD-NEXT: and v3.8b, v4.8b, v3.8b 4057; CHECK-SD-NEXT: ushll v4.2d, v6.2s, #0 4058; CHECK-SD-NEXT: ucvtf v17.2d, v17.2d 4059; CHECK-SD-NEXT: ushll v16.2d, v16.2s, #0 4060; CHECK-SD-NEXT: ucvtf v6.2d, v18.2d 4061; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 4062; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 4063; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #0 4064; CHECK-SD-NEXT: stp q1, q7, [x8] 4065; CHECK-SD-NEXT: ushll v1.2d, v5.2s, #0 4066; CHECK-SD-NEXT: ucvtf v5.2d, v16.2d 4067; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 4068; CHECK-SD-NEXT: stp q0, q17, [x8, #224] 4069; CHECK-SD-NEXT: ucvtf v0.2d, v4.2d 4070; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 4071; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 4072; CHECK-SD-NEXT: stp q5, q6, [x8, #192] 4073; CHECK-SD-NEXT: stp q0, q2, [x8, #96] 4074; CHECK-SD-NEXT: stp q3, q1, [x8, #64] 4075; CHECK-SD-NEXT: ret 4076; 4077; CHECK-GI-LABEL: utofp_v32i8_v32f64: 4078; CHECK-GI: // %bb.0: // %entry 4079; CHECK-GI-NEXT: ushll v2.8h, v0.8b, #0 4080; CHECK-GI-NEXT: ushll2 v0.8h, v0.16b, #0 4081; CHECK-GI-NEXT: ushll v4.8h, v1.8b, #0 4082; CHECK-GI-NEXT: ushll2 v1.8h, v1.16b, #0 4083; CHECK-GI-NEXT: ushll v3.4s, v2.4h, #0 4084; CHECK-GI-NEXT: ushll2 v2.4s, v2.8h, #0 4085; CHECK-GI-NEXT: ushll v6.4s, v0.4h, #0 4086; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 4087; CHECK-GI-NEXT: ushll v16.4s, v4.4h, #0 4088; CHECK-GI-NEXT: ushll2 v4.4s, v4.8h, #0 4089; CHECK-GI-NEXT: ushll v18.4s, v1.4h, #0 4090; CHECK-GI-NEXT: ushll2 v1.4s, v1.8h, #0 4091; CHECK-GI-NEXT: ushll v5.2d, v3.2s, #0 4092; CHECK-GI-NEXT: ushll2 v3.2d, v3.4s, #0 4093; CHECK-GI-NEXT: ushll v7.2d, v2.2s, #0 4094; CHECK-GI-NEXT: ushll2 v2.2d, v2.4s, #0 4095; CHECK-GI-NEXT: ushll v17.2d, v6.2s, #0 4096; CHECK-GI-NEXT: ushll2 v6.2d, v6.4s, #0 4097; CHECK-GI-NEXT: ushll v19.2d, v0.2s, #0 4098; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 4099; CHECK-GI-NEXT: ushll v20.2d, v16.2s, #0 4100; CHECK-GI-NEXT: ucvtf v5.2d, v5.2d 4101; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 4102; CHECK-GI-NEXT: ucvtf v7.2d, v7.2d 4103; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 4104; CHECK-GI-NEXT: ucvtf v17.2d, v17.2d 4105; CHECK-GI-NEXT: ucvtf v6.2d, v6.2d 4106; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 4107; CHECK-GI-NEXT: stp q5, q3, [x8] 4108; CHECK-GI-NEXT: ushll2 v5.2d, v16.4s, #0 4109; CHECK-GI-NEXT: ucvtf v16.2d, v19.2d 4110; CHECK-GI-NEXT: stp q7, q2, [x8, #32] 4111; CHECK-GI-NEXT: ucvtf v2.2d, v20.2d 4112; CHECK-GI-NEXT: ushll v3.2d, v4.2s, #0 4113; CHECK-GI-NEXT: stp q17, q6, [x8, #64] 4114; CHECK-GI-NEXT: ushll2 v4.2d, v4.4s, #0 4115; CHECK-GI-NEXT: ushll v6.2d, v18.2s, #0 4116; CHECK-GI-NEXT: ucvtf v5.2d, v5.2d 4117; CHECK-GI-NEXT: ushll2 v7.2d, v18.4s, #0 4118; CHECK-GI-NEXT: stp q16, q0, [x8, #96] 4119; CHECK-GI-NEXT: ushll v0.2d, v1.2s, #0 4120; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 4121; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 4122; CHECK-GI-NEXT: ucvtf v4.2d, v4.2d 4123; CHECK-GI-NEXT: ucvtf v6.2d, v6.2d 4124; CHECK-GI-NEXT: stp q2, q5, [x8, #128] 4125; CHECK-GI-NEXT: ucvtf v2.2d, v7.2d 4126; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 4127; CHECK-GI-NEXT: ucvtf v1.2d, v1.2d 4128; CHECK-GI-NEXT: stp q3, q4, [x8, #160] 4129; CHECK-GI-NEXT: stp q6, q2, [x8, #192] 4130; CHECK-GI-NEXT: stp q0, q1, [x8, #224] 4131; CHECK-GI-NEXT: ret 4132entry: 4133 %c = uitofp <32 x i8> %a to <32 x double> 4134 ret <32 x double> %c 4135} 4136 4137define <2 x float> @stofp_v2i128_v2f32(<2 x i128> %a) { 4138; CHECK-SD-LABEL: stofp_v2i128_v2f32: 4139; CHECK-SD: // %bb.0: // %entry 4140; CHECK-SD-NEXT: sub sp, sp, #48 4141; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 4142; CHECK-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 4143; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 4144; CHECK-SD-NEXT: .cfi_offset w19, -8 4145; CHECK-SD-NEXT: .cfi_offset w20, -16 4146; CHECK-SD-NEXT: .cfi_offset w30, -32 4147; CHECK-SD-NEXT: mov x19, x1 4148; CHECK-SD-NEXT: mov x20, x0 4149; CHECK-SD-NEXT: mov x0, x2 4150; CHECK-SD-NEXT: mov x1, x3 4151; CHECK-SD-NEXT: bl __floattisf 4152; CHECK-SD-NEXT: mov x0, x20 4153; CHECK-SD-NEXT: mov x1, x19 4154; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4155; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 4156; CHECK-SD-NEXT: bl __floattisf 4157; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4158; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4159; CHECK-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 4160; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 4161; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 4162; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 4163; CHECK-SD-NEXT: add sp, sp, #48 4164; CHECK-SD-NEXT: ret 4165; 4166; CHECK-GI-LABEL: stofp_v2i128_v2f32: 4167; CHECK-GI: // %bb.0: // %entry 4168; CHECK-GI-NEXT: sub sp, sp, #48 4169; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 4170; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 4171; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 4172; CHECK-GI-NEXT: .cfi_offset w19, -8 4173; CHECK-GI-NEXT: .cfi_offset w20, -16 4174; CHECK-GI-NEXT: .cfi_offset w30, -32 4175; CHECK-GI-NEXT: mov x19, x2 4176; CHECK-GI-NEXT: mov x20, x3 4177; CHECK-GI-NEXT: bl __floattisf 4178; CHECK-GI-NEXT: mov x0, x19 4179; CHECK-GI-NEXT: mov x1, x20 4180; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4181; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 4182; CHECK-GI-NEXT: bl __floattisf 4183; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4184; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4185; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 4186; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 4187; CHECK-GI-NEXT: mov v1.s[1], v0.s[0] 4188; CHECK-GI-NEXT: fmov d0, d1 4189; CHECK-GI-NEXT: add sp, sp, #48 4190; CHECK-GI-NEXT: ret 4191entry: 4192 %c = sitofp <2 x i128> %a to <2 x float> 4193 ret <2 x float> %c 4194} 4195 4196define <2 x float> @utofp_v2i128_v2f32(<2 x i128> %a) { 4197; CHECK-SD-LABEL: utofp_v2i128_v2f32: 4198; CHECK-SD: // %bb.0: // %entry 4199; CHECK-SD-NEXT: sub sp, sp, #48 4200; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 4201; CHECK-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 4202; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 4203; CHECK-SD-NEXT: .cfi_offset w19, -8 4204; CHECK-SD-NEXT: .cfi_offset w20, -16 4205; CHECK-SD-NEXT: .cfi_offset w30, -32 4206; CHECK-SD-NEXT: mov x19, x1 4207; CHECK-SD-NEXT: mov x20, x0 4208; CHECK-SD-NEXT: mov x0, x2 4209; CHECK-SD-NEXT: mov x1, x3 4210; CHECK-SD-NEXT: bl __floatuntisf 4211; CHECK-SD-NEXT: mov x0, x20 4212; CHECK-SD-NEXT: mov x1, x19 4213; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4214; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 4215; CHECK-SD-NEXT: bl __floatuntisf 4216; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4217; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4218; CHECK-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 4219; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 4220; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 4221; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 4222; CHECK-SD-NEXT: add sp, sp, #48 4223; CHECK-SD-NEXT: ret 4224; 4225; CHECK-GI-LABEL: utofp_v2i128_v2f32: 4226; CHECK-GI: // %bb.0: // %entry 4227; CHECK-GI-NEXT: sub sp, sp, #48 4228; CHECK-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 4229; CHECK-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 4230; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 4231; CHECK-GI-NEXT: .cfi_offset w19, -8 4232; CHECK-GI-NEXT: .cfi_offset w20, -16 4233; CHECK-GI-NEXT: .cfi_offset w30, -32 4234; CHECK-GI-NEXT: mov x19, x2 4235; CHECK-GI-NEXT: mov x20, x3 4236; CHECK-GI-NEXT: bl __floatuntisf 4237; CHECK-GI-NEXT: mov x0, x19 4238; CHECK-GI-NEXT: mov x1, x20 4239; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4240; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 4241; CHECK-GI-NEXT: bl __floatuntisf 4242; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4243; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4244; CHECK-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 4245; CHECK-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 4246; CHECK-GI-NEXT: mov v1.s[1], v0.s[0] 4247; CHECK-GI-NEXT: fmov d0, d1 4248; CHECK-GI-NEXT: add sp, sp, #48 4249; CHECK-GI-NEXT: ret 4250entry: 4251 %c = uitofp <2 x i128> %a to <2 x float> 4252 ret <2 x float> %c 4253} 4254 4255define <3 x float> @stofp_v3i128_v3f32(<3 x i128> %a) { 4256; CHECK-SD-LABEL: stofp_v3i128_v3f32: 4257; CHECK-SD: // %bb.0: // %entry 4258; CHECK-SD-NEXT: sub sp, sp, #64 4259; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 4260; CHECK-SD-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 4261; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 4262; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 4263; CHECK-SD-NEXT: .cfi_offset w19, -8 4264; CHECK-SD-NEXT: .cfi_offset w20, -16 4265; CHECK-SD-NEXT: .cfi_offset w21, -24 4266; CHECK-SD-NEXT: .cfi_offset w22, -32 4267; CHECK-SD-NEXT: .cfi_offset w30, -48 4268; CHECK-SD-NEXT: mov x21, x1 4269; CHECK-SD-NEXT: mov x22, x0 4270; CHECK-SD-NEXT: mov x0, x2 4271; CHECK-SD-NEXT: mov x1, x3 4272; CHECK-SD-NEXT: mov x19, x5 4273; CHECK-SD-NEXT: mov x20, x4 4274; CHECK-SD-NEXT: bl __floattisf 4275; CHECK-SD-NEXT: mov x0, x22 4276; CHECK-SD-NEXT: mov x1, x21 4277; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4278; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 4279; CHECK-SD-NEXT: bl __floattisf 4280; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4281; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4282; CHECK-SD-NEXT: mov x0, x20 4283; CHECK-SD-NEXT: mov x1, x19 4284; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 4285; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 4286; CHECK-SD-NEXT: bl __floattisf 4287; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4288; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4289; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 4290; CHECK-SD-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 4291; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 4292; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 4293; CHECK-SD-NEXT: mov v0.16b, v1.16b 4294; CHECK-SD-NEXT: add sp, sp, #64 4295; CHECK-SD-NEXT: ret 4296; 4297; CHECK-GI-LABEL: stofp_v3i128_v3f32: 4298; CHECK-GI: // %bb.0: // %entry 4299; CHECK-GI-NEXT: sub sp, sp, #80 4300; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 4301; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 4302; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 4303; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 4304; CHECK-GI-NEXT: .cfi_offset w19, -8 4305; CHECK-GI-NEXT: .cfi_offset w20, -16 4306; CHECK-GI-NEXT: .cfi_offset w21, -24 4307; CHECK-GI-NEXT: .cfi_offset w22, -32 4308; CHECK-GI-NEXT: .cfi_offset w30, -48 4309; CHECK-GI-NEXT: mov x19, x2 4310; CHECK-GI-NEXT: mov x20, x3 4311; CHECK-GI-NEXT: mov x21, x4 4312; CHECK-GI-NEXT: mov x22, x5 4313; CHECK-GI-NEXT: bl __floattisf 4314; CHECK-GI-NEXT: mov x0, x19 4315; CHECK-GI-NEXT: mov x1, x20 4316; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4317; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 4318; CHECK-GI-NEXT: bl __floattisf 4319; CHECK-GI-NEXT: mov x0, x21 4320; CHECK-GI-NEXT: mov x1, x22 4321; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4322; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 4323; CHECK-GI-NEXT: bl __floattisf 4324; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 4325; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4326; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 4327; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 4328; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 4329; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 4330; CHECK-GI-NEXT: mov v1.s[2], v0.s[0] 4331; CHECK-GI-NEXT: mov v0.16b, v1.16b 4332; CHECK-GI-NEXT: add sp, sp, #80 4333; CHECK-GI-NEXT: ret 4334entry: 4335 %c = sitofp <3 x i128> %a to <3 x float> 4336 ret <3 x float> %c 4337} 4338 4339define <3 x float> @utofp_v3i128_v3f32(<3 x i128> %a) { 4340; CHECK-SD-LABEL: utofp_v3i128_v3f32: 4341; CHECK-SD: // %bb.0: // %entry 4342; CHECK-SD-NEXT: sub sp, sp, #64 4343; CHECK-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 4344; CHECK-SD-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 4345; CHECK-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 4346; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 4347; CHECK-SD-NEXT: .cfi_offset w19, -8 4348; CHECK-SD-NEXT: .cfi_offset w20, -16 4349; CHECK-SD-NEXT: .cfi_offset w21, -24 4350; CHECK-SD-NEXT: .cfi_offset w22, -32 4351; CHECK-SD-NEXT: .cfi_offset w30, -48 4352; CHECK-SD-NEXT: mov x21, x1 4353; CHECK-SD-NEXT: mov x22, x0 4354; CHECK-SD-NEXT: mov x0, x2 4355; CHECK-SD-NEXT: mov x1, x3 4356; CHECK-SD-NEXT: mov x19, x5 4357; CHECK-SD-NEXT: mov x20, x4 4358; CHECK-SD-NEXT: bl __floatuntisf 4359; CHECK-SD-NEXT: mov x0, x22 4360; CHECK-SD-NEXT: mov x1, x21 4361; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4362; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 4363; CHECK-SD-NEXT: bl __floatuntisf 4364; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4365; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4366; CHECK-SD-NEXT: mov x0, x20 4367; CHECK-SD-NEXT: mov x1, x19 4368; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 4369; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 4370; CHECK-SD-NEXT: bl __floatuntisf 4371; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 4372; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 4373; CHECK-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 4374; CHECK-SD-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 4375; CHECK-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 4376; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 4377; CHECK-SD-NEXT: mov v0.16b, v1.16b 4378; CHECK-SD-NEXT: add sp, sp, #64 4379; CHECK-SD-NEXT: ret 4380; 4381; CHECK-GI-LABEL: utofp_v3i128_v3f32: 4382; CHECK-GI: // %bb.0: // %entry 4383; CHECK-GI-NEXT: sub sp, sp, #80 4384; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 4385; CHECK-GI-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 4386; CHECK-GI-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 4387; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 4388; CHECK-GI-NEXT: .cfi_offset w19, -8 4389; CHECK-GI-NEXT: .cfi_offset w20, -16 4390; CHECK-GI-NEXT: .cfi_offset w21, -24 4391; CHECK-GI-NEXT: .cfi_offset w22, -32 4392; CHECK-GI-NEXT: .cfi_offset w30, -48 4393; CHECK-GI-NEXT: mov x19, x2 4394; CHECK-GI-NEXT: mov x20, x3 4395; CHECK-GI-NEXT: mov x21, x4 4396; CHECK-GI-NEXT: mov x22, x5 4397; CHECK-GI-NEXT: bl __floatuntisf 4398; CHECK-GI-NEXT: mov x0, x19 4399; CHECK-GI-NEXT: mov x1, x20 4400; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4401; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 4402; CHECK-GI-NEXT: bl __floatuntisf 4403; CHECK-GI-NEXT: mov x0, x21 4404; CHECK-GI-NEXT: mov x1, x22 4405; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4406; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 4407; CHECK-GI-NEXT: bl __floatuntisf 4408; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 4409; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 4410; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 4411; CHECK-GI-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 4412; CHECK-GI-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 4413; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 4414; CHECK-GI-NEXT: mov v1.s[2], v0.s[0] 4415; CHECK-GI-NEXT: mov v0.16b, v1.16b 4416; CHECK-GI-NEXT: add sp, sp, #80 4417; CHECK-GI-NEXT: ret 4418entry: 4419 %c = uitofp <3 x i128> %a to <3 x float> 4420 ret <3 x float> %c 4421} 4422 4423define <2 x float> @stofp_v2i64_v2f32(<2 x i64> %a) { 4424; CHECK-LABEL: stofp_v2i64_v2f32: 4425; CHECK: // %bb.0: // %entry 4426; CHECK-NEXT: scvtf v0.2d, v0.2d 4427; CHECK-NEXT: fcvtn v0.2s, v0.2d 4428; CHECK-NEXT: ret 4429entry: 4430 %c = sitofp <2 x i64> %a to <2 x float> 4431 ret <2 x float> %c 4432} 4433 4434define <2 x float> @utofp_v2i64_v2f32(<2 x i64> %a) { 4435; CHECK-LABEL: utofp_v2i64_v2f32: 4436; CHECK: // %bb.0: // %entry 4437; CHECK-NEXT: ucvtf v0.2d, v0.2d 4438; CHECK-NEXT: fcvtn v0.2s, v0.2d 4439; CHECK-NEXT: ret 4440entry: 4441 %c = uitofp <2 x i64> %a to <2 x float> 4442 ret <2 x float> %c 4443} 4444 4445define <3 x float> @stofp_v3i64_v3f32(<3 x i64> %a) { 4446; CHECK-SD-LABEL: stofp_v3i64_v3f32: 4447; CHECK-SD: // %bb.0: // %entry 4448; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 4449; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 4450; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 4451; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 4452; CHECK-SD-NEXT: scvtf v1.2d, v2.2d 4453; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 4454; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 4455; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 4456; CHECK-SD-NEXT: ret 4457; 4458; CHECK-GI-LABEL: stofp_v3i64_v3f32: 4459; CHECK-GI: // %bb.0: // %entry 4460; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 4461; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 4462; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 4463; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 4464; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 4465; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 4466; CHECK-GI-NEXT: fcvtn v2.2s, v2.2d 4467; CHECK-GI-NEXT: fcvtn v1.2s, v0.2d 4468; CHECK-GI-NEXT: mov v0.s[0], v1.s[0] 4469; CHECK-GI-NEXT: mov v0.s[1], v1.s[1] 4470; CHECK-GI-NEXT: mov v0.s[2], v2.s[0] 4471; CHECK-GI-NEXT: ret 4472entry: 4473 %c = sitofp <3 x i64> %a to <3 x float> 4474 ret <3 x float> %c 4475} 4476 4477define <3 x float> @utofp_v3i64_v3f32(<3 x i64> %a) { 4478; CHECK-SD-LABEL: utofp_v3i64_v3f32: 4479; CHECK-SD: // %bb.0: // %entry 4480; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 4481; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 4482; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 4483; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 4484; CHECK-SD-NEXT: ucvtf v1.2d, v2.2d 4485; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 4486; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 4487; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 4488; CHECK-SD-NEXT: ret 4489; 4490; CHECK-GI-LABEL: utofp_v3i64_v3f32: 4491; CHECK-GI: // %bb.0: // %entry 4492; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 4493; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 4494; CHECK-GI-NEXT: // kill: def $d2 killed $d2 def $q2 4495; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 4496; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 4497; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 4498; CHECK-GI-NEXT: fcvtn v2.2s, v2.2d 4499; CHECK-GI-NEXT: fcvtn v1.2s, v0.2d 4500; CHECK-GI-NEXT: mov v0.s[0], v1.s[0] 4501; CHECK-GI-NEXT: mov v0.s[1], v1.s[1] 4502; CHECK-GI-NEXT: mov v0.s[2], v2.s[0] 4503; CHECK-GI-NEXT: ret 4504entry: 4505 %c = uitofp <3 x i64> %a to <3 x float> 4506 ret <3 x float> %c 4507} 4508 4509define <4 x float> @stofp_v4i64_v4f32(<4 x i64> %a) { 4510; CHECK-LABEL: stofp_v4i64_v4f32: 4511; CHECK: // %bb.0: // %entry 4512; CHECK-NEXT: scvtf v0.2d, v0.2d 4513; CHECK-NEXT: scvtf v1.2d, v1.2d 4514; CHECK-NEXT: fcvtn v0.2s, v0.2d 4515; CHECK-NEXT: fcvtn2 v0.4s, v1.2d 4516; CHECK-NEXT: ret 4517entry: 4518 %c = sitofp <4 x i64> %a to <4 x float> 4519 ret <4 x float> %c 4520} 4521 4522define <4 x float> @utofp_v4i64_v4f32(<4 x i64> %a) { 4523; CHECK-LABEL: utofp_v4i64_v4f32: 4524; CHECK: // %bb.0: // %entry 4525; CHECK-NEXT: ucvtf v0.2d, v0.2d 4526; CHECK-NEXT: ucvtf v1.2d, v1.2d 4527; CHECK-NEXT: fcvtn v0.2s, v0.2d 4528; CHECK-NEXT: fcvtn2 v0.4s, v1.2d 4529; CHECK-NEXT: ret 4530entry: 4531 %c = uitofp <4 x i64> %a to <4 x float> 4532 ret <4 x float> %c 4533} 4534 4535define <8 x float> @stofp_v8i64_v8f32(<8 x i64> %a) { 4536; CHECK-SD-LABEL: stofp_v8i64_v8f32: 4537; CHECK-SD: // %bb.0: // %entry 4538; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 4539; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 4540; CHECK-SD-NEXT: scvtf v4.2d, v1.2d 4541; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 4542; CHECK-SD-NEXT: fcvtn v1.2s, v2.2d 4543; CHECK-SD-NEXT: scvtf v2.2d, v3.2d 4544; CHECK-SD-NEXT: fcvtn2 v0.4s, v4.2d 4545; CHECK-SD-NEXT: fcvtn2 v1.4s, v2.2d 4546; CHECK-SD-NEXT: ret 4547; 4548; CHECK-GI-LABEL: stofp_v8i64_v8f32: 4549; CHECK-GI: // %bb.0: // %entry 4550; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 4551; CHECK-GI-NEXT: scvtf v2.2d, v2.2d 4552; CHECK-GI-NEXT: scvtf v4.2d, v1.2d 4553; CHECK-GI-NEXT: scvtf v3.2d, v3.2d 4554; CHECK-GI-NEXT: fcvtn v0.2s, v0.2d 4555; CHECK-GI-NEXT: fcvtn v1.2s, v2.2d 4556; CHECK-GI-NEXT: fcvtn2 v0.4s, v4.2d 4557; CHECK-GI-NEXT: fcvtn2 v1.4s, v3.2d 4558; CHECK-GI-NEXT: ret 4559entry: 4560 %c = sitofp <8 x i64> %a to <8 x float> 4561 ret <8 x float> %c 4562} 4563 4564define <8 x float> @utofp_v8i64_v8f32(<8 x i64> %a) { 4565; CHECK-SD-LABEL: utofp_v8i64_v8f32: 4566; CHECK-SD: // %bb.0: // %entry 4567; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 4568; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 4569; CHECK-SD-NEXT: ucvtf v4.2d, v1.2d 4570; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 4571; CHECK-SD-NEXT: fcvtn v1.2s, v2.2d 4572; CHECK-SD-NEXT: ucvtf v2.2d, v3.2d 4573; CHECK-SD-NEXT: fcvtn2 v0.4s, v4.2d 4574; CHECK-SD-NEXT: fcvtn2 v1.4s, v2.2d 4575; CHECK-SD-NEXT: ret 4576; 4577; CHECK-GI-LABEL: utofp_v8i64_v8f32: 4578; CHECK-GI: // %bb.0: // %entry 4579; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 4580; CHECK-GI-NEXT: ucvtf v2.2d, v2.2d 4581; CHECK-GI-NEXT: ucvtf v4.2d, v1.2d 4582; CHECK-GI-NEXT: ucvtf v3.2d, v3.2d 4583; CHECK-GI-NEXT: fcvtn v0.2s, v0.2d 4584; CHECK-GI-NEXT: fcvtn v1.2s, v2.2d 4585; CHECK-GI-NEXT: fcvtn2 v0.4s, v4.2d 4586; CHECK-GI-NEXT: fcvtn2 v1.4s, v3.2d 4587; CHECK-GI-NEXT: ret 4588entry: 4589 %c = uitofp <8 x i64> %a to <8 x float> 4590 ret <8 x float> %c 4591} 4592 4593define <16 x float> @stofp_v16i64_v16f32(<16 x i64> %a) { 4594; CHECK-LABEL: stofp_v16i64_v16f32: 4595; CHECK: // %bb.0: // %entry 4596; CHECK-NEXT: scvtf v0.2d, v0.2d 4597; CHECK-NEXT: scvtf v2.2d, v2.2d 4598; CHECK-NEXT: scvtf v4.2d, v4.2d 4599; CHECK-NEXT: scvtf v6.2d, v6.2d 4600; CHECK-NEXT: scvtf v16.2d, v1.2d 4601; CHECK-NEXT: scvtf v17.2d, v3.2d 4602; CHECK-NEXT: scvtf v5.2d, v5.2d 4603; CHECK-NEXT: scvtf v7.2d, v7.2d 4604; CHECK-NEXT: fcvtn v0.2s, v0.2d 4605; CHECK-NEXT: fcvtn v1.2s, v2.2d 4606; CHECK-NEXT: fcvtn v2.2s, v4.2d 4607; CHECK-NEXT: fcvtn v3.2s, v6.2d 4608; CHECK-NEXT: fcvtn2 v0.4s, v16.2d 4609; CHECK-NEXT: fcvtn2 v1.4s, v17.2d 4610; CHECK-NEXT: fcvtn2 v2.4s, v5.2d 4611; CHECK-NEXT: fcvtn2 v3.4s, v7.2d 4612; CHECK-NEXT: ret 4613entry: 4614 %c = sitofp <16 x i64> %a to <16 x float> 4615 ret <16 x float> %c 4616} 4617 4618define <16 x float> @utofp_v16i64_v16f32(<16 x i64> %a) { 4619; CHECK-LABEL: utofp_v16i64_v16f32: 4620; CHECK: // %bb.0: // %entry 4621; CHECK-NEXT: ucvtf v0.2d, v0.2d 4622; CHECK-NEXT: ucvtf v2.2d, v2.2d 4623; CHECK-NEXT: ucvtf v4.2d, v4.2d 4624; CHECK-NEXT: ucvtf v6.2d, v6.2d 4625; CHECK-NEXT: ucvtf v16.2d, v1.2d 4626; CHECK-NEXT: ucvtf v17.2d, v3.2d 4627; CHECK-NEXT: ucvtf v5.2d, v5.2d 4628; CHECK-NEXT: ucvtf v7.2d, v7.2d 4629; CHECK-NEXT: fcvtn v0.2s, v0.2d 4630; CHECK-NEXT: fcvtn v1.2s, v2.2d 4631; CHECK-NEXT: fcvtn v2.2s, v4.2d 4632; CHECK-NEXT: fcvtn v3.2s, v6.2d 4633; CHECK-NEXT: fcvtn2 v0.4s, v16.2d 4634; CHECK-NEXT: fcvtn2 v1.4s, v17.2d 4635; CHECK-NEXT: fcvtn2 v2.4s, v5.2d 4636; CHECK-NEXT: fcvtn2 v3.4s, v7.2d 4637; CHECK-NEXT: ret 4638entry: 4639 %c = uitofp <16 x i64> %a to <16 x float> 4640 ret <16 x float> %c 4641} 4642 4643define <32 x float> @stofp_v32i64_v32f32(<32 x i64> %a) { 4644; CHECK-SD-LABEL: stofp_v32i64_v32f32: 4645; CHECK-SD: // %bb.0: // %entry 4646; CHECK-SD-NEXT: ldp q17, q16, [sp, #64] 4647; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 4648; CHECK-SD-NEXT: ldp q19, q18, [sp, #32] 4649; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 4650; CHECK-SD-NEXT: ldp q21, q20, [sp] 4651; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 4652; CHECK-SD-NEXT: ldp q23, q22, [sp, #96] 4653; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 4654; CHECK-SD-NEXT: scvtf v19.2d, v19.2d 4655; CHECK-SD-NEXT: scvtf v17.2d, v17.2d 4656; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 4657; CHECK-SD-NEXT: scvtf v21.2d, v21.2d 4658; CHECK-SD-NEXT: scvtf v24.2d, v1.2d 4659; CHECK-SD-NEXT: fcvtn v1.2s, v2.2d 4660; CHECK-SD-NEXT: scvtf v23.2d, v23.2d 4661; CHECK-SD-NEXT: scvtf v25.2d, v3.2d 4662; CHECK-SD-NEXT: fcvtn v2.2s, v4.2d 4663; CHECK-SD-NEXT: scvtf v26.2d, v5.2d 4664; CHECK-SD-NEXT: fcvtn v3.2s, v6.2d 4665; CHECK-SD-NEXT: scvtf v27.2d, v7.2d 4666; CHECK-SD-NEXT: scvtf v20.2d, v20.2d 4667; CHECK-SD-NEXT: fcvtn v5.2s, v19.2d 4668; CHECK-SD-NEXT: scvtf v18.2d, v18.2d 4669; CHECK-SD-NEXT: fcvtn v4.2s, v21.2d 4670; CHECK-SD-NEXT: fcvtn v6.2s, v17.2d 4671; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 4672; CHECK-SD-NEXT: fcvtn v7.2s, v23.2d 4673; CHECK-SD-NEXT: scvtf v17.2d, v22.2d 4674; CHECK-SD-NEXT: fcvtn2 v0.4s, v24.2d 4675; CHECK-SD-NEXT: fcvtn2 v1.4s, v25.2d 4676; CHECK-SD-NEXT: fcvtn2 v2.4s, v26.2d 4677; CHECK-SD-NEXT: fcvtn2 v3.4s, v27.2d 4678; CHECK-SD-NEXT: fcvtn2 v5.4s, v18.2d 4679; CHECK-SD-NEXT: fcvtn2 v4.4s, v20.2d 4680; CHECK-SD-NEXT: fcvtn2 v6.4s, v16.2d 4681; CHECK-SD-NEXT: fcvtn2 v7.4s, v17.2d 4682; CHECK-SD-NEXT: ret 4683; 4684; CHECK-GI-LABEL: stofp_v32i64_v32f32: 4685; CHECK-GI: // %bb.0: // %entry 4686; CHECK-GI-NEXT: ldp q16, q17, [sp] 4687; CHECK-GI-NEXT: scvtf v0.2d, v0.2d 4688; CHECK-GI-NEXT: ldp q18, q19, [sp, #32] 4689; CHECK-GI-NEXT: scvtf v24.2d, v1.2d 4690; CHECK-GI-NEXT: ldp q20, q21, [sp, #64] 4691; CHECK-GI-NEXT: scvtf v1.2d, v2.2d 4692; CHECK-GI-NEXT: ldp q22, q23, [sp, #96] 4693; CHECK-GI-NEXT: scvtf v25.2d, v3.2d 4694; CHECK-GI-NEXT: scvtf v2.2d, v4.2d 4695; CHECK-GI-NEXT: scvtf v26.2d, v5.2d 4696; CHECK-GI-NEXT: scvtf v3.2d, v6.2d 4697; CHECK-GI-NEXT: scvtf v27.2d, v7.2d 4698; CHECK-GI-NEXT: scvtf v4.2d, v16.2d 4699; CHECK-GI-NEXT: scvtf v5.2d, v18.2d 4700; CHECK-GI-NEXT: scvtf v6.2d, v20.2d 4701; CHECK-GI-NEXT: scvtf v7.2d, v22.2d 4702; CHECK-GI-NEXT: scvtf v16.2d, v17.2d 4703; CHECK-GI-NEXT: scvtf v17.2d, v19.2d 4704; CHECK-GI-NEXT: scvtf v18.2d, v21.2d 4705; CHECK-GI-NEXT: scvtf v19.2d, v23.2d 4706; CHECK-GI-NEXT: fcvtn v0.2s, v0.2d 4707; CHECK-GI-NEXT: fcvtn v1.2s, v1.2d 4708; CHECK-GI-NEXT: fcvtn v2.2s, v2.2d 4709; CHECK-GI-NEXT: fcvtn v3.2s, v3.2d 4710; CHECK-GI-NEXT: fcvtn v4.2s, v4.2d 4711; CHECK-GI-NEXT: fcvtn v5.2s, v5.2d 4712; CHECK-GI-NEXT: fcvtn v6.2s, v6.2d 4713; CHECK-GI-NEXT: fcvtn v7.2s, v7.2d 4714; CHECK-GI-NEXT: fcvtn2 v0.4s, v24.2d 4715; CHECK-GI-NEXT: fcvtn2 v1.4s, v25.2d 4716; CHECK-GI-NEXT: fcvtn2 v2.4s, v26.2d 4717; CHECK-GI-NEXT: fcvtn2 v3.4s, v27.2d 4718; CHECK-GI-NEXT: fcvtn2 v4.4s, v16.2d 4719; CHECK-GI-NEXT: fcvtn2 v5.4s, v17.2d 4720; CHECK-GI-NEXT: fcvtn2 v6.4s, v18.2d 4721; CHECK-GI-NEXT: fcvtn2 v7.4s, v19.2d 4722; CHECK-GI-NEXT: ret 4723entry: 4724 %c = sitofp <32 x i64> %a to <32 x float> 4725 ret <32 x float> %c 4726} 4727 4728define <32 x float> @utofp_v32i64_v32f32(<32 x i64> %a) { 4729; CHECK-SD-LABEL: utofp_v32i64_v32f32: 4730; CHECK-SD: // %bb.0: // %entry 4731; CHECK-SD-NEXT: ldp q17, q16, [sp, #64] 4732; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 4733; CHECK-SD-NEXT: ldp q19, q18, [sp, #32] 4734; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 4735; CHECK-SD-NEXT: ldp q21, q20, [sp] 4736; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 4737; CHECK-SD-NEXT: ldp q23, q22, [sp, #96] 4738; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 4739; CHECK-SD-NEXT: ucvtf v19.2d, v19.2d 4740; CHECK-SD-NEXT: ucvtf v17.2d, v17.2d 4741; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 4742; CHECK-SD-NEXT: ucvtf v21.2d, v21.2d 4743; CHECK-SD-NEXT: ucvtf v24.2d, v1.2d 4744; CHECK-SD-NEXT: fcvtn v1.2s, v2.2d 4745; CHECK-SD-NEXT: ucvtf v23.2d, v23.2d 4746; CHECK-SD-NEXT: ucvtf v25.2d, v3.2d 4747; CHECK-SD-NEXT: fcvtn v2.2s, v4.2d 4748; CHECK-SD-NEXT: ucvtf v26.2d, v5.2d 4749; CHECK-SD-NEXT: fcvtn v3.2s, v6.2d 4750; CHECK-SD-NEXT: ucvtf v27.2d, v7.2d 4751; CHECK-SD-NEXT: ucvtf v20.2d, v20.2d 4752; CHECK-SD-NEXT: fcvtn v5.2s, v19.2d 4753; CHECK-SD-NEXT: ucvtf v18.2d, v18.2d 4754; CHECK-SD-NEXT: fcvtn v4.2s, v21.2d 4755; CHECK-SD-NEXT: fcvtn v6.2s, v17.2d 4756; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 4757; CHECK-SD-NEXT: fcvtn v7.2s, v23.2d 4758; CHECK-SD-NEXT: ucvtf v17.2d, v22.2d 4759; CHECK-SD-NEXT: fcvtn2 v0.4s, v24.2d 4760; CHECK-SD-NEXT: fcvtn2 v1.4s, v25.2d 4761; CHECK-SD-NEXT: fcvtn2 v2.4s, v26.2d 4762; CHECK-SD-NEXT: fcvtn2 v3.4s, v27.2d 4763; CHECK-SD-NEXT: fcvtn2 v5.4s, v18.2d 4764; CHECK-SD-NEXT: fcvtn2 v4.4s, v20.2d 4765; CHECK-SD-NEXT: fcvtn2 v6.4s, v16.2d 4766; CHECK-SD-NEXT: fcvtn2 v7.4s, v17.2d 4767; CHECK-SD-NEXT: ret 4768; 4769; CHECK-GI-LABEL: utofp_v32i64_v32f32: 4770; CHECK-GI: // %bb.0: // %entry 4771; CHECK-GI-NEXT: ldp q16, q17, [sp] 4772; CHECK-GI-NEXT: ucvtf v0.2d, v0.2d 4773; CHECK-GI-NEXT: ldp q18, q19, [sp, #32] 4774; CHECK-GI-NEXT: ucvtf v24.2d, v1.2d 4775; CHECK-GI-NEXT: ldp q20, q21, [sp, #64] 4776; CHECK-GI-NEXT: ucvtf v1.2d, v2.2d 4777; CHECK-GI-NEXT: ldp q22, q23, [sp, #96] 4778; CHECK-GI-NEXT: ucvtf v25.2d, v3.2d 4779; CHECK-GI-NEXT: ucvtf v2.2d, v4.2d 4780; CHECK-GI-NEXT: ucvtf v26.2d, v5.2d 4781; CHECK-GI-NEXT: ucvtf v3.2d, v6.2d 4782; CHECK-GI-NEXT: ucvtf v27.2d, v7.2d 4783; CHECK-GI-NEXT: ucvtf v4.2d, v16.2d 4784; CHECK-GI-NEXT: ucvtf v5.2d, v18.2d 4785; CHECK-GI-NEXT: ucvtf v6.2d, v20.2d 4786; CHECK-GI-NEXT: ucvtf v7.2d, v22.2d 4787; CHECK-GI-NEXT: ucvtf v16.2d, v17.2d 4788; CHECK-GI-NEXT: ucvtf v17.2d, v19.2d 4789; CHECK-GI-NEXT: ucvtf v18.2d, v21.2d 4790; CHECK-GI-NEXT: ucvtf v19.2d, v23.2d 4791; CHECK-GI-NEXT: fcvtn v0.2s, v0.2d 4792; CHECK-GI-NEXT: fcvtn v1.2s, v1.2d 4793; CHECK-GI-NEXT: fcvtn v2.2s, v2.2d 4794; CHECK-GI-NEXT: fcvtn v3.2s, v3.2d 4795; CHECK-GI-NEXT: fcvtn v4.2s, v4.2d 4796; CHECK-GI-NEXT: fcvtn v5.2s, v5.2d 4797; CHECK-GI-NEXT: fcvtn v6.2s, v6.2d 4798; CHECK-GI-NEXT: fcvtn v7.2s, v7.2d 4799; CHECK-GI-NEXT: fcvtn2 v0.4s, v24.2d 4800; CHECK-GI-NEXT: fcvtn2 v1.4s, v25.2d 4801; CHECK-GI-NEXT: fcvtn2 v2.4s, v26.2d 4802; CHECK-GI-NEXT: fcvtn2 v3.4s, v27.2d 4803; CHECK-GI-NEXT: fcvtn2 v4.4s, v16.2d 4804; CHECK-GI-NEXT: fcvtn2 v5.4s, v17.2d 4805; CHECK-GI-NEXT: fcvtn2 v6.4s, v18.2d 4806; CHECK-GI-NEXT: fcvtn2 v7.4s, v19.2d 4807; CHECK-GI-NEXT: ret 4808entry: 4809 %c = uitofp <32 x i64> %a to <32 x float> 4810 ret <32 x float> %c 4811} 4812 4813define <2 x float> @stofp_v2i32_v2f32(<2 x i32> %a) { 4814; CHECK-LABEL: stofp_v2i32_v2f32: 4815; CHECK: // %bb.0: // %entry 4816; CHECK-NEXT: scvtf v0.2s, v0.2s 4817; CHECK-NEXT: ret 4818entry: 4819 %c = sitofp <2 x i32> %a to <2 x float> 4820 ret <2 x float> %c 4821} 4822 4823define <2 x float> @utofp_v2i32_v2f32(<2 x i32> %a) { 4824; CHECK-LABEL: utofp_v2i32_v2f32: 4825; CHECK: // %bb.0: // %entry 4826; CHECK-NEXT: ucvtf v0.2s, v0.2s 4827; CHECK-NEXT: ret 4828entry: 4829 %c = uitofp <2 x i32> %a to <2 x float> 4830 ret <2 x float> %c 4831} 4832 4833define <3 x float> @stofp_v3i32_v3f32(<3 x i32> %a) { 4834; CHECK-LABEL: stofp_v3i32_v3f32: 4835; CHECK: // %bb.0: // %entry 4836; CHECK-NEXT: scvtf v0.4s, v0.4s 4837; CHECK-NEXT: ret 4838entry: 4839 %c = sitofp <3 x i32> %a to <3 x float> 4840 ret <3 x float> %c 4841} 4842 4843define <3 x float> @utofp_v3i32_v3f32(<3 x i32> %a) { 4844; CHECK-LABEL: utofp_v3i32_v3f32: 4845; CHECK: // %bb.0: // %entry 4846; CHECK-NEXT: ucvtf v0.4s, v0.4s 4847; CHECK-NEXT: ret 4848entry: 4849 %c = uitofp <3 x i32> %a to <3 x float> 4850 ret <3 x float> %c 4851} 4852 4853define <4 x float> @stofp_v4i32_v4f32(<4 x i32> %a) { 4854; CHECK-LABEL: stofp_v4i32_v4f32: 4855; CHECK: // %bb.0: // %entry 4856; CHECK-NEXT: scvtf v0.4s, v0.4s 4857; CHECK-NEXT: ret 4858entry: 4859 %c = sitofp <4 x i32> %a to <4 x float> 4860 ret <4 x float> %c 4861} 4862 4863define <4 x float> @utofp_v4i32_v4f32(<4 x i32> %a) { 4864; CHECK-LABEL: utofp_v4i32_v4f32: 4865; CHECK: // %bb.0: // %entry 4866; CHECK-NEXT: ucvtf v0.4s, v0.4s 4867; CHECK-NEXT: ret 4868entry: 4869 %c = uitofp <4 x i32> %a to <4 x float> 4870 ret <4 x float> %c 4871} 4872 4873define <8 x float> @stofp_v8i32_v8f32(<8 x i32> %a) { 4874; CHECK-LABEL: stofp_v8i32_v8f32: 4875; CHECK: // %bb.0: // %entry 4876; CHECK-NEXT: scvtf v0.4s, v0.4s 4877; CHECK-NEXT: scvtf v1.4s, v1.4s 4878; CHECK-NEXT: ret 4879entry: 4880 %c = sitofp <8 x i32> %a to <8 x float> 4881 ret <8 x float> %c 4882} 4883 4884define <8 x float> @utofp_v8i32_v8f32(<8 x i32> %a) { 4885; CHECK-LABEL: utofp_v8i32_v8f32: 4886; CHECK: // %bb.0: // %entry 4887; CHECK-NEXT: ucvtf v0.4s, v0.4s 4888; CHECK-NEXT: ucvtf v1.4s, v1.4s 4889; CHECK-NEXT: ret 4890entry: 4891 %c = uitofp <8 x i32> %a to <8 x float> 4892 ret <8 x float> %c 4893} 4894 4895define <16 x float> @stofp_v16i32_v16f32(<16 x i32> %a) { 4896; CHECK-LABEL: stofp_v16i32_v16f32: 4897; CHECK: // %bb.0: // %entry 4898; CHECK-NEXT: scvtf v0.4s, v0.4s 4899; CHECK-NEXT: scvtf v1.4s, v1.4s 4900; CHECK-NEXT: scvtf v2.4s, v2.4s 4901; CHECK-NEXT: scvtf v3.4s, v3.4s 4902; CHECK-NEXT: ret 4903entry: 4904 %c = sitofp <16 x i32> %a to <16 x float> 4905 ret <16 x float> %c 4906} 4907 4908define <16 x float> @utofp_v16i32_v16f32(<16 x i32> %a) { 4909; CHECK-LABEL: utofp_v16i32_v16f32: 4910; CHECK: // %bb.0: // %entry 4911; CHECK-NEXT: ucvtf v0.4s, v0.4s 4912; CHECK-NEXT: ucvtf v1.4s, v1.4s 4913; CHECK-NEXT: ucvtf v2.4s, v2.4s 4914; CHECK-NEXT: ucvtf v3.4s, v3.4s 4915; CHECK-NEXT: ret 4916entry: 4917 %c = uitofp <16 x i32> %a to <16 x float> 4918 ret <16 x float> %c 4919} 4920 4921define <32 x float> @stofp_v32i32_v32f32(<32 x i32> %a) { 4922; CHECK-LABEL: stofp_v32i32_v32f32: 4923; CHECK: // %bb.0: // %entry 4924; CHECK-NEXT: scvtf v0.4s, v0.4s 4925; CHECK-NEXT: scvtf v1.4s, v1.4s 4926; CHECK-NEXT: scvtf v2.4s, v2.4s 4927; CHECK-NEXT: scvtf v3.4s, v3.4s 4928; CHECK-NEXT: scvtf v4.4s, v4.4s 4929; CHECK-NEXT: scvtf v5.4s, v5.4s 4930; CHECK-NEXT: scvtf v6.4s, v6.4s 4931; CHECK-NEXT: scvtf v7.4s, v7.4s 4932; CHECK-NEXT: ret 4933entry: 4934 %c = sitofp <32 x i32> %a to <32 x float> 4935 ret <32 x float> %c 4936} 4937 4938define <32 x float> @utofp_v32i32_v32f32(<32 x i32> %a) { 4939; CHECK-LABEL: utofp_v32i32_v32f32: 4940; CHECK: // %bb.0: // %entry 4941; CHECK-NEXT: ucvtf v0.4s, v0.4s 4942; CHECK-NEXT: ucvtf v1.4s, v1.4s 4943; CHECK-NEXT: ucvtf v2.4s, v2.4s 4944; CHECK-NEXT: ucvtf v3.4s, v3.4s 4945; CHECK-NEXT: ucvtf v4.4s, v4.4s 4946; CHECK-NEXT: ucvtf v5.4s, v5.4s 4947; CHECK-NEXT: ucvtf v6.4s, v6.4s 4948; CHECK-NEXT: ucvtf v7.4s, v7.4s 4949; CHECK-NEXT: ret 4950entry: 4951 %c = uitofp <32 x i32> %a to <32 x float> 4952 ret <32 x float> %c 4953} 4954 4955define <2 x float> @stofp_v2i16_v2f32(<2 x i16> %a) { 4956; CHECK-LABEL: stofp_v2i16_v2f32: 4957; CHECK: // %bb.0: // %entry 4958; CHECK-NEXT: shl v0.2s, v0.2s, #16 4959; CHECK-NEXT: sshr v0.2s, v0.2s, #16 4960; CHECK-NEXT: scvtf v0.2s, v0.2s 4961; CHECK-NEXT: ret 4962entry: 4963 %c = sitofp <2 x i16> %a to <2 x float> 4964 ret <2 x float> %c 4965} 4966 4967define <2 x float> @utofp_v2i16_v2f32(<2 x i16> %a) { 4968; CHECK-LABEL: utofp_v2i16_v2f32: 4969; CHECK: // %bb.0: // %entry 4970; CHECK-NEXT: movi d1, #0x00ffff0000ffff 4971; CHECK-NEXT: and v0.8b, v0.8b, v1.8b 4972; CHECK-NEXT: ucvtf v0.2s, v0.2s 4973; CHECK-NEXT: ret 4974entry: 4975 %c = uitofp <2 x i16> %a to <2 x float> 4976 ret <2 x float> %c 4977} 4978 4979define <3 x float> @stofp_v3i16_v3f32(<3 x i16> %a) { 4980; CHECK-LABEL: stofp_v3i16_v3f32: 4981; CHECK: // %bb.0: // %entry 4982; CHECK-NEXT: sshll v0.4s, v0.4h, #0 4983; CHECK-NEXT: scvtf v0.4s, v0.4s 4984; CHECK-NEXT: ret 4985entry: 4986 %c = sitofp <3 x i16> %a to <3 x float> 4987 ret <3 x float> %c 4988} 4989 4990define <3 x float> @utofp_v3i16_v3f32(<3 x i16> %a) { 4991; CHECK-LABEL: utofp_v3i16_v3f32: 4992; CHECK: // %bb.0: // %entry 4993; CHECK-NEXT: ushll v0.4s, v0.4h, #0 4994; CHECK-NEXT: ucvtf v0.4s, v0.4s 4995; CHECK-NEXT: ret 4996entry: 4997 %c = uitofp <3 x i16> %a to <3 x float> 4998 ret <3 x float> %c 4999} 5000 5001define <4 x float> @stofp_v4i16_v4f32(<4 x i16> %a) { 5002; CHECK-LABEL: stofp_v4i16_v4f32: 5003; CHECK: // %bb.0: // %entry 5004; CHECK-NEXT: sshll v0.4s, v0.4h, #0 5005; CHECK-NEXT: scvtf v0.4s, v0.4s 5006; CHECK-NEXT: ret 5007entry: 5008 %c = sitofp <4 x i16> %a to <4 x float> 5009 ret <4 x float> %c 5010} 5011 5012define <4 x float> @utofp_v4i16_v4f32(<4 x i16> %a) { 5013; CHECK-LABEL: utofp_v4i16_v4f32: 5014; CHECK: // %bb.0: // %entry 5015; CHECK-NEXT: ushll v0.4s, v0.4h, #0 5016; CHECK-NEXT: ucvtf v0.4s, v0.4s 5017; CHECK-NEXT: ret 5018entry: 5019 %c = uitofp <4 x i16> %a to <4 x float> 5020 ret <4 x float> %c 5021} 5022 5023define <8 x float> @stofp_v8i16_v8f32(<8 x i16> %a) { 5024; CHECK-SD-LABEL: stofp_v8i16_v8f32: 5025; CHECK-SD: // %bb.0: // %entry 5026; CHECK-SD-NEXT: sshll2 v1.4s, v0.8h, #0 5027; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 5028; CHECK-SD-NEXT: scvtf v1.4s, v1.4s 5029; CHECK-SD-NEXT: scvtf v0.4s, v0.4s 5030; CHECK-SD-NEXT: ret 5031; 5032; CHECK-GI-LABEL: stofp_v8i16_v8f32: 5033; CHECK-GI: // %bb.0: // %entry 5034; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 5035; CHECK-GI-NEXT: sshll2 v2.4s, v0.8h, #0 5036; CHECK-GI-NEXT: scvtf v0.4s, v1.4s 5037; CHECK-GI-NEXT: scvtf v1.4s, v2.4s 5038; CHECK-GI-NEXT: ret 5039entry: 5040 %c = sitofp <8 x i16> %a to <8 x float> 5041 ret <8 x float> %c 5042} 5043 5044define <8 x float> @utofp_v8i16_v8f32(<8 x i16> %a) { 5045; CHECK-SD-LABEL: utofp_v8i16_v8f32: 5046; CHECK-SD: // %bb.0: // %entry 5047; CHECK-SD-NEXT: ushll2 v1.4s, v0.8h, #0 5048; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 5049; CHECK-SD-NEXT: ucvtf v1.4s, v1.4s 5050; CHECK-SD-NEXT: ucvtf v0.4s, v0.4s 5051; CHECK-SD-NEXT: ret 5052; 5053; CHECK-GI-LABEL: utofp_v8i16_v8f32: 5054; CHECK-GI: // %bb.0: // %entry 5055; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 5056; CHECK-GI-NEXT: ushll2 v2.4s, v0.8h, #0 5057; CHECK-GI-NEXT: ucvtf v0.4s, v1.4s 5058; CHECK-GI-NEXT: ucvtf v1.4s, v2.4s 5059; CHECK-GI-NEXT: ret 5060entry: 5061 %c = uitofp <8 x i16> %a to <8 x float> 5062 ret <8 x float> %c 5063} 5064 5065define <16 x float> @stofp_v16i16_v16f32(<16 x i16> %a) { 5066; CHECK-SD-LABEL: stofp_v16i16_v16f32: 5067; CHECK-SD: // %bb.0: // %entry 5068; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0 5069; CHECK-SD-NEXT: sshll2 v3.4s, v0.8h, #0 5070; CHECK-SD-NEXT: sshll2 v4.4s, v1.8h, #0 5071; CHECK-SD-NEXT: sshll v5.4s, v1.4h, #0 5072; CHECK-SD-NEXT: scvtf v0.4s, v2.4s 5073; CHECK-SD-NEXT: scvtf v1.4s, v3.4s 5074; CHECK-SD-NEXT: scvtf v3.4s, v4.4s 5075; CHECK-SD-NEXT: scvtf v2.4s, v5.4s 5076; CHECK-SD-NEXT: ret 5077; 5078; CHECK-GI-LABEL: stofp_v16i16_v16f32: 5079; CHECK-GI: // %bb.0: // %entry 5080; CHECK-GI-NEXT: sshll v2.4s, v0.4h, #0 5081; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0 5082; CHECK-GI-NEXT: sshll v4.4s, v1.4h, #0 5083; CHECK-GI-NEXT: sshll2 v5.4s, v1.8h, #0 5084; CHECK-GI-NEXT: scvtf v0.4s, v2.4s 5085; CHECK-GI-NEXT: scvtf v1.4s, v3.4s 5086; CHECK-GI-NEXT: scvtf v2.4s, v4.4s 5087; CHECK-GI-NEXT: scvtf v3.4s, v5.4s 5088; CHECK-GI-NEXT: ret 5089entry: 5090 %c = sitofp <16 x i16> %a to <16 x float> 5091 ret <16 x float> %c 5092} 5093 5094define <16 x float> @utofp_v16i16_v16f32(<16 x i16> %a) { 5095; CHECK-SD-LABEL: utofp_v16i16_v16f32: 5096; CHECK-SD: // %bb.0: // %entry 5097; CHECK-SD-NEXT: ushll v2.4s, v0.4h, #0 5098; CHECK-SD-NEXT: ushll2 v3.4s, v0.8h, #0 5099; CHECK-SD-NEXT: ushll2 v4.4s, v1.8h, #0 5100; CHECK-SD-NEXT: ushll v5.4s, v1.4h, #0 5101; CHECK-SD-NEXT: ucvtf v0.4s, v2.4s 5102; CHECK-SD-NEXT: ucvtf v1.4s, v3.4s 5103; CHECK-SD-NEXT: ucvtf v3.4s, v4.4s 5104; CHECK-SD-NEXT: ucvtf v2.4s, v5.4s 5105; CHECK-SD-NEXT: ret 5106; 5107; CHECK-GI-LABEL: utofp_v16i16_v16f32: 5108; CHECK-GI: // %bb.0: // %entry 5109; CHECK-GI-NEXT: ushll v2.4s, v0.4h, #0 5110; CHECK-GI-NEXT: ushll2 v3.4s, v0.8h, #0 5111; CHECK-GI-NEXT: ushll v4.4s, v1.4h, #0 5112; CHECK-GI-NEXT: ushll2 v5.4s, v1.8h, #0 5113; CHECK-GI-NEXT: ucvtf v0.4s, v2.4s 5114; CHECK-GI-NEXT: ucvtf v1.4s, v3.4s 5115; CHECK-GI-NEXT: ucvtf v2.4s, v4.4s 5116; CHECK-GI-NEXT: ucvtf v3.4s, v5.4s 5117; CHECK-GI-NEXT: ret 5118entry: 5119 %c = uitofp <16 x i16> %a to <16 x float> 5120 ret <16 x float> %c 5121} 5122 5123define <32 x float> @stofp_v32i16_v32f32(<32 x i16> %a) { 5124; CHECK-SD-LABEL: stofp_v32i16_v32f32: 5125; CHECK-SD: // %bb.0: // %entry 5126; CHECK-SD-NEXT: sshll2 v4.4s, v0.8h, #0 5127; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 5128; CHECK-SD-NEXT: sshll2 v5.4s, v1.8h, #0 5129; CHECK-SD-NEXT: sshll v6.4s, v1.4h, #0 5130; CHECK-SD-NEXT: sshll v7.4s, v2.4h, #0 5131; CHECK-SD-NEXT: sshll2 v16.4s, v2.8h, #0 5132; CHECK-SD-NEXT: sshll2 v17.4s, v3.8h, #0 5133; CHECK-SD-NEXT: sshll v18.4s, v3.4h, #0 5134; CHECK-SD-NEXT: scvtf v1.4s, v4.4s 5135; CHECK-SD-NEXT: scvtf v0.4s, v0.4s 5136; CHECK-SD-NEXT: scvtf v3.4s, v5.4s 5137; CHECK-SD-NEXT: scvtf v2.4s, v6.4s 5138; CHECK-SD-NEXT: scvtf v4.4s, v7.4s 5139; CHECK-SD-NEXT: scvtf v5.4s, v16.4s 5140; CHECK-SD-NEXT: scvtf v7.4s, v17.4s 5141; CHECK-SD-NEXT: scvtf v6.4s, v18.4s 5142; CHECK-SD-NEXT: ret 5143; 5144; CHECK-GI-LABEL: stofp_v32i16_v32f32: 5145; CHECK-GI: // %bb.0: // %entry 5146; CHECK-GI-NEXT: sshll v4.4s, v0.4h, #0 5147; CHECK-GI-NEXT: sshll2 v5.4s, v0.8h, #0 5148; CHECK-GI-NEXT: sshll v6.4s, v1.4h, #0 5149; CHECK-GI-NEXT: sshll2 v7.4s, v1.8h, #0 5150; CHECK-GI-NEXT: sshll v16.4s, v2.4h, #0 5151; CHECK-GI-NEXT: sshll2 v17.4s, v2.8h, #0 5152; CHECK-GI-NEXT: sshll v18.4s, v3.4h, #0 5153; CHECK-GI-NEXT: sshll2 v19.4s, v3.8h, #0 5154; CHECK-GI-NEXT: scvtf v0.4s, v4.4s 5155; CHECK-GI-NEXT: scvtf v1.4s, v5.4s 5156; CHECK-GI-NEXT: scvtf v2.4s, v6.4s 5157; CHECK-GI-NEXT: scvtf v3.4s, v7.4s 5158; CHECK-GI-NEXT: scvtf v4.4s, v16.4s 5159; CHECK-GI-NEXT: scvtf v5.4s, v17.4s 5160; CHECK-GI-NEXT: scvtf v6.4s, v18.4s 5161; CHECK-GI-NEXT: scvtf v7.4s, v19.4s 5162; CHECK-GI-NEXT: ret 5163entry: 5164 %c = sitofp <32 x i16> %a to <32 x float> 5165 ret <32 x float> %c 5166} 5167 5168define <32 x float> @utofp_v32i16_v32f32(<32 x i16> %a) { 5169; CHECK-SD-LABEL: utofp_v32i16_v32f32: 5170; CHECK-SD: // %bb.0: // %entry 5171; CHECK-SD-NEXT: ushll2 v4.4s, v0.8h, #0 5172; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 5173; CHECK-SD-NEXT: ushll2 v5.4s, v1.8h, #0 5174; CHECK-SD-NEXT: ushll v6.4s, v1.4h, #0 5175; CHECK-SD-NEXT: ushll v7.4s, v2.4h, #0 5176; CHECK-SD-NEXT: ushll2 v16.4s, v2.8h, #0 5177; CHECK-SD-NEXT: ushll2 v17.4s, v3.8h, #0 5178; CHECK-SD-NEXT: ushll v18.4s, v3.4h, #0 5179; CHECK-SD-NEXT: ucvtf v1.4s, v4.4s 5180; CHECK-SD-NEXT: ucvtf v0.4s, v0.4s 5181; CHECK-SD-NEXT: ucvtf v3.4s, v5.4s 5182; CHECK-SD-NEXT: ucvtf v2.4s, v6.4s 5183; CHECK-SD-NEXT: ucvtf v4.4s, v7.4s 5184; CHECK-SD-NEXT: ucvtf v5.4s, v16.4s 5185; CHECK-SD-NEXT: ucvtf v7.4s, v17.4s 5186; CHECK-SD-NEXT: ucvtf v6.4s, v18.4s 5187; CHECK-SD-NEXT: ret 5188; 5189; CHECK-GI-LABEL: utofp_v32i16_v32f32: 5190; CHECK-GI: // %bb.0: // %entry 5191; CHECK-GI-NEXT: ushll v4.4s, v0.4h, #0 5192; CHECK-GI-NEXT: ushll2 v5.4s, v0.8h, #0 5193; CHECK-GI-NEXT: ushll v6.4s, v1.4h, #0 5194; CHECK-GI-NEXT: ushll2 v7.4s, v1.8h, #0 5195; CHECK-GI-NEXT: ushll v16.4s, v2.4h, #0 5196; CHECK-GI-NEXT: ushll2 v17.4s, v2.8h, #0 5197; CHECK-GI-NEXT: ushll v18.4s, v3.4h, #0 5198; CHECK-GI-NEXT: ushll2 v19.4s, v3.8h, #0 5199; CHECK-GI-NEXT: ucvtf v0.4s, v4.4s 5200; CHECK-GI-NEXT: ucvtf v1.4s, v5.4s 5201; CHECK-GI-NEXT: ucvtf v2.4s, v6.4s 5202; CHECK-GI-NEXT: ucvtf v3.4s, v7.4s 5203; CHECK-GI-NEXT: ucvtf v4.4s, v16.4s 5204; CHECK-GI-NEXT: ucvtf v5.4s, v17.4s 5205; CHECK-GI-NEXT: ucvtf v6.4s, v18.4s 5206; CHECK-GI-NEXT: ucvtf v7.4s, v19.4s 5207; CHECK-GI-NEXT: ret 5208entry: 5209 %c = uitofp <32 x i16> %a to <32 x float> 5210 ret <32 x float> %c 5211} 5212 5213define <2 x float> @stofp_v2i8_v2f32(<2 x i8> %a) { 5214; CHECK-LABEL: stofp_v2i8_v2f32: 5215; CHECK: // %bb.0: // %entry 5216; CHECK-NEXT: shl v0.2s, v0.2s, #24 5217; CHECK-NEXT: sshr v0.2s, v0.2s, #24 5218; CHECK-NEXT: scvtf v0.2s, v0.2s 5219; CHECK-NEXT: ret 5220entry: 5221 %c = sitofp <2 x i8> %a to <2 x float> 5222 ret <2 x float> %c 5223} 5224 5225define <2 x float> @utofp_v2i8_v2f32(<2 x i8> %a) { 5226; CHECK-LABEL: utofp_v2i8_v2f32: 5227; CHECK: // %bb.0: // %entry 5228; CHECK-NEXT: movi d1, #0x0000ff000000ff 5229; CHECK-NEXT: and v0.8b, v0.8b, v1.8b 5230; CHECK-NEXT: ucvtf v0.2s, v0.2s 5231; CHECK-NEXT: ret 5232entry: 5233 %c = uitofp <2 x i8> %a to <2 x float> 5234 ret <2 x float> %c 5235} 5236 5237define <3 x float> @stofp_v3i8_v3f32(<3 x i8> %a) { 5238; CHECK-SD-LABEL: stofp_v3i8_v3f32: 5239; CHECK-SD: // %bb.0: // %entry 5240; CHECK-SD-NEXT: fmov s0, w0 5241; CHECK-SD-NEXT: mov v0.h[1], w1 5242; CHECK-SD-NEXT: mov v0.h[2], w2 5243; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8 5244; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8 5245; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 5246; CHECK-SD-NEXT: scvtf v0.4s, v0.4s 5247; CHECK-SD-NEXT: ret 5248; 5249; CHECK-GI-LABEL: stofp_v3i8_v3f32: 5250; CHECK-GI: // %bb.0: // %entry 5251; CHECK-GI-NEXT: fmov s0, w0 5252; CHECK-GI-NEXT: mov v0.h[1], w1 5253; CHECK-GI-NEXT: mov v0.h[2], w2 5254; CHECK-GI-NEXT: shl v0.4h, v0.4h, #8 5255; CHECK-GI-NEXT: sshr v0.4h, v0.4h, #8 5256; CHECK-GI-NEXT: mov v1.h[0], v0.h[2] 5257; CHECK-GI-NEXT: mov v1.h[1], v0.h[3] 5258; CHECK-GI-NEXT: sshll v0.4s, v0.4h, #0 5259; CHECK-GI-NEXT: sshll v1.4s, v1.4h, #0 5260; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 5261; CHECK-GI-NEXT: scvtf v0.4s, v0.4s 5262; CHECK-GI-NEXT: ret 5263entry: 5264 %c = sitofp <3 x i8> %a to <3 x float> 5265 ret <3 x float> %c 5266} 5267 5268define <3 x float> @utofp_v3i8_v3f32(<3 x i8> %a) { 5269; CHECK-SD-LABEL: utofp_v3i8_v3f32: 5270; CHECK-SD: // %bb.0: // %entry 5271; CHECK-SD-NEXT: fmov s0, w0 5272; CHECK-SD-NEXT: mov v0.h[1], w1 5273; CHECK-SD-NEXT: mov v0.h[2], w2 5274; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8 5275; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 5276; CHECK-SD-NEXT: ucvtf v0.4s, v0.4s 5277; CHECK-SD-NEXT: ret 5278; 5279; CHECK-GI-LABEL: utofp_v3i8_v3f32: 5280; CHECK-GI: // %bb.0: // %entry 5281; CHECK-GI-NEXT: fmov s0, w0 5282; CHECK-GI-NEXT: movi d1, #0xff00ff00ff00ff 5283; CHECK-GI-NEXT: mov v0.h[1], w1 5284; CHECK-GI-NEXT: mov v0.h[2], w2 5285; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b 5286; CHECK-GI-NEXT: mov v1.h[0], v0.h[2] 5287; CHECK-GI-NEXT: mov v1.h[1], v0.h[3] 5288; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 5289; CHECK-GI-NEXT: ushll v1.4s, v1.4h, #0 5290; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 5291; CHECK-GI-NEXT: ucvtf v0.4s, v0.4s 5292; CHECK-GI-NEXT: ret 5293entry: 5294 %c = uitofp <3 x i8> %a to <3 x float> 5295 ret <3 x float> %c 5296} 5297 5298define <4 x float> @stofp_v4i8_v4f32(<4 x i8> %a) { 5299; CHECK-SD-LABEL: stofp_v4i8_v4f32: 5300; CHECK-SD: // %bb.0: // %entry 5301; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8 5302; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8 5303; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 5304; CHECK-SD-NEXT: scvtf v0.4s, v0.4s 5305; CHECK-SD-NEXT: ret 5306; 5307; CHECK-GI-LABEL: stofp_v4i8_v4f32: 5308; CHECK-GI: // %bb.0: // %entry 5309; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 5310; CHECK-GI-NEXT: shl v0.4s, v0.4s, #24 5311; CHECK-GI-NEXT: sshr v0.4s, v0.4s, #24 5312; CHECK-GI-NEXT: scvtf v0.4s, v0.4s 5313; CHECK-GI-NEXT: ret 5314entry: 5315 %c = sitofp <4 x i8> %a to <4 x float> 5316 ret <4 x float> %c 5317} 5318 5319define <4 x float> @utofp_v4i8_v4f32(<4 x i8> %a) { 5320; CHECK-SD-LABEL: utofp_v4i8_v4f32: 5321; CHECK-SD: // %bb.0: // %entry 5322; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8 5323; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 5324; CHECK-SD-NEXT: ucvtf v0.4s, v0.4s 5325; CHECK-SD-NEXT: ret 5326; 5327; CHECK-GI-LABEL: utofp_v4i8_v4f32: 5328; CHECK-GI: // %bb.0: // %entry 5329; CHECK-GI-NEXT: movi v1.2d, #0x0000ff000000ff 5330; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 5331; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b 5332; CHECK-GI-NEXT: ucvtf v0.4s, v0.4s 5333; CHECK-GI-NEXT: ret 5334entry: 5335 %c = uitofp <4 x i8> %a to <4 x float> 5336 ret <4 x float> %c 5337} 5338 5339define <8 x float> @stofp_v8i8_v8f32(<8 x i8> %a) { 5340; CHECK-SD-LABEL: stofp_v8i8_v8f32: 5341; CHECK-SD: // %bb.0: // %entry 5342; CHECK-SD-NEXT: zip1 v1.8b, v0.8b, v0.8b 5343; CHECK-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b 5344; CHECK-SD-NEXT: shl v1.4h, v1.4h, #8 5345; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8 5346; CHECK-SD-NEXT: sshr v1.4h, v1.4h, #8 5347; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8 5348; CHECK-SD-NEXT: sshll v1.4s, v1.4h, #0 5349; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0 5350; CHECK-SD-NEXT: scvtf v0.4s, v1.4s 5351; CHECK-SD-NEXT: scvtf v1.4s, v2.4s 5352; CHECK-SD-NEXT: ret 5353; 5354; CHECK-GI-LABEL: stofp_v8i8_v8f32: 5355; CHECK-GI: // %bb.0: // %entry 5356; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0 5357; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 5358; CHECK-GI-NEXT: sshll2 v2.4s, v0.8h, #0 5359; CHECK-GI-NEXT: scvtf v0.4s, v1.4s 5360; CHECK-GI-NEXT: scvtf v1.4s, v2.4s 5361; CHECK-GI-NEXT: ret 5362entry: 5363 %c = sitofp <8 x i8> %a to <8 x float> 5364 ret <8 x float> %c 5365} 5366 5367define <8 x float> @utofp_v8i8_v8f32(<8 x i8> %a) { 5368; CHECK-SD-LABEL: utofp_v8i8_v8f32: 5369; CHECK-SD: // %bb.0: // %entry 5370; CHECK-SD-NEXT: zip1 v1.8b, v0.8b, v0.8b 5371; CHECK-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b 5372; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8 5373; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8 5374; CHECK-SD-NEXT: ushll v1.4s, v1.4h, #0 5375; CHECK-SD-NEXT: ushll v2.4s, v0.4h, #0 5376; CHECK-SD-NEXT: ucvtf v0.4s, v1.4s 5377; CHECK-SD-NEXT: ucvtf v1.4s, v2.4s 5378; CHECK-SD-NEXT: ret 5379; 5380; CHECK-GI-LABEL: utofp_v8i8_v8f32: 5381; CHECK-GI: // %bb.0: // %entry 5382; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0 5383; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 5384; CHECK-GI-NEXT: ushll2 v2.4s, v0.8h, #0 5385; CHECK-GI-NEXT: ucvtf v0.4s, v1.4s 5386; CHECK-GI-NEXT: ucvtf v1.4s, v2.4s 5387; CHECK-GI-NEXT: ret 5388entry: 5389 %c = uitofp <8 x i8> %a to <8 x float> 5390 ret <8 x float> %c 5391} 5392 5393define <16 x float> @stofp_v16i8_v16f32(<16 x i8> %a) { 5394; CHECK-SD-LABEL: stofp_v16i8_v16f32: 5395; CHECK-SD: // %bb.0: // %entry 5396; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 5397; CHECK-SD-NEXT: zip1 v2.8b, v0.8b, v0.8b 5398; CHECK-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b 5399; CHECK-SD-NEXT: zip1 v3.8b, v1.8b, v0.8b 5400; CHECK-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b 5401; CHECK-SD-NEXT: shl v2.4h, v2.4h, #8 5402; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8 5403; CHECK-SD-NEXT: sshr v2.4h, v2.4h, #8 5404; CHECK-SD-NEXT: shl v3.4h, v3.4h, #8 5405; CHECK-SD-NEXT: shl v1.4h, v1.4h, #8 5406; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8 5407; CHECK-SD-NEXT: sshll v2.4s, v2.4h, #0 5408; CHECK-SD-NEXT: sshr v3.4h, v3.4h, #8 5409; CHECK-SD-NEXT: sshr v1.4h, v1.4h, #8 5410; CHECK-SD-NEXT: sshll v4.4s, v0.4h, #0 5411; CHECK-SD-NEXT: scvtf v0.4s, v2.4s 5412; CHECK-SD-NEXT: sshll v3.4s, v3.4h, #0 5413; CHECK-SD-NEXT: sshll v5.4s, v1.4h, #0 5414; CHECK-SD-NEXT: scvtf v1.4s, v4.4s 5415; CHECK-SD-NEXT: scvtf v2.4s, v3.4s 5416; CHECK-SD-NEXT: scvtf v3.4s, v5.4s 5417; CHECK-SD-NEXT: ret 5418; 5419; CHECK-GI-LABEL: stofp_v16i8_v16f32: 5420; CHECK-GI: // %bb.0: // %entry 5421; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0 5422; CHECK-GI-NEXT: sshll2 v0.8h, v0.16b, #0 5423; CHECK-GI-NEXT: sshll v2.4s, v1.4h, #0 5424; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 5425; CHECK-GI-NEXT: sshll v3.4s, v0.4h, #0 5426; CHECK-GI-NEXT: sshll2 v4.4s, v0.8h, #0 5427; CHECK-GI-NEXT: scvtf v0.4s, v2.4s 5428; CHECK-GI-NEXT: scvtf v1.4s, v1.4s 5429; CHECK-GI-NEXT: scvtf v2.4s, v3.4s 5430; CHECK-GI-NEXT: scvtf v3.4s, v4.4s 5431; CHECK-GI-NEXT: ret 5432entry: 5433 %c = sitofp <16 x i8> %a to <16 x float> 5434 ret <16 x float> %c 5435} 5436 5437define <16 x float> @utofp_v16i8_v16f32(<16 x i8> %a) { 5438; CHECK-SD-LABEL: utofp_v16i8_v16f32: 5439; CHECK-SD: // %bb.0: // %entry 5440; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 5441; CHECK-SD-NEXT: zip1 v2.8b, v0.8b, v0.8b 5442; CHECK-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b 5443; CHECK-SD-NEXT: zip1 v3.8b, v1.8b, v0.8b 5444; CHECK-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b 5445; CHECK-SD-NEXT: bic v2.4h, #255, lsl #8 5446; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8 5447; CHECK-SD-NEXT: ushll v2.4s, v2.4h, #0 5448; CHECK-SD-NEXT: bic v3.4h, #255, lsl #8 5449; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8 5450; CHECK-SD-NEXT: ushll v4.4s, v0.4h, #0 5451; CHECK-SD-NEXT: ucvtf v0.4s, v2.4s 5452; CHECK-SD-NEXT: ushll v3.4s, v3.4h, #0 5453; CHECK-SD-NEXT: ushll v5.4s, v1.4h, #0 5454; CHECK-SD-NEXT: ucvtf v1.4s, v4.4s 5455; CHECK-SD-NEXT: ucvtf v2.4s, v3.4s 5456; CHECK-SD-NEXT: ucvtf v3.4s, v5.4s 5457; CHECK-SD-NEXT: ret 5458; 5459; CHECK-GI-LABEL: utofp_v16i8_v16f32: 5460; CHECK-GI: // %bb.0: // %entry 5461; CHECK-GI-NEXT: ushll v1.8h, v0.8b, #0 5462; CHECK-GI-NEXT: ushll2 v0.8h, v0.16b, #0 5463; CHECK-GI-NEXT: ushll v2.4s, v1.4h, #0 5464; CHECK-GI-NEXT: ushll2 v1.4s, v1.8h, #0 5465; CHECK-GI-NEXT: ushll v3.4s, v0.4h, #0 5466; CHECK-GI-NEXT: ushll2 v4.4s, v0.8h, #0 5467; CHECK-GI-NEXT: ucvtf v0.4s, v2.4s 5468; CHECK-GI-NEXT: ucvtf v1.4s, v1.4s 5469; CHECK-GI-NEXT: ucvtf v2.4s, v3.4s 5470; CHECK-GI-NEXT: ucvtf v3.4s, v4.4s 5471; CHECK-GI-NEXT: ret 5472entry: 5473 %c = uitofp <16 x i8> %a to <16 x float> 5474 ret <16 x float> %c 5475} 5476 5477define <32 x float> @stofp_v32i8_v32f32(<32 x i8> %a) { 5478; CHECK-SD-LABEL: stofp_v32i8_v32f32: 5479; CHECK-SD: // %bb.0: // %entry 5480; CHECK-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8 5481; CHECK-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8 5482; CHECK-SD-NEXT: zip1 v4.8b, v0.8b, v0.8b 5483; CHECK-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b 5484; CHECK-SD-NEXT: shl v4.4h, v4.4h, #8 5485; CHECK-SD-NEXT: zip1 v5.8b, v1.8b, v0.8b 5486; CHECK-SD-NEXT: zip1 v6.8b, v2.8b, v0.8b 5487; CHECK-SD-NEXT: zip2 v2.8b, v2.8b, v0.8b 5488; CHECK-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b 5489; CHECK-SD-NEXT: zip1 v7.8b, v3.8b, v0.8b 5490; CHECK-SD-NEXT: zip2 v3.8b, v3.8b, v0.8b 5491; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8 5492; CHECK-SD-NEXT: sshr v4.4h, v4.4h, #8 5493; CHECK-SD-NEXT: shl v5.4h, v5.4h, #8 5494; CHECK-SD-NEXT: shl v6.4h, v6.4h, #8 5495; CHECK-SD-NEXT: shl v2.4h, v2.4h, #8 5496; CHECK-SD-NEXT: shl v1.4h, v1.4h, #8 5497; CHECK-SD-NEXT: shl v7.4h, v7.4h, #8 5498; CHECK-SD-NEXT: shl v3.4h, v3.4h, #8 5499; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8 5500; CHECK-SD-NEXT: sshll v4.4s, v4.4h, #0 5501; CHECK-SD-NEXT: sshr v5.4h, v5.4h, #8 5502; CHECK-SD-NEXT: sshr v6.4h, v6.4h, #8 5503; CHECK-SD-NEXT: sshr v2.4h, v2.4h, #8 5504; CHECK-SD-NEXT: sshr v1.4h, v1.4h, #8 5505; CHECK-SD-NEXT: sshr v7.4h, v7.4h, #8 5506; CHECK-SD-NEXT: sshr v3.4h, v3.4h, #8 5507; CHECK-SD-NEXT: sshll v16.4s, v0.4h, #0 5508; CHECK-SD-NEXT: scvtf v0.4s, v4.4s 5509; CHECK-SD-NEXT: sshll v5.4s, v5.4h, #0 5510; CHECK-SD-NEXT: sshll v6.4s, v6.4h, #0 5511; CHECK-SD-NEXT: sshll v17.4s, v2.4h, #0 5512; CHECK-SD-NEXT: sshll v18.4s, v1.4h, #0 5513; CHECK-SD-NEXT: sshll v7.4s, v7.4h, #0 5514; CHECK-SD-NEXT: sshll v19.4s, v3.4h, #0 5515; CHECK-SD-NEXT: scvtf v1.4s, v16.4s 5516; CHECK-SD-NEXT: scvtf v4.4s, v5.4s 5517; CHECK-SD-NEXT: scvtf v2.4s, v6.4s 5518; CHECK-SD-NEXT: scvtf v3.4s, v17.4s 5519; CHECK-SD-NEXT: scvtf v5.4s, v18.4s 5520; CHECK-SD-NEXT: scvtf v6.4s, v7.4s 5521; CHECK-SD-NEXT: scvtf v7.4s, v19.4s 5522; CHECK-SD-NEXT: ret 5523; 5524; CHECK-GI-LABEL: stofp_v32i8_v32f32: 5525; CHECK-GI: // %bb.0: // %entry 5526; CHECK-GI-NEXT: sshll v2.8h, v0.8b, #0 5527; CHECK-GI-NEXT: sshll2 v0.8h, v0.16b, #0 5528; CHECK-GI-NEXT: sshll v3.8h, v1.8b, #0 5529; CHECK-GI-NEXT: sshll2 v1.8h, v1.16b, #0 5530; CHECK-GI-NEXT: sshll v4.4s, v2.4h, #0 5531; CHECK-GI-NEXT: sshll2 v2.4s, v2.8h, #0 5532; CHECK-GI-NEXT: sshll v5.4s, v0.4h, #0 5533; CHECK-GI-NEXT: sshll2 v6.4s, v0.8h, #0 5534; CHECK-GI-NEXT: sshll v7.4s, v3.4h, #0 5535; CHECK-GI-NEXT: sshll2 v16.4s, v3.8h, #0 5536; CHECK-GI-NEXT: sshll v17.4s, v1.4h, #0 5537; CHECK-GI-NEXT: sshll2 v18.4s, v1.8h, #0 5538; CHECK-GI-NEXT: scvtf v0.4s, v4.4s 5539; CHECK-GI-NEXT: scvtf v1.4s, v2.4s 5540; CHECK-GI-NEXT: scvtf v2.4s, v5.4s 5541; CHECK-GI-NEXT: scvtf v3.4s, v6.4s 5542; CHECK-GI-NEXT: scvtf v4.4s, v7.4s 5543; CHECK-GI-NEXT: scvtf v5.4s, v16.4s 5544; CHECK-GI-NEXT: scvtf v6.4s, v17.4s 5545; CHECK-GI-NEXT: scvtf v7.4s, v18.4s 5546; CHECK-GI-NEXT: ret 5547entry: 5548 %c = sitofp <32 x i8> %a to <32 x float> 5549 ret <32 x float> %c 5550} 5551 5552define <32 x float> @utofp_v32i8_v32f32(<32 x i8> %a) { 5553; CHECK-SD-LABEL: utofp_v32i8_v32f32: 5554; CHECK-SD: // %bb.0: // %entry 5555; CHECK-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8 5556; CHECK-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8 5557; CHECK-SD-NEXT: zip1 v4.8b, v0.8b, v0.8b 5558; CHECK-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b 5559; CHECK-SD-NEXT: bic v4.4h, #255, lsl #8 5560; CHECK-SD-NEXT: zip1 v5.8b, v1.8b, v0.8b 5561; CHECK-SD-NEXT: zip1 v6.8b, v2.8b, v0.8b 5562; CHECK-SD-NEXT: zip2 v2.8b, v2.8b, v0.8b 5563; CHECK-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b 5564; CHECK-SD-NEXT: zip1 v7.8b, v3.8b, v0.8b 5565; CHECK-SD-NEXT: zip2 v3.8b, v3.8b, v0.8b 5566; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8 5567; CHECK-SD-NEXT: ushll v4.4s, v4.4h, #0 5568; CHECK-SD-NEXT: bic v5.4h, #255, lsl #8 5569; CHECK-SD-NEXT: bic v6.4h, #255, lsl #8 5570; CHECK-SD-NEXT: bic v2.4h, #255, lsl #8 5571; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8 5572; CHECK-SD-NEXT: bic v7.4h, #255, lsl #8 5573; CHECK-SD-NEXT: bic v3.4h, #255, lsl #8 5574; CHECK-SD-NEXT: ushll v16.4s, v0.4h, #0 5575; CHECK-SD-NEXT: ucvtf v0.4s, v4.4s 5576; CHECK-SD-NEXT: ushll v5.4s, v5.4h, #0 5577; CHECK-SD-NEXT: ushll v6.4s, v6.4h, #0 5578; CHECK-SD-NEXT: ushll v17.4s, v2.4h, #0 5579; CHECK-SD-NEXT: ushll v18.4s, v1.4h, #0 5580; CHECK-SD-NEXT: ushll v7.4s, v7.4h, #0 5581; CHECK-SD-NEXT: ushll v19.4s, v3.4h, #0 5582; CHECK-SD-NEXT: ucvtf v1.4s, v16.4s 5583; CHECK-SD-NEXT: ucvtf v4.4s, v5.4s 5584; CHECK-SD-NEXT: ucvtf v2.4s, v6.4s 5585; CHECK-SD-NEXT: ucvtf v3.4s, v17.4s 5586; CHECK-SD-NEXT: ucvtf v5.4s, v18.4s 5587; CHECK-SD-NEXT: ucvtf v6.4s, v7.4s 5588; CHECK-SD-NEXT: ucvtf v7.4s, v19.4s 5589; CHECK-SD-NEXT: ret 5590; 5591; CHECK-GI-LABEL: utofp_v32i8_v32f32: 5592; CHECK-GI: // %bb.0: // %entry 5593; CHECK-GI-NEXT: ushll v2.8h, v0.8b, #0 5594; CHECK-GI-NEXT: ushll2 v0.8h, v0.16b, #0 5595; CHECK-GI-NEXT: ushll v3.8h, v1.8b, #0 5596; CHECK-GI-NEXT: ushll2 v1.8h, v1.16b, #0 5597; CHECK-GI-NEXT: ushll v4.4s, v2.4h, #0 5598; CHECK-GI-NEXT: ushll2 v2.4s, v2.8h, #0 5599; CHECK-GI-NEXT: ushll v5.4s, v0.4h, #0 5600; CHECK-GI-NEXT: ushll2 v6.4s, v0.8h, #0 5601; CHECK-GI-NEXT: ushll v7.4s, v3.4h, #0 5602; CHECK-GI-NEXT: ushll2 v16.4s, v3.8h, #0 5603; CHECK-GI-NEXT: ushll v17.4s, v1.4h, #0 5604; CHECK-GI-NEXT: ushll2 v18.4s, v1.8h, #0 5605; CHECK-GI-NEXT: ucvtf v0.4s, v4.4s 5606; CHECK-GI-NEXT: ucvtf v1.4s, v2.4s 5607; CHECK-GI-NEXT: ucvtf v2.4s, v5.4s 5608; CHECK-GI-NEXT: ucvtf v3.4s, v6.4s 5609; CHECK-GI-NEXT: ucvtf v4.4s, v7.4s 5610; CHECK-GI-NEXT: ucvtf v5.4s, v16.4s 5611; CHECK-GI-NEXT: ucvtf v6.4s, v17.4s 5612; CHECK-GI-NEXT: ucvtf v7.4s, v18.4s 5613; CHECK-GI-NEXT: ret 5614entry: 5615 %c = uitofp <32 x i8> %a to <32 x float> 5616 ret <32 x float> %c 5617} 5618 5619define <2 x half> @stofp_v2i128_v2f16(<2 x i128> %a) { 5620; CHECK-SD-NOFP16-LABEL: stofp_v2i128_v2f16: 5621; CHECK-SD-NOFP16: // %bb.0: // %entry 5622; CHECK-SD-NOFP16-NEXT: sub sp, sp, #48 5623; CHECK-SD-NOFP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5624; CHECK-SD-NOFP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5625; CHECK-SD-NOFP16-NEXT: .cfi_def_cfa_offset 48 5626; CHECK-SD-NOFP16-NEXT: .cfi_offset w19, -8 5627; CHECK-SD-NOFP16-NEXT: .cfi_offset w20, -16 5628; CHECK-SD-NOFP16-NEXT: .cfi_offset w30, -32 5629; CHECK-SD-NOFP16-NEXT: mov x19, x1 5630; CHECK-SD-NOFP16-NEXT: mov x20, x0 5631; CHECK-SD-NOFP16-NEXT: mov x0, x2 5632; CHECK-SD-NOFP16-NEXT: mov x1, x3 5633; CHECK-SD-NOFP16-NEXT: bl __floattisf 5634; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 5635; CHECK-SD-NOFP16-NEXT: mov x0, x20 5636; CHECK-SD-NOFP16-NEXT: mov x1, x19 5637; CHECK-SD-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5638; CHECK-SD-NOFP16-NEXT: bl __floattisf 5639; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 5640; CHECK-SD-NOFP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5641; CHECK-SD-NOFP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5642; CHECK-SD-NOFP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5643; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v1.h[0] 5644; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5645; CHECK-SD-NOFP16-NEXT: add sp, sp, #48 5646; CHECK-SD-NOFP16-NEXT: ret 5647; 5648; CHECK-SD-FP16-LABEL: stofp_v2i128_v2f16: 5649; CHECK-SD-FP16: // %bb.0: // %entry 5650; CHECK-SD-FP16-NEXT: sub sp, sp, #48 5651; CHECK-SD-FP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5652; CHECK-SD-FP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5653; CHECK-SD-FP16-NEXT: .cfi_def_cfa_offset 48 5654; CHECK-SD-FP16-NEXT: .cfi_offset w19, -8 5655; CHECK-SD-FP16-NEXT: .cfi_offset w20, -16 5656; CHECK-SD-FP16-NEXT: .cfi_offset w30, -32 5657; CHECK-SD-FP16-NEXT: mov x19, x1 5658; CHECK-SD-FP16-NEXT: mov x20, x0 5659; CHECK-SD-FP16-NEXT: mov x0, x2 5660; CHECK-SD-FP16-NEXT: mov x1, x3 5661; CHECK-SD-FP16-NEXT: bl __floattihf 5662; CHECK-SD-FP16-NEXT: mov x0, x20 5663; CHECK-SD-FP16-NEXT: mov x1, x19 5664; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5665; CHECK-SD-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5666; CHECK-SD-FP16-NEXT: bl __floattihf 5667; CHECK-SD-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5668; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5669; CHECK-SD-FP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5670; CHECK-SD-FP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5671; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 5672; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5673; CHECK-SD-FP16-NEXT: add sp, sp, #48 5674; CHECK-SD-FP16-NEXT: ret 5675; 5676; CHECK-GI-NOFP16-LABEL: stofp_v2i128_v2f16: 5677; CHECK-GI-NOFP16: // %bb.0: // %entry 5678; CHECK-GI-NOFP16-NEXT: sub sp, sp, #48 5679; CHECK-GI-NOFP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5680; CHECK-GI-NOFP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5681; CHECK-GI-NOFP16-NEXT: .cfi_def_cfa_offset 48 5682; CHECK-GI-NOFP16-NEXT: .cfi_offset w19, -8 5683; CHECK-GI-NOFP16-NEXT: .cfi_offset w20, -16 5684; CHECK-GI-NOFP16-NEXT: .cfi_offset w30, -32 5685; CHECK-GI-NOFP16-NEXT: mov x19, x2 5686; CHECK-GI-NOFP16-NEXT: mov x20, x3 5687; CHECK-GI-NOFP16-NEXT: bl __floattisf 5688; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 5689; CHECK-GI-NOFP16-NEXT: mov x0, x19 5690; CHECK-GI-NOFP16-NEXT: mov x1, x20 5691; CHECK-GI-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5692; CHECK-GI-NOFP16-NEXT: bl __floattisf 5693; CHECK-GI-NOFP16-NEXT: fcvt h1, s0 5694; CHECK-GI-NOFP16-NEXT: ldr q0, [sp] // 16-byte Folded Reload 5695; CHECK-GI-NOFP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5696; CHECK-GI-NOFP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5697; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[0] 5698; CHECK-GI-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5699; CHECK-GI-NOFP16-NEXT: add sp, sp, #48 5700; CHECK-GI-NOFP16-NEXT: ret 5701; 5702; CHECK-GI-FP16-LABEL: stofp_v2i128_v2f16: 5703; CHECK-GI-FP16: // %bb.0: // %entry 5704; CHECK-GI-FP16-NEXT: sub sp, sp, #48 5705; CHECK-GI-FP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5706; CHECK-GI-FP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5707; CHECK-GI-FP16-NEXT: .cfi_def_cfa_offset 48 5708; CHECK-GI-FP16-NEXT: .cfi_offset w19, -8 5709; CHECK-GI-FP16-NEXT: .cfi_offset w20, -16 5710; CHECK-GI-FP16-NEXT: .cfi_offset w30, -32 5711; CHECK-GI-FP16-NEXT: mov x19, x2 5712; CHECK-GI-FP16-NEXT: mov x20, x3 5713; CHECK-GI-FP16-NEXT: bl __floattihf 5714; CHECK-GI-FP16-NEXT: mov x0, x19 5715; CHECK-GI-FP16-NEXT: mov x1, x20 5716; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5717; CHECK-GI-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5718; CHECK-GI-FP16-NEXT: bl __floattihf 5719; CHECK-GI-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5720; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5721; CHECK-GI-FP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5722; CHECK-GI-FP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5723; CHECK-GI-FP16-NEXT: mov v1.h[1], v0.h[0] 5724; CHECK-GI-FP16-NEXT: fmov d0, d1 5725; CHECK-GI-FP16-NEXT: add sp, sp, #48 5726; CHECK-GI-FP16-NEXT: ret 5727entry: 5728 %c = sitofp <2 x i128> %a to <2 x half> 5729 ret <2 x half> %c 5730} 5731 5732define <2 x half> @utofp_v2i128_v2f16(<2 x i128> %a) { 5733; CHECK-SD-NOFP16-LABEL: utofp_v2i128_v2f16: 5734; CHECK-SD-NOFP16: // %bb.0: // %entry 5735; CHECK-SD-NOFP16-NEXT: sub sp, sp, #48 5736; CHECK-SD-NOFP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5737; CHECK-SD-NOFP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5738; CHECK-SD-NOFP16-NEXT: .cfi_def_cfa_offset 48 5739; CHECK-SD-NOFP16-NEXT: .cfi_offset w19, -8 5740; CHECK-SD-NOFP16-NEXT: .cfi_offset w20, -16 5741; CHECK-SD-NOFP16-NEXT: .cfi_offset w30, -32 5742; CHECK-SD-NOFP16-NEXT: mov x19, x1 5743; CHECK-SD-NOFP16-NEXT: mov x20, x0 5744; CHECK-SD-NOFP16-NEXT: mov x0, x2 5745; CHECK-SD-NOFP16-NEXT: mov x1, x3 5746; CHECK-SD-NOFP16-NEXT: bl __floatuntisf 5747; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 5748; CHECK-SD-NOFP16-NEXT: mov x0, x20 5749; CHECK-SD-NOFP16-NEXT: mov x1, x19 5750; CHECK-SD-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5751; CHECK-SD-NOFP16-NEXT: bl __floatuntisf 5752; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 5753; CHECK-SD-NOFP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5754; CHECK-SD-NOFP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5755; CHECK-SD-NOFP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5756; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v1.h[0] 5757; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5758; CHECK-SD-NOFP16-NEXT: add sp, sp, #48 5759; CHECK-SD-NOFP16-NEXT: ret 5760; 5761; CHECK-SD-FP16-LABEL: utofp_v2i128_v2f16: 5762; CHECK-SD-FP16: // %bb.0: // %entry 5763; CHECK-SD-FP16-NEXT: sub sp, sp, #48 5764; CHECK-SD-FP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5765; CHECK-SD-FP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5766; CHECK-SD-FP16-NEXT: .cfi_def_cfa_offset 48 5767; CHECK-SD-FP16-NEXT: .cfi_offset w19, -8 5768; CHECK-SD-FP16-NEXT: .cfi_offset w20, -16 5769; CHECK-SD-FP16-NEXT: .cfi_offset w30, -32 5770; CHECK-SD-FP16-NEXT: mov x19, x1 5771; CHECK-SD-FP16-NEXT: mov x20, x0 5772; CHECK-SD-FP16-NEXT: mov x0, x2 5773; CHECK-SD-FP16-NEXT: mov x1, x3 5774; CHECK-SD-FP16-NEXT: bl __floatuntihf 5775; CHECK-SD-FP16-NEXT: mov x0, x20 5776; CHECK-SD-FP16-NEXT: mov x1, x19 5777; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5778; CHECK-SD-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5779; CHECK-SD-FP16-NEXT: bl __floatuntihf 5780; CHECK-SD-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5781; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5782; CHECK-SD-FP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5783; CHECK-SD-FP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5784; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 5785; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5786; CHECK-SD-FP16-NEXT: add sp, sp, #48 5787; CHECK-SD-FP16-NEXT: ret 5788; 5789; CHECK-GI-NOFP16-LABEL: utofp_v2i128_v2f16: 5790; CHECK-GI-NOFP16: // %bb.0: // %entry 5791; CHECK-GI-NOFP16-NEXT: sub sp, sp, #48 5792; CHECK-GI-NOFP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5793; CHECK-GI-NOFP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5794; CHECK-GI-NOFP16-NEXT: .cfi_def_cfa_offset 48 5795; CHECK-GI-NOFP16-NEXT: .cfi_offset w19, -8 5796; CHECK-GI-NOFP16-NEXT: .cfi_offset w20, -16 5797; CHECK-GI-NOFP16-NEXT: .cfi_offset w30, -32 5798; CHECK-GI-NOFP16-NEXT: mov x19, x2 5799; CHECK-GI-NOFP16-NEXT: mov x20, x3 5800; CHECK-GI-NOFP16-NEXT: bl __floatuntisf 5801; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 5802; CHECK-GI-NOFP16-NEXT: mov x0, x19 5803; CHECK-GI-NOFP16-NEXT: mov x1, x20 5804; CHECK-GI-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5805; CHECK-GI-NOFP16-NEXT: bl __floatuntisf 5806; CHECK-GI-NOFP16-NEXT: fcvt h1, s0 5807; CHECK-GI-NOFP16-NEXT: ldr q0, [sp] // 16-byte Folded Reload 5808; CHECK-GI-NOFP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5809; CHECK-GI-NOFP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5810; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[0] 5811; CHECK-GI-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5812; CHECK-GI-NOFP16-NEXT: add sp, sp, #48 5813; CHECK-GI-NOFP16-NEXT: ret 5814; 5815; CHECK-GI-FP16-LABEL: utofp_v2i128_v2f16: 5816; CHECK-GI-FP16: // %bb.0: // %entry 5817; CHECK-GI-FP16-NEXT: sub sp, sp, #48 5818; CHECK-GI-FP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5819; CHECK-GI-FP16-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill 5820; CHECK-GI-FP16-NEXT: .cfi_def_cfa_offset 48 5821; CHECK-GI-FP16-NEXT: .cfi_offset w19, -8 5822; CHECK-GI-FP16-NEXT: .cfi_offset w20, -16 5823; CHECK-GI-FP16-NEXT: .cfi_offset w30, -32 5824; CHECK-GI-FP16-NEXT: mov x19, x2 5825; CHECK-GI-FP16-NEXT: mov x20, x3 5826; CHECK-GI-FP16-NEXT: bl __floatuntihf 5827; CHECK-GI-FP16-NEXT: mov x0, x19 5828; CHECK-GI-FP16-NEXT: mov x1, x20 5829; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5830; CHECK-GI-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5831; CHECK-GI-FP16-NEXT: bl __floatuntihf 5832; CHECK-GI-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5833; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5834; CHECK-GI-FP16-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload 5835; CHECK-GI-FP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5836; CHECK-GI-FP16-NEXT: mov v1.h[1], v0.h[0] 5837; CHECK-GI-FP16-NEXT: fmov d0, d1 5838; CHECK-GI-FP16-NEXT: add sp, sp, #48 5839; CHECK-GI-FP16-NEXT: ret 5840entry: 5841 %c = uitofp <2 x i128> %a to <2 x half> 5842 ret <2 x half> %c 5843} 5844 5845define <3 x half> @stofp_v3i128_v3f16(<3 x i128> %a) { 5846; CHECK-SD-NOFP16-LABEL: stofp_v3i128_v3f16: 5847; CHECK-SD-NOFP16: // %bb.0: // %entry 5848; CHECK-SD-NOFP16-NEXT: sub sp, sp, #64 5849; CHECK-SD-NOFP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5850; CHECK-SD-NOFP16-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 5851; CHECK-SD-NOFP16-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 5852; CHECK-SD-NOFP16-NEXT: .cfi_def_cfa_offset 64 5853; CHECK-SD-NOFP16-NEXT: .cfi_offset w19, -8 5854; CHECK-SD-NOFP16-NEXT: .cfi_offset w20, -16 5855; CHECK-SD-NOFP16-NEXT: .cfi_offset w21, -24 5856; CHECK-SD-NOFP16-NEXT: .cfi_offset w22, -32 5857; CHECK-SD-NOFP16-NEXT: .cfi_offset w30, -48 5858; CHECK-SD-NOFP16-NEXT: mov x21, x1 5859; CHECK-SD-NOFP16-NEXT: mov x22, x0 5860; CHECK-SD-NOFP16-NEXT: mov x0, x2 5861; CHECK-SD-NOFP16-NEXT: mov x1, x3 5862; CHECK-SD-NOFP16-NEXT: mov x19, x5 5863; CHECK-SD-NOFP16-NEXT: mov x20, x4 5864; CHECK-SD-NOFP16-NEXT: bl __floattisf 5865; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 5866; CHECK-SD-NOFP16-NEXT: mov x0, x22 5867; CHECK-SD-NOFP16-NEXT: mov x1, x21 5868; CHECK-SD-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5869; CHECK-SD-NOFP16-NEXT: bl __floattisf 5870; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 5871; CHECK-SD-NOFP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5872; CHECK-SD-NOFP16-NEXT: mov x0, x20 5873; CHECK-SD-NOFP16-NEXT: mov x1, x19 5874; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v1.h[0] 5875; CHECK-SD-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5876; CHECK-SD-NOFP16-NEXT: bl __floattisf 5877; CHECK-SD-NOFP16-NEXT: fcvt h1, s0 5878; CHECK-SD-NOFP16-NEXT: ldr q0, [sp] // 16-byte Folded Reload 5879; CHECK-SD-NOFP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5880; CHECK-SD-NOFP16-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 5881; CHECK-SD-NOFP16-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 5882; CHECK-SD-NOFP16-NEXT: mov v0.h[2], v1.h[0] 5883; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5884; CHECK-SD-NOFP16-NEXT: add sp, sp, #64 5885; CHECK-SD-NOFP16-NEXT: ret 5886; 5887; CHECK-SD-FP16-LABEL: stofp_v3i128_v3f16: 5888; CHECK-SD-FP16: // %bb.0: // %entry 5889; CHECK-SD-FP16-NEXT: sub sp, sp, #64 5890; CHECK-SD-FP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 5891; CHECK-SD-FP16-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 5892; CHECK-SD-FP16-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 5893; CHECK-SD-FP16-NEXT: .cfi_def_cfa_offset 64 5894; CHECK-SD-FP16-NEXT: .cfi_offset w19, -8 5895; CHECK-SD-FP16-NEXT: .cfi_offset w20, -16 5896; CHECK-SD-FP16-NEXT: .cfi_offset w21, -24 5897; CHECK-SD-FP16-NEXT: .cfi_offset w22, -32 5898; CHECK-SD-FP16-NEXT: .cfi_offset w30, -48 5899; CHECK-SD-FP16-NEXT: mov x21, x1 5900; CHECK-SD-FP16-NEXT: mov x22, x0 5901; CHECK-SD-FP16-NEXT: mov x0, x2 5902; CHECK-SD-FP16-NEXT: mov x1, x3 5903; CHECK-SD-FP16-NEXT: mov x19, x5 5904; CHECK-SD-FP16-NEXT: mov x20, x4 5905; CHECK-SD-FP16-NEXT: bl __floattihf 5906; CHECK-SD-FP16-NEXT: mov x0, x22 5907; CHECK-SD-FP16-NEXT: mov x1, x21 5908; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5909; CHECK-SD-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5910; CHECK-SD-FP16-NEXT: bl __floattihf 5911; CHECK-SD-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5912; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5913; CHECK-SD-FP16-NEXT: mov x0, x20 5914; CHECK-SD-FP16-NEXT: mov x1, x19 5915; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 5916; CHECK-SD-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5917; CHECK-SD-FP16-NEXT: bl __floattihf 5918; CHECK-SD-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 5919; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5920; CHECK-SD-FP16-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 5921; CHECK-SD-FP16-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 5922; CHECK-SD-FP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 5923; CHECK-SD-FP16-NEXT: mov v1.h[2], v0.h[0] 5924; CHECK-SD-FP16-NEXT: fmov d0, d1 5925; CHECK-SD-FP16-NEXT: add sp, sp, #64 5926; CHECK-SD-FP16-NEXT: ret 5927; 5928; CHECK-GI-NOFP16-LABEL: stofp_v3i128_v3f16: 5929; CHECK-GI-NOFP16: // %bb.0: // %entry 5930; CHECK-GI-NOFP16-NEXT: sub sp, sp, #80 5931; CHECK-GI-NOFP16-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 5932; CHECK-GI-NOFP16-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 5933; CHECK-GI-NOFP16-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 5934; CHECK-GI-NOFP16-NEXT: .cfi_def_cfa_offset 80 5935; CHECK-GI-NOFP16-NEXT: .cfi_offset w19, -8 5936; CHECK-GI-NOFP16-NEXT: .cfi_offset w20, -16 5937; CHECK-GI-NOFP16-NEXT: .cfi_offset w21, -24 5938; CHECK-GI-NOFP16-NEXT: .cfi_offset w22, -32 5939; CHECK-GI-NOFP16-NEXT: .cfi_offset w30, -48 5940; CHECK-GI-NOFP16-NEXT: mov x19, x2 5941; CHECK-GI-NOFP16-NEXT: mov x20, x3 5942; CHECK-GI-NOFP16-NEXT: mov x21, x4 5943; CHECK-GI-NOFP16-NEXT: mov x22, x5 5944; CHECK-GI-NOFP16-NEXT: bl __floattisf 5945; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 5946; CHECK-GI-NOFP16-NEXT: mov x0, x19 5947; CHECK-GI-NOFP16-NEXT: mov x1, x20 5948; CHECK-GI-NOFP16-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 5949; CHECK-GI-NOFP16-NEXT: bl __floattisf 5950; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 5951; CHECK-GI-NOFP16-NEXT: mov x0, x21 5952; CHECK-GI-NOFP16-NEXT: mov x1, x22 5953; CHECK-GI-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5954; CHECK-GI-NOFP16-NEXT: bl __floattisf 5955; CHECK-GI-NOFP16-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 5956; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 5957; CHECK-GI-NOFP16-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 5958; CHECK-GI-NOFP16-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 5959; CHECK-GI-NOFP16-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 5960; CHECK-GI-NOFP16-NEXT: mov v1.h[1], v2.h[0] 5961; CHECK-GI-NOFP16-NEXT: mov v1.h[2], v0.h[0] 5962; CHECK-GI-NOFP16-NEXT: mov v0.16b, v1.16b 5963; CHECK-GI-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 5964; CHECK-GI-NOFP16-NEXT: add sp, sp, #80 5965; CHECK-GI-NOFP16-NEXT: ret 5966; 5967; CHECK-GI-FP16-LABEL: stofp_v3i128_v3f16: 5968; CHECK-GI-FP16: // %bb.0: // %entry 5969; CHECK-GI-FP16-NEXT: sub sp, sp, #80 5970; CHECK-GI-FP16-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 5971; CHECK-GI-FP16-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 5972; CHECK-GI-FP16-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 5973; CHECK-GI-FP16-NEXT: .cfi_def_cfa_offset 80 5974; CHECK-GI-FP16-NEXT: .cfi_offset w19, -8 5975; CHECK-GI-FP16-NEXT: .cfi_offset w20, -16 5976; CHECK-GI-FP16-NEXT: .cfi_offset w21, -24 5977; CHECK-GI-FP16-NEXT: .cfi_offset w22, -32 5978; CHECK-GI-FP16-NEXT: .cfi_offset w30, -48 5979; CHECK-GI-FP16-NEXT: mov x19, x2 5980; CHECK-GI-FP16-NEXT: mov x20, x3 5981; CHECK-GI-FP16-NEXT: mov x21, x4 5982; CHECK-GI-FP16-NEXT: mov x22, x5 5983; CHECK-GI-FP16-NEXT: bl __floattihf 5984; CHECK-GI-FP16-NEXT: mov x0, x19 5985; CHECK-GI-FP16-NEXT: mov x1, x20 5986; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5987; CHECK-GI-FP16-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 5988; CHECK-GI-FP16-NEXT: bl __floattihf 5989; CHECK-GI-FP16-NEXT: mov x0, x21 5990; CHECK-GI-FP16-NEXT: mov x1, x22 5991; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5992; CHECK-GI-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 5993; CHECK-GI-FP16-NEXT: bl __floattihf 5994; CHECK-GI-FP16-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 5995; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 5996; CHECK-GI-FP16-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 5997; CHECK-GI-FP16-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 5998; CHECK-GI-FP16-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 5999; CHECK-GI-FP16-NEXT: mov v1.h[1], v2.h[0] 6000; CHECK-GI-FP16-NEXT: mov v1.h[2], v0.h[0] 6001; CHECK-GI-FP16-NEXT: mov v0.16b, v1.16b 6002; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6003; CHECK-GI-FP16-NEXT: add sp, sp, #80 6004; CHECK-GI-FP16-NEXT: ret 6005entry: 6006 %c = sitofp <3 x i128> %a to <3 x half> 6007 ret <3 x half> %c 6008} 6009 6010define <3 x half> @utofp_v3i128_v3f16(<3 x i128> %a) { 6011; CHECK-SD-NOFP16-LABEL: utofp_v3i128_v3f16: 6012; CHECK-SD-NOFP16: // %bb.0: // %entry 6013; CHECK-SD-NOFP16-NEXT: sub sp, sp, #64 6014; CHECK-SD-NOFP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 6015; CHECK-SD-NOFP16-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 6016; CHECK-SD-NOFP16-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 6017; CHECK-SD-NOFP16-NEXT: .cfi_def_cfa_offset 64 6018; CHECK-SD-NOFP16-NEXT: .cfi_offset w19, -8 6019; CHECK-SD-NOFP16-NEXT: .cfi_offset w20, -16 6020; CHECK-SD-NOFP16-NEXT: .cfi_offset w21, -24 6021; CHECK-SD-NOFP16-NEXT: .cfi_offset w22, -32 6022; CHECK-SD-NOFP16-NEXT: .cfi_offset w30, -48 6023; CHECK-SD-NOFP16-NEXT: mov x21, x1 6024; CHECK-SD-NOFP16-NEXT: mov x22, x0 6025; CHECK-SD-NOFP16-NEXT: mov x0, x2 6026; CHECK-SD-NOFP16-NEXT: mov x1, x3 6027; CHECK-SD-NOFP16-NEXT: mov x19, x5 6028; CHECK-SD-NOFP16-NEXT: mov x20, x4 6029; CHECK-SD-NOFP16-NEXT: bl __floatuntisf 6030; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 6031; CHECK-SD-NOFP16-NEXT: mov x0, x22 6032; CHECK-SD-NOFP16-NEXT: mov x1, x21 6033; CHECK-SD-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 6034; CHECK-SD-NOFP16-NEXT: bl __floatuntisf 6035; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 6036; CHECK-SD-NOFP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 6037; CHECK-SD-NOFP16-NEXT: mov x0, x20 6038; CHECK-SD-NOFP16-NEXT: mov x1, x19 6039; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v1.h[0] 6040; CHECK-SD-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 6041; CHECK-SD-NOFP16-NEXT: bl __floatuntisf 6042; CHECK-SD-NOFP16-NEXT: fcvt h1, s0 6043; CHECK-SD-NOFP16-NEXT: ldr q0, [sp] // 16-byte Folded Reload 6044; CHECK-SD-NOFP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 6045; CHECK-SD-NOFP16-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 6046; CHECK-SD-NOFP16-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 6047; CHECK-SD-NOFP16-NEXT: mov v0.h[2], v1.h[0] 6048; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6049; CHECK-SD-NOFP16-NEXT: add sp, sp, #64 6050; CHECK-SD-NOFP16-NEXT: ret 6051; 6052; CHECK-SD-FP16-LABEL: utofp_v3i128_v3f16: 6053; CHECK-SD-FP16: // %bb.0: // %entry 6054; CHECK-SD-FP16-NEXT: sub sp, sp, #64 6055; CHECK-SD-FP16-NEXT: str x30, [sp, #16] // 8-byte Folded Spill 6056; CHECK-SD-FP16-NEXT: stp x22, x21, [sp, #32] // 16-byte Folded Spill 6057; CHECK-SD-FP16-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill 6058; CHECK-SD-FP16-NEXT: .cfi_def_cfa_offset 64 6059; CHECK-SD-FP16-NEXT: .cfi_offset w19, -8 6060; CHECK-SD-FP16-NEXT: .cfi_offset w20, -16 6061; CHECK-SD-FP16-NEXT: .cfi_offset w21, -24 6062; CHECK-SD-FP16-NEXT: .cfi_offset w22, -32 6063; CHECK-SD-FP16-NEXT: .cfi_offset w30, -48 6064; CHECK-SD-FP16-NEXT: mov x21, x1 6065; CHECK-SD-FP16-NEXT: mov x22, x0 6066; CHECK-SD-FP16-NEXT: mov x0, x2 6067; CHECK-SD-FP16-NEXT: mov x1, x3 6068; CHECK-SD-FP16-NEXT: mov x19, x5 6069; CHECK-SD-FP16-NEXT: mov x20, x4 6070; CHECK-SD-FP16-NEXT: bl __floatuntihf 6071; CHECK-SD-FP16-NEXT: mov x0, x22 6072; CHECK-SD-FP16-NEXT: mov x1, x21 6073; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 6074; CHECK-SD-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 6075; CHECK-SD-FP16-NEXT: bl __floatuntihf 6076; CHECK-SD-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 6077; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 6078; CHECK-SD-FP16-NEXT: mov x0, x20 6079; CHECK-SD-FP16-NEXT: mov x1, x19 6080; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 6081; CHECK-SD-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 6082; CHECK-SD-FP16-NEXT: bl __floatuntihf 6083; CHECK-SD-FP16-NEXT: ldr q1, [sp] // 16-byte Folded Reload 6084; CHECK-SD-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 6085; CHECK-SD-FP16-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload 6086; CHECK-SD-FP16-NEXT: ldp x22, x21, [sp, #32] // 16-byte Folded Reload 6087; CHECK-SD-FP16-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload 6088; CHECK-SD-FP16-NEXT: mov v1.h[2], v0.h[0] 6089; CHECK-SD-FP16-NEXT: fmov d0, d1 6090; CHECK-SD-FP16-NEXT: add sp, sp, #64 6091; CHECK-SD-FP16-NEXT: ret 6092; 6093; CHECK-GI-NOFP16-LABEL: utofp_v3i128_v3f16: 6094; CHECK-GI-NOFP16: // %bb.0: // %entry 6095; CHECK-GI-NOFP16-NEXT: sub sp, sp, #80 6096; CHECK-GI-NOFP16-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 6097; CHECK-GI-NOFP16-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 6098; CHECK-GI-NOFP16-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 6099; CHECK-GI-NOFP16-NEXT: .cfi_def_cfa_offset 80 6100; CHECK-GI-NOFP16-NEXT: .cfi_offset w19, -8 6101; CHECK-GI-NOFP16-NEXT: .cfi_offset w20, -16 6102; CHECK-GI-NOFP16-NEXT: .cfi_offset w21, -24 6103; CHECK-GI-NOFP16-NEXT: .cfi_offset w22, -32 6104; CHECK-GI-NOFP16-NEXT: .cfi_offset w30, -48 6105; CHECK-GI-NOFP16-NEXT: mov x19, x2 6106; CHECK-GI-NOFP16-NEXT: mov x20, x3 6107; CHECK-GI-NOFP16-NEXT: mov x21, x4 6108; CHECK-GI-NOFP16-NEXT: mov x22, x5 6109; CHECK-GI-NOFP16-NEXT: bl __floatuntisf 6110; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 6111; CHECK-GI-NOFP16-NEXT: mov x0, x19 6112; CHECK-GI-NOFP16-NEXT: mov x1, x20 6113; CHECK-GI-NOFP16-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 6114; CHECK-GI-NOFP16-NEXT: bl __floatuntisf 6115; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 6116; CHECK-GI-NOFP16-NEXT: mov x0, x21 6117; CHECK-GI-NOFP16-NEXT: mov x1, x22 6118; CHECK-GI-NOFP16-NEXT: str q0, [sp] // 16-byte Folded Spill 6119; CHECK-GI-NOFP16-NEXT: bl __floatuntisf 6120; CHECK-GI-NOFP16-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 6121; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 6122; CHECK-GI-NOFP16-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 6123; CHECK-GI-NOFP16-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 6124; CHECK-GI-NOFP16-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 6125; CHECK-GI-NOFP16-NEXT: mov v1.h[1], v2.h[0] 6126; CHECK-GI-NOFP16-NEXT: mov v1.h[2], v0.h[0] 6127; CHECK-GI-NOFP16-NEXT: mov v0.16b, v1.16b 6128; CHECK-GI-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6129; CHECK-GI-NOFP16-NEXT: add sp, sp, #80 6130; CHECK-GI-NOFP16-NEXT: ret 6131; 6132; CHECK-GI-FP16-LABEL: utofp_v3i128_v3f16: 6133; CHECK-GI-FP16: // %bb.0: // %entry 6134; CHECK-GI-FP16-NEXT: sub sp, sp, #80 6135; CHECK-GI-FP16-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 6136; CHECK-GI-FP16-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill 6137; CHECK-GI-FP16-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill 6138; CHECK-GI-FP16-NEXT: .cfi_def_cfa_offset 80 6139; CHECK-GI-FP16-NEXT: .cfi_offset w19, -8 6140; CHECK-GI-FP16-NEXT: .cfi_offset w20, -16 6141; CHECK-GI-FP16-NEXT: .cfi_offset w21, -24 6142; CHECK-GI-FP16-NEXT: .cfi_offset w22, -32 6143; CHECK-GI-FP16-NEXT: .cfi_offset w30, -48 6144; CHECK-GI-FP16-NEXT: mov x19, x2 6145; CHECK-GI-FP16-NEXT: mov x20, x3 6146; CHECK-GI-FP16-NEXT: mov x21, x4 6147; CHECK-GI-FP16-NEXT: mov x22, x5 6148; CHECK-GI-FP16-NEXT: bl __floatuntihf 6149; CHECK-GI-FP16-NEXT: mov x0, x19 6150; CHECK-GI-FP16-NEXT: mov x1, x20 6151; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 6152; CHECK-GI-FP16-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 6153; CHECK-GI-FP16-NEXT: bl __floatuntihf 6154; CHECK-GI-FP16-NEXT: mov x0, x21 6155; CHECK-GI-FP16-NEXT: mov x1, x22 6156; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 6157; CHECK-GI-FP16-NEXT: str q0, [sp] // 16-byte Folded Spill 6158; CHECK-GI-FP16-NEXT: bl __floatuntihf 6159; CHECK-GI-FP16-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 6160; CHECK-GI-FP16-NEXT: // kill: def $h0 killed $h0 def $q0 6161; CHECK-GI-FP16-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 6162; CHECK-GI-FP16-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload 6163; CHECK-GI-FP16-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload 6164; CHECK-GI-FP16-NEXT: mov v1.h[1], v2.h[0] 6165; CHECK-GI-FP16-NEXT: mov v1.h[2], v0.h[0] 6166; CHECK-GI-FP16-NEXT: mov v0.16b, v1.16b 6167; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6168; CHECK-GI-FP16-NEXT: add sp, sp, #80 6169; CHECK-GI-FP16-NEXT: ret 6170entry: 6171 %c = uitofp <3 x i128> %a to <3 x half> 6172 ret <3 x half> %c 6173} 6174 6175define <2 x half> @stofp_v2i64_v2f16(<2 x i64> %a) { 6176; CHECK-SD-NOFP16-LABEL: stofp_v2i64_v2f16: 6177; CHECK-SD-NOFP16: // %bb.0: // %entry 6178; CHECK-SD-NOFP16-NEXT: mov x8, v0.d[1] 6179; CHECK-SD-NOFP16-NEXT: fmov x9, d0 6180; CHECK-SD-NOFP16-NEXT: scvtf s1, x9 6181; CHECK-SD-NOFP16-NEXT: scvtf s0, x8 6182; CHECK-SD-NOFP16-NEXT: fcvt h2, s0 6183; CHECK-SD-NOFP16-NEXT: fcvt h0, s1 6184; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v2.h[0] 6185; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6186; CHECK-SD-NOFP16-NEXT: ret 6187; 6188; CHECK-SD-FP16-LABEL: stofp_v2i64_v2f16: 6189; CHECK-SD-FP16: // %bb.0: // %entry 6190; CHECK-SD-FP16-NEXT: mov x8, v0.d[1] 6191; CHECK-SD-FP16-NEXT: fmov x9, d0 6192; CHECK-SD-FP16-NEXT: scvtf h0, x9 6193; CHECK-SD-FP16-NEXT: scvtf h1, x8 6194; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 6195; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6196; CHECK-SD-FP16-NEXT: ret 6197; 6198; CHECK-GI-NOFP16-LABEL: stofp_v2i64_v2f16: 6199; CHECK-GI-NOFP16: // %bb.0: // %entry 6200; CHECK-GI-NOFP16-NEXT: scvtf v0.2d, v0.2d 6201; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6202; CHECK-GI-NOFP16-NEXT: mov v1.s[0], v0.s[0] 6203; CHECK-GI-NOFP16-NEXT: mov v1.s[1], v0.s[1] 6204; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 6205; CHECK-GI-NOFP16-NEXT: ret 6206; 6207; CHECK-GI-FP16-LABEL: stofp_v2i64_v2f16: 6208; CHECK-GI-FP16: // %bb.0: // %entry 6209; CHECK-GI-FP16-NEXT: scvtf v0.2d, v0.2d 6210; CHECK-GI-FP16-NEXT: mov d1, v0.d[1] 6211; CHECK-GI-FP16-NEXT: fcvt h0, d0 6212; CHECK-GI-FP16-NEXT: fcvt h1, d1 6213; CHECK-GI-FP16-NEXT: mov v0.h[1], v1.h[0] 6214; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6215; CHECK-GI-FP16-NEXT: ret 6216entry: 6217 %c = sitofp <2 x i64> %a to <2 x half> 6218 ret <2 x half> %c 6219} 6220 6221define <2 x half> @utofp_v2i64_v2f16(<2 x i64> %a) { 6222; CHECK-SD-NOFP16-LABEL: utofp_v2i64_v2f16: 6223; CHECK-SD-NOFP16: // %bb.0: // %entry 6224; CHECK-SD-NOFP16-NEXT: mov x8, v0.d[1] 6225; CHECK-SD-NOFP16-NEXT: fmov x9, d0 6226; CHECK-SD-NOFP16-NEXT: ucvtf s1, x9 6227; CHECK-SD-NOFP16-NEXT: ucvtf s0, x8 6228; CHECK-SD-NOFP16-NEXT: fcvt h2, s0 6229; CHECK-SD-NOFP16-NEXT: fcvt h0, s1 6230; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v2.h[0] 6231; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6232; CHECK-SD-NOFP16-NEXT: ret 6233; 6234; CHECK-SD-FP16-LABEL: utofp_v2i64_v2f16: 6235; CHECK-SD-FP16: // %bb.0: // %entry 6236; CHECK-SD-FP16-NEXT: mov x8, v0.d[1] 6237; CHECK-SD-FP16-NEXT: fmov x9, d0 6238; CHECK-SD-FP16-NEXT: ucvtf h0, x9 6239; CHECK-SD-FP16-NEXT: ucvtf h1, x8 6240; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 6241; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6242; CHECK-SD-FP16-NEXT: ret 6243; 6244; CHECK-GI-NOFP16-LABEL: utofp_v2i64_v2f16: 6245; CHECK-GI-NOFP16: // %bb.0: // %entry 6246; CHECK-GI-NOFP16-NEXT: ucvtf v0.2d, v0.2d 6247; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6248; CHECK-GI-NOFP16-NEXT: mov v1.s[0], v0.s[0] 6249; CHECK-GI-NOFP16-NEXT: mov v1.s[1], v0.s[1] 6250; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 6251; CHECK-GI-NOFP16-NEXT: ret 6252; 6253; CHECK-GI-FP16-LABEL: utofp_v2i64_v2f16: 6254; CHECK-GI-FP16: // %bb.0: // %entry 6255; CHECK-GI-FP16-NEXT: ucvtf v0.2d, v0.2d 6256; CHECK-GI-FP16-NEXT: mov d1, v0.d[1] 6257; CHECK-GI-FP16-NEXT: fcvt h0, d0 6258; CHECK-GI-FP16-NEXT: fcvt h1, d1 6259; CHECK-GI-FP16-NEXT: mov v0.h[1], v1.h[0] 6260; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6261; CHECK-GI-FP16-NEXT: ret 6262entry: 6263 %c = uitofp <2 x i64> %a to <2 x half> 6264 ret <2 x half> %c 6265} 6266 6267define <3 x half> @stofp_v3i64_v3f16(<3 x i64> %a) { 6268; CHECK-SD-LABEL: stofp_v3i64_v3f16: 6269; CHECK-SD: // %bb.0: // %entry 6270; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 6271; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 6272; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 6273; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 6274; CHECK-SD-NEXT: scvtf v1.2d, v2.2d 6275; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 6276; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6277; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6278; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6279; CHECK-SD-NEXT: ret 6280; 6281; CHECK-GI-NOFP16-LABEL: stofp_v3i64_v3f16: 6282; CHECK-GI-NOFP16: // %bb.0: // %entry 6283; CHECK-GI-NOFP16-NEXT: // kill: def $d0 killed $d0 def $q0 6284; CHECK-GI-NOFP16-NEXT: // kill: def $d1 killed $d1 def $q1 6285; CHECK-GI-NOFP16-NEXT: // kill: def $d2 killed $d2 def $q2 6286; CHECK-GI-NOFP16-NEXT: mov v0.d[1], v1.d[0] 6287; CHECK-GI-NOFP16-NEXT: scvtf v1.2d, v2.2d 6288; CHECK-GI-NOFP16-NEXT: scvtf v0.2d, v0.2d 6289; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6290; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6291; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6292; CHECK-GI-NOFP16-NEXT: ret 6293; 6294; CHECK-GI-FP16-LABEL: stofp_v3i64_v3f16: 6295; CHECK-GI-FP16: // %bb.0: // %entry 6296; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 def $q0 6297; CHECK-GI-FP16-NEXT: // kill: def $d1 killed $d1 def $q1 6298; CHECK-GI-FP16-NEXT: // kill: def $d2 killed $d2 def $q2 6299; CHECK-GI-FP16-NEXT: mov v0.d[1], v1.d[0] 6300; CHECK-GI-FP16-NEXT: scvtf v2.2d, v2.2d 6301; CHECK-GI-FP16-NEXT: scvtf v0.2d, v0.2d 6302; CHECK-GI-FP16-NEXT: fcvt h2, d2 6303; CHECK-GI-FP16-NEXT: mov d1, v0.d[1] 6304; CHECK-GI-FP16-NEXT: fcvt h0, d0 6305; CHECK-GI-FP16-NEXT: fcvt h1, d1 6306; CHECK-GI-FP16-NEXT: mov v0.h[1], v1.h[0] 6307; CHECK-GI-FP16-NEXT: mov v0.h[2], v2.h[0] 6308; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6309; CHECK-GI-FP16-NEXT: ret 6310entry: 6311 %c = sitofp <3 x i64> %a to <3 x half> 6312 ret <3 x half> %c 6313} 6314 6315define <3 x half> @utofp_v3i64_v3f16(<3 x i64> %a) { 6316; CHECK-SD-LABEL: utofp_v3i64_v3f16: 6317; CHECK-SD: // %bb.0: // %entry 6318; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 6319; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 6320; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 6321; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 6322; CHECK-SD-NEXT: ucvtf v1.2d, v2.2d 6323; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 6324; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6325; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6326; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6327; CHECK-SD-NEXT: ret 6328; 6329; CHECK-GI-NOFP16-LABEL: utofp_v3i64_v3f16: 6330; CHECK-GI-NOFP16: // %bb.0: // %entry 6331; CHECK-GI-NOFP16-NEXT: // kill: def $d0 killed $d0 def $q0 6332; CHECK-GI-NOFP16-NEXT: // kill: def $d1 killed $d1 def $q1 6333; CHECK-GI-NOFP16-NEXT: // kill: def $d2 killed $d2 def $q2 6334; CHECK-GI-NOFP16-NEXT: mov v0.d[1], v1.d[0] 6335; CHECK-GI-NOFP16-NEXT: ucvtf v1.2d, v2.2d 6336; CHECK-GI-NOFP16-NEXT: ucvtf v0.2d, v0.2d 6337; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6338; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6339; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6340; CHECK-GI-NOFP16-NEXT: ret 6341; 6342; CHECK-GI-FP16-LABEL: utofp_v3i64_v3f16: 6343; CHECK-GI-FP16: // %bb.0: // %entry 6344; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 def $q0 6345; CHECK-GI-FP16-NEXT: // kill: def $d1 killed $d1 def $q1 6346; CHECK-GI-FP16-NEXT: // kill: def $d2 killed $d2 def $q2 6347; CHECK-GI-FP16-NEXT: mov v0.d[1], v1.d[0] 6348; CHECK-GI-FP16-NEXT: ucvtf v2.2d, v2.2d 6349; CHECK-GI-FP16-NEXT: ucvtf v0.2d, v0.2d 6350; CHECK-GI-FP16-NEXT: fcvt h2, d2 6351; CHECK-GI-FP16-NEXT: mov d1, v0.d[1] 6352; CHECK-GI-FP16-NEXT: fcvt h0, d0 6353; CHECK-GI-FP16-NEXT: fcvt h1, d1 6354; CHECK-GI-FP16-NEXT: mov v0.h[1], v1.h[0] 6355; CHECK-GI-FP16-NEXT: mov v0.h[2], v2.h[0] 6356; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6357; CHECK-GI-FP16-NEXT: ret 6358entry: 6359 %c = uitofp <3 x i64> %a to <3 x half> 6360 ret <3 x half> %c 6361} 6362 6363define <4 x half> @stofp_v4i64_v4f16(<4 x i64> %a) { 6364; CHECK-SD-LABEL: stofp_v4i64_v4f16: 6365; CHECK-SD: // %bb.0: // %entry 6366; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 6367; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 6368; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6369; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6370; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6371; CHECK-SD-NEXT: ret 6372; 6373; CHECK-GI-NOFP16-LABEL: stofp_v4i64_v4f16: 6374; CHECK-GI-NOFP16: // %bb.0: // %entry 6375; CHECK-GI-NOFP16-NEXT: scvtf v0.2d, v0.2d 6376; CHECK-GI-NOFP16-NEXT: scvtf v1.2d, v1.2d 6377; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6378; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6379; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6380; CHECK-GI-NOFP16-NEXT: ret 6381; 6382; CHECK-GI-FP16-LABEL: stofp_v4i64_v4f16: 6383; CHECK-GI-FP16: // %bb.0: // %entry 6384; CHECK-GI-FP16-NEXT: scvtf v0.2d, v0.2d 6385; CHECK-GI-FP16-NEXT: scvtf v1.2d, v1.2d 6386; CHECK-GI-FP16-NEXT: mov d2, v0.d[1] 6387; CHECK-GI-FP16-NEXT: fcvt h0, d0 6388; CHECK-GI-FP16-NEXT: mov d3, v1.d[1] 6389; CHECK-GI-FP16-NEXT: fcvt h1, d1 6390; CHECK-GI-FP16-NEXT: fcvt h2, d2 6391; CHECK-GI-FP16-NEXT: mov v0.h[1], v2.h[0] 6392; CHECK-GI-FP16-NEXT: fcvt h2, d3 6393; CHECK-GI-FP16-NEXT: mov v0.h[2], v1.h[0] 6394; CHECK-GI-FP16-NEXT: mov v0.h[3], v2.h[0] 6395; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6396; CHECK-GI-FP16-NEXT: ret 6397entry: 6398 %c = sitofp <4 x i64> %a to <4 x half> 6399 ret <4 x half> %c 6400} 6401 6402define <4 x half> @utofp_v4i64_v4f16(<4 x i64> %a) { 6403; CHECK-SD-LABEL: utofp_v4i64_v4f16: 6404; CHECK-SD: // %bb.0: // %entry 6405; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 6406; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 6407; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6408; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6409; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6410; CHECK-SD-NEXT: ret 6411; 6412; CHECK-GI-NOFP16-LABEL: utofp_v4i64_v4f16: 6413; CHECK-GI-NOFP16: // %bb.0: // %entry 6414; CHECK-GI-NOFP16-NEXT: ucvtf v0.2d, v0.2d 6415; CHECK-GI-NOFP16-NEXT: ucvtf v1.2d, v1.2d 6416; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6417; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6418; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6419; CHECK-GI-NOFP16-NEXT: ret 6420; 6421; CHECK-GI-FP16-LABEL: utofp_v4i64_v4f16: 6422; CHECK-GI-FP16: // %bb.0: // %entry 6423; CHECK-GI-FP16-NEXT: ucvtf v0.2d, v0.2d 6424; CHECK-GI-FP16-NEXT: ucvtf v1.2d, v1.2d 6425; CHECK-GI-FP16-NEXT: mov d2, v0.d[1] 6426; CHECK-GI-FP16-NEXT: fcvt h0, d0 6427; CHECK-GI-FP16-NEXT: mov d3, v1.d[1] 6428; CHECK-GI-FP16-NEXT: fcvt h1, d1 6429; CHECK-GI-FP16-NEXT: fcvt h2, d2 6430; CHECK-GI-FP16-NEXT: mov v0.h[1], v2.h[0] 6431; CHECK-GI-FP16-NEXT: fcvt h2, d3 6432; CHECK-GI-FP16-NEXT: mov v0.h[2], v1.h[0] 6433; CHECK-GI-FP16-NEXT: mov v0.h[3], v2.h[0] 6434; CHECK-GI-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 6435; CHECK-GI-FP16-NEXT: ret 6436entry: 6437 %c = uitofp <4 x i64> %a to <4 x half> 6438 ret <4 x half> %c 6439} 6440 6441define <8 x half> @stofp_v8i64_v8f16(<8 x i64> %a) { 6442; CHECK-SD-LABEL: stofp_v8i64_v8f16: 6443; CHECK-SD: // %bb.0: // %entry 6444; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 6445; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 6446; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 6447; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 6448; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6449; CHECK-SD-NEXT: fcvtn v2.2s, v2.2d 6450; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6451; CHECK-SD-NEXT: fcvtn2 v2.4s, v3.2d 6452; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6453; CHECK-SD-NEXT: fcvtn2 v0.8h, v2.4s 6454; CHECK-SD-NEXT: ret 6455; 6456; CHECK-GI-NOFP16-LABEL: stofp_v8i64_v8f16: 6457; CHECK-GI-NOFP16: // %bb.0: // %entry 6458; CHECK-GI-NOFP16-NEXT: scvtf v0.2d, v0.2d 6459; CHECK-GI-NOFP16-NEXT: scvtf v1.2d, v1.2d 6460; CHECK-GI-NOFP16-NEXT: scvtf v2.2d, v2.2d 6461; CHECK-GI-NOFP16-NEXT: scvtf v3.2d, v3.2d 6462; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6463; CHECK-GI-NOFP16-NEXT: fcvtn v2.2s, v2.2d 6464; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6465; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.4s, v3.2d 6466; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6467; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 6468; CHECK-GI-NOFP16-NEXT: ret 6469; 6470; CHECK-GI-FP16-LABEL: stofp_v8i64_v8f16: 6471; CHECK-GI-FP16: // %bb.0: // %entry 6472; CHECK-GI-FP16-NEXT: scvtf v0.2d, v0.2d 6473; CHECK-GI-FP16-NEXT: scvtf v1.2d, v1.2d 6474; CHECK-GI-FP16-NEXT: scvtf v2.2d, v2.2d 6475; CHECK-GI-FP16-NEXT: scvtf v3.2d, v3.2d 6476; CHECK-GI-FP16-NEXT: mov d4, v0.d[1] 6477; CHECK-GI-FP16-NEXT: fcvt h0, d0 6478; CHECK-GI-FP16-NEXT: mov d5, v1.d[1] 6479; CHECK-GI-FP16-NEXT: fcvt h1, d1 6480; CHECK-GI-FP16-NEXT: fcvt h4, d4 6481; CHECK-GI-FP16-NEXT: mov v0.h[1], v4.h[0] 6482; CHECK-GI-FP16-NEXT: fcvt h4, d5 6483; CHECK-GI-FP16-NEXT: mov v0.h[2], v1.h[0] 6484; CHECK-GI-FP16-NEXT: mov d1, v2.d[1] 6485; CHECK-GI-FP16-NEXT: fcvt h2, d2 6486; CHECK-GI-FP16-NEXT: mov v0.h[3], v4.h[0] 6487; CHECK-GI-FP16-NEXT: fcvt h1, d1 6488; CHECK-GI-FP16-NEXT: mov v0.h[4], v2.h[0] 6489; CHECK-GI-FP16-NEXT: mov d2, v3.d[1] 6490; CHECK-GI-FP16-NEXT: fcvt h3, d3 6491; CHECK-GI-FP16-NEXT: mov v0.h[5], v1.h[0] 6492; CHECK-GI-FP16-NEXT: fcvt h1, d2 6493; CHECK-GI-FP16-NEXT: mov v0.h[6], v3.h[0] 6494; CHECK-GI-FP16-NEXT: mov v0.h[7], v1.h[0] 6495; CHECK-GI-FP16-NEXT: ret 6496entry: 6497 %c = sitofp <8 x i64> %a to <8 x half> 6498 ret <8 x half> %c 6499} 6500 6501define <8 x half> @utofp_v8i64_v8f16(<8 x i64> %a) { 6502; CHECK-SD-LABEL: utofp_v8i64_v8f16: 6503; CHECK-SD: // %bb.0: // %entry 6504; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 6505; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 6506; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 6507; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 6508; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6509; CHECK-SD-NEXT: fcvtn v2.2s, v2.2d 6510; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6511; CHECK-SD-NEXT: fcvtn2 v2.4s, v3.2d 6512; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6513; CHECK-SD-NEXT: fcvtn2 v0.8h, v2.4s 6514; CHECK-SD-NEXT: ret 6515; 6516; CHECK-GI-NOFP16-LABEL: utofp_v8i64_v8f16: 6517; CHECK-GI-NOFP16: // %bb.0: // %entry 6518; CHECK-GI-NOFP16-NEXT: ucvtf v0.2d, v0.2d 6519; CHECK-GI-NOFP16-NEXT: ucvtf v1.2d, v1.2d 6520; CHECK-GI-NOFP16-NEXT: ucvtf v2.2d, v2.2d 6521; CHECK-GI-NOFP16-NEXT: ucvtf v3.2d, v3.2d 6522; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6523; CHECK-GI-NOFP16-NEXT: fcvtn v2.2s, v2.2d 6524; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6525; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.4s, v3.2d 6526; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6527; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 6528; CHECK-GI-NOFP16-NEXT: ret 6529; 6530; CHECK-GI-FP16-LABEL: utofp_v8i64_v8f16: 6531; CHECK-GI-FP16: // %bb.0: // %entry 6532; CHECK-GI-FP16-NEXT: ucvtf v0.2d, v0.2d 6533; CHECK-GI-FP16-NEXT: ucvtf v1.2d, v1.2d 6534; CHECK-GI-FP16-NEXT: ucvtf v2.2d, v2.2d 6535; CHECK-GI-FP16-NEXT: ucvtf v3.2d, v3.2d 6536; CHECK-GI-FP16-NEXT: mov d4, v0.d[1] 6537; CHECK-GI-FP16-NEXT: fcvt h0, d0 6538; CHECK-GI-FP16-NEXT: mov d5, v1.d[1] 6539; CHECK-GI-FP16-NEXT: fcvt h1, d1 6540; CHECK-GI-FP16-NEXT: fcvt h4, d4 6541; CHECK-GI-FP16-NEXT: mov v0.h[1], v4.h[0] 6542; CHECK-GI-FP16-NEXT: fcvt h4, d5 6543; CHECK-GI-FP16-NEXT: mov v0.h[2], v1.h[0] 6544; CHECK-GI-FP16-NEXT: mov d1, v2.d[1] 6545; CHECK-GI-FP16-NEXT: fcvt h2, d2 6546; CHECK-GI-FP16-NEXT: mov v0.h[3], v4.h[0] 6547; CHECK-GI-FP16-NEXT: fcvt h1, d1 6548; CHECK-GI-FP16-NEXT: mov v0.h[4], v2.h[0] 6549; CHECK-GI-FP16-NEXT: mov d2, v3.d[1] 6550; CHECK-GI-FP16-NEXT: fcvt h3, d3 6551; CHECK-GI-FP16-NEXT: mov v0.h[5], v1.h[0] 6552; CHECK-GI-FP16-NEXT: fcvt h1, d2 6553; CHECK-GI-FP16-NEXT: mov v0.h[6], v3.h[0] 6554; CHECK-GI-FP16-NEXT: mov v0.h[7], v1.h[0] 6555; CHECK-GI-FP16-NEXT: ret 6556entry: 6557 %c = uitofp <8 x i64> %a to <8 x half> 6558 ret <8 x half> %c 6559} 6560 6561define <16 x half> @stofp_v16i64_v16f16(<16 x i64> %a) { 6562; CHECK-SD-LABEL: stofp_v16i64_v16f16: 6563; CHECK-SD: // %bb.0: // %entry 6564; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 6565; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 6566; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 6567; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 6568; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 6569; CHECK-SD-NEXT: scvtf v5.2d, v5.2d 6570; CHECK-SD-NEXT: scvtf v3.2d, v3.2d 6571; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6572; CHECK-SD-NEXT: fcvtn v4.2s, v4.2d 6573; CHECK-SD-NEXT: fcvtn v2.2s, v2.2d 6574; CHECK-SD-NEXT: fcvtn v6.2s, v6.2d 6575; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6576; CHECK-SD-NEXT: scvtf v1.2d, v7.2d 6577; CHECK-SD-NEXT: fcvtn2 v4.4s, v5.2d 6578; CHECK-SD-NEXT: fcvtn2 v2.4s, v3.2d 6579; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6580; CHECK-SD-NEXT: fcvtn2 v6.4s, v1.2d 6581; CHECK-SD-NEXT: fcvtn v1.4h, v4.4s 6582; CHECK-SD-NEXT: fcvtn2 v0.8h, v2.4s 6583; CHECK-SD-NEXT: fcvtn2 v1.8h, v6.4s 6584; CHECK-SD-NEXT: ret 6585; 6586; CHECK-GI-NOFP16-LABEL: stofp_v16i64_v16f16: 6587; CHECK-GI-NOFP16: // %bb.0: // %entry 6588; CHECK-GI-NOFP16-NEXT: scvtf v0.2d, v0.2d 6589; CHECK-GI-NOFP16-NEXT: scvtf v4.2d, v4.2d 6590; CHECK-GI-NOFP16-NEXT: scvtf v1.2d, v1.2d 6591; CHECK-GI-NOFP16-NEXT: scvtf v2.2d, v2.2d 6592; CHECK-GI-NOFP16-NEXT: scvtf v5.2d, v5.2d 6593; CHECK-GI-NOFP16-NEXT: scvtf v6.2d, v6.2d 6594; CHECK-GI-NOFP16-NEXT: scvtf v3.2d, v3.2d 6595; CHECK-GI-NOFP16-NEXT: scvtf v7.2d, v7.2d 6596; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6597; CHECK-GI-NOFP16-NEXT: fcvtn v4.2s, v4.2d 6598; CHECK-GI-NOFP16-NEXT: fcvtn v2.2s, v2.2d 6599; CHECK-GI-NOFP16-NEXT: fcvtn v6.2s, v6.2d 6600; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6601; CHECK-GI-NOFP16-NEXT: fcvtn2 v4.4s, v5.2d 6602; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.4s, v3.2d 6603; CHECK-GI-NOFP16-NEXT: fcvtn2 v6.4s, v7.2d 6604; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6605; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v4.4s 6606; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 6607; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v6.4s 6608; CHECK-GI-NOFP16-NEXT: ret 6609; 6610; CHECK-GI-FP16-LABEL: stofp_v16i64_v16f16: 6611; CHECK-GI-FP16: // %bb.0: // %entry 6612; CHECK-GI-FP16-NEXT: scvtf v0.2d, v0.2d 6613; CHECK-GI-FP16-NEXT: scvtf v4.2d, v4.2d 6614; CHECK-GI-FP16-NEXT: scvtf v18.2d, v1.2d 6615; CHECK-GI-FP16-NEXT: scvtf v5.2d, v5.2d 6616; CHECK-GI-FP16-NEXT: scvtf v2.2d, v2.2d 6617; CHECK-GI-FP16-NEXT: scvtf v3.2d, v3.2d 6618; CHECK-GI-FP16-NEXT: mov d16, v0.d[1] 6619; CHECK-GI-FP16-NEXT: mov d17, v4.d[1] 6620; CHECK-GI-FP16-NEXT: fcvt h0, d0 6621; CHECK-GI-FP16-NEXT: fcvt h1, d4 6622; CHECK-GI-FP16-NEXT: mov d19, v5.d[1] 6623; CHECK-GI-FP16-NEXT: fcvt h5, d5 6624; CHECK-GI-FP16-NEXT: fcvt h16, d16 6625; CHECK-GI-FP16-NEXT: fcvt h4, d17 6626; CHECK-GI-FP16-NEXT: mov d17, v18.d[1] 6627; CHECK-GI-FP16-NEXT: fcvt h18, d18 6628; CHECK-GI-FP16-NEXT: mov v0.h[1], v16.h[0] 6629; CHECK-GI-FP16-NEXT: mov v1.h[1], v4.h[0] 6630; CHECK-GI-FP16-NEXT: scvtf v4.2d, v6.2d 6631; CHECK-GI-FP16-NEXT: fcvt h6, d17 6632; CHECK-GI-FP16-NEXT: fcvt h16, d19 6633; CHECK-GI-FP16-NEXT: mov v0.h[2], v18.h[0] 6634; CHECK-GI-FP16-NEXT: mov v1.h[2], v5.h[0] 6635; CHECK-GI-FP16-NEXT: mov d5, v2.d[1] 6636; CHECK-GI-FP16-NEXT: fcvt h2, d2 6637; CHECK-GI-FP16-NEXT: mov d17, v4.d[1] 6638; CHECK-GI-FP16-NEXT: fcvt h4, d4 6639; CHECK-GI-FP16-NEXT: mov v0.h[3], v6.h[0] 6640; CHECK-GI-FP16-NEXT: mov v1.h[3], v16.h[0] 6641; CHECK-GI-FP16-NEXT: scvtf v6.2d, v7.2d 6642; CHECK-GI-FP16-NEXT: fcvt h5, d5 6643; CHECK-GI-FP16-NEXT: fcvt h7, d17 6644; CHECK-GI-FP16-NEXT: mov v0.h[4], v2.h[0] 6645; CHECK-GI-FP16-NEXT: mov v1.h[4], v4.h[0] 6646; CHECK-GI-FP16-NEXT: mov d2, v3.d[1] 6647; CHECK-GI-FP16-NEXT: fcvt h3, d3 6648; CHECK-GI-FP16-NEXT: mov d4, v6.d[1] 6649; CHECK-GI-FP16-NEXT: fcvt h6, d6 6650; CHECK-GI-FP16-NEXT: mov v0.h[5], v5.h[0] 6651; CHECK-GI-FP16-NEXT: mov v1.h[5], v7.h[0] 6652; CHECK-GI-FP16-NEXT: fcvt h2, d2 6653; CHECK-GI-FP16-NEXT: fcvt h4, d4 6654; CHECK-GI-FP16-NEXT: mov v0.h[6], v3.h[0] 6655; CHECK-GI-FP16-NEXT: mov v1.h[6], v6.h[0] 6656; CHECK-GI-FP16-NEXT: mov v0.h[7], v2.h[0] 6657; CHECK-GI-FP16-NEXT: mov v1.h[7], v4.h[0] 6658; CHECK-GI-FP16-NEXT: ret 6659entry: 6660 %c = sitofp <16 x i64> %a to <16 x half> 6661 ret <16 x half> %c 6662} 6663 6664define <16 x half> @utofp_v16i64_v16f16(<16 x i64> %a) { 6665; CHECK-SD-LABEL: utofp_v16i64_v16f16: 6666; CHECK-SD: // %bb.0: // %entry 6667; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 6668; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 6669; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 6670; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 6671; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 6672; CHECK-SD-NEXT: ucvtf v5.2d, v5.2d 6673; CHECK-SD-NEXT: ucvtf v3.2d, v3.2d 6674; CHECK-SD-NEXT: fcvtn v0.2s, v0.2d 6675; CHECK-SD-NEXT: fcvtn v4.2s, v4.2d 6676; CHECK-SD-NEXT: fcvtn v2.2s, v2.2d 6677; CHECK-SD-NEXT: fcvtn v6.2s, v6.2d 6678; CHECK-SD-NEXT: fcvtn2 v0.4s, v1.2d 6679; CHECK-SD-NEXT: ucvtf v1.2d, v7.2d 6680; CHECK-SD-NEXT: fcvtn2 v4.4s, v5.2d 6681; CHECK-SD-NEXT: fcvtn2 v2.4s, v3.2d 6682; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 6683; CHECK-SD-NEXT: fcvtn2 v6.4s, v1.2d 6684; CHECK-SD-NEXT: fcvtn v1.4h, v4.4s 6685; CHECK-SD-NEXT: fcvtn2 v0.8h, v2.4s 6686; CHECK-SD-NEXT: fcvtn2 v1.8h, v6.4s 6687; CHECK-SD-NEXT: ret 6688; 6689; CHECK-GI-NOFP16-LABEL: utofp_v16i64_v16f16: 6690; CHECK-GI-NOFP16: // %bb.0: // %entry 6691; CHECK-GI-NOFP16-NEXT: ucvtf v0.2d, v0.2d 6692; CHECK-GI-NOFP16-NEXT: ucvtf v4.2d, v4.2d 6693; CHECK-GI-NOFP16-NEXT: ucvtf v1.2d, v1.2d 6694; CHECK-GI-NOFP16-NEXT: ucvtf v2.2d, v2.2d 6695; CHECK-GI-NOFP16-NEXT: ucvtf v5.2d, v5.2d 6696; CHECK-GI-NOFP16-NEXT: ucvtf v6.2d, v6.2d 6697; CHECK-GI-NOFP16-NEXT: ucvtf v3.2d, v3.2d 6698; CHECK-GI-NOFP16-NEXT: ucvtf v7.2d, v7.2d 6699; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6700; CHECK-GI-NOFP16-NEXT: fcvtn v4.2s, v4.2d 6701; CHECK-GI-NOFP16-NEXT: fcvtn v2.2s, v2.2d 6702; CHECK-GI-NOFP16-NEXT: fcvtn v6.2s, v6.2d 6703; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6704; CHECK-GI-NOFP16-NEXT: fcvtn2 v4.4s, v5.2d 6705; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.4s, v3.2d 6706; CHECK-GI-NOFP16-NEXT: fcvtn2 v6.4s, v7.2d 6707; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6708; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v4.4s 6709; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 6710; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v6.4s 6711; CHECK-GI-NOFP16-NEXT: ret 6712; 6713; CHECK-GI-FP16-LABEL: utofp_v16i64_v16f16: 6714; CHECK-GI-FP16: // %bb.0: // %entry 6715; CHECK-GI-FP16-NEXT: ucvtf v0.2d, v0.2d 6716; CHECK-GI-FP16-NEXT: ucvtf v4.2d, v4.2d 6717; CHECK-GI-FP16-NEXT: ucvtf v18.2d, v1.2d 6718; CHECK-GI-FP16-NEXT: ucvtf v5.2d, v5.2d 6719; CHECK-GI-FP16-NEXT: ucvtf v2.2d, v2.2d 6720; CHECK-GI-FP16-NEXT: ucvtf v3.2d, v3.2d 6721; CHECK-GI-FP16-NEXT: mov d16, v0.d[1] 6722; CHECK-GI-FP16-NEXT: mov d17, v4.d[1] 6723; CHECK-GI-FP16-NEXT: fcvt h0, d0 6724; CHECK-GI-FP16-NEXT: fcvt h1, d4 6725; CHECK-GI-FP16-NEXT: mov d19, v5.d[1] 6726; CHECK-GI-FP16-NEXT: fcvt h5, d5 6727; CHECK-GI-FP16-NEXT: fcvt h16, d16 6728; CHECK-GI-FP16-NEXT: fcvt h4, d17 6729; CHECK-GI-FP16-NEXT: mov d17, v18.d[1] 6730; CHECK-GI-FP16-NEXT: fcvt h18, d18 6731; CHECK-GI-FP16-NEXT: mov v0.h[1], v16.h[0] 6732; CHECK-GI-FP16-NEXT: mov v1.h[1], v4.h[0] 6733; CHECK-GI-FP16-NEXT: ucvtf v4.2d, v6.2d 6734; CHECK-GI-FP16-NEXT: fcvt h6, d17 6735; CHECK-GI-FP16-NEXT: fcvt h16, d19 6736; CHECK-GI-FP16-NEXT: mov v0.h[2], v18.h[0] 6737; CHECK-GI-FP16-NEXT: mov v1.h[2], v5.h[0] 6738; CHECK-GI-FP16-NEXT: mov d5, v2.d[1] 6739; CHECK-GI-FP16-NEXT: fcvt h2, d2 6740; CHECK-GI-FP16-NEXT: mov d17, v4.d[1] 6741; CHECK-GI-FP16-NEXT: fcvt h4, d4 6742; CHECK-GI-FP16-NEXT: mov v0.h[3], v6.h[0] 6743; CHECK-GI-FP16-NEXT: mov v1.h[3], v16.h[0] 6744; CHECK-GI-FP16-NEXT: ucvtf v6.2d, v7.2d 6745; CHECK-GI-FP16-NEXT: fcvt h5, d5 6746; CHECK-GI-FP16-NEXT: fcvt h7, d17 6747; CHECK-GI-FP16-NEXT: mov v0.h[4], v2.h[0] 6748; CHECK-GI-FP16-NEXT: mov v1.h[4], v4.h[0] 6749; CHECK-GI-FP16-NEXT: mov d2, v3.d[1] 6750; CHECK-GI-FP16-NEXT: fcvt h3, d3 6751; CHECK-GI-FP16-NEXT: mov d4, v6.d[1] 6752; CHECK-GI-FP16-NEXT: fcvt h6, d6 6753; CHECK-GI-FP16-NEXT: mov v0.h[5], v5.h[0] 6754; CHECK-GI-FP16-NEXT: mov v1.h[5], v7.h[0] 6755; CHECK-GI-FP16-NEXT: fcvt h2, d2 6756; CHECK-GI-FP16-NEXT: fcvt h4, d4 6757; CHECK-GI-FP16-NEXT: mov v0.h[6], v3.h[0] 6758; CHECK-GI-FP16-NEXT: mov v1.h[6], v6.h[0] 6759; CHECK-GI-FP16-NEXT: mov v0.h[7], v2.h[0] 6760; CHECK-GI-FP16-NEXT: mov v1.h[7], v4.h[0] 6761; CHECK-GI-FP16-NEXT: ret 6762entry: 6763 %c = uitofp <16 x i64> %a to <16 x half> 6764 ret <16 x half> %c 6765} 6766 6767define <32 x half> @stofp_v32i64_v32f16(<32 x i64> %a) { 6768; CHECK-SD-LABEL: stofp_v32i64_v32f16: 6769; CHECK-SD: // %bb.0: // %entry 6770; CHECK-SD-NEXT: ldp q17, q16, [sp] 6771; CHECK-SD-NEXT: scvtf v18.2d, v0.2d 6772; CHECK-SD-NEXT: ldp q19, q0, [sp, #64] 6773; CHECK-SD-NEXT: scvtf v4.2d, v4.2d 6774; CHECK-SD-NEXT: ldp q21, q20, [sp, #96] 6775; CHECK-SD-NEXT: scvtf v2.2d, v2.2d 6776; CHECK-SD-NEXT: scvtf v17.2d, v17.2d 6777; CHECK-SD-NEXT: ldp q23, q22, [sp, #32] 6778; CHECK-SD-NEXT: scvtf v19.2d, v19.2d 6779; CHECK-SD-NEXT: fcvtn v18.2s, v18.2d 6780; CHECK-SD-NEXT: scvtf v1.2d, v1.2d 6781; CHECK-SD-NEXT: scvtf v6.2d, v6.2d 6782; CHECK-SD-NEXT: fcvtn v4.2s, v4.2d 6783; CHECK-SD-NEXT: scvtf v5.2d, v5.2d 6784; CHECK-SD-NEXT: scvtf v23.2d, v23.2d 6785; CHECK-SD-NEXT: scvtf v16.2d, v16.2d 6786; CHECK-SD-NEXT: scvtf v21.2d, v21.2d 6787; CHECK-SD-NEXT: fcvtn v17.2s, v17.2d 6788; CHECK-SD-NEXT: scvtf v0.2d, v0.2d 6789; CHECK-SD-NEXT: fcvtn v24.2s, v2.2d 6790; CHECK-SD-NEXT: fcvtn v19.2s, v19.2d 6791; CHECK-SD-NEXT: scvtf v2.2d, v3.2d 6792; CHECK-SD-NEXT: fcvtn2 v18.4s, v1.2d 6793; CHECK-SD-NEXT: fcvtn v6.2s, v6.2d 6794; CHECK-SD-NEXT: scvtf v1.2d, v7.2d 6795; CHECK-SD-NEXT: fcvtn2 v4.4s, v5.2d 6796; CHECK-SD-NEXT: fcvtn v5.2s, v23.2d 6797; CHECK-SD-NEXT: scvtf v3.2d, v22.2d 6798; CHECK-SD-NEXT: fcvtn v7.2s, v21.2d 6799; CHECK-SD-NEXT: fcvtn2 v17.4s, v16.2d 6800; CHECK-SD-NEXT: scvtf v16.2d, v20.2d 6801; CHECK-SD-NEXT: fcvtn2 v19.4s, v0.2d 6802; CHECK-SD-NEXT: fcvtn2 v24.4s, v2.2d 6803; CHECK-SD-NEXT: fcvtn v0.4h, v18.4s 6804; CHECK-SD-NEXT: fcvtn2 v6.4s, v1.2d 6805; CHECK-SD-NEXT: fcvtn v1.4h, v4.4s 6806; CHECK-SD-NEXT: fcvtn2 v5.4s, v3.2d 6807; CHECK-SD-NEXT: fcvtn v2.4h, v17.4s 6808; CHECK-SD-NEXT: fcvtn2 v7.4s, v16.2d 6809; CHECK-SD-NEXT: fcvtn v3.4h, v19.4s 6810; CHECK-SD-NEXT: fcvtn2 v0.8h, v24.4s 6811; CHECK-SD-NEXT: fcvtn2 v1.8h, v6.4s 6812; CHECK-SD-NEXT: fcvtn2 v2.8h, v5.4s 6813; CHECK-SD-NEXT: fcvtn2 v3.8h, v7.4s 6814; CHECK-SD-NEXT: ret 6815; 6816; CHECK-GI-NOFP16-LABEL: stofp_v32i64_v32f16: 6817; CHECK-GI-NOFP16: // %bb.0: // %entry 6818; CHECK-GI-NOFP16-NEXT: ldp q16, q17, [sp] 6819; CHECK-GI-NOFP16-NEXT: scvtf v0.2d, v0.2d 6820; CHECK-GI-NOFP16-NEXT: ldp q20, q21, [sp, #64] 6821; CHECK-GI-NOFP16-NEXT: scvtf v4.2d, v4.2d 6822; CHECK-GI-NOFP16-NEXT: ldp q18, q19, [sp, #32] 6823; CHECK-GI-NOFP16-NEXT: scvtf v1.2d, v1.2d 6824; CHECK-GI-NOFP16-NEXT: scvtf v16.2d, v16.2d 6825; CHECK-GI-NOFP16-NEXT: ldp q22, q23, [sp, #96] 6826; CHECK-GI-NOFP16-NEXT: scvtf v20.2d, v20.2d 6827; CHECK-GI-NOFP16-NEXT: scvtf v2.2d, v2.2d 6828; CHECK-GI-NOFP16-NEXT: scvtf v5.2d, v5.2d 6829; CHECK-GI-NOFP16-NEXT: scvtf v6.2d, v6.2d 6830; CHECK-GI-NOFP16-NEXT: scvtf v17.2d, v17.2d 6831; CHECK-GI-NOFP16-NEXT: scvtf v18.2d, v18.2d 6832; CHECK-GI-NOFP16-NEXT: scvtf v21.2d, v21.2d 6833; CHECK-GI-NOFP16-NEXT: scvtf v22.2d, v22.2d 6834; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 6835; CHECK-GI-NOFP16-NEXT: fcvtn v4.2s, v4.2d 6836; CHECK-GI-NOFP16-NEXT: fcvtn v16.2s, v16.2d 6837; CHECK-GI-NOFP16-NEXT: scvtf v3.2d, v3.2d 6838; CHECK-GI-NOFP16-NEXT: fcvtn v20.2s, v20.2d 6839; CHECK-GI-NOFP16-NEXT: scvtf v7.2d, v7.2d 6840; CHECK-GI-NOFP16-NEXT: scvtf v19.2d, v19.2d 6841; CHECK-GI-NOFP16-NEXT: scvtf v23.2d, v23.2d 6842; CHECK-GI-NOFP16-NEXT: fcvtn v24.2s, v2.2d 6843; CHECK-GI-NOFP16-NEXT: fcvtn v6.2s, v6.2d 6844; CHECK-GI-NOFP16-NEXT: fcvtn v18.2s, v18.2d 6845; CHECK-GI-NOFP16-NEXT: fcvtn v22.2s, v22.2d 6846; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 6847; CHECK-GI-NOFP16-NEXT: fcvtn2 v4.4s, v5.2d 6848; CHECK-GI-NOFP16-NEXT: fcvtn2 v16.4s, v17.2d 6849; CHECK-GI-NOFP16-NEXT: fcvtn2 v20.4s, v21.2d 6850; CHECK-GI-NOFP16-NEXT: fcvtn2 v24.4s, v3.2d 6851; CHECK-GI-NOFP16-NEXT: fcvtn2 v6.4s, v7.2d 6852; CHECK-GI-NOFP16-NEXT: fcvtn2 v18.4s, v19.2d 6853; CHECK-GI-NOFP16-NEXT: fcvtn2 v22.4s, v23.2d 6854; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 6855; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v4.4s 6856; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v16.4s 6857; CHECK-GI-NOFP16-NEXT: fcvtn v3.4h, v20.4s 6858; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v24.4s 6859; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v6.4s 6860; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 6861; CHECK-GI-NOFP16-NEXT: fcvtn2 v3.8h, v22.4s 6862; CHECK-GI-NOFP16-NEXT: ret 6863; 6864; CHECK-GI-FP16-LABEL: stofp_v32i64_v32f16: 6865; CHECK-GI-FP16: // %bb.0: // %entry 6866; CHECK-GI-FP16-NEXT: ldp q16, q18, [sp] 6867; CHECK-GI-FP16-NEXT: scvtf v0.2d, v0.2d 6868; CHECK-GI-FP16-NEXT: ldp q17, q19, [sp, #64] 6869; CHECK-GI-FP16-NEXT: scvtf v4.2d, v4.2d 6870; CHECK-GI-FP16-NEXT: scvtf v1.2d, v1.2d 6871; CHECK-GI-FP16-NEXT: scvtf v5.2d, v5.2d 6872; CHECK-GI-FP16-NEXT: scvtf v6.2d, v6.2d 6873; CHECK-GI-FP16-NEXT: scvtf v20.2d, v16.2d 6874; CHECK-GI-FP16-NEXT: scvtf v24.2d, v18.2d 6875; CHECK-GI-FP16-NEXT: scvtf v2.2d, v2.2d 6876; CHECK-GI-FP16-NEXT: scvtf v16.2d, v17.2d 6877; CHECK-GI-FP16-NEXT: mov d21, v0.d[1] 6878; CHECK-GI-FP16-NEXT: scvtf v25.2d, v19.2d 6879; CHECK-GI-FP16-NEXT: mov d22, v4.d[1] 6880; CHECK-GI-FP16-NEXT: fcvt h0, d0 6881; CHECK-GI-FP16-NEXT: scvtf v3.2d, v3.2d 6882; CHECK-GI-FP16-NEXT: mov d18, v1.d[1] 6883; CHECK-GI-FP16-NEXT: fcvt h17, d1 6884; CHECK-GI-FP16-NEXT: mov d19, v5.d[1] 6885; CHECK-GI-FP16-NEXT: mov d23, v20.d[1] 6886; CHECK-GI-FP16-NEXT: fcvt h1, d4 6887; CHECK-GI-FP16-NEXT: fcvt h4, d20 6888; CHECK-GI-FP16-NEXT: mov d26, v16.d[1] 6889; CHECK-GI-FP16-NEXT: fcvt h20, d5 6890; CHECK-GI-FP16-NEXT: fcvt h5, d16 6891; CHECK-GI-FP16-NEXT: fcvt h28, d21 6892; CHECK-GI-FP16-NEXT: fcvt h29, d22 6893; CHECK-GI-FP16-NEXT: fcvt h22, d24 6894; CHECK-GI-FP16-NEXT: fcvt h21, d25 6895; CHECK-GI-FP16-NEXT: fcvt h18, d18 6896; CHECK-GI-FP16-NEXT: fcvt h19, d19 6897; CHECK-GI-FP16-NEXT: fcvt h27, d23 6898; CHECK-GI-FP16-NEXT: mov d23, v24.d[1] 6899; CHECK-GI-FP16-NEXT: mov d24, v25.d[1] 6900; CHECK-GI-FP16-NEXT: ldp q25, q16, [sp, #32] 6901; CHECK-GI-FP16-NEXT: fcvt h26, d26 6902; CHECK-GI-FP16-NEXT: mov v0.h[1], v28.h[0] 6903; CHECK-GI-FP16-NEXT: mov v1.h[1], v29.h[0] 6904; CHECK-GI-FP16-NEXT: scvtf v7.2d, v7.2d 6905; CHECK-GI-FP16-NEXT: mov v4.h[1], v27.h[0] 6906; CHECK-GI-FP16-NEXT: scvtf v25.2d, v25.2d 6907; CHECK-GI-FP16-NEXT: fcvt h23, d23 6908; CHECK-GI-FP16-NEXT: mov v5.h[1], v26.h[0] 6909; CHECK-GI-FP16-NEXT: ldp q26, q27, [sp, #96] 6910; CHECK-GI-FP16-NEXT: fcvt h24, d24 6911; CHECK-GI-FP16-NEXT: mov v0.h[2], v17.h[0] 6912; CHECK-GI-FP16-NEXT: mov v1.h[2], v20.h[0] 6913; CHECK-GI-FP16-NEXT: mov d20, v6.d[1] 6914; CHECK-GI-FP16-NEXT: mov d17, v2.d[1] 6915; CHECK-GI-FP16-NEXT: fcvt h2, d2 6916; CHECK-GI-FP16-NEXT: scvtf v26.2d, v26.2d 6917; CHECK-GI-FP16-NEXT: mov v4.h[2], v22.h[0] 6918; CHECK-GI-FP16-NEXT: fcvt h22, d25 6919; CHECK-GI-FP16-NEXT: mov v5.h[2], v21.h[0] 6920; CHECK-GI-FP16-NEXT: mov d21, v25.d[1] 6921; CHECK-GI-FP16-NEXT: fcvt h6, d6 6922; CHECK-GI-FP16-NEXT: mov v0.h[3], v18.h[0] 6923; CHECK-GI-FP16-NEXT: mov v1.h[3], v19.h[0] 6924; CHECK-GI-FP16-NEXT: scvtf v16.2d, v16.2d 6925; CHECK-GI-FP16-NEXT: scvtf v18.2d, v27.2d 6926; CHECK-GI-FP16-NEXT: fcvt h19, d20 6927; CHECK-GI-FP16-NEXT: fcvt h17, d17 6928; CHECK-GI-FP16-NEXT: mov d25, v26.d[1] 6929; CHECK-GI-FP16-NEXT: fcvt h26, d26 6930; CHECK-GI-FP16-NEXT: mov v4.h[3], v23.h[0] 6931; CHECK-GI-FP16-NEXT: mov v5.h[3], v24.h[0] 6932; CHECK-GI-FP16-NEXT: fcvt h20, d21 6933; CHECK-GI-FP16-NEXT: mov v0.h[4], v2.h[0] 6934; CHECK-GI-FP16-NEXT: mov v1.h[4], v6.h[0] 6935; CHECK-GI-FP16-NEXT: mov d2, v3.d[1] 6936; CHECK-GI-FP16-NEXT: mov d23, v18.d[1] 6937; CHECK-GI-FP16-NEXT: fcvt h18, d18 6938; CHECK-GI-FP16-NEXT: fcvt h3, d3 6939; CHECK-GI-FP16-NEXT: fcvt h21, d25 6940; CHECK-GI-FP16-NEXT: mov v4.h[4], v22.h[0] 6941; CHECK-GI-FP16-NEXT: mov d22, v16.d[1] 6942; CHECK-GI-FP16-NEXT: mov v5.h[4], v26.h[0] 6943; CHECK-GI-FP16-NEXT: fcvt h16, d16 6944; CHECK-GI-FP16-NEXT: mov d6, v7.d[1] 6945; CHECK-GI-FP16-NEXT: fcvt h7, d7 6946; CHECK-GI-FP16-NEXT: mov v0.h[5], v17.h[0] 6947; CHECK-GI-FP16-NEXT: mov v1.h[5], v19.h[0] 6948; CHECK-GI-FP16-NEXT: fcvt h19, d23 6949; CHECK-GI-FP16-NEXT: fcvt h2, d2 6950; CHECK-GI-FP16-NEXT: mov v4.h[5], v20.h[0] 6951; CHECK-GI-FP16-NEXT: fcvt h17, d22 6952; CHECK-GI-FP16-NEXT: mov v5.h[5], v21.h[0] 6953; CHECK-GI-FP16-NEXT: fcvt h6, d6 6954; CHECK-GI-FP16-NEXT: mov v0.h[6], v3.h[0] 6955; CHECK-GI-FP16-NEXT: mov v1.h[6], v7.h[0] 6956; CHECK-GI-FP16-NEXT: mov v4.h[6], v16.h[0] 6957; CHECK-GI-FP16-NEXT: mov v5.h[6], v18.h[0] 6958; CHECK-GI-FP16-NEXT: mov v0.h[7], v2.h[0] 6959; CHECK-GI-FP16-NEXT: mov v1.h[7], v6.h[0] 6960; CHECK-GI-FP16-NEXT: mov v4.h[7], v17.h[0] 6961; CHECK-GI-FP16-NEXT: mov v5.h[7], v19.h[0] 6962; CHECK-GI-FP16-NEXT: mov v2.16b, v4.16b 6963; CHECK-GI-FP16-NEXT: mov v3.16b, v5.16b 6964; CHECK-GI-FP16-NEXT: ret 6965entry: 6966 %c = sitofp <32 x i64> %a to <32 x half> 6967 ret <32 x half> %c 6968} 6969 6970define <32 x half> @utofp_v32i64_v32f16(<32 x i64> %a) { 6971; CHECK-SD-LABEL: utofp_v32i64_v32f16: 6972; CHECK-SD: // %bb.0: // %entry 6973; CHECK-SD-NEXT: ldp q17, q16, [sp] 6974; CHECK-SD-NEXT: ucvtf v18.2d, v0.2d 6975; CHECK-SD-NEXT: ldp q19, q0, [sp, #64] 6976; CHECK-SD-NEXT: ucvtf v4.2d, v4.2d 6977; CHECK-SD-NEXT: ldp q21, q20, [sp, #96] 6978; CHECK-SD-NEXT: ucvtf v2.2d, v2.2d 6979; CHECK-SD-NEXT: ucvtf v17.2d, v17.2d 6980; CHECK-SD-NEXT: ldp q23, q22, [sp, #32] 6981; CHECK-SD-NEXT: ucvtf v19.2d, v19.2d 6982; CHECK-SD-NEXT: fcvtn v18.2s, v18.2d 6983; CHECK-SD-NEXT: ucvtf v1.2d, v1.2d 6984; CHECK-SD-NEXT: ucvtf v6.2d, v6.2d 6985; CHECK-SD-NEXT: fcvtn v4.2s, v4.2d 6986; CHECK-SD-NEXT: ucvtf v5.2d, v5.2d 6987; CHECK-SD-NEXT: ucvtf v23.2d, v23.2d 6988; CHECK-SD-NEXT: ucvtf v16.2d, v16.2d 6989; CHECK-SD-NEXT: ucvtf v21.2d, v21.2d 6990; CHECK-SD-NEXT: fcvtn v17.2s, v17.2d 6991; CHECK-SD-NEXT: ucvtf v0.2d, v0.2d 6992; CHECK-SD-NEXT: fcvtn v24.2s, v2.2d 6993; CHECK-SD-NEXT: fcvtn v19.2s, v19.2d 6994; CHECK-SD-NEXT: ucvtf v2.2d, v3.2d 6995; CHECK-SD-NEXT: fcvtn2 v18.4s, v1.2d 6996; CHECK-SD-NEXT: fcvtn v6.2s, v6.2d 6997; CHECK-SD-NEXT: ucvtf v1.2d, v7.2d 6998; CHECK-SD-NEXT: fcvtn2 v4.4s, v5.2d 6999; CHECK-SD-NEXT: fcvtn v5.2s, v23.2d 7000; CHECK-SD-NEXT: ucvtf v3.2d, v22.2d 7001; CHECK-SD-NEXT: fcvtn v7.2s, v21.2d 7002; CHECK-SD-NEXT: fcvtn2 v17.4s, v16.2d 7003; CHECK-SD-NEXT: ucvtf v16.2d, v20.2d 7004; CHECK-SD-NEXT: fcvtn2 v19.4s, v0.2d 7005; CHECK-SD-NEXT: fcvtn2 v24.4s, v2.2d 7006; CHECK-SD-NEXT: fcvtn v0.4h, v18.4s 7007; CHECK-SD-NEXT: fcvtn2 v6.4s, v1.2d 7008; CHECK-SD-NEXT: fcvtn v1.4h, v4.4s 7009; CHECK-SD-NEXT: fcvtn2 v5.4s, v3.2d 7010; CHECK-SD-NEXT: fcvtn v2.4h, v17.4s 7011; CHECK-SD-NEXT: fcvtn2 v7.4s, v16.2d 7012; CHECK-SD-NEXT: fcvtn v3.4h, v19.4s 7013; CHECK-SD-NEXT: fcvtn2 v0.8h, v24.4s 7014; CHECK-SD-NEXT: fcvtn2 v1.8h, v6.4s 7015; CHECK-SD-NEXT: fcvtn2 v2.8h, v5.4s 7016; CHECK-SD-NEXT: fcvtn2 v3.8h, v7.4s 7017; CHECK-SD-NEXT: ret 7018; 7019; CHECK-GI-NOFP16-LABEL: utofp_v32i64_v32f16: 7020; CHECK-GI-NOFP16: // %bb.0: // %entry 7021; CHECK-GI-NOFP16-NEXT: ldp q16, q17, [sp] 7022; CHECK-GI-NOFP16-NEXT: ucvtf v0.2d, v0.2d 7023; CHECK-GI-NOFP16-NEXT: ldp q20, q21, [sp, #64] 7024; CHECK-GI-NOFP16-NEXT: ucvtf v4.2d, v4.2d 7025; CHECK-GI-NOFP16-NEXT: ldp q18, q19, [sp, #32] 7026; CHECK-GI-NOFP16-NEXT: ucvtf v1.2d, v1.2d 7027; CHECK-GI-NOFP16-NEXT: ucvtf v16.2d, v16.2d 7028; CHECK-GI-NOFP16-NEXT: ldp q22, q23, [sp, #96] 7029; CHECK-GI-NOFP16-NEXT: ucvtf v20.2d, v20.2d 7030; CHECK-GI-NOFP16-NEXT: ucvtf v2.2d, v2.2d 7031; CHECK-GI-NOFP16-NEXT: ucvtf v5.2d, v5.2d 7032; CHECK-GI-NOFP16-NEXT: ucvtf v6.2d, v6.2d 7033; CHECK-GI-NOFP16-NEXT: ucvtf v17.2d, v17.2d 7034; CHECK-GI-NOFP16-NEXT: ucvtf v18.2d, v18.2d 7035; CHECK-GI-NOFP16-NEXT: ucvtf v21.2d, v21.2d 7036; CHECK-GI-NOFP16-NEXT: ucvtf v22.2d, v22.2d 7037; CHECK-GI-NOFP16-NEXT: fcvtn v0.2s, v0.2d 7038; CHECK-GI-NOFP16-NEXT: fcvtn v4.2s, v4.2d 7039; CHECK-GI-NOFP16-NEXT: fcvtn v16.2s, v16.2d 7040; CHECK-GI-NOFP16-NEXT: ucvtf v3.2d, v3.2d 7041; CHECK-GI-NOFP16-NEXT: fcvtn v20.2s, v20.2d 7042; CHECK-GI-NOFP16-NEXT: ucvtf v7.2d, v7.2d 7043; CHECK-GI-NOFP16-NEXT: ucvtf v19.2d, v19.2d 7044; CHECK-GI-NOFP16-NEXT: ucvtf v23.2d, v23.2d 7045; CHECK-GI-NOFP16-NEXT: fcvtn v24.2s, v2.2d 7046; CHECK-GI-NOFP16-NEXT: fcvtn v6.2s, v6.2d 7047; CHECK-GI-NOFP16-NEXT: fcvtn v18.2s, v18.2d 7048; CHECK-GI-NOFP16-NEXT: fcvtn v22.2s, v22.2d 7049; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.4s, v1.2d 7050; CHECK-GI-NOFP16-NEXT: fcvtn2 v4.4s, v5.2d 7051; CHECK-GI-NOFP16-NEXT: fcvtn2 v16.4s, v17.2d 7052; CHECK-GI-NOFP16-NEXT: fcvtn2 v20.4s, v21.2d 7053; CHECK-GI-NOFP16-NEXT: fcvtn2 v24.4s, v3.2d 7054; CHECK-GI-NOFP16-NEXT: fcvtn2 v6.4s, v7.2d 7055; CHECK-GI-NOFP16-NEXT: fcvtn2 v18.4s, v19.2d 7056; CHECK-GI-NOFP16-NEXT: fcvtn2 v22.4s, v23.2d 7057; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7058; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v4.4s 7059; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v16.4s 7060; CHECK-GI-NOFP16-NEXT: fcvtn v3.4h, v20.4s 7061; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v24.4s 7062; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v6.4s 7063; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 7064; CHECK-GI-NOFP16-NEXT: fcvtn2 v3.8h, v22.4s 7065; CHECK-GI-NOFP16-NEXT: ret 7066; 7067; CHECK-GI-FP16-LABEL: utofp_v32i64_v32f16: 7068; CHECK-GI-FP16: // %bb.0: // %entry 7069; CHECK-GI-FP16-NEXT: ldp q16, q18, [sp] 7070; CHECK-GI-FP16-NEXT: ucvtf v0.2d, v0.2d 7071; CHECK-GI-FP16-NEXT: ldp q17, q19, [sp, #64] 7072; CHECK-GI-FP16-NEXT: ucvtf v4.2d, v4.2d 7073; CHECK-GI-FP16-NEXT: ucvtf v1.2d, v1.2d 7074; CHECK-GI-FP16-NEXT: ucvtf v5.2d, v5.2d 7075; CHECK-GI-FP16-NEXT: ucvtf v6.2d, v6.2d 7076; CHECK-GI-FP16-NEXT: ucvtf v20.2d, v16.2d 7077; CHECK-GI-FP16-NEXT: ucvtf v24.2d, v18.2d 7078; CHECK-GI-FP16-NEXT: ucvtf v2.2d, v2.2d 7079; CHECK-GI-FP16-NEXT: ucvtf v16.2d, v17.2d 7080; CHECK-GI-FP16-NEXT: mov d21, v0.d[1] 7081; CHECK-GI-FP16-NEXT: ucvtf v25.2d, v19.2d 7082; CHECK-GI-FP16-NEXT: mov d22, v4.d[1] 7083; CHECK-GI-FP16-NEXT: fcvt h0, d0 7084; CHECK-GI-FP16-NEXT: ucvtf v3.2d, v3.2d 7085; CHECK-GI-FP16-NEXT: mov d18, v1.d[1] 7086; CHECK-GI-FP16-NEXT: fcvt h17, d1 7087; CHECK-GI-FP16-NEXT: mov d19, v5.d[1] 7088; CHECK-GI-FP16-NEXT: mov d23, v20.d[1] 7089; CHECK-GI-FP16-NEXT: fcvt h1, d4 7090; CHECK-GI-FP16-NEXT: fcvt h4, d20 7091; CHECK-GI-FP16-NEXT: mov d26, v16.d[1] 7092; CHECK-GI-FP16-NEXT: fcvt h20, d5 7093; CHECK-GI-FP16-NEXT: fcvt h5, d16 7094; CHECK-GI-FP16-NEXT: fcvt h28, d21 7095; CHECK-GI-FP16-NEXT: fcvt h29, d22 7096; CHECK-GI-FP16-NEXT: fcvt h22, d24 7097; CHECK-GI-FP16-NEXT: fcvt h21, d25 7098; CHECK-GI-FP16-NEXT: fcvt h18, d18 7099; CHECK-GI-FP16-NEXT: fcvt h19, d19 7100; CHECK-GI-FP16-NEXT: fcvt h27, d23 7101; CHECK-GI-FP16-NEXT: mov d23, v24.d[1] 7102; CHECK-GI-FP16-NEXT: mov d24, v25.d[1] 7103; CHECK-GI-FP16-NEXT: ldp q25, q16, [sp, #32] 7104; CHECK-GI-FP16-NEXT: fcvt h26, d26 7105; CHECK-GI-FP16-NEXT: mov v0.h[1], v28.h[0] 7106; CHECK-GI-FP16-NEXT: mov v1.h[1], v29.h[0] 7107; CHECK-GI-FP16-NEXT: ucvtf v7.2d, v7.2d 7108; CHECK-GI-FP16-NEXT: mov v4.h[1], v27.h[0] 7109; CHECK-GI-FP16-NEXT: ucvtf v25.2d, v25.2d 7110; CHECK-GI-FP16-NEXT: fcvt h23, d23 7111; CHECK-GI-FP16-NEXT: mov v5.h[1], v26.h[0] 7112; CHECK-GI-FP16-NEXT: ldp q26, q27, [sp, #96] 7113; CHECK-GI-FP16-NEXT: fcvt h24, d24 7114; CHECK-GI-FP16-NEXT: mov v0.h[2], v17.h[0] 7115; CHECK-GI-FP16-NEXT: mov v1.h[2], v20.h[0] 7116; CHECK-GI-FP16-NEXT: mov d20, v6.d[1] 7117; CHECK-GI-FP16-NEXT: mov d17, v2.d[1] 7118; CHECK-GI-FP16-NEXT: fcvt h2, d2 7119; CHECK-GI-FP16-NEXT: ucvtf v26.2d, v26.2d 7120; CHECK-GI-FP16-NEXT: mov v4.h[2], v22.h[0] 7121; CHECK-GI-FP16-NEXT: fcvt h22, d25 7122; CHECK-GI-FP16-NEXT: mov v5.h[2], v21.h[0] 7123; CHECK-GI-FP16-NEXT: mov d21, v25.d[1] 7124; CHECK-GI-FP16-NEXT: fcvt h6, d6 7125; CHECK-GI-FP16-NEXT: mov v0.h[3], v18.h[0] 7126; CHECK-GI-FP16-NEXT: mov v1.h[3], v19.h[0] 7127; CHECK-GI-FP16-NEXT: ucvtf v16.2d, v16.2d 7128; CHECK-GI-FP16-NEXT: ucvtf v18.2d, v27.2d 7129; CHECK-GI-FP16-NEXT: fcvt h19, d20 7130; CHECK-GI-FP16-NEXT: fcvt h17, d17 7131; CHECK-GI-FP16-NEXT: mov d25, v26.d[1] 7132; CHECK-GI-FP16-NEXT: fcvt h26, d26 7133; CHECK-GI-FP16-NEXT: mov v4.h[3], v23.h[0] 7134; CHECK-GI-FP16-NEXT: mov v5.h[3], v24.h[0] 7135; CHECK-GI-FP16-NEXT: fcvt h20, d21 7136; CHECK-GI-FP16-NEXT: mov v0.h[4], v2.h[0] 7137; CHECK-GI-FP16-NEXT: mov v1.h[4], v6.h[0] 7138; CHECK-GI-FP16-NEXT: mov d2, v3.d[1] 7139; CHECK-GI-FP16-NEXT: mov d23, v18.d[1] 7140; CHECK-GI-FP16-NEXT: fcvt h18, d18 7141; CHECK-GI-FP16-NEXT: fcvt h3, d3 7142; CHECK-GI-FP16-NEXT: fcvt h21, d25 7143; CHECK-GI-FP16-NEXT: mov v4.h[4], v22.h[0] 7144; CHECK-GI-FP16-NEXT: mov d22, v16.d[1] 7145; CHECK-GI-FP16-NEXT: mov v5.h[4], v26.h[0] 7146; CHECK-GI-FP16-NEXT: fcvt h16, d16 7147; CHECK-GI-FP16-NEXT: mov d6, v7.d[1] 7148; CHECK-GI-FP16-NEXT: fcvt h7, d7 7149; CHECK-GI-FP16-NEXT: mov v0.h[5], v17.h[0] 7150; CHECK-GI-FP16-NEXT: mov v1.h[5], v19.h[0] 7151; CHECK-GI-FP16-NEXT: fcvt h19, d23 7152; CHECK-GI-FP16-NEXT: fcvt h2, d2 7153; CHECK-GI-FP16-NEXT: mov v4.h[5], v20.h[0] 7154; CHECK-GI-FP16-NEXT: fcvt h17, d22 7155; CHECK-GI-FP16-NEXT: mov v5.h[5], v21.h[0] 7156; CHECK-GI-FP16-NEXT: fcvt h6, d6 7157; CHECK-GI-FP16-NEXT: mov v0.h[6], v3.h[0] 7158; CHECK-GI-FP16-NEXT: mov v1.h[6], v7.h[0] 7159; CHECK-GI-FP16-NEXT: mov v4.h[6], v16.h[0] 7160; CHECK-GI-FP16-NEXT: mov v5.h[6], v18.h[0] 7161; CHECK-GI-FP16-NEXT: mov v0.h[7], v2.h[0] 7162; CHECK-GI-FP16-NEXT: mov v1.h[7], v6.h[0] 7163; CHECK-GI-FP16-NEXT: mov v4.h[7], v17.h[0] 7164; CHECK-GI-FP16-NEXT: mov v5.h[7], v19.h[0] 7165; CHECK-GI-FP16-NEXT: mov v2.16b, v4.16b 7166; CHECK-GI-FP16-NEXT: mov v3.16b, v5.16b 7167; CHECK-GI-FP16-NEXT: ret 7168entry: 7169 %c = uitofp <32 x i64> %a to <32 x half> 7170 ret <32 x half> %c 7171} 7172 7173define <2 x half> @stofp_v2i32_v2f16(<2 x i32> %a) { 7174; CHECK-SD-LABEL: stofp_v2i32_v2f16: 7175; CHECK-SD: // %bb.0: // %entry 7176; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 7177; CHECK-SD-NEXT: scvtf v0.4s, v0.4s 7178; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 7179; CHECK-SD-NEXT: ret 7180; 7181; CHECK-GI-LABEL: stofp_v2i32_v2f16: 7182; CHECK-GI: // %bb.0: // %entry 7183; CHECK-GI-NEXT: scvtf v0.2s, v0.2s 7184; CHECK-GI-NEXT: mov v1.s[0], v0.s[0] 7185; CHECK-GI-NEXT: mov v1.s[1], v0.s[1] 7186; CHECK-GI-NEXT: fcvtn v0.4h, v1.4s 7187; CHECK-GI-NEXT: ret 7188entry: 7189 %c = sitofp <2 x i32> %a to <2 x half> 7190 ret <2 x half> %c 7191} 7192 7193define <2 x half> @utofp_v2i32_v2f16(<2 x i32> %a) { 7194; CHECK-SD-LABEL: utofp_v2i32_v2f16: 7195; CHECK-SD: // %bb.0: // %entry 7196; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 7197; CHECK-SD-NEXT: ucvtf v0.4s, v0.4s 7198; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 7199; CHECK-SD-NEXT: ret 7200; 7201; CHECK-GI-LABEL: utofp_v2i32_v2f16: 7202; CHECK-GI: // %bb.0: // %entry 7203; CHECK-GI-NEXT: ucvtf v0.2s, v0.2s 7204; CHECK-GI-NEXT: mov v1.s[0], v0.s[0] 7205; CHECK-GI-NEXT: mov v1.s[1], v0.s[1] 7206; CHECK-GI-NEXT: fcvtn v0.4h, v1.4s 7207; CHECK-GI-NEXT: ret 7208entry: 7209 %c = uitofp <2 x i32> %a to <2 x half> 7210 ret <2 x half> %c 7211} 7212 7213define <3 x half> @stofp_v3i32_v3f16(<3 x i32> %a) { 7214; CHECK-LABEL: stofp_v3i32_v3f16: 7215; CHECK: // %bb.0: // %entry 7216; CHECK-NEXT: scvtf v0.4s, v0.4s 7217; CHECK-NEXT: fcvtn v0.4h, v0.4s 7218; CHECK-NEXT: ret 7219entry: 7220 %c = sitofp <3 x i32> %a to <3 x half> 7221 ret <3 x half> %c 7222} 7223 7224define <3 x half> @utofp_v3i32_v3f16(<3 x i32> %a) { 7225; CHECK-LABEL: utofp_v3i32_v3f16: 7226; CHECK: // %bb.0: // %entry 7227; CHECK-NEXT: ucvtf v0.4s, v0.4s 7228; CHECK-NEXT: fcvtn v0.4h, v0.4s 7229; CHECK-NEXT: ret 7230entry: 7231 %c = uitofp <3 x i32> %a to <3 x half> 7232 ret <3 x half> %c 7233} 7234 7235define <4 x half> @stofp_v4i32_v4f16(<4 x i32> %a) { 7236; CHECK-LABEL: stofp_v4i32_v4f16: 7237; CHECK: // %bb.0: // %entry 7238; CHECK-NEXT: scvtf v0.4s, v0.4s 7239; CHECK-NEXT: fcvtn v0.4h, v0.4s 7240; CHECK-NEXT: ret 7241entry: 7242 %c = sitofp <4 x i32> %a to <4 x half> 7243 ret <4 x half> %c 7244} 7245 7246define <4 x half> @utofp_v4i32_v4f16(<4 x i32> %a) { 7247; CHECK-LABEL: utofp_v4i32_v4f16: 7248; CHECK: // %bb.0: // %entry 7249; CHECK-NEXT: ucvtf v0.4s, v0.4s 7250; CHECK-NEXT: fcvtn v0.4h, v0.4s 7251; CHECK-NEXT: ret 7252entry: 7253 %c = uitofp <4 x i32> %a to <4 x half> 7254 ret <4 x half> %c 7255} 7256 7257define <8 x half> @stofp_v8i32_v8f16(<8 x i32> %a) { 7258; CHECK-LABEL: stofp_v8i32_v8f16: 7259; CHECK: // %bb.0: // %entry 7260; CHECK-NEXT: scvtf v0.4s, v0.4s 7261; CHECK-NEXT: scvtf v1.4s, v1.4s 7262; CHECK-NEXT: fcvtn v0.4h, v0.4s 7263; CHECK-NEXT: fcvtn2 v0.8h, v1.4s 7264; CHECK-NEXT: ret 7265entry: 7266 %c = sitofp <8 x i32> %a to <8 x half> 7267 ret <8 x half> %c 7268} 7269 7270define <8 x half> @utofp_v8i32_v8f16(<8 x i32> %a) { 7271; CHECK-LABEL: utofp_v8i32_v8f16: 7272; CHECK: // %bb.0: // %entry 7273; CHECK-NEXT: ucvtf v0.4s, v0.4s 7274; CHECK-NEXT: ucvtf v1.4s, v1.4s 7275; CHECK-NEXT: fcvtn v0.4h, v0.4s 7276; CHECK-NEXT: fcvtn2 v0.8h, v1.4s 7277; CHECK-NEXT: ret 7278entry: 7279 %c = uitofp <8 x i32> %a to <8 x half> 7280 ret <8 x half> %c 7281} 7282 7283define <16 x half> @stofp_v16i32_v16f16(<16 x i32> %a) { 7284; CHECK-SD-LABEL: stofp_v16i32_v16f16: 7285; CHECK-SD: // %bb.0: // %entry 7286; CHECK-SD-NEXT: scvtf v0.4s, v0.4s 7287; CHECK-SD-NEXT: scvtf v2.4s, v2.4s 7288; CHECK-SD-NEXT: scvtf v4.4s, v1.4s 7289; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 7290; CHECK-SD-NEXT: fcvtn v1.4h, v2.4s 7291; CHECK-SD-NEXT: scvtf v2.4s, v3.4s 7292; CHECK-SD-NEXT: fcvtn2 v0.8h, v4.4s 7293; CHECK-SD-NEXT: fcvtn2 v1.8h, v2.4s 7294; CHECK-SD-NEXT: ret 7295; 7296; CHECK-GI-LABEL: stofp_v16i32_v16f16: 7297; CHECK-GI: // %bb.0: // %entry 7298; CHECK-GI-NEXT: scvtf v0.4s, v0.4s 7299; CHECK-GI-NEXT: scvtf v2.4s, v2.4s 7300; CHECK-GI-NEXT: scvtf v4.4s, v1.4s 7301; CHECK-GI-NEXT: scvtf v3.4s, v3.4s 7302; CHECK-GI-NEXT: fcvtn v0.4h, v0.4s 7303; CHECK-GI-NEXT: fcvtn v1.4h, v2.4s 7304; CHECK-GI-NEXT: fcvtn2 v0.8h, v4.4s 7305; CHECK-GI-NEXT: fcvtn2 v1.8h, v3.4s 7306; CHECK-GI-NEXT: ret 7307entry: 7308 %c = sitofp <16 x i32> %a to <16 x half> 7309 ret <16 x half> %c 7310} 7311 7312define <16 x half> @utofp_v16i32_v16f16(<16 x i32> %a) { 7313; CHECK-SD-LABEL: utofp_v16i32_v16f16: 7314; CHECK-SD: // %bb.0: // %entry 7315; CHECK-SD-NEXT: ucvtf v0.4s, v0.4s 7316; CHECK-SD-NEXT: ucvtf v2.4s, v2.4s 7317; CHECK-SD-NEXT: ucvtf v4.4s, v1.4s 7318; CHECK-SD-NEXT: fcvtn v0.4h, v0.4s 7319; CHECK-SD-NEXT: fcvtn v1.4h, v2.4s 7320; CHECK-SD-NEXT: ucvtf v2.4s, v3.4s 7321; CHECK-SD-NEXT: fcvtn2 v0.8h, v4.4s 7322; CHECK-SD-NEXT: fcvtn2 v1.8h, v2.4s 7323; CHECK-SD-NEXT: ret 7324; 7325; CHECK-GI-LABEL: utofp_v16i32_v16f16: 7326; CHECK-GI: // %bb.0: // %entry 7327; CHECK-GI-NEXT: ucvtf v0.4s, v0.4s 7328; CHECK-GI-NEXT: ucvtf v2.4s, v2.4s 7329; CHECK-GI-NEXT: ucvtf v4.4s, v1.4s 7330; CHECK-GI-NEXT: ucvtf v3.4s, v3.4s 7331; CHECK-GI-NEXT: fcvtn v0.4h, v0.4s 7332; CHECK-GI-NEXT: fcvtn v1.4h, v2.4s 7333; CHECK-GI-NEXT: fcvtn2 v0.8h, v4.4s 7334; CHECK-GI-NEXT: fcvtn2 v1.8h, v3.4s 7335; CHECK-GI-NEXT: ret 7336entry: 7337 %c = uitofp <16 x i32> %a to <16 x half> 7338 ret <16 x half> %c 7339} 7340 7341define <32 x half> @stofp_v32i32_v32f16(<32 x i32> %a) { 7342; CHECK-LABEL: stofp_v32i32_v32f16: 7343; CHECK: // %bb.0: // %entry 7344; CHECK-NEXT: scvtf v0.4s, v0.4s 7345; CHECK-NEXT: scvtf v2.4s, v2.4s 7346; CHECK-NEXT: scvtf v4.4s, v4.4s 7347; CHECK-NEXT: scvtf v6.4s, v6.4s 7348; CHECK-NEXT: scvtf v16.4s, v1.4s 7349; CHECK-NEXT: scvtf v17.4s, v3.4s 7350; CHECK-NEXT: scvtf v5.4s, v5.4s 7351; CHECK-NEXT: scvtf v7.4s, v7.4s 7352; CHECK-NEXT: fcvtn v0.4h, v0.4s 7353; CHECK-NEXT: fcvtn v1.4h, v2.4s 7354; CHECK-NEXT: fcvtn v2.4h, v4.4s 7355; CHECK-NEXT: fcvtn v3.4h, v6.4s 7356; CHECK-NEXT: fcvtn2 v0.8h, v16.4s 7357; CHECK-NEXT: fcvtn2 v1.8h, v17.4s 7358; CHECK-NEXT: fcvtn2 v2.8h, v5.4s 7359; CHECK-NEXT: fcvtn2 v3.8h, v7.4s 7360; CHECK-NEXT: ret 7361entry: 7362 %c = sitofp <32 x i32> %a to <32 x half> 7363 ret <32 x half> %c 7364} 7365 7366define <32 x half> @utofp_v32i32_v32f16(<32 x i32> %a) { 7367; CHECK-LABEL: utofp_v32i32_v32f16: 7368; CHECK: // %bb.0: // %entry 7369; CHECK-NEXT: ucvtf v0.4s, v0.4s 7370; CHECK-NEXT: ucvtf v2.4s, v2.4s 7371; CHECK-NEXT: ucvtf v4.4s, v4.4s 7372; CHECK-NEXT: ucvtf v6.4s, v6.4s 7373; CHECK-NEXT: ucvtf v16.4s, v1.4s 7374; CHECK-NEXT: ucvtf v17.4s, v3.4s 7375; CHECK-NEXT: ucvtf v5.4s, v5.4s 7376; CHECK-NEXT: ucvtf v7.4s, v7.4s 7377; CHECK-NEXT: fcvtn v0.4h, v0.4s 7378; CHECK-NEXT: fcvtn v1.4h, v2.4s 7379; CHECK-NEXT: fcvtn v2.4h, v4.4s 7380; CHECK-NEXT: fcvtn v3.4h, v6.4s 7381; CHECK-NEXT: fcvtn2 v0.8h, v16.4s 7382; CHECK-NEXT: fcvtn2 v1.8h, v17.4s 7383; CHECK-NEXT: fcvtn2 v2.8h, v5.4s 7384; CHECK-NEXT: fcvtn2 v3.8h, v7.4s 7385; CHECK-NEXT: ret 7386entry: 7387 %c = uitofp <32 x i32> %a to <32 x half> 7388 ret <32 x half> %c 7389} 7390 7391define <2 x half> @stofp_v2i16_v2f16(<2 x i16> %a) { 7392; CHECK-SD-NOFP16-LABEL: stofp_v2i16_v2f16: 7393; CHECK-SD-NOFP16: // %bb.0: // %entry 7394; CHECK-SD-NOFP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7395; CHECK-SD-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 7396; CHECK-SD-NOFP16-NEXT: scvtf v0.4s, v0.4s 7397; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7398; CHECK-SD-NOFP16-NEXT: ret 7399; 7400; CHECK-SD-FP16-LABEL: stofp_v2i16_v2f16: 7401; CHECK-SD-FP16: // %bb.0: // %entry 7402; CHECK-SD-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7403; CHECK-SD-FP16-NEXT: scvtf v0.4h, v0.4h 7404; CHECK-SD-FP16-NEXT: ret 7405; 7406; CHECK-GI-NOFP16-LABEL: stofp_v2i16_v2f16: 7407; CHECK-GI-NOFP16: // %bb.0: // %entry 7408; CHECK-GI-NOFP16-NEXT: shl v0.2s, v0.2s, #16 7409; CHECK-GI-NOFP16-NEXT: sshr v0.2s, v0.2s, #16 7410; CHECK-GI-NOFP16-NEXT: scvtf v0.2s, v0.2s 7411; CHECK-GI-NOFP16-NEXT: mov v1.s[0], v0.s[0] 7412; CHECK-GI-NOFP16-NEXT: mov v1.s[1], v0.s[1] 7413; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7414; CHECK-GI-NOFP16-NEXT: ret 7415; 7416; CHECK-GI-FP16-LABEL: stofp_v2i16_v2f16: 7417; CHECK-GI-FP16: // %bb.0: // %entry 7418; CHECK-GI-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7419; CHECK-GI-FP16-NEXT: scvtf v0.4h, v0.4h 7420; CHECK-GI-FP16-NEXT: ret 7421entry: 7422 %c = sitofp <2 x i16> %a to <2 x half> 7423 ret <2 x half> %c 7424} 7425 7426define <2 x half> @utofp_v2i16_v2f16(<2 x i16> %a) { 7427; CHECK-SD-NOFP16-LABEL: utofp_v2i16_v2f16: 7428; CHECK-SD-NOFP16: // %bb.0: // %entry 7429; CHECK-SD-NOFP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7430; CHECK-SD-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 7431; CHECK-SD-NOFP16-NEXT: ucvtf v0.4s, v0.4s 7432; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7433; CHECK-SD-NOFP16-NEXT: ret 7434; 7435; CHECK-SD-FP16-LABEL: utofp_v2i16_v2f16: 7436; CHECK-SD-FP16: // %bb.0: // %entry 7437; CHECK-SD-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7438; CHECK-SD-FP16-NEXT: ucvtf v0.4h, v0.4h 7439; CHECK-SD-FP16-NEXT: ret 7440; 7441; CHECK-GI-NOFP16-LABEL: utofp_v2i16_v2f16: 7442; CHECK-GI-NOFP16: // %bb.0: // %entry 7443; CHECK-GI-NOFP16-NEXT: movi d1, #0x00ffff0000ffff 7444; CHECK-GI-NOFP16-NEXT: and v0.8b, v0.8b, v1.8b 7445; CHECK-GI-NOFP16-NEXT: ucvtf v0.2s, v0.2s 7446; CHECK-GI-NOFP16-NEXT: mov v1.s[0], v0.s[0] 7447; CHECK-GI-NOFP16-NEXT: mov v1.s[1], v0.s[1] 7448; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7449; CHECK-GI-NOFP16-NEXT: ret 7450; 7451; CHECK-GI-FP16-LABEL: utofp_v2i16_v2f16: 7452; CHECK-GI-FP16: // %bb.0: // %entry 7453; CHECK-GI-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7454; CHECK-GI-FP16-NEXT: ucvtf v0.4h, v0.4h 7455; CHECK-GI-FP16-NEXT: ret 7456entry: 7457 %c = uitofp <2 x i16> %a to <2 x half> 7458 ret <2 x half> %c 7459} 7460 7461define <3 x half> @stofp_v3i16_v3f16(<3 x i16> %a) { 7462; CHECK-SD-NOFP16-LABEL: stofp_v3i16_v3f16: 7463; CHECK-SD-NOFP16: // %bb.0: // %entry 7464; CHECK-SD-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 7465; CHECK-SD-NOFP16-NEXT: scvtf v0.4s, v0.4s 7466; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7467; CHECK-SD-NOFP16-NEXT: ret 7468; 7469; CHECK-SD-FP16-LABEL: stofp_v3i16_v3f16: 7470; CHECK-SD-FP16: // %bb.0: // %entry 7471; CHECK-SD-FP16-NEXT: scvtf v0.4h, v0.4h 7472; CHECK-SD-FP16-NEXT: ret 7473; 7474; CHECK-GI-NOFP16-LABEL: stofp_v3i16_v3f16: 7475; CHECK-GI-NOFP16: // %bb.0: // %entry 7476; CHECK-GI-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 7477; CHECK-GI-NOFP16-NEXT: scvtf v0.4s, v0.4s 7478; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7479; CHECK-GI-NOFP16-NEXT: ret 7480; 7481; CHECK-GI-FP16-LABEL: stofp_v3i16_v3f16: 7482; CHECK-GI-FP16: // %bb.0: // %entry 7483; CHECK-GI-FP16-NEXT: scvtf v0.4h, v0.4h 7484; CHECK-GI-FP16-NEXT: ret 7485entry: 7486 %c = sitofp <3 x i16> %a to <3 x half> 7487 ret <3 x half> %c 7488} 7489 7490define <3 x half> @utofp_v3i16_v3f16(<3 x i16> %a) { 7491; CHECK-SD-NOFP16-LABEL: utofp_v3i16_v3f16: 7492; CHECK-SD-NOFP16: // %bb.0: // %entry 7493; CHECK-SD-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 7494; CHECK-SD-NOFP16-NEXT: ucvtf v0.4s, v0.4s 7495; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7496; CHECK-SD-NOFP16-NEXT: ret 7497; 7498; CHECK-SD-FP16-LABEL: utofp_v3i16_v3f16: 7499; CHECK-SD-FP16: // %bb.0: // %entry 7500; CHECK-SD-FP16-NEXT: ucvtf v0.4h, v0.4h 7501; CHECK-SD-FP16-NEXT: ret 7502; 7503; CHECK-GI-NOFP16-LABEL: utofp_v3i16_v3f16: 7504; CHECK-GI-NOFP16: // %bb.0: // %entry 7505; CHECK-GI-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 7506; CHECK-GI-NOFP16-NEXT: ucvtf v0.4s, v0.4s 7507; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7508; CHECK-GI-NOFP16-NEXT: ret 7509; 7510; CHECK-GI-FP16-LABEL: utofp_v3i16_v3f16: 7511; CHECK-GI-FP16: // %bb.0: // %entry 7512; CHECK-GI-FP16-NEXT: ucvtf v0.4h, v0.4h 7513; CHECK-GI-FP16-NEXT: ret 7514entry: 7515 %c = uitofp <3 x i16> %a to <3 x half> 7516 ret <3 x half> %c 7517} 7518 7519define <4 x half> @stofp_v4i16_v4f16(<4 x i16> %a) { 7520; CHECK-SD-NOFP16-LABEL: stofp_v4i16_v4f16: 7521; CHECK-SD-NOFP16: // %bb.0: // %entry 7522; CHECK-SD-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 7523; CHECK-SD-NOFP16-NEXT: scvtf v0.4s, v0.4s 7524; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7525; CHECK-SD-NOFP16-NEXT: ret 7526; 7527; CHECK-SD-FP16-LABEL: stofp_v4i16_v4f16: 7528; CHECK-SD-FP16: // %bb.0: // %entry 7529; CHECK-SD-FP16-NEXT: scvtf v0.4h, v0.4h 7530; CHECK-SD-FP16-NEXT: ret 7531; 7532; CHECK-GI-NOFP16-LABEL: stofp_v4i16_v4f16: 7533; CHECK-GI-NOFP16: // %bb.0: // %entry 7534; CHECK-GI-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 7535; CHECK-GI-NOFP16-NEXT: scvtf v0.4s, v0.4s 7536; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7537; CHECK-GI-NOFP16-NEXT: ret 7538; 7539; CHECK-GI-FP16-LABEL: stofp_v4i16_v4f16: 7540; CHECK-GI-FP16: // %bb.0: // %entry 7541; CHECK-GI-FP16-NEXT: scvtf v0.4h, v0.4h 7542; CHECK-GI-FP16-NEXT: ret 7543entry: 7544 %c = sitofp <4 x i16> %a to <4 x half> 7545 ret <4 x half> %c 7546} 7547 7548define <4 x half> @utofp_v4i16_v4f16(<4 x i16> %a) { 7549; CHECK-SD-NOFP16-LABEL: utofp_v4i16_v4f16: 7550; CHECK-SD-NOFP16: // %bb.0: // %entry 7551; CHECK-SD-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 7552; CHECK-SD-NOFP16-NEXT: ucvtf v0.4s, v0.4s 7553; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7554; CHECK-SD-NOFP16-NEXT: ret 7555; 7556; CHECK-SD-FP16-LABEL: utofp_v4i16_v4f16: 7557; CHECK-SD-FP16: // %bb.0: // %entry 7558; CHECK-SD-FP16-NEXT: ucvtf v0.4h, v0.4h 7559; CHECK-SD-FP16-NEXT: ret 7560; 7561; CHECK-GI-NOFP16-LABEL: utofp_v4i16_v4f16: 7562; CHECK-GI-NOFP16: // %bb.0: // %entry 7563; CHECK-GI-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 7564; CHECK-GI-NOFP16-NEXT: ucvtf v0.4s, v0.4s 7565; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 7566; CHECK-GI-NOFP16-NEXT: ret 7567; 7568; CHECK-GI-FP16-LABEL: utofp_v4i16_v4f16: 7569; CHECK-GI-FP16: // %bb.0: // %entry 7570; CHECK-GI-FP16-NEXT: ucvtf v0.4h, v0.4h 7571; CHECK-GI-FP16-NEXT: ret 7572entry: 7573 %c = uitofp <4 x i16> %a to <4 x half> 7574 ret <4 x half> %c 7575} 7576 7577define <8 x half> @stofp_v8i16_v8f16(<8 x i16> %a) { 7578; CHECK-SD-NOFP16-LABEL: stofp_v8i16_v8f16: 7579; CHECK-SD-NOFP16: // %bb.0: // %entry 7580; CHECK-SD-NOFP16-NEXT: sshll v1.4s, v0.4h, #0 7581; CHECK-SD-NOFP16-NEXT: sshll2 v2.4s, v0.8h, #0 7582; CHECK-SD-NOFP16-NEXT: scvtf v1.4s, v1.4s 7583; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7584; CHECK-SD-NOFP16-NEXT: scvtf v1.4s, v2.4s 7585; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 7586; CHECK-SD-NOFP16-NEXT: ret 7587; 7588; CHECK-SD-FP16-LABEL: stofp_v8i16_v8f16: 7589; CHECK-SD-FP16: // %bb.0: // %entry 7590; CHECK-SD-FP16-NEXT: scvtf v0.8h, v0.8h 7591; CHECK-SD-FP16-NEXT: ret 7592; 7593; CHECK-GI-NOFP16-LABEL: stofp_v8i16_v8f16: 7594; CHECK-GI-NOFP16: // %bb.0: // %entry 7595; CHECK-GI-NOFP16-NEXT: sshll v1.4s, v0.4h, #0 7596; CHECK-GI-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 7597; CHECK-GI-NOFP16-NEXT: scvtf v1.4s, v1.4s 7598; CHECK-GI-NOFP16-NEXT: scvtf v2.4s, v0.4s 7599; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7600; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 7601; CHECK-GI-NOFP16-NEXT: ret 7602; 7603; CHECK-GI-FP16-LABEL: stofp_v8i16_v8f16: 7604; CHECK-GI-FP16: // %bb.0: // %entry 7605; CHECK-GI-FP16-NEXT: scvtf v0.8h, v0.8h 7606; CHECK-GI-FP16-NEXT: ret 7607entry: 7608 %c = sitofp <8 x i16> %a to <8 x half> 7609 ret <8 x half> %c 7610} 7611 7612define <8 x half> @utofp_v8i16_v8f16(<8 x i16> %a) { 7613; CHECK-SD-NOFP16-LABEL: utofp_v8i16_v8f16: 7614; CHECK-SD-NOFP16: // %bb.0: // %entry 7615; CHECK-SD-NOFP16-NEXT: ushll v1.4s, v0.4h, #0 7616; CHECK-SD-NOFP16-NEXT: ushll2 v2.4s, v0.8h, #0 7617; CHECK-SD-NOFP16-NEXT: ucvtf v1.4s, v1.4s 7618; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7619; CHECK-SD-NOFP16-NEXT: ucvtf v1.4s, v2.4s 7620; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 7621; CHECK-SD-NOFP16-NEXT: ret 7622; 7623; CHECK-SD-FP16-LABEL: utofp_v8i16_v8f16: 7624; CHECK-SD-FP16: // %bb.0: // %entry 7625; CHECK-SD-FP16-NEXT: ucvtf v0.8h, v0.8h 7626; CHECK-SD-FP16-NEXT: ret 7627; 7628; CHECK-GI-NOFP16-LABEL: utofp_v8i16_v8f16: 7629; CHECK-GI-NOFP16: // %bb.0: // %entry 7630; CHECK-GI-NOFP16-NEXT: ushll v1.4s, v0.4h, #0 7631; CHECK-GI-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 7632; CHECK-GI-NOFP16-NEXT: ucvtf v1.4s, v1.4s 7633; CHECK-GI-NOFP16-NEXT: ucvtf v2.4s, v0.4s 7634; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7635; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 7636; CHECK-GI-NOFP16-NEXT: ret 7637; 7638; CHECK-GI-FP16-LABEL: utofp_v8i16_v8f16: 7639; CHECK-GI-FP16: // %bb.0: // %entry 7640; CHECK-GI-FP16-NEXT: ucvtf v0.8h, v0.8h 7641; CHECK-GI-FP16-NEXT: ret 7642entry: 7643 %c = uitofp <8 x i16> %a to <8 x half> 7644 ret <8 x half> %c 7645} 7646 7647define <16 x half> @stofp_v16i16_v16f16(<16 x i16> %a) { 7648; CHECK-SD-NOFP16-LABEL: stofp_v16i16_v16f16: 7649; CHECK-SD-NOFP16: // %bb.0: // %entry 7650; CHECK-SD-NOFP16-NEXT: sshll v2.4s, v0.4h, #0 7651; CHECK-SD-NOFP16-NEXT: sshll v3.4s, v1.4h, #0 7652; CHECK-SD-NOFP16-NEXT: sshll2 v4.4s, v0.8h, #0 7653; CHECK-SD-NOFP16-NEXT: sshll2 v5.4s, v1.8h, #0 7654; CHECK-SD-NOFP16-NEXT: scvtf v2.4s, v2.4s 7655; CHECK-SD-NOFP16-NEXT: scvtf v3.4s, v3.4s 7656; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 7657; CHECK-SD-NOFP16-NEXT: scvtf v2.4s, v4.4s 7658; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v3.4s 7659; CHECK-SD-NOFP16-NEXT: scvtf v3.4s, v5.4s 7660; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 7661; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 7662; CHECK-SD-NOFP16-NEXT: ret 7663; 7664; CHECK-SD-FP16-LABEL: stofp_v16i16_v16f16: 7665; CHECK-SD-FP16: // %bb.0: // %entry 7666; CHECK-SD-FP16-NEXT: scvtf v0.8h, v0.8h 7667; CHECK-SD-FP16-NEXT: scvtf v1.8h, v1.8h 7668; CHECK-SD-FP16-NEXT: ret 7669; 7670; CHECK-GI-NOFP16-LABEL: stofp_v16i16_v16f16: 7671; CHECK-GI-NOFP16: // %bb.0: // %entry 7672; CHECK-GI-NOFP16-NEXT: sshll v2.4s, v0.4h, #0 7673; CHECK-GI-NOFP16-NEXT: sshll v3.4s, v1.4h, #0 7674; CHECK-GI-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 7675; CHECK-GI-NOFP16-NEXT: sshll2 v1.4s, v1.8h, #0 7676; CHECK-GI-NOFP16-NEXT: scvtf v2.4s, v2.4s 7677; CHECK-GI-NOFP16-NEXT: scvtf v3.4s, v3.4s 7678; CHECK-GI-NOFP16-NEXT: scvtf v4.4s, v0.4s 7679; CHECK-GI-NOFP16-NEXT: scvtf v5.4s, v1.4s 7680; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 7681; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 7682; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 7683; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 7684; CHECK-GI-NOFP16-NEXT: ret 7685; 7686; CHECK-GI-FP16-LABEL: stofp_v16i16_v16f16: 7687; CHECK-GI-FP16: // %bb.0: // %entry 7688; CHECK-GI-FP16-NEXT: scvtf v0.8h, v0.8h 7689; CHECK-GI-FP16-NEXT: scvtf v1.8h, v1.8h 7690; CHECK-GI-FP16-NEXT: ret 7691entry: 7692 %c = sitofp <16 x i16> %a to <16 x half> 7693 ret <16 x half> %c 7694} 7695 7696define <16 x half> @utofp_v16i16_v16f16(<16 x i16> %a) { 7697; CHECK-SD-NOFP16-LABEL: utofp_v16i16_v16f16: 7698; CHECK-SD-NOFP16: // %bb.0: // %entry 7699; CHECK-SD-NOFP16-NEXT: ushll v2.4s, v0.4h, #0 7700; CHECK-SD-NOFP16-NEXT: ushll v3.4s, v1.4h, #0 7701; CHECK-SD-NOFP16-NEXT: ushll2 v4.4s, v0.8h, #0 7702; CHECK-SD-NOFP16-NEXT: ushll2 v5.4s, v1.8h, #0 7703; CHECK-SD-NOFP16-NEXT: ucvtf v2.4s, v2.4s 7704; CHECK-SD-NOFP16-NEXT: ucvtf v3.4s, v3.4s 7705; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 7706; CHECK-SD-NOFP16-NEXT: ucvtf v2.4s, v4.4s 7707; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v3.4s 7708; CHECK-SD-NOFP16-NEXT: ucvtf v3.4s, v5.4s 7709; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 7710; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 7711; CHECK-SD-NOFP16-NEXT: ret 7712; 7713; CHECK-SD-FP16-LABEL: utofp_v16i16_v16f16: 7714; CHECK-SD-FP16: // %bb.0: // %entry 7715; CHECK-SD-FP16-NEXT: ucvtf v0.8h, v0.8h 7716; CHECK-SD-FP16-NEXT: ucvtf v1.8h, v1.8h 7717; CHECK-SD-FP16-NEXT: ret 7718; 7719; CHECK-GI-NOFP16-LABEL: utofp_v16i16_v16f16: 7720; CHECK-GI-NOFP16: // %bb.0: // %entry 7721; CHECK-GI-NOFP16-NEXT: ushll v2.4s, v0.4h, #0 7722; CHECK-GI-NOFP16-NEXT: ushll v3.4s, v1.4h, #0 7723; CHECK-GI-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 7724; CHECK-GI-NOFP16-NEXT: ushll2 v1.4s, v1.8h, #0 7725; CHECK-GI-NOFP16-NEXT: ucvtf v2.4s, v2.4s 7726; CHECK-GI-NOFP16-NEXT: ucvtf v3.4s, v3.4s 7727; CHECK-GI-NOFP16-NEXT: ucvtf v4.4s, v0.4s 7728; CHECK-GI-NOFP16-NEXT: ucvtf v5.4s, v1.4s 7729; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 7730; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 7731; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 7732; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 7733; CHECK-GI-NOFP16-NEXT: ret 7734; 7735; CHECK-GI-FP16-LABEL: utofp_v16i16_v16f16: 7736; CHECK-GI-FP16: // %bb.0: // %entry 7737; CHECK-GI-FP16-NEXT: ucvtf v0.8h, v0.8h 7738; CHECK-GI-FP16-NEXT: ucvtf v1.8h, v1.8h 7739; CHECK-GI-FP16-NEXT: ret 7740entry: 7741 %c = uitofp <16 x i16> %a to <16 x half> 7742 ret <16 x half> %c 7743} 7744 7745define <32 x half> @stofp_v32i16_v32f16(<32 x i16> %a) { 7746; CHECK-SD-NOFP16-LABEL: stofp_v32i16_v32f16: 7747; CHECK-SD-NOFP16: // %bb.0: // %entry 7748; CHECK-SD-NOFP16-NEXT: sshll v4.4s, v0.4h, #0 7749; CHECK-SD-NOFP16-NEXT: sshll v5.4s, v1.4h, #0 7750; CHECK-SD-NOFP16-NEXT: sshll v6.4s, v2.4h, #0 7751; CHECK-SD-NOFP16-NEXT: sshll v7.4s, v3.4h, #0 7752; CHECK-SD-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 7753; CHECK-SD-NOFP16-NEXT: sshll2 v1.4s, v1.8h, #0 7754; CHECK-SD-NOFP16-NEXT: sshll2 v2.4s, v2.8h, #0 7755; CHECK-SD-NOFP16-NEXT: sshll2 v3.4s, v3.8h, #0 7756; CHECK-SD-NOFP16-NEXT: scvtf v4.4s, v4.4s 7757; CHECK-SD-NOFP16-NEXT: scvtf v5.4s, v5.4s 7758; CHECK-SD-NOFP16-NEXT: scvtf v6.4s, v6.4s 7759; CHECK-SD-NOFP16-NEXT: scvtf v7.4s, v7.4s 7760; CHECK-SD-NOFP16-NEXT: scvtf v16.4s, v0.4s 7761; CHECK-SD-NOFP16-NEXT: scvtf v17.4s, v1.4s 7762; CHECK-SD-NOFP16-NEXT: scvtf v18.4s, v2.4s 7763; CHECK-SD-NOFP16-NEXT: scvtf v19.4s, v3.4s 7764; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v4.4s 7765; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v5.4s 7766; CHECK-SD-NOFP16-NEXT: fcvtn v2.4h, v6.4s 7767; CHECK-SD-NOFP16-NEXT: fcvtn v3.4h, v7.4s 7768; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v16.4s 7769; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v17.4s 7770; CHECK-SD-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 7771; CHECK-SD-NOFP16-NEXT: fcvtn2 v3.8h, v19.4s 7772; CHECK-SD-NOFP16-NEXT: ret 7773; 7774; CHECK-SD-FP16-LABEL: stofp_v32i16_v32f16: 7775; CHECK-SD-FP16: // %bb.0: // %entry 7776; CHECK-SD-FP16-NEXT: scvtf v0.8h, v0.8h 7777; CHECK-SD-FP16-NEXT: scvtf v1.8h, v1.8h 7778; CHECK-SD-FP16-NEXT: scvtf v2.8h, v2.8h 7779; CHECK-SD-FP16-NEXT: scvtf v3.8h, v3.8h 7780; CHECK-SD-FP16-NEXT: ret 7781; 7782; CHECK-GI-NOFP16-LABEL: stofp_v32i16_v32f16: 7783; CHECK-GI-NOFP16: // %bb.0: // %entry 7784; CHECK-GI-NOFP16-NEXT: sshll v4.4s, v0.4h, #0 7785; CHECK-GI-NOFP16-NEXT: sshll v5.4s, v1.4h, #0 7786; CHECK-GI-NOFP16-NEXT: sshll v6.4s, v2.4h, #0 7787; CHECK-GI-NOFP16-NEXT: sshll v7.4s, v3.4h, #0 7788; CHECK-GI-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 7789; CHECK-GI-NOFP16-NEXT: sshll2 v1.4s, v1.8h, #0 7790; CHECK-GI-NOFP16-NEXT: sshll2 v2.4s, v2.8h, #0 7791; CHECK-GI-NOFP16-NEXT: sshll2 v3.4s, v3.8h, #0 7792; CHECK-GI-NOFP16-NEXT: scvtf v4.4s, v4.4s 7793; CHECK-GI-NOFP16-NEXT: scvtf v5.4s, v5.4s 7794; CHECK-GI-NOFP16-NEXT: scvtf v6.4s, v6.4s 7795; CHECK-GI-NOFP16-NEXT: scvtf v7.4s, v7.4s 7796; CHECK-GI-NOFP16-NEXT: scvtf v16.4s, v0.4s 7797; CHECK-GI-NOFP16-NEXT: scvtf v17.4s, v1.4s 7798; CHECK-GI-NOFP16-NEXT: scvtf v18.4s, v2.4s 7799; CHECK-GI-NOFP16-NEXT: scvtf v19.4s, v3.4s 7800; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v4.4s 7801; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v5.4s 7802; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v6.4s 7803; CHECK-GI-NOFP16-NEXT: fcvtn v3.4h, v7.4s 7804; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v16.4s 7805; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v17.4s 7806; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 7807; CHECK-GI-NOFP16-NEXT: fcvtn2 v3.8h, v19.4s 7808; CHECK-GI-NOFP16-NEXT: ret 7809; 7810; CHECK-GI-FP16-LABEL: stofp_v32i16_v32f16: 7811; CHECK-GI-FP16: // %bb.0: // %entry 7812; CHECK-GI-FP16-NEXT: scvtf v0.8h, v0.8h 7813; CHECK-GI-FP16-NEXT: scvtf v1.8h, v1.8h 7814; CHECK-GI-FP16-NEXT: scvtf v2.8h, v2.8h 7815; CHECK-GI-FP16-NEXT: scvtf v3.8h, v3.8h 7816; CHECK-GI-FP16-NEXT: ret 7817entry: 7818 %c = sitofp <32 x i16> %a to <32 x half> 7819 ret <32 x half> %c 7820} 7821 7822define <32 x half> @utofp_v32i16_v32f16(<32 x i16> %a) { 7823; CHECK-SD-NOFP16-LABEL: utofp_v32i16_v32f16: 7824; CHECK-SD-NOFP16: // %bb.0: // %entry 7825; CHECK-SD-NOFP16-NEXT: ushll v4.4s, v0.4h, #0 7826; CHECK-SD-NOFP16-NEXT: ushll v5.4s, v1.4h, #0 7827; CHECK-SD-NOFP16-NEXT: ushll v6.4s, v2.4h, #0 7828; CHECK-SD-NOFP16-NEXT: ushll v7.4s, v3.4h, #0 7829; CHECK-SD-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 7830; CHECK-SD-NOFP16-NEXT: ushll2 v1.4s, v1.8h, #0 7831; CHECK-SD-NOFP16-NEXT: ushll2 v2.4s, v2.8h, #0 7832; CHECK-SD-NOFP16-NEXT: ushll2 v3.4s, v3.8h, #0 7833; CHECK-SD-NOFP16-NEXT: ucvtf v4.4s, v4.4s 7834; CHECK-SD-NOFP16-NEXT: ucvtf v5.4s, v5.4s 7835; CHECK-SD-NOFP16-NEXT: ucvtf v6.4s, v6.4s 7836; CHECK-SD-NOFP16-NEXT: ucvtf v7.4s, v7.4s 7837; CHECK-SD-NOFP16-NEXT: ucvtf v16.4s, v0.4s 7838; CHECK-SD-NOFP16-NEXT: ucvtf v17.4s, v1.4s 7839; CHECK-SD-NOFP16-NEXT: ucvtf v18.4s, v2.4s 7840; CHECK-SD-NOFP16-NEXT: ucvtf v19.4s, v3.4s 7841; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v4.4s 7842; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v5.4s 7843; CHECK-SD-NOFP16-NEXT: fcvtn v2.4h, v6.4s 7844; CHECK-SD-NOFP16-NEXT: fcvtn v3.4h, v7.4s 7845; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v16.4s 7846; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v17.4s 7847; CHECK-SD-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 7848; CHECK-SD-NOFP16-NEXT: fcvtn2 v3.8h, v19.4s 7849; CHECK-SD-NOFP16-NEXT: ret 7850; 7851; CHECK-SD-FP16-LABEL: utofp_v32i16_v32f16: 7852; CHECK-SD-FP16: // %bb.0: // %entry 7853; CHECK-SD-FP16-NEXT: ucvtf v0.8h, v0.8h 7854; CHECK-SD-FP16-NEXT: ucvtf v1.8h, v1.8h 7855; CHECK-SD-FP16-NEXT: ucvtf v2.8h, v2.8h 7856; CHECK-SD-FP16-NEXT: ucvtf v3.8h, v3.8h 7857; CHECK-SD-FP16-NEXT: ret 7858; 7859; CHECK-GI-NOFP16-LABEL: utofp_v32i16_v32f16: 7860; CHECK-GI-NOFP16: // %bb.0: // %entry 7861; CHECK-GI-NOFP16-NEXT: ushll v4.4s, v0.4h, #0 7862; CHECK-GI-NOFP16-NEXT: ushll v5.4s, v1.4h, #0 7863; CHECK-GI-NOFP16-NEXT: ushll v6.4s, v2.4h, #0 7864; CHECK-GI-NOFP16-NEXT: ushll v7.4s, v3.4h, #0 7865; CHECK-GI-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 7866; CHECK-GI-NOFP16-NEXT: ushll2 v1.4s, v1.8h, #0 7867; CHECK-GI-NOFP16-NEXT: ushll2 v2.4s, v2.8h, #0 7868; CHECK-GI-NOFP16-NEXT: ushll2 v3.4s, v3.8h, #0 7869; CHECK-GI-NOFP16-NEXT: ucvtf v4.4s, v4.4s 7870; CHECK-GI-NOFP16-NEXT: ucvtf v5.4s, v5.4s 7871; CHECK-GI-NOFP16-NEXT: ucvtf v6.4s, v6.4s 7872; CHECK-GI-NOFP16-NEXT: ucvtf v7.4s, v7.4s 7873; CHECK-GI-NOFP16-NEXT: ucvtf v16.4s, v0.4s 7874; CHECK-GI-NOFP16-NEXT: ucvtf v17.4s, v1.4s 7875; CHECK-GI-NOFP16-NEXT: ucvtf v18.4s, v2.4s 7876; CHECK-GI-NOFP16-NEXT: ucvtf v19.4s, v3.4s 7877; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v4.4s 7878; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v5.4s 7879; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v6.4s 7880; CHECK-GI-NOFP16-NEXT: fcvtn v3.4h, v7.4s 7881; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v16.4s 7882; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v17.4s 7883; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 7884; CHECK-GI-NOFP16-NEXT: fcvtn2 v3.8h, v19.4s 7885; CHECK-GI-NOFP16-NEXT: ret 7886; 7887; CHECK-GI-FP16-LABEL: utofp_v32i16_v32f16: 7888; CHECK-GI-FP16: // %bb.0: // %entry 7889; CHECK-GI-FP16-NEXT: ucvtf v0.8h, v0.8h 7890; CHECK-GI-FP16-NEXT: ucvtf v1.8h, v1.8h 7891; CHECK-GI-FP16-NEXT: ucvtf v2.8h, v2.8h 7892; CHECK-GI-FP16-NEXT: ucvtf v3.8h, v3.8h 7893; CHECK-GI-FP16-NEXT: ret 7894entry: 7895 %c = uitofp <32 x i16> %a to <32 x half> 7896 ret <32 x half> %c 7897} 7898 7899define <2 x half> @stofp_v2i8_v2f16(<2 x i8> %a) { 7900; CHECK-SD-NOFP16-LABEL: stofp_v2i8_v2f16: 7901; CHECK-SD-NOFP16: // %bb.0: // %entry 7902; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 def $q0 7903; CHECK-SD-NOFP16-NEXT: mov w8, v0.s[1] 7904; CHECK-SD-NOFP16-NEXT: fmov w9, s0 7905; CHECK-SD-NOFP16-NEXT: sxtb w9, w9 7906; CHECK-SD-NOFP16-NEXT: sxtb w8, w8 7907; CHECK-SD-NOFP16-NEXT: scvtf s1, w9 7908; CHECK-SD-NOFP16-NEXT: scvtf s0, w8 7909; CHECK-SD-NOFP16-NEXT: fcvt h2, s0 7910; CHECK-SD-NOFP16-NEXT: fcvt h0, s1 7911; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v2.h[0] 7912; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 7913; CHECK-SD-NOFP16-NEXT: ret 7914; 7915; CHECK-SD-FP16-LABEL: stofp_v2i8_v2f16: 7916; CHECK-SD-FP16: // %bb.0: // %entry 7917; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 def $q0 7918; CHECK-SD-FP16-NEXT: mov w8, v0.s[1] 7919; CHECK-SD-FP16-NEXT: fmov w9, s0 7920; CHECK-SD-FP16-NEXT: sxtb w9, w9 7921; CHECK-SD-FP16-NEXT: sxtb w8, w8 7922; CHECK-SD-FP16-NEXT: scvtf h0, w9 7923; CHECK-SD-FP16-NEXT: scvtf h1, w8 7924; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 7925; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 7926; CHECK-SD-FP16-NEXT: ret 7927; 7928; CHECK-GI-NOFP16-LABEL: stofp_v2i8_v2f16: 7929; CHECK-GI-NOFP16: // %bb.0: // %entry 7930; CHECK-GI-NOFP16-NEXT: shl v0.2s, v0.2s, #24 7931; CHECK-GI-NOFP16-NEXT: sshr v0.2s, v0.2s, #24 7932; CHECK-GI-NOFP16-NEXT: scvtf v0.2s, v0.2s 7933; CHECK-GI-NOFP16-NEXT: mov v1.s[0], v0.s[0] 7934; CHECK-GI-NOFP16-NEXT: mov v1.s[1], v0.s[1] 7935; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7936; CHECK-GI-NOFP16-NEXT: ret 7937; 7938; CHECK-GI-FP16-LABEL: stofp_v2i8_v2f16: 7939; CHECK-GI-FP16: // %bb.0: // %entry 7940; CHECK-GI-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7941; CHECK-GI-FP16-NEXT: shl v0.4h, v0.4h, #8 7942; CHECK-GI-FP16-NEXT: sshr v0.4h, v0.4h, #8 7943; CHECK-GI-FP16-NEXT: scvtf v0.4h, v0.4h 7944; CHECK-GI-FP16-NEXT: ret 7945entry: 7946 %c = sitofp <2 x i8> %a to <2 x half> 7947 ret <2 x half> %c 7948} 7949 7950define <2 x half> @utofp_v2i8_v2f16(<2 x i8> %a) { 7951; CHECK-SD-NOFP16-LABEL: utofp_v2i8_v2f16: 7952; CHECK-SD-NOFP16: // %bb.0: // %entry 7953; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 def $q0 7954; CHECK-SD-NOFP16-NEXT: mov w8, v0.s[1] 7955; CHECK-SD-NOFP16-NEXT: fmov w9, s0 7956; CHECK-SD-NOFP16-NEXT: and w9, w9, #0xff 7957; CHECK-SD-NOFP16-NEXT: and w8, w8, #0xff 7958; CHECK-SD-NOFP16-NEXT: ucvtf s1, w9 7959; CHECK-SD-NOFP16-NEXT: ucvtf s0, w8 7960; CHECK-SD-NOFP16-NEXT: fcvt h2, s0 7961; CHECK-SD-NOFP16-NEXT: fcvt h0, s1 7962; CHECK-SD-NOFP16-NEXT: mov v0.h[1], v2.h[0] 7963; CHECK-SD-NOFP16-NEXT: // kill: def $d0 killed $d0 killed $q0 7964; CHECK-SD-NOFP16-NEXT: ret 7965; 7966; CHECK-SD-FP16-LABEL: utofp_v2i8_v2f16: 7967; CHECK-SD-FP16: // %bb.0: // %entry 7968; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 def $q0 7969; CHECK-SD-FP16-NEXT: mov w8, v0.s[1] 7970; CHECK-SD-FP16-NEXT: fmov w9, s0 7971; CHECK-SD-FP16-NEXT: and w9, w9, #0xff 7972; CHECK-SD-FP16-NEXT: and w8, w8, #0xff 7973; CHECK-SD-FP16-NEXT: ucvtf h0, w9 7974; CHECK-SD-FP16-NEXT: ucvtf h1, w8 7975; CHECK-SD-FP16-NEXT: mov v0.h[1], v1.h[0] 7976; CHECK-SD-FP16-NEXT: // kill: def $d0 killed $d0 killed $q0 7977; CHECK-SD-FP16-NEXT: ret 7978; 7979; CHECK-GI-NOFP16-LABEL: utofp_v2i8_v2f16: 7980; CHECK-GI-NOFP16: // %bb.0: // %entry 7981; CHECK-GI-NOFP16-NEXT: movi d1, #0x0000ff000000ff 7982; CHECK-GI-NOFP16-NEXT: and v0.8b, v0.8b, v1.8b 7983; CHECK-GI-NOFP16-NEXT: ucvtf v0.2s, v0.2s 7984; CHECK-GI-NOFP16-NEXT: mov v1.s[0], v0.s[0] 7985; CHECK-GI-NOFP16-NEXT: mov v1.s[1], v0.s[1] 7986; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 7987; CHECK-GI-NOFP16-NEXT: ret 7988; 7989; CHECK-GI-FP16-LABEL: utofp_v2i8_v2f16: 7990; CHECK-GI-FP16: // %bb.0: // %entry 7991; CHECK-GI-FP16-NEXT: movi d1, #0x0000ff000000ff 7992; CHECK-GI-FP16-NEXT: and v0.8b, v0.8b, v1.8b 7993; CHECK-GI-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h 7994; CHECK-GI-FP16-NEXT: ucvtf v0.4h, v0.4h 7995; CHECK-GI-FP16-NEXT: ret 7996entry: 7997 %c = uitofp <2 x i8> %a to <2 x half> 7998 ret <2 x half> %c 7999} 8000 8001define <3 x half> @stofp_v3i8_v3f16(<3 x i8> %a) { 8002; CHECK-SD-NOFP16-LABEL: stofp_v3i8_v3f16: 8003; CHECK-SD-NOFP16: // %bb.0: // %entry 8004; CHECK-SD-NOFP16-NEXT: fmov s0, w0 8005; CHECK-SD-NOFP16-NEXT: mov v0.h[1], w1 8006; CHECK-SD-NOFP16-NEXT: mov v0.h[2], w2 8007; CHECK-SD-NOFP16-NEXT: shl v0.4h, v0.4h, #8 8008; CHECK-SD-NOFP16-NEXT: sshr v0.4h, v0.4h, #8 8009; CHECK-SD-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 8010; CHECK-SD-NOFP16-NEXT: scvtf v0.4s, v0.4s 8011; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8012; CHECK-SD-NOFP16-NEXT: ret 8013; 8014; CHECK-SD-FP16-LABEL: stofp_v3i8_v3f16: 8015; CHECK-SD-FP16: // %bb.0: // %entry 8016; CHECK-SD-FP16-NEXT: fmov s0, w0 8017; CHECK-SD-FP16-NEXT: mov v0.h[1], w1 8018; CHECK-SD-FP16-NEXT: mov v0.h[2], w2 8019; CHECK-SD-FP16-NEXT: shl v0.4h, v0.4h, #8 8020; CHECK-SD-FP16-NEXT: sshr v0.4h, v0.4h, #8 8021; CHECK-SD-FP16-NEXT: scvtf v0.4h, v0.4h 8022; CHECK-SD-FP16-NEXT: ret 8023; 8024; CHECK-GI-NOFP16-LABEL: stofp_v3i8_v3f16: 8025; CHECK-GI-NOFP16: // %bb.0: // %entry 8026; CHECK-GI-NOFP16-NEXT: fmov s0, w0 8027; CHECK-GI-NOFP16-NEXT: mov v0.h[1], w1 8028; CHECK-GI-NOFP16-NEXT: mov v0.h[2], w2 8029; CHECK-GI-NOFP16-NEXT: shl v0.4h, v0.4h, #8 8030; CHECK-GI-NOFP16-NEXT: sshr v0.4h, v0.4h, #8 8031; CHECK-GI-NOFP16-NEXT: mov v1.h[0], v0.h[2] 8032; CHECK-GI-NOFP16-NEXT: mov v1.h[1], v0.h[3] 8033; CHECK-GI-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 8034; CHECK-GI-NOFP16-NEXT: sshll v1.4s, v1.4h, #0 8035; CHECK-GI-NOFP16-NEXT: mov v0.d[1], v1.d[0] 8036; CHECK-GI-NOFP16-NEXT: scvtf v0.4s, v0.4s 8037; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8038; CHECK-GI-NOFP16-NEXT: ret 8039; 8040; CHECK-GI-FP16-LABEL: stofp_v3i8_v3f16: 8041; CHECK-GI-FP16: // %bb.0: // %entry 8042; CHECK-GI-FP16-NEXT: fmov s0, w0 8043; CHECK-GI-FP16-NEXT: mov v0.b[1], w1 8044; CHECK-GI-FP16-NEXT: mov v0.b[2], w2 8045; CHECK-GI-FP16-NEXT: sshll v0.8h, v0.8b, #0 8046; CHECK-GI-FP16-NEXT: scvtf v0.4h, v0.4h 8047; CHECK-GI-FP16-NEXT: ret 8048entry: 8049 %c = sitofp <3 x i8> %a to <3 x half> 8050 ret <3 x half> %c 8051} 8052 8053define <3 x half> @utofp_v3i8_v3f16(<3 x i8> %a) { 8054; CHECK-SD-NOFP16-LABEL: utofp_v3i8_v3f16: 8055; CHECK-SD-NOFP16: // %bb.0: // %entry 8056; CHECK-SD-NOFP16-NEXT: fmov s0, w0 8057; CHECK-SD-NOFP16-NEXT: mov v0.h[1], w1 8058; CHECK-SD-NOFP16-NEXT: mov v0.h[2], w2 8059; CHECK-SD-NOFP16-NEXT: bic v0.4h, #255, lsl #8 8060; CHECK-SD-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 8061; CHECK-SD-NOFP16-NEXT: ucvtf v0.4s, v0.4s 8062; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8063; CHECK-SD-NOFP16-NEXT: ret 8064; 8065; CHECK-SD-FP16-LABEL: utofp_v3i8_v3f16: 8066; CHECK-SD-FP16: // %bb.0: // %entry 8067; CHECK-SD-FP16-NEXT: fmov s0, w0 8068; CHECK-SD-FP16-NEXT: mov v0.h[1], w1 8069; CHECK-SD-FP16-NEXT: mov v0.h[2], w2 8070; CHECK-SD-FP16-NEXT: bic v0.4h, #255, lsl #8 8071; CHECK-SD-FP16-NEXT: ucvtf v0.4h, v0.4h 8072; CHECK-SD-FP16-NEXT: ret 8073; 8074; CHECK-GI-NOFP16-LABEL: utofp_v3i8_v3f16: 8075; CHECK-GI-NOFP16: // %bb.0: // %entry 8076; CHECK-GI-NOFP16-NEXT: fmov s0, w0 8077; CHECK-GI-NOFP16-NEXT: movi d1, #0xff00ff00ff00ff 8078; CHECK-GI-NOFP16-NEXT: mov v0.h[1], w1 8079; CHECK-GI-NOFP16-NEXT: mov v0.h[2], w2 8080; CHECK-GI-NOFP16-NEXT: and v0.8b, v0.8b, v1.8b 8081; CHECK-GI-NOFP16-NEXT: mov v1.h[0], v0.h[2] 8082; CHECK-GI-NOFP16-NEXT: mov v1.h[1], v0.h[3] 8083; CHECK-GI-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 8084; CHECK-GI-NOFP16-NEXT: ushll v1.4s, v1.4h, #0 8085; CHECK-GI-NOFP16-NEXT: mov v0.d[1], v1.d[0] 8086; CHECK-GI-NOFP16-NEXT: ucvtf v0.4s, v0.4s 8087; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8088; CHECK-GI-NOFP16-NEXT: ret 8089; 8090; CHECK-GI-FP16-LABEL: utofp_v3i8_v3f16: 8091; CHECK-GI-FP16: // %bb.0: // %entry 8092; CHECK-GI-FP16-NEXT: fmov s0, w0 8093; CHECK-GI-FP16-NEXT: mov v0.b[1], w1 8094; CHECK-GI-FP16-NEXT: mov v0.b[2], w2 8095; CHECK-GI-FP16-NEXT: ushll v0.8h, v0.8b, #0 8096; CHECK-GI-FP16-NEXT: ucvtf v0.4h, v0.4h 8097; CHECK-GI-FP16-NEXT: ret 8098entry: 8099 %c = uitofp <3 x i8> %a to <3 x half> 8100 ret <3 x half> %c 8101} 8102 8103define <4 x half> @stofp_v4i8_v4f16(<4 x i8> %a) { 8104; CHECK-SD-NOFP16-LABEL: stofp_v4i8_v4f16: 8105; CHECK-SD-NOFP16: // %bb.0: // %entry 8106; CHECK-SD-NOFP16-NEXT: shl v0.4h, v0.4h, #8 8107; CHECK-SD-NOFP16-NEXT: sshr v0.4h, v0.4h, #8 8108; CHECK-SD-NOFP16-NEXT: sshll v0.4s, v0.4h, #0 8109; CHECK-SD-NOFP16-NEXT: scvtf v0.4s, v0.4s 8110; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8111; CHECK-SD-NOFP16-NEXT: ret 8112; 8113; CHECK-SD-FP16-LABEL: stofp_v4i8_v4f16: 8114; CHECK-SD-FP16: // %bb.0: // %entry 8115; CHECK-SD-FP16-NEXT: shl v0.4h, v0.4h, #8 8116; CHECK-SD-FP16-NEXT: sshr v0.4h, v0.4h, #8 8117; CHECK-SD-FP16-NEXT: scvtf v0.4h, v0.4h 8118; CHECK-SD-FP16-NEXT: ret 8119; 8120; CHECK-GI-NOFP16-LABEL: stofp_v4i8_v4f16: 8121; CHECK-GI-NOFP16: // %bb.0: // %entry 8122; CHECK-GI-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 8123; CHECK-GI-NOFP16-NEXT: shl v0.4s, v0.4s, #24 8124; CHECK-GI-NOFP16-NEXT: sshr v0.4s, v0.4s, #24 8125; CHECK-GI-NOFP16-NEXT: scvtf v0.4s, v0.4s 8126; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8127; CHECK-GI-NOFP16-NEXT: ret 8128; 8129; CHECK-GI-FP16-LABEL: stofp_v4i8_v4f16: 8130; CHECK-GI-FP16: // %bb.0: // %entry 8131; CHECK-GI-FP16-NEXT: shl v0.4h, v0.4h, #8 8132; CHECK-GI-FP16-NEXT: sshr v0.4h, v0.4h, #8 8133; CHECK-GI-FP16-NEXT: scvtf v0.4h, v0.4h 8134; CHECK-GI-FP16-NEXT: ret 8135entry: 8136 %c = sitofp <4 x i8> %a to <4 x half> 8137 ret <4 x half> %c 8138} 8139 8140define <4 x half> @utofp_v4i8_v4f16(<4 x i8> %a) { 8141; CHECK-SD-NOFP16-LABEL: utofp_v4i8_v4f16: 8142; CHECK-SD-NOFP16: // %bb.0: // %entry 8143; CHECK-SD-NOFP16-NEXT: bic v0.4h, #255, lsl #8 8144; CHECK-SD-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 8145; CHECK-SD-NOFP16-NEXT: ucvtf v0.4s, v0.4s 8146; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8147; CHECK-SD-NOFP16-NEXT: ret 8148; 8149; CHECK-SD-FP16-LABEL: utofp_v4i8_v4f16: 8150; CHECK-SD-FP16: // %bb.0: // %entry 8151; CHECK-SD-FP16-NEXT: bic v0.4h, #255, lsl #8 8152; CHECK-SD-FP16-NEXT: ucvtf v0.4h, v0.4h 8153; CHECK-SD-FP16-NEXT: ret 8154; 8155; CHECK-GI-NOFP16-LABEL: utofp_v4i8_v4f16: 8156; CHECK-GI-NOFP16: // %bb.0: // %entry 8157; CHECK-GI-NOFP16-NEXT: movi v1.2d, #0x0000ff000000ff 8158; CHECK-GI-NOFP16-NEXT: ushll v0.4s, v0.4h, #0 8159; CHECK-GI-NOFP16-NEXT: and v0.16b, v0.16b, v1.16b 8160; CHECK-GI-NOFP16-NEXT: ucvtf v0.4s, v0.4s 8161; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 8162; CHECK-GI-NOFP16-NEXT: ret 8163; 8164; CHECK-GI-FP16-LABEL: utofp_v4i8_v4f16: 8165; CHECK-GI-FP16: // %bb.0: // %entry 8166; CHECK-GI-FP16-NEXT: movi d1, #0xff00ff00ff00ff 8167; CHECK-GI-FP16-NEXT: and v0.8b, v0.8b, v1.8b 8168; CHECK-GI-FP16-NEXT: ucvtf v0.4h, v0.4h 8169; CHECK-GI-FP16-NEXT: ret 8170entry: 8171 %c = uitofp <4 x i8> %a to <4 x half> 8172 ret <4 x half> %c 8173} 8174 8175define <8 x half> @stofp_v8i8_v8f16(<8 x i8> %a) { 8176; CHECK-SD-NOFP16-LABEL: stofp_v8i8_v8f16: 8177; CHECK-SD-NOFP16: // %bb.0: // %entry 8178; CHECK-SD-NOFP16-NEXT: sshll v0.8h, v0.8b, #0 8179; CHECK-SD-NOFP16-NEXT: sshll v1.4s, v0.4h, #0 8180; CHECK-SD-NOFP16-NEXT: sshll2 v2.4s, v0.8h, #0 8181; CHECK-SD-NOFP16-NEXT: scvtf v1.4s, v1.4s 8182; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 8183; CHECK-SD-NOFP16-NEXT: scvtf v1.4s, v2.4s 8184; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 8185; CHECK-SD-NOFP16-NEXT: ret 8186; 8187; CHECK-SD-FP16-LABEL: stofp_v8i8_v8f16: 8188; CHECK-SD-FP16: // %bb.0: // %entry 8189; CHECK-SD-FP16-NEXT: sshll v0.8h, v0.8b, #0 8190; CHECK-SD-FP16-NEXT: scvtf v0.8h, v0.8h 8191; CHECK-SD-FP16-NEXT: ret 8192; 8193; CHECK-GI-NOFP16-LABEL: stofp_v8i8_v8f16: 8194; CHECK-GI-NOFP16: // %bb.0: // %entry 8195; CHECK-GI-NOFP16-NEXT: sshll v0.8h, v0.8b, #0 8196; CHECK-GI-NOFP16-NEXT: sshll v1.4s, v0.4h, #0 8197; CHECK-GI-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 8198; CHECK-GI-NOFP16-NEXT: scvtf v1.4s, v1.4s 8199; CHECK-GI-NOFP16-NEXT: scvtf v2.4s, v0.4s 8200; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 8201; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 8202; CHECK-GI-NOFP16-NEXT: ret 8203; 8204; CHECK-GI-FP16-LABEL: stofp_v8i8_v8f16: 8205; CHECK-GI-FP16: // %bb.0: // %entry 8206; CHECK-GI-FP16-NEXT: sshll v0.8h, v0.8b, #0 8207; CHECK-GI-FP16-NEXT: scvtf v0.8h, v0.8h 8208; CHECK-GI-FP16-NEXT: ret 8209entry: 8210 %c = sitofp <8 x i8> %a to <8 x half> 8211 ret <8 x half> %c 8212} 8213 8214define <8 x half> @utofp_v8i8_v8f16(<8 x i8> %a) { 8215; CHECK-SD-NOFP16-LABEL: utofp_v8i8_v8f16: 8216; CHECK-SD-NOFP16: // %bb.0: // %entry 8217; CHECK-SD-NOFP16-NEXT: ushll v0.8h, v0.8b, #0 8218; CHECK-SD-NOFP16-NEXT: ushll v1.4s, v0.4h, #0 8219; CHECK-SD-NOFP16-NEXT: ushll2 v2.4s, v0.8h, #0 8220; CHECK-SD-NOFP16-NEXT: ucvtf v1.4s, v1.4s 8221; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 8222; CHECK-SD-NOFP16-NEXT: ucvtf v1.4s, v2.4s 8223; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 8224; CHECK-SD-NOFP16-NEXT: ret 8225; 8226; CHECK-SD-FP16-LABEL: utofp_v8i8_v8f16: 8227; CHECK-SD-FP16: // %bb.0: // %entry 8228; CHECK-SD-FP16-NEXT: ushll v0.8h, v0.8b, #0 8229; CHECK-SD-FP16-NEXT: ucvtf v0.8h, v0.8h 8230; CHECK-SD-FP16-NEXT: ret 8231; 8232; CHECK-GI-NOFP16-LABEL: utofp_v8i8_v8f16: 8233; CHECK-GI-NOFP16: // %bb.0: // %entry 8234; CHECK-GI-NOFP16-NEXT: ushll v0.8h, v0.8b, #0 8235; CHECK-GI-NOFP16-NEXT: ushll v1.4s, v0.4h, #0 8236; CHECK-GI-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 8237; CHECK-GI-NOFP16-NEXT: ucvtf v1.4s, v1.4s 8238; CHECK-GI-NOFP16-NEXT: ucvtf v2.4s, v0.4s 8239; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 8240; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 8241; CHECK-GI-NOFP16-NEXT: ret 8242; 8243; CHECK-GI-FP16-LABEL: utofp_v8i8_v8f16: 8244; CHECK-GI-FP16: // %bb.0: // %entry 8245; CHECK-GI-FP16-NEXT: ushll v0.8h, v0.8b, #0 8246; CHECK-GI-FP16-NEXT: ucvtf v0.8h, v0.8h 8247; CHECK-GI-FP16-NEXT: ret 8248entry: 8249 %c = uitofp <8 x i8> %a to <8 x half> 8250 ret <8 x half> %c 8251} 8252 8253define <16 x half> @stofp_v16i8_v16f16(<16 x i8> %a) { 8254; CHECK-SD-NOFP16-LABEL: stofp_v16i8_v16f16: 8255; CHECK-SD-NOFP16: // %bb.0: // %entry 8256; CHECK-SD-NOFP16-NEXT: sshll2 v1.8h, v0.16b, #0 8257; CHECK-SD-NOFP16-NEXT: sshll v0.8h, v0.8b, #0 8258; CHECK-SD-NOFP16-NEXT: sshll v2.4s, v1.4h, #0 8259; CHECK-SD-NOFP16-NEXT: sshll v3.4s, v0.4h, #0 8260; CHECK-SD-NOFP16-NEXT: sshll2 v4.4s, v1.8h, #0 8261; CHECK-SD-NOFP16-NEXT: sshll2 v5.4s, v0.8h, #0 8262; CHECK-SD-NOFP16-NEXT: scvtf v2.4s, v2.4s 8263; CHECK-SD-NOFP16-NEXT: scvtf v3.4s, v3.4s 8264; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v2.4s 8265; CHECK-SD-NOFP16-NEXT: scvtf v2.4s, v4.4s 8266; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v3.4s 8267; CHECK-SD-NOFP16-NEXT: scvtf v3.4s, v5.4s 8268; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v2.4s 8269; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v3.4s 8270; CHECK-SD-NOFP16-NEXT: ret 8271; 8272; CHECK-SD-FP16-LABEL: stofp_v16i8_v16f16: 8273; CHECK-SD-FP16: // %bb.0: // %entry 8274; CHECK-SD-FP16-NEXT: sshll2 v1.8h, v0.16b, #0 8275; CHECK-SD-FP16-NEXT: sshll v0.8h, v0.8b, #0 8276; CHECK-SD-FP16-NEXT: scvtf v1.8h, v1.8h 8277; CHECK-SD-FP16-NEXT: scvtf v0.8h, v0.8h 8278; CHECK-SD-FP16-NEXT: ret 8279; 8280; CHECK-GI-NOFP16-LABEL: stofp_v16i8_v16f16: 8281; CHECK-GI-NOFP16: // %bb.0: // %entry 8282; CHECK-GI-NOFP16-NEXT: sshll v1.8h, v0.8b, #0 8283; CHECK-GI-NOFP16-NEXT: sshll2 v0.8h, v0.16b, #0 8284; CHECK-GI-NOFP16-NEXT: sshll v2.4s, v1.4h, #0 8285; CHECK-GI-NOFP16-NEXT: sshll v3.4s, v0.4h, #0 8286; CHECK-GI-NOFP16-NEXT: sshll2 v1.4s, v1.8h, #0 8287; CHECK-GI-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 8288; CHECK-GI-NOFP16-NEXT: scvtf v2.4s, v2.4s 8289; CHECK-GI-NOFP16-NEXT: scvtf v3.4s, v3.4s 8290; CHECK-GI-NOFP16-NEXT: scvtf v4.4s, v1.4s 8291; CHECK-GI-NOFP16-NEXT: scvtf v5.4s, v0.4s 8292; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 8293; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 8294; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 8295; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 8296; CHECK-GI-NOFP16-NEXT: ret 8297; 8298; CHECK-GI-FP16-LABEL: stofp_v16i8_v16f16: 8299; CHECK-GI-FP16: // %bb.0: // %entry 8300; CHECK-GI-FP16-NEXT: sshll v1.8h, v0.8b, #0 8301; CHECK-GI-FP16-NEXT: sshll2 v2.8h, v0.16b, #0 8302; CHECK-GI-FP16-NEXT: scvtf v0.8h, v1.8h 8303; CHECK-GI-FP16-NEXT: scvtf v1.8h, v2.8h 8304; CHECK-GI-FP16-NEXT: ret 8305entry: 8306 %c = sitofp <16 x i8> %a to <16 x half> 8307 ret <16 x half> %c 8308} 8309 8310define <16 x half> @utofp_v16i8_v16f16(<16 x i8> %a) { 8311; CHECK-SD-NOFP16-LABEL: utofp_v16i8_v16f16: 8312; CHECK-SD-NOFP16: // %bb.0: // %entry 8313; CHECK-SD-NOFP16-NEXT: ushll2 v1.8h, v0.16b, #0 8314; CHECK-SD-NOFP16-NEXT: ushll v0.8h, v0.8b, #0 8315; CHECK-SD-NOFP16-NEXT: ushll v2.4s, v1.4h, #0 8316; CHECK-SD-NOFP16-NEXT: ushll v3.4s, v0.4h, #0 8317; CHECK-SD-NOFP16-NEXT: ushll2 v4.4s, v1.8h, #0 8318; CHECK-SD-NOFP16-NEXT: ushll2 v5.4s, v0.8h, #0 8319; CHECK-SD-NOFP16-NEXT: ucvtf v2.4s, v2.4s 8320; CHECK-SD-NOFP16-NEXT: ucvtf v3.4s, v3.4s 8321; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v2.4s 8322; CHECK-SD-NOFP16-NEXT: ucvtf v2.4s, v4.4s 8323; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v3.4s 8324; CHECK-SD-NOFP16-NEXT: ucvtf v3.4s, v5.4s 8325; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v2.4s 8326; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v3.4s 8327; CHECK-SD-NOFP16-NEXT: ret 8328; 8329; CHECK-SD-FP16-LABEL: utofp_v16i8_v16f16: 8330; CHECK-SD-FP16: // %bb.0: // %entry 8331; CHECK-SD-FP16-NEXT: ushll2 v1.8h, v0.16b, #0 8332; CHECK-SD-FP16-NEXT: ushll v0.8h, v0.8b, #0 8333; CHECK-SD-FP16-NEXT: ucvtf v1.8h, v1.8h 8334; CHECK-SD-FP16-NEXT: ucvtf v0.8h, v0.8h 8335; CHECK-SD-FP16-NEXT: ret 8336; 8337; CHECK-GI-NOFP16-LABEL: utofp_v16i8_v16f16: 8338; CHECK-GI-NOFP16: // %bb.0: // %entry 8339; CHECK-GI-NOFP16-NEXT: ushll v1.8h, v0.8b, #0 8340; CHECK-GI-NOFP16-NEXT: ushll2 v0.8h, v0.16b, #0 8341; CHECK-GI-NOFP16-NEXT: ushll v2.4s, v1.4h, #0 8342; CHECK-GI-NOFP16-NEXT: ushll v3.4s, v0.4h, #0 8343; CHECK-GI-NOFP16-NEXT: ushll2 v1.4s, v1.8h, #0 8344; CHECK-GI-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 8345; CHECK-GI-NOFP16-NEXT: ucvtf v2.4s, v2.4s 8346; CHECK-GI-NOFP16-NEXT: ucvtf v3.4s, v3.4s 8347; CHECK-GI-NOFP16-NEXT: ucvtf v4.4s, v1.4s 8348; CHECK-GI-NOFP16-NEXT: ucvtf v5.4s, v0.4s 8349; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 8350; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 8351; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 8352; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 8353; CHECK-GI-NOFP16-NEXT: ret 8354; 8355; CHECK-GI-FP16-LABEL: utofp_v16i8_v16f16: 8356; CHECK-GI-FP16: // %bb.0: // %entry 8357; CHECK-GI-FP16-NEXT: ushll v1.8h, v0.8b, #0 8358; CHECK-GI-FP16-NEXT: ushll2 v2.8h, v0.16b, #0 8359; CHECK-GI-FP16-NEXT: ucvtf v0.8h, v1.8h 8360; CHECK-GI-FP16-NEXT: ucvtf v1.8h, v2.8h 8361; CHECK-GI-FP16-NEXT: ret 8362entry: 8363 %c = uitofp <16 x i8> %a to <16 x half> 8364 ret <16 x half> %c 8365} 8366 8367define <32 x half> @stofp_v32i8_v32f16(<32 x i8> %a) { 8368; CHECK-SD-NOFP16-LABEL: stofp_v32i8_v32f16: 8369; CHECK-SD-NOFP16: // %bb.0: // %entry 8370; CHECK-SD-NOFP16-NEXT: sshll v2.8h, v0.8b, #0 8371; CHECK-SD-NOFP16-NEXT: sshll2 v0.8h, v0.16b, #0 8372; CHECK-SD-NOFP16-NEXT: sshll2 v3.8h, v1.16b, #0 8373; CHECK-SD-NOFP16-NEXT: sshll v1.8h, v1.8b, #0 8374; CHECK-SD-NOFP16-NEXT: sshll v4.4s, v2.4h, #0 8375; CHECK-SD-NOFP16-NEXT: sshll v5.4s, v0.4h, #0 8376; CHECK-SD-NOFP16-NEXT: sshll v6.4s, v3.4h, #0 8377; CHECK-SD-NOFP16-NEXT: sshll v7.4s, v1.4h, #0 8378; CHECK-SD-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 8379; CHECK-SD-NOFP16-NEXT: sshll2 v3.4s, v3.8h, #0 8380; CHECK-SD-NOFP16-NEXT: sshll2 v2.4s, v2.8h, #0 8381; CHECK-SD-NOFP16-NEXT: sshll2 v1.4s, v1.8h, #0 8382; CHECK-SD-NOFP16-NEXT: scvtf v4.4s, v4.4s 8383; CHECK-SD-NOFP16-NEXT: scvtf v5.4s, v5.4s 8384; CHECK-SD-NOFP16-NEXT: scvtf v6.4s, v6.4s 8385; CHECK-SD-NOFP16-NEXT: scvtf v7.4s, v7.4s 8386; CHECK-SD-NOFP16-NEXT: scvtf v16.4s, v0.4s 8387; CHECK-SD-NOFP16-NEXT: scvtf v17.4s, v3.4s 8388; CHECK-SD-NOFP16-NEXT: scvtf v18.4s, v2.4s 8389; CHECK-SD-NOFP16-NEXT: scvtf v19.4s, v1.4s 8390; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v4.4s 8391; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v5.4s 8392; CHECK-SD-NOFP16-NEXT: fcvtn v3.4h, v6.4s 8393; CHECK-SD-NOFP16-NEXT: fcvtn v2.4h, v7.4s 8394; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v18.4s 8395; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v16.4s 8396; CHECK-SD-NOFP16-NEXT: fcvtn2 v3.8h, v17.4s 8397; CHECK-SD-NOFP16-NEXT: fcvtn2 v2.8h, v19.4s 8398; CHECK-SD-NOFP16-NEXT: ret 8399; 8400; CHECK-SD-FP16-LABEL: stofp_v32i8_v32f16: 8401; CHECK-SD-FP16: // %bb.0: // %entry 8402; CHECK-SD-FP16-NEXT: sshll v2.8h, v0.8b, #0 8403; CHECK-SD-FP16-NEXT: sshll2 v3.8h, v0.16b, #0 8404; CHECK-SD-FP16-NEXT: sshll2 v4.8h, v1.16b, #0 8405; CHECK-SD-FP16-NEXT: sshll v5.8h, v1.8b, #0 8406; CHECK-SD-FP16-NEXT: scvtf v0.8h, v2.8h 8407; CHECK-SD-FP16-NEXT: scvtf v1.8h, v3.8h 8408; CHECK-SD-FP16-NEXT: scvtf v3.8h, v4.8h 8409; CHECK-SD-FP16-NEXT: scvtf v2.8h, v5.8h 8410; CHECK-SD-FP16-NEXT: ret 8411; 8412; CHECK-GI-NOFP16-LABEL: stofp_v32i8_v32f16: 8413; CHECK-GI-NOFP16: // %bb.0: // %entry 8414; CHECK-GI-NOFP16-NEXT: sshll v2.8h, v0.8b, #0 8415; CHECK-GI-NOFP16-NEXT: sshll2 v0.8h, v0.16b, #0 8416; CHECK-GI-NOFP16-NEXT: sshll v3.8h, v1.8b, #0 8417; CHECK-GI-NOFP16-NEXT: sshll2 v1.8h, v1.16b, #0 8418; CHECK-GI-NOFP16-NEXT: sshll v4.4s, v2.4h, #0 8419; CHECK-GI-NOFP16-NEXT: sshll v5.4s, v0.4h, #0 8420; CHECK-GI-NOFP16-NEXT: sshll v6.4s, v3.4h, #0 8421; CHECK-GI-NOFP16-NEXT: sshll v7.4s, v1.4h, #0 8422; CHECK-GI-NOFP16-NEXT: sshll2 v2.4s, v2.8h, #0 8423; CHECK-GI-NOFP16-NEXT: sshll2 v0.4s, v0.8h, #0 8424; CHECK-GI-NOFP16-NEXT: sshll2 v3.4s, v3.8h, #0 8425; CHECK-GI-NOFP16-NEXT: sshll2 v1.4s, v1.8h, #0 8426; CHECK-GI-NOFP16-NEXT: scvtf v4.4s, v4.4s 8427; CHECK-GI-NOFP16-NEXT: scvtf v5.4s, v5.4s 8428; CHECK-GI-NOFP16-NEXT: scvtf v6.4s, v6.4s 8429; CHECK-GI-NOFP16-NEXT: scvtf v7.4s, v7.4s 8430; CHECK-GI-NOFP16-NEXT: scvtf v16.4s, v2.4s 8431; CHECK-GI-NOFP16-NEXT: scvtf v17.4s, v0.4s 8432; CHECK-GI-NOFP16-NEXT: scvtf v18.4s, v3.4s 8433; CHECK-GI-NOFP16-NEXT: scvtf v19.4s, v1.4s 8434; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v4.4s 8435; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v5.4s 8436; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v6.4s 8437; CHECK-GI-NOFP16-NEXT: fcvtn v3.4h, v7.4s 8438; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v16.4s 8439; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v17.4s 8440; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 8441; CHECK-GI-NOFP16-NEXT: fcvtn2 v3.8h, v19.4s 8442; CHECK-GI-NOFP16-NEXT: ret 8443; 8444; CHECK-GI-FP16-LABEL: stofp_v32i8_v32f16: 8445; CHECK-GI-FP16: // %bb.0: // %entry 8446; CHECK-GI-FP16-NEXT: sshll v2.8h, v0.8b, #0 8447; CHECK-GI-FP16-NEXT: sshll2 v3.8h, v0.16b, #0 8448; CHECK-GI-FP16-NEXT: sshll v4.8h, v1.8b, #0 8449; CHECK-GI-FP16-NEXT: sshll2 v5.8h, v1.16b, #0 8450; CHECK-GI-FP16-NEXT: scvtf v0.8h, v2.8h 8451; CHECK-GI-FP16-NEXT: scvtf v1.8h, v3.8h 8452; CHECK-GI-FP16-NEXT: scvtf v2.8h, v4.8h 8453; CHECK-GI-FP16-NEXT: scvtf v3.8h, v5.8h 8454; CHECK-GI-FP16-NEXT: ret 8455entry: 8456 %c = sitofp <32 x i8> %a to <32 x half> 8457 ret <32 x half> %c 8458} 8459 8460define <32 x half> @utofp_v32i8_v32f16(<32 x i8> %a) { 8461; CHECK-SD-NOFP16-LABEL: utofp_v32i8_v32f16: 8462; CHECK-SD-NOFP16: // %bb.0: // %entry 8463; CHECK-SD-NOFP16-NEXT: ushll v2.8h, v0.8b, #0 8464; CHECK-SD-NOFP16-NEXT: ushll2 v0.8h, v0.16b, #0 8465; CHECK-SD-NOFP16-NEXT: ushll2 v3.8h, v1.16b, #0 8466; CHECK-SD-NOFP16-NEXT: ushll v1.8h, v1.8b, #0 8467; CHECK-SD-NOFP16-NEXT: ushll v4.4s, v2.4h, #0 8468; CHECK-SD-NOFP16-NEXT: ushll v5.4s, v0.4h, #0 8469; CHECK-SD-NOFP16-NEXT: ushll v6.4s, v3.4h, #0 8470; CHECK-SD-NOFP16-NEXT: ushll v7.4s, v1.4h, #0 8471; CHECK-SD-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 8472; CHECK-SD-NOFP16-NEXT: ushll2 v3.4s, v3.8h, #0 8473; CHECK-SD-NOFP16-NEXT: ushll2 v2.4s, v2.8h, #0 8474; CHECK-SD-NOFP16-NEXT: ushll2 v1.4s, v1.8h, #0 8475; CHECK-SD-NOFP16-NEXT: ucvtf v4.4s, v4.4s 8476; CHECK-SD-NOFP16-NEXT: ucvtf v5.4s, v5.4s 8477; CHECK-SD-NOFP16-NEXT: ucvtf v6.4s, v6.4s 8478; CHECK-SD-NOFP16-NEXT: ucvtf v7.4s, v7.4s 8479; CHECK-SD-NOFP16-NEXT: ucvtf v16.4s, v0.4s 8480; CHECK-SD-NOFP16-NEXT: ucvtf v17.4s, v3.4s 8481; CHECK-SD-NOFP16-NEXT: ucvtf v18.4s, v2.4s 8482; CHECK-SD-NOFP16-NEXT: ucvtf v19.4s, v1.4s 8483; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v4.4s 8484; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v5.4s 8485; CHECK-SD-NOFP16-NEXT: fcvtn v3.4h, v6.4s 8486; CHECK-SD-NOFP16-NEXT: fcvtn v2.4h, v7.4s 8487; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v18.4s 8488; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v16.4s 8489; CHECK-SD-NOFP16-NEXT: fcvtn2 v3.8h, v17.4s 8490; CHECK-SD-NOFP16-NEXT: fcvtn2 v2.8h, v19.4s 8491; CHECK-SD-NOFP16-NEXT: ret 8492; 8493; CHECK-SD-FP16-LABEL: utofp_v32i8_v32f16: 8494; CHECK-SD-FP16: // %bb.0: // %entry 8495; CHECK-SD-FP16-NEXT: ushll v2.8h, v0.8b, #0 8496; CHECK-SD-FP16-NEXT: ushll2 v3.8h, v0.16b, #0 8497; CHECK-SD-FP16-NEXT: ushll2 v4.8h, v1.16b, #0 8498; CHECK-SD-FP16-NEXT: ushll v5.8h, v1.8b, #0 8499; CHECK-SD-FP16-NEXT: ucvtf v0.8h, v2.8h 8500; CHECK-SD-FP16-NEXT: ucvtf v1.8h, v3.8h 8501; CHECK-SD-FP16-NEXT: ucvtf v3.8h, v4.8h 8502; CHECK-SD-FP16-NEXT: ucvtf v2.8h, v5.8h 8503; CHECK-SD-FP16-NEXT: ret 8504; 8505; CHECK-GI-NOFP16-LABEL: utofp_v32i8_v32f16: 8506; CHECK-GI-NOFP16: // %bb.0: // %entry 8507; CHECK-GI-NOFP16-NEXT: ushll v2.8h, v0.8b, #0 8508; CHECK-GI-NOFP16-NEXT: ushll2 v0.8h, v0.16b, #0 8509; CHECK-GI-NOFP16-NEXT: ushll v3.8h, v1.8b, #0 8510; CHECK-GI-NOFP16-NEXT: ushll2 v1.8h, v1.16b, #0 8511; CHECK-GI-NOFP16-NEXT: ushll v4.4s, v2.4h, #0 8512; CHECK-GI-NOFP16-NEXT: ushll v5.4s, v0.4h, #0 8513; CHECK-GI-NOFP16-NEXT: ushll v6.4s, v3.4h, #0 8514; CHECK-GI-NOFP16-NEXT: ushll v7.4s, v1.4h, #0 8515; CHECK-GI-NOFP16-NEXT: ushll2 v2.4s, v2.8h, #0 8516; CHECK-GI-NOFP16-NEXT: ushll2 v0.4s, v0.8h, #0 8517; CHECK-GI-NOFP16-NEXT: ushll2 v3.4s, v3.8h, #0 8518; CHECK-GI-NOFP16-NEXT: ushll2 v1.4s, v1.8h, #0 8519; CHECK-GI-NOFP16-NEXT: ucvtf v4.4s, v4.4s 8520; CHECK-GI-NOFP16-NEXT: ucvtf v5.4s, v5.4s 8521; CHECK-GI-NOFP16-NEXT: ucvtf v6.4s, v6.4s 8522; CHECK-GI-NOFP16-NEXT: ucvtf v7.4s, v7.4s 8523; CHECK-GI-NOFP16-NEXT: ucvtf v16.4s, v2.4s 8524; CHECK-GI-NOFP16-NEXT: ucvtf v17.4s, v0.4s 8525; CHECK-GI-NOFP16-NEXT: ucvtf v18.4s, v3.4s 8526; CHECK-GI-NOFP16-NEXT: ucvtf v19.4s, v1.4s 8527; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v4.4s 8528; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v5.4s 8529; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v6.4s 8530; CHECK-GI-NOFP16-NEXT: fcvtn v3.4h, v7.4s 8531; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v16.4s 8532; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v17.4s 8533; CHECK-GI-NOFP16-NEXT: fcvtn2 v2.8h, v18.4s 8534; CHECK-GI-NOFP16-NEXT: fcvtn2 v3.8h, v19.4s 8535; CHECK-GI-NOFP16-NEXT: ret 8536; 8537; CHECK-GI-FP16-LABEL: utofp_v32i8_v32f16: 8538; CHECK-GI-FP16: // %bb.0: // %entry 8539; CHECK-GI-FP16-NEXT: ushll v2.8h, v0.8b, #0 8540; CHECK-GI-FP16-NEXT: ushll2 v3.8h, v0.16b, #0 8541; CHECK-GI-FP16-NEXT: ushll v4.8h, v1.8b, #0 8542; CHECK-GI-FP16-NEXT: ushll2 v5.8h, v1.16b, #0 8543; CHECK-GI-FP16-NEXT: ucvtf v0.8h, v2.8h 8544; CHECK-GI-FP16-NEXT: ucvtf v1.8h, v3.8h 8545; CHECK-GI-FP16-NEXT: ucvtf v2.8h, v4.8h 8546; CHECK-GI-FP16-NEXT: ucvtf v3.8h, v5.8h 8547; CHECK-GI-FP16-NEXT: ret 8548entry: 8549 %c = uitofp <32 x i8> %a to <32 x half> 8550 ret <32 x half> %c 8551} 8552