1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 4 5target triple = "aarch64-unknown-linux-gnu" 6 7; 8; FCVTZU H -> H 9; 10 11define <4 x i16> @fcvtzu_v4f16_v4i16(<4 x half> %op1) { 12; CHECK-LABEL: fcvtzu_v4f16_v4i16: 13; CHECK: // %bb.0: 14; CHECK-NEXT: ptrue p0.h, vl4 15; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 16; CHECK-NEXT: fcvtzu z0.h, p0/m, z0.h 17; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 18; CHECK-NEXT: ret 19; 20; NONEON-NOSVE-LABEL: fcvtzu_v4f16_v4i16: 21; NONEON-NOSVE: // %bb.0: 22; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 23; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 24; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 25; NONEON-NOSVE-NEXT: fcvt s0, h0 26; NONEON-NOSVE-NEXT: fcvtzs w8, s0 27; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 28; NONEON-NOSVE-NEXT: fcvt s0, h0 29; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 30; NONEON-NOSVE-NEXT: fcvtzs w8, s0 31; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 32; NONEON-NOSVE-NEXT: fcvt s0, h0 33; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 34; NONEON-NOSVE-NEXT: fcvtzs w8, s0 35; NONEON-NOSVE-NEXT: ldr h0, [sp] 36; NONEON-NOSVE-NEXT: fcvt s0, h0 37; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 38; NONEON-NOSVE-NEXT: fcvtzs w8, s0 39; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 40; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 41; NONEON-NOSVE-NEXT: add sp, sp, #16 42; NONEON-NOSVE-NEXT: ret 43 %res = fptoui <4 x half> %op1 to <4 x i16> 44 ret <4 x i16> %res 45} 46 47define void @fcvtzu_v8f16_v8i16(ptr %a, ptr %b) { 48; CHECK-LABEL: fcvtzu_v8f16_v8i16: 49; CHECK: // %bb.0: 50; CHECK-NEXT: ptrue p0.h, vl8 51; CHECK-NEXT: ldr q0, [x0] 52; CHECK-NEXT: fcvtzu z0.h, p0/m, z0.h 53; CHECK-NEXT: str q0, [x1] 54; CHECK-NEXT: ret 55; 56; NONEON-NOSVE-LABEL: fcvtzu_v8f16_v8i16: 57; NONEON-NOSVE: // %bb.0: 58; NONEON-NOSVE-NEXT: ldr q0, [x0] 59; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 60; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 61; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 62; NONEON-NOSVE-NEXT: fcvt s0, h0 63; NONEON-NOSVE-NEXT: fcvtzs w8, s0 64; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 65; NONEON-NOSVE-NEXT: fcvt s0, h0 66; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 67; NONEON-NOSVE-NEXT: fcvtzs w8, s0 68; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 69; NONEON-NOSVE-NEXT: fcvt s0, h0 70; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 71; NONEON-NOSVE-NEXT: fcvtzs w8, s0 72; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 73; NONEON-NOSVE-NEXT: fcvt s0, h0 74; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 75; NONEON-NOSVE-NEXT: fcvtzs w8, s0 76; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 77; NONEON-NOSVE-NEXT: fcvt s0, h0 78; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 79; NONEON-NOSVE-NEXT: fcvtzs w8, s0 80; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 81; NONEON-NOSVE-NEXT: fcvt s0, h0 82; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 83; NONEON-NOSVE-NEXT: fcvtzs w8, s0 84; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 85; NONEON-NOSVE-NEXT: fcvt s0, h0 86; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 87; NONEON-NOSVE-NEXT: fcvtzs w8, s0 88; NONEON-NOSVE-NEXT: ldr h0, [sp] 89; NONEON-NOSVE-NEXT: fcvt s0, h0 90; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 91; NONEON-NOSVE-NEXT: fcvtzs w8, s0 92; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 93; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 94; NONEON-NOSVE-NEXT: str q0, [x1] 95; NONEON-NOSVE-NEXT: add sp, sp, #32 96; NONEON-NOSVE-NEXT: ret 97 %op1 = load <8 x half>, ptr %a 98 %res = fptoui <8 x half> %op1 to <8 x i16> 99 store <8 x i16> %res, ptr %b 100 ret void 101} 102 103define void @fcvtzu_v16f16_v16i16(ptr %a, ptr %b) { 104; CHECK-LABEL: fcvtzu_v16f16_v16i16: 105; CHECK: // %bb.0: 106; CHECK-NEXT: ldp q0, q1, [x0] 107; CHECK-NEXT: ptrue p0.h, vl8 108; CHECK-NEXT: fcvtzu z0.h, p0/m, z0.h 109; CHECK-NEXT: fcvtzu z1.h, p0/m, z1.h 110; CHECK-NEXT: stp q0, q1, [x1] 111; CHECK-NEXT: ret 112; 113; NONEON-NOSVE-LABEL: fcvtzu_v16f16_v16i16: 114; NONEON-NOSVE: // %bb.0: 115; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 116; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 117; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 118; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 119; NONEON-NOSVE-NEXT: fcvt s0, h0 120; NONEON-NOSVE-NEXT: fcvtzs w8, s0 121; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 122; NONEON-NOSVE-NEXT: fcvt s0, h0 123; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 124; NONEON-NOSVE-NEXT: fcvtzs w8, s0 125; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 126; NONEON-NOSVE-NEXT: fcvt s0, h0 127; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 128; NONEON-NOSVE-NEXT: fcvtzs w8, s0 129; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 130; NONEON-NOSVE-NEXT: fcvt s0, h0 131; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 132; NONEON-NOSVE-NEXT: fcvtzs w8, s0 133; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 134; NONEON-NOSVE-NEXT: fcvt s0, h0 135; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 136; NONEON-NOSVE-NEXT: fcvtzs w8, s0 137; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 138; NONEON-NOSVE-NEXT: fcvt s0, h0 139; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 140; NONEON-NOSVE-NEXT: fcvtzs w8, s0 141; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 142; NONEON-NOSVE-NEXT: fcvt s0, h0 143; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 144; NONEON-NOSVE-NEXT: fcvtzs w8, s0 145; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 146; NONEON-NOSVE-NEXT: fcvt s0, h0 147; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 148; NONEON-NOSVE-NEXT: fcvtzs w8, s0 149; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 150; NONEON-NOSVE-NEXT: fcvt s0, h0 151; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 152; NONEON-NOSVE-NEXT: fcvtzs w8, s0 153; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 154; NONEON-NOSVE-NEXT: fcvt s0, h0 155; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 156; NONEON-NOSVE-NEXT: fcvtzs w8, s0 157; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 158; NONEON-NOSVE-NEXT: fcvt s0, h0 159; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 160; NONEON-NOSVE-NEXT: fcvtzs w8, s0 161; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 162; NONEON-NOSVE-NEXT: fcvt s0, h0 163; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 164; NONEON-NOSVE-NEXT: fcvtzs w8, s0 165; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 166; NONEON-NOSVE-NEXT: fcvt s0, h0 167; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 168; NONEON-NOSVE-NEXT: fcvtzs w8, s0 169; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 170; NONEON-NOSVE-NEXT: fcvt s0, h0 171; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 172; NONEON-NOSVE-NEXT: fcvtzs w8, s0 173; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 174; NONEON-NOSVE-NEXT: fcvt s0, h0 175; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 176; NONEON-NOSVE-NEXT: fcvtzs w8, s0 177; NONEON-NOSVE-NEXT: ldr h0, [sp] 178; NONEON-NOSVE-NEXT: fcvt s0, h0 179; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 180; NONEON-NOSVE-NEXT: fcvtzs w8, s0 181; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 182; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 183; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 184; NONEON-NOSVE-NEXT: add sp, sp, #64 185; NONEON-NOSVE-NEXT: ret 186 %op1 = load <16 x half>, ptr %a 187 %res = fptoui <16 x half> %op1 to <16 x i16> 188 store <16 x i16> %res, ptr %b 189 ret void 190} 191 192; 193; FCVTZU H -> S 194; 195 196define <2 x i32> @fcvtzu_v2f16_v2i32(<2 x half> %op1) { 197; CHECK-LABEL: fcvtzu_v2f16_v2i32: 198; CHECK: // %bb.0: 199; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 200; CHECK-NEXT: ptrue p0.s, vl4 201; CHECK-NEXT: uunpklo z0.s, z0.h 202; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h 203; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 204; CHECK-NEXT: ret 205; 206; NONEON-NOSVE-LABEL: fcvtzu_v2f16_v2i32: 207; NONEON-NOSVE: // %bb.0: 208; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 209; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 210; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 211; NONEON-NOSVE-NEXT: fcvt s0, h0 212; NONEON-NOSVE-NEXT: fcvtzu w9, s0 213; NONEON-NOSVE-NEXT: ldr h0, [sp] 214; NONEON-NOSVE-NEXT: fcvt s0, h0 215; NONEON-NOSVE-NEXT: fcvtzu w8, s0 216; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 217; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 218; NONEON-NOSVE-NEXT: add sp, sp, #16 219; NONEON-NOSVE-NEXT: ret 220 %res = fptoui <2 x half> %op1 to <2 x i32> 221 ret <2 x i32> %res 222} 223 224define <4 x i32> @fcvtzu_v4f16_v4i32(<4 x half> %op1) { 225; CHECK-LABEL: fcvtzu_v4f16_v4i32: 226; CHECK: // %bb.0: 227; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 228; CHECK-NEXT: ptrue p0.s, vl4 229; CHECK-NEXT: uunpklo z0.s, z0.h 230; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h 231; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 232; CHECK-NEXT: ret 233; 234; NONEON-NOSVE-LABEL: fcvtzu_v4f16_v4i32: 235; NONEON-NOSVE: // %bb.0: 236; NONEON-NOSVE-NEXT: sub sp, sp, #32 237; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 238; NONEON-NOSVE-NEXT: str d0, [sp, #8] 239; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 240; NONEON-NOSVE-NEXT: fcvt s0, h0 241; NONEON-NOSVE-NEXT: fcvtzu w9, s0 242; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 243; NONEON-NOSVE-NEXT: fcvt s0, h0 244; NONEON-NOSVE-NEXT: fcvtzu w8, s0 245; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 246; NONEON-NOSVE-NEXT: fcvt s0, h0 247; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 248; NONEON-NOSVE-NEXT: fcvtzu w9, s0 249; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 250; NONEON-NOSVE-NEXT: fcvt s0, h0 251; NONEON-NOSVE-NEXT: fcvtzu w8, s0 252; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 253; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 254; NONEON-NOSVE-NEXT: add sp, sp, #32 255; NONEON-NOSVE-NEXT: ret 256 %res = fptoui <4 x half> %op1 to <4 x i32> 257 ret <4 x i32> %res 258} 259 260define void @fcvtzu_v8f16_v8i32(ptr %a, ptr %b) { 261; CHECK-LABEL: fcvtzu_v8f16_v8i32: 262; CHECK: // %bb.0: 263; CHECK-NEXT: ldr q0, [x0] 264; CHECK-NEXT: ptrue p0.s, vl4 265; CHECK-NEXT: uunpklo z1.s, z0.h 266; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 267; CHECK-NEXT: uunpklo z0.s, z0.h 268; CHECK-NEXT: fcvtzu z1.s, p0/m, z1.h 269; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h 270; CHECK-NEXT: stp q1, q0, [x1] 271; CHECK-NEXT: ret 272; 273; NONEON-NOSVE-LABEL: fcvtzu_v8f16_v8i32: 274; NONEON-NOSVE: // %bb.0: 275; NONEON-NOSVE-NEXT: ldr q0, [x0] 276; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 277; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 278; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 279; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 280; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 281; NONEON-NOSVE-NEXT: fcvt s0, h0 282; NONEON-NOSVE-NEXT: fcvtzu w9, s0 283; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 284; NONEON-NOSVE-NEXT: fcvt s0, h0 285; NONEON-NOSVE-NEXT: fcvtzu w8, s0 286; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 287; NONEON-NOSVE-NEXT: fcvt s0, h0 288; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 289; NONEON-NOSVE-NEXT: fcvtzu w9, s0 290; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 291; NONEON-NOSVE-NEXT: fcvt s0, h0 292; NONEON-NOSVE-NEXT: fcvtzu w8, s0 293; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 294; NONEON-NOSVE-NEXT: fcvt s0, h0 295; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 296; NONEON-NOSVE-NEXT: fcvtzu w9, s0 297; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 298; NONEON-NOSVE-NEXT: fcvt s0, h0 299; NONEON-NOSVE-NEXT: fcvtzu w8, s0 300; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 301; NONEON-NOSVE-NEXT: fcvt s0, h0 302; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 303; NONEON-NOSVE-NEXT: fcvtzu w9, s0 304; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 305; NONEON-NOSVE-NEXT: fcvt s0, h0 306; NONEON-NOSVE-NEXT: fcvtzu w8, s0 307; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 308; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 309; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 310; NONEON-NOSVE-NEXT: add sp, sp, #64 311; NONEON-NOSVE-NEXT: ret 312 %op1 = load <8 x half>, ptr %a 313 %res = fptoui <8 x half> %op1 to <8 x i32> 314 store <8 x i32> %res, ptr %b 315 ret void 316} 317 318define void @fcvtzu_v16f16_v16i32(ptr %a, ptr %b) { 319; CHECK-LABEL: fcvtzu_v16f16_v16i32: 320; CHECK: // %bb.0: 321; CHECK-NEXT: ldp q1, q0, [x0] 322; CHECK-NEXT: ptrue p0.s, vl4 323; CHECK-NEXT: uunpklo z2.s, z0.h 324; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 325; CHECK-NEXT: uunpklo z3.s, z1.h 326; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 327; CHECK-NEXT: uunpklo z0.s, z0.h 328; CHECK-NEXT: uunpklo z1.s, z1.h 329; CHECK-NEXT: fcvtzu z2.s, p0/m, z2.h 330; CHECK-NEXT: fcvtzu z3.s, p0/m, z3.h 331; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h 332; CHECK-NEXT: fcvtzu z1.s, p0/m, z1.h 333; CHECK-NEXT: stp q2, q0, [x1, #32] 334; CHECK-NEXT: stp q3, q1, [x1] 335; CHECK-NEXT: ret 336; 337; NONEON-NOSVE-LABEL: fcvtzu_v16f16_v16i32: 338; NONEON-NOSVE: // %bb.0: 339; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 340; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 341; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 342; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 343; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 344; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 345; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 346; NONEON-NOSVE-NEXT: ldr h0, [sp, #46] 347; NONEON-NOSVE-NEXT: fcvt s0, h0 348; NONEON-NOSVE-NEXT: fcvtzu w9, s0 349; NONEON-NOSVE-NEXT: ldr h0, [sp, #44] 350; NONEON-NOSVE-NEXT: fcvt s0, h0 351; NONEON-NOSVE-NEXT: fcvtzu w8, s0 352; NONEON-NOSVE-NEXT: ldr h0, [sp, #42] 353; NONEON-NOSVE-NEXT: fcvt s0, h0 354; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 355; NONEON-NOSVE-NEXT: fcvtzu w9, s0 356; NONEON-NOSVE-NEXT: ldr h0, [sp, #40] 357; NONEON-NOSVE-NEXT: fcvt s0, h0 358; NONEON-NOSVE-NEXT: fcvtzu w8, s0 359; NONEON-NOSVE-NEXT: ldr h0, [sp, #38] 360; NONEON-NOSVE-NEXT: fcvt s0, h0 361; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 362; NONEON-NOSVE-NEXT: fcvtzu w9, s0 363; NONEON-NOSVE-NEXT: ldr h0, [sp, #36] 364; NONEON-NOSVE-NEXT: fcvt s0, h0 365; NONEON-NOSVE-NEXT: fcvtzu w8, s0 366; NONEON-NOSVE-NEXT: ldr h0, [sp, #34] 367; NONEON-NOSVE-NEXT: fcvt s0, h0 368; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 369; NONEON-NOSVE-NEXT: fcvtzu w9, s0 370; NONEON-NOSVE-NEXT: ldr h0, [sp, #32] 371; NONEON-NOSVE-NEXT: fcvt s0, h0 372; NONEON-NOSVE-NEXT: fcvtzu w8, s0 373; NONEON-NOSVE-NEXT: ldr h0, [sp, #62] 374; NONEON-NOSVE-NEXT: fcvt s0, h0 375; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 376; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 377; NONEON-NOSVE-NEXT: fcvtzu w9, s0 378; NONEON-NOSVE-NEXT: ldr h0, [sp, #60] 379; NONEON-NOSVE-NEXT: fcvt s0, h0 380; NONEON-NOSVE-NEXT: fcvtzu w8, s0 381; NONEON-NOSVE-NEXT: ldr h0, [sp, #58] 382; NONEON-NOSVE-NEXT: fcvt s0, h0 383; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 384; NONEON-NOSVE-NEXT: fcvtzu w9, s0 385; NONEON-NOSVE-NEXT: ldr h0, [sp, #56] 386; NONEON-NOSVE-NEXT: fcvt s0, h0 387; NONEON-NOSVE-NEXT: fcvtzu w8, s0 388; NONEON-NOSVE-NEXT: ldr h0, [sp, #54] 389; NONEON-NOSVE-NEXT: fcvt s0, h0 390; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 391; NONEON-NOSVE-NEXT: fcvtzu w9, s0 392; NONEON-NOSVE-NEXT: ldr h0, [sp, #52] 393; NONEON-NOSVE-NEXT: fcvt s0, h0 394; NONEON-NOSVE-NEXT: fcvtzu w8, s0 395; NONEON-NOSVE-NEXT: ldr h0, [sp, #50] 396; NONEON-NOSVE-NEXT: fcvt s0, h0 397; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 398; NONEON-NOSVE-NEXT: fcvtzu w9, s0 399; NONEON-NOSVE-NEXT: ldr h0, [sp, #48] 400; NONEON-NOSVE-NEXT: fcvt s0, h0 401; NONEON-NOSVE-NEXT: fcvtzu w8, s0 402; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 403; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 404; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 405; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 406; NONEON-NOSVE-NEXT: add sp, sp, #128 407; NONEON-NOSVE-NEXT: ret 408 %op1 = load <16 x half>, ptr %a 409 %res = fptoui <16 x half> %op1 to <16 x i32> 410 store <16 x i32> %res, ptr %b 411 ret void 412} 413 414; 415; FCVTZU H -> D 416; 417 418define <1 x i64> @fcvtzu_v1f16_v1i64(<1 x half> %op1) { 419; CHECK-LABEL: fcvtzu_v1f16_v1i64: 420; CHECK: // %bb.0: 421; CHECK-NEXT: ptrue p0.d 422; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0 423; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h 424; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 425; CHECK-NEXT: ret 426; 427; NONEON-NOSVE-LABEL: fcvtzu_v1f16_v1i64: 428; NONEON-NOSVE: // %bb.0: 429; NONEON-NOSVE-NEXT: sub sp, sp, #16 430; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 431; NONEON-NOSVE-NEXT: fcvt s0, h0 432; NONEON-NOSVE-NEXT: fcvtzu x8, s0 433; NONEON-NOSVE-NEXT: str x8, [sp, #8] 434; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 435; NONEON-NOSVE-NEXT: add sp, sp, #16 436; NONEON-NOSVE-NEXT: ret 437 %res = fptoui <1 x half> %op1 to <1 x i64> 438 ret <1 x i64> %res 439} 440 441define <2 x i64> @fcvtzu_v2f16_v2i64(<2 x half> %op1) { 442; CHECK-LABEL: fcvtzu_v2f16_v2i64: 443; CHECK: // %bb.0: 444; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 445; CHECK-NEXT: mov z1.h, z0.h[1] 446; CHECK-NEXT: ptrue p0.d 447; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h 448; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.h 449; CHECK-NEXT: zip1 z0.d, z0.d, z1.d 450; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 451; CHECK-NEXT: ret 452; 453; NONEON-NOSVE-LABEL: fcvtzu_v2f16_v2i64: 454; NONEON-NOSVE: // %bb.0: 455; NONEON-NOSVE-NEXT: sub sp, sp, #32 456; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 457; NONEON-NOSVE-NEXT: str d0, [sp, #8] 458; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 459; NONEON-NOSVE-NEXT: fcvt s0, h0 460; NONEON-NOSVE-NEXT: fcvtzu x9, s0 461; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 462; NONEON-NOSVE-NEXT: fcvt s0, h0 463; NONEON-NOSVE-NEXT: fcvtzu x8, s0 464; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 465; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 466; NONEON-NOSVE-NEXT: add sp, sp, #32 467; NONEON-NOSVE-NEXT: ret 468 %res = fptoui <2 x half> %op1 to <2 x i64> 469 ret <2 x i64> %res 470} 471 472define void @fcvtzu_v4f16_v4i64(ptr %a, ptr %b) { 473; CHECK-LABEL: fcvtzu_v4f16_v4i64: 474; CHECK: // %bb.0: 475; CHECK-NEXT: ldr d0, [x0] 476; CHECK-NEXT: ptrue p0.d 477; CHECK-NEXT: mov z1.h, z0.h[3] 478; CHECK-NEXT: mov z2.h, z0.h[2] 479; CHECK-NEXT: mov z3.h, z0.h[1] 480; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h 481; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.h 482; CHECK-NEXT: fcvtzu z2.d, p0/m, z2.h 483; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.h 484; CHECK-NEXT: zip1 z1.d, z2.d, z1.d 485; CHECK-NEXT: zip1 z0.d, z0.d, z3.d 486; CHECK-NEXT: stp q0, q1, [x1] 487; CHECK-NEXT: ret 488; 489; NONEON-NOSVE-LABEL: fcvtzu_v4f16_v4i64: 490; NONEON-NOSVE: // %bb.0: 491; NONEON-NOSVE-NEXT: sub sp, sp, #48 492; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 493; NONEON-NOSVE-NEXT: ldr d0, [x0] 494; NONEON-NOSVE-NEXT: str d0, [sp, #8] 495; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 496; NONEON-NOSVE-NEXT: fcvt s0, h0 497; NONEON-NOSVE-NEXT: fcvtzu x9, s0 498; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 499; NONEON-NOSVE-NEXT: fcvt s0, h0 500; NONEON-NOSVE-NEXT: fcvtzu x8, s0 501; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 502; NONEON-NOSVE-NEXT: fcvt s0, h0 503; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 504; NONEON-NOSVE-NEXT: fcvtzu x9, s0 505; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 506; NONEON-NOSVE-NEXT: fcvt s0, h0 507; NONEON-NOSVE-NEXT: fcvtzu x8, s0 508; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 509; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #16] 510; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 511; NONEON-NOSVE-NEXT: add sp, sp, #48 512; NONEON-NOSVE-NEXT: ret 513 %op1 = load <4 x half>, ptr %a 514 %res = fptoui <4 x half> %op1 to <4 x i64> 515 store <4 x i64> %res, ptr %b 516 ret void 517} 518 519define void @fcvtzu_v8f16_v8i64(ptr %a, ptr %b) { 520; CHECK-LABEL: fcvtzu_v8f16_v8i64: 521; CHECK: // %bb.0: 522; CHECK-NEXT: ldr q0, [x0] 523; CHECK-NEXT: ptrue p0.d 524; CHECK-NEXT: mov z1.d, z0.d 525; CHECK-NEXT: mov z2.h, z0.h[3] 526; CHECK-NEXT: mov z3.h, z0.h[2] 527; CHECK-NEXT: mov z4.h, z0.h[1] 528; CHECK-NEXT: ext z1.b, z1.b, z0.b, #8 529; CHECK-NEXT: fcvtzu z2.d, p0/m, z2.h 530; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.h 531; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h 532; CHECK-NEXT: fcvtzu z4.d, p0/m, z4.h 533; CHECK-NEXT: mov z5.h, z1.h[3] 534; CHECK-NEXT: mov z6.h, z1.h[2] 535; CHECK-NEXT: mov z7.h, z1.h[1] 536; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.h 537; CHECK-NEXT: zip1 z2.d, z3.d, z2.d 538; CHECK-NEXT: zip1 z0.d, z0.d, z4.d 539; CHECK-NEXT: fcvtzu z5.d, p0/m, z5.h 540; CHECK-NEXT: fcvtzu z6.d, p0/m, z6.h 541; CHECK-NEXT: fcvtzu z7.d, p0/m, z7.h 542; CHECK-NEXT: stp q0, q2, [x1] 543; CHECK-NEXT: zip1 z3.d, z6.d, z5.d 544; CHECK-NEXT: zip1 z1.d, z1.d, z7.d 545; CHECK-NEXT: stp q1, q3, [x1, #32] 546; CHECK-NEXT: ret 547; 548; NONEON-NOSVE-LABEL: fcvtzu_v8f16_v8i64: 549; NONEON-NOSVE: // %bb.0: 550; NONEON-NOSVE-NEXT: ldr q0, [x0] 551; NONEON-NOSVE-NEXT: str q0, [sp, #-96]! 552; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 553; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 554; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 555; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 556; NONEON-NOSVE-NEXT: fcvt s0, h0 557; NONEON-NOSVE-NEXT: fcvtzu x9, s0 558; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 559; NONEON-NOSVE-NEXT: fcvt s0, h0 560; NONEON-NOSVE-NEXT: fcvtzu x8, s0 561; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 562; NONEON-NOSVE-NEXT: fcvt s0, h0 563; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 564; NONEON-NOSVE-NEXT: fcvtzu x9, s0 565; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 566; NONEON-NOSVE-NEXT: fcvt s0, h0 567; NONEON-NOSVE-NEXT: fcvtzu x8, s0 568; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 569; NONEON-NOSVE-NEXT: fcvt s0, h0 570; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #80] 571; NONEON-NOSVE-NEXT: ldp q2, q3, [sp, #64] 572; NONEON-NOSVE-NEXT: fcvtzu x9, s0 573; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 574; NONEON-NOSVE-NEXT: fcvt s0, h0 575; NONEON-NOSVE-NEXT: fcvtzu x8, s0 576; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 577; NONEON-NOSVE-NEXT: fcvt s0, h0 578; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 579; NONEON-NOSVE-NEXT: fcvtzu x9, s0 580; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 581; NONEON-NOSVE-NEXT: fcvt s0, h0 582; NONEON-NOSVE-NEXT: fcvtzu x8, s0 583; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 584; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #32] 585; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 586; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 587; NONEON-NOSVE-NEXT: add sp, sp, #96 588; NONEON-NOSVE-NEXT: ret 589 %op1 = load <8 x half>, ptr %a 590 %res = fptoui <8 x half> %op1 to <8 x i64> 591 store <8 x i64> %res, ptr %b 592 ret void 593} 594 595define void @fcvtzu_v16f16_v16i64(ptr %a, ptr %b) { 596; CHECK-LABEL: fcvtzu_v16f16_v16i64: 597; CHECK: // %bb.0: 598; CHECK-NEXT: ldp q1, q0, [x0] 599; CHECK-NEXT: ptrue p0.d 600; CHECK-NEXT: mov z3.h, z1.h[1] 601; CHECK-NEXT: mov z5.h, z0.h[3] 602; CHECK-NEXT: mov z6.h, z0.h[2] 603; CHECK-NEXT: mov z16.d, z0.d 604; CHECK-NEXT: movprfx z2, z1 605; CHECK-NEXT: fcvtzu z2.d, p0/m, z1.h 606; CHECK-NEXT: mov z4.h, z1.h[3] 607; CHECK-NEXT: mov z7.h, z1.h[2] 608; CHECK-NEXT: mov z17.h, z0.h[1] 609; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 610; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.h 611; CHECK-NEXT: fcvtzu z5.d, p0/m, z5.h 612; CHECK-NEXT: fcvtzu z6.d, p0/m, z6.h 613; CHECK-NEXT: ext z16.b, z16.b, z0.b, #8 614; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.h 615; CHECK-NEXT: fcvtzu z4.d, p0/m, z4.h 616; CHECK-NEXT: fcvtzu z17.d, p0/m, z17.h 617; CHECK-NEXT: fcvtzu z7.d, p0/m, z7.h 618; CHECK-NEXT: mov z20.h, z1.h[3] 619; CHECK-NEXT: mov z18.h, z16.h[3] 620; CHECK-NEXT: mov z19.h, z16.h[2] 621; CHECK-NEXT: mov z21.h, z16.h[1] 622; CHECK-NEXT: zip1 z2.d, z2.d, z3.d 623; CHECK-NEXT: mov z3.h, z1.h[2] 624; CHECK-NEXT: zip1 z5.d, z6.d, z5.d 625; CHECK-NEXT: mov z6.h, z1.h[1] 626; CHECK-NEXT: zip1 z0.d, z0.d, z17.d 627; CHECK-NEXT: fcvtzu z16.d, p0/m, z16.h 628; CHECK-NEXT: fcvtzu z18.d, p0/m, z18.h 629; CHECK-NEXT: movprfx z17, z21 630; CHECK-NEXT: fcvtzu z17.d, p0/m, z21.h 631; CHECK-NEXT: fcvtzu z19.d, p0/m, z19.h 632; CHECK-NEXT: zip1 z4.d, z7.d, z4.d 633; CHECK-NEXT: movprfx z7, z20 634; CHECK-NEXT: fcvtzu z7.d, p0/m, z20.h 635; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.h 636; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.h 637; CHECK-NEXT: stp q0, q5, [x1, #64] 638; CHECK-NEXT: fcvtzu z6.d, p0/m, z6.h 639; CHECK-NEXT: zip1 z0.d, z19.d, z18.d 640; CHECK-NEXT: zip1 z5.d, z16.d, z17.d 641; CHECK-NEXT: stp q2, q4, [x1] 642; CHECK-NEXT: zip1 z2.d, z3.d, z7.d 643; CHECK-NEXT: zip1 z1.d, z1.d, z6.d 644; CHECK-NEXT: stp q5, q0, [x1, #96] 645; CHECK-NEXT: stp q1, q2, [x1, #32] 646; CHECK-NEXT: ret 647; 648; NONEON-NOSVE-LABEL: fcvtzu_v16f16_v16i64: 649; NONEON-NOSVE: // %bb.0: 650; NONEON-NOSVE-NEXT: sub sp, sp, #192 651; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 192 652; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 653; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 654; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 655; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 656; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 657; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 658; NONEON-NOSVE-NEXT: ldr h0, [sp, #42] 659; NONEON-NOSVE-NEXT: fcvt s0, h0 660; NONEON-NOSVE-NEXT: fcvtzu x9, s0 661; NONEON-NOSVE-NEXT: ldr h0, [sp, #40] 662; NONEON-NOSVE-NEXT: fcvt s0, h0 663; NONEON-NOSVE-NEXT: fcvtzu x8, s0 664; NONEON-NOSVE-NEXT: ldr h0, [sp, #46] 665; NONEON-NOSVE-NEXT: fcvt s0, h0 666; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #96] 667; NONEON-NOSVE-NEXT: fcvtzu x9, s0 668; NONEON-NOSVE-NEXT: ldr h0, [sp, #44] 669; NONEON-NOSVE-NEXT: fcvt s0, h0 670; NONEON-NOSVE-NEXT: fcvtzu x8, s0 671; NONEON-NOSVE-NEXT: ldr h0, [sp, #34] 672; NONEON-NOSVE-NEXT: fcvt s0, h0 673; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #112] 674; NONEON-NOSVE-NEXT: fcvtzu x9, s0 675; NONEON-NOSVE-NEXT: ldr h0, [sp, #32] 676; NONEON-NOSVE-NEXT: fcvt s0, h0 677; NONEON-NOSVE-NEXT: fcvtzu x8, s0 678; NONEON-NOSVE-NEXT: ldr h0, [sp, #38] 679; NONEON-NOSVE-NEXT: fcvt s0, h0 680; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 681; NONEON-NOSVE-NEXT: fcvtzu x9, s0 682; NONEON-NOSVE-NEXT: ldr h0, [sp, #36] 683; NONEON-NOSVE-NEXT: fcvt s0, h0 684; NONEON-NOSVE-NEXT: fcvtzu x8, s0 685; NONEON-NOSVE-NEXT: ldr h0, [sp, #58] 686; NONEON-NOSVE-NEXT: fcvt s0, h0 687; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #80] 688; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #64] 689; NONEON-NOSVE-NEXT: fcvtzu x9, s0 690; NONEON-NOSVE-NEXT: ldr h0, [sp, #56] 691; NONEON-NOSVE-NEXT: fcvt s0, h0 692; NONEON-NOSVE-NEXT: fcvtzu x8, s0 693; NONEON-NOSVE-NEXT: ldr h0, [sp, #62] 694; NONEON-NOSVE-NEXT: fcvt s0, h0 695; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #160] 696; NONEON-NOSVE-NEXT: fcvtzu x9, s0 697; NONEON-NOSVE-NEXT: ldr h0, [sp, #60] 698; NONEON-NOSVE-NEXT: fcvt s0, h0 699; NONEON-NOSVE-NEXT: fcvtzu x8, s0 700; NONEON-NOSVE-NEXT: ldr h0, [sp, #50] 701; NONEON-NOSVE-NEXT: fcvt s0, h0 702; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #176] 703; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #160] 704; NONEON-NOSVE-NEXT: fcvtzu x9, s0 705; NONEON-NOSVE-NEXT: ldr h0, [sp, #48] 706; NONEON-NOSVE-NEXT: fcvt s0, h0 707; NONEON-NOSVE-NEXT: fcvtzu x8, s0 708; NONEON-NOSVE-NEXT: ldr h0, [sp, #54] 709; NONEON-NOSVE-NEXT: fcvt s0, h0 710; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #128] 711; NONEON-NOSVE-NEXT: fcvtzu x9, s0 712; NONEON-NOSVE-NEXT: ldr h0, [sp, #52] 713; NONEON-NOSVE-NEXT: fcvt s0, h0 714; NONEON-NOSVE-NEXT: fcvtzu x8, s0 715; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 716; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #144] 717; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #128] 718; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 719; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 720; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 721; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 722; NONEON-NOSVE-NEXT: add sp, sp, #192 723; NONEON-NOSVE-NEXT: ret 724 %op1 = load <16 x half>, ptr %a 725 %res = fptoui <16 x half> %op1 to <16 x i64> 726 store <16 x i64> %res, ptr %b 727 ret void 728} 729 730; 731; FCVTZU S -> H 732; 733 734define <2 x i16> @fcvtzu_v2f32_v2i16(<2 x float> %op1) { 735; CHECK-LABEL: fcvtzu_v2f32_v2i16: 736; CHECK: // %bb.0: 737; CHECK-NEXT: ptrue p0.s, vl2 738; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 739; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 740; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 741; CHECK-NEXT: ret 742; 743; NONEON-NOSVE-LABEL: fcvtzu_v2f32_v2i16: 744; NONEON-NOSVE: // %bb.0: 745; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 746; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 747; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 748; NONEON-NOSVE-NEXT: fcvtzu w9, s1 749; NONEON-NOSVE-NEXT: fcvtzu w8, s0 750; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 751; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 752; NONEON-NOSVE-NEXT: add sp, sp, #16 753; NONEON-NOSVE-NEXT: ret 754 %res = fptoui <2 x float> %op1 to <2 x i16> 755 ret <2 x i16> %res 756} 757 758define <4 x i16> @fcvtzu_v4f32_v4i16(<4 x float> %op1) { 759; CHECK-LABEL: fcvtzu_v4f32_v4i16: 760; CHECK: // %bb.0: 761; CHECK-NEXT: ptrue p0.s, vl4 762; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 763; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 764; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 765; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 766; CHECK-NEXT: ret 767; 768; NONEON-NOSVE-LABEL: fcvtzu_v4f32_v4i16: 769; NONEON-NOSVE: // %bb.0: 770; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 771; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 772; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 773; NONEON-NOSVE-NEXT: fcvtzs w8, s1 774; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 775; NONEON-NOSVE-NEXT: fcvtzs w8, s0 776; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 777; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 778; NONEON-NOSVE-NEXT: fcvtzs w8, s1 779; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 780; NONEON-NOSVE-NEXT: fcvtzs w8, s0 781; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 782; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 783; NONEON-NOSVE-NEXT: add sp, sp, #32 784; NONEON-NOSVE-NEXT: ret 785 %res = fptoui <4 x float> %op1 to <4 x i16> 786 ret <4 x i16> %res 787} 788 789define <8 x i16> @fcvtzu_v8f32_v8i16(ptr %a) { 790; CHECK-LABEL: fcvtzu_v8f32_v8i16: 791; CHECK: // %bb.0: 792; CHECK-NEXT: ldp q0, q1, [x0] 793; CHECK-NEXT: ptrue p0.s, vl4 794; CHECK-NEXT: fcvtzu z1.s, p0/m, z1.s 795; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 796; CHECK-NEXT: ptrue p0.h, vl4 797; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 798; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 799; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 800; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 801; CHECK-NEXT: ret 802; 803; NONEON-NOSVE-LABEL: fcvtzu_v8f32_v8i16: 804; NONEON-NOSVE: // %bb.0: 805; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 806; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 807; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 808; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 809; NONEON-NOSVE-NEXT: fcvtzs w8, s1 810; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 811; NONEON-NOSVE-NEXT: fcvtzs w8, s0 812; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 813; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 814; NONEON-NOSVE-NEXT: fcvtzs w8, s1 815; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 816; NONEON-NOSVE-NEXT: fcvtzs w8, s0 817; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 818; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 819; NONEON-NOSVE-NEXT: fcvtzs w8, s1 820; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 821; NONEON-NOSVE-NEXT: fcvtzs w8, s0 822; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 823; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 824; NONEON-NOSVE-NEXT: fcvtzs w8, s1 825; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 826; NONEON-NOSVE-NEXT: fcvtzs w8, s0 827; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 828; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 829; NONEON-NOSVE-NEXT: add sp, sp, #48 830; NONEON-NOSVE-NEXT: ret 831 %op1 = load <8 x float>, ptr %a 832 %res = fptoui <8 x float> %op1 to <8 x i16> 833 ret <8 x i16> %res 834} 835 836define void @fcvtzu_v16f32_v16i16(ptr %a, ptr %b) { 837; CHECK-LABEL: fcvtzu_v16f32_v16i16: 838; CHECK: // %bb.0: 839; CHECK-NEXT: ldp q0, q1, [x0, #32] 840; CHECK-NEXT: ptrue p0.s, vl4 841; CHECK-NEXT: ldp q2, q3, [x0] 842; CHECK-NEXT: fcvtzu z1.s, p0/m, z1.s 843; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 844; CHECK-NEXT: fcvtzu z3.s, p0/m, z3.s 845; CHECK-NEXT: fcvtzu z2.s, p0/m, z2.s 846; CHECK-NEXT: ptrue p0.h, vl4 847; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 848; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 849; CHECK-NEXT: uzp1 z3.h, z3.h, z3.h 850; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h 851; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 852; CHECK-NEXT: splice z2.h, p0, z2.h, z3.h 853; CHECK-NEXT: stp q2, q0, [x1] 854; CHECK-NEXT: ret 855; 856; NONEON-NOSVE-LABEL: fcvtzu_v16f32_v16i16: 857; NONEON-NOSVE: // %bb.0: 858; NONEON-NOSVE-NEXT: sub sp, sp, #96 859; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 860; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 861; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32] 862; NONEON-NOSVE-NEXT: str q1, [sp] 863; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16] 864; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #40] 865; NONEON-NOSVE-NEXT: str q2, [sp, #48] 866; NONEON-NOSVE-NEXT: fcvtzs w8, s1 867; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 868; NONEON-NOSVE-NEXT: fcvtzs w8, s0 869; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #32] 870; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 871; NONEON-NOSVE-NEXT: fcvtzs w8, s1 872; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 873; NONEON-NOSVE-NEXT: fcvtzs w8, s0 874; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 875; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 876; NONEON-NOSVE-NEXT: fcvtzs w8, s1 877; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 878; NONEON-NOSVE-NEXT: fcvtzs w8, s0 879; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 880; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 881; NONEON-NOSVE-NEXT: fcvtzs w8, s1 882; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 883; NONEON-NOSVE-NEXT: fcvtzs w8, s0 884; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 885; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 886; NONEON-NOSVE-NEXT: fcvtzs w8, s1 887; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 888; NONEON-NOSVE-NEXT: fcvtzs w8, s0 889; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 890; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 891; NONEON-NOSVE-NEXT: fcvtzs w8, s1 892; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 893; NONEON-NOSVE-NEXT: fcvtzs w8, s0 894; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #56] 895; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 896; NONEON-NOSVE-NEXT: fcvtzs w8, s1 897; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 898; NONEON-NOSVE-NEXT: fcvtzs w8, s0 899; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #48] 900; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 901; NONEON-NOSVE-NEXT: fcvtzs w8, s1 902; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 903; NONEON-NOSVE-NEXT: fcvtzs w8, s0 904; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 905; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64] 906; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 907; NONEON-NOSVE-NEXT: add sp, sp, #96 908; NONEON-NOSVE-NEXT: ret 909 %op1 = load <16 x float>, ptr %a 910 %res = fptoui <16 x float> %op1 to <16 x i16> 911 store <16 x i16> %res, ptr %b 912 ret void 913} 914 915; 916; FCVTZU S -> S 917; 918 919define <2 x i32> @fcvtzu_v2f32_v2i32(<2 x float> %op1) { 920; CHECK-LABEL: fcvtzu_v2f32_v2i32: 921; CHECK: // %bb.0: 922; CHECK-NEXT: ptrue p0.s, vl2 923; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 924; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 925; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 926; CHECK-NEXT: ret 927; 928; NONEON-NOSVE-LABEL: fcvtzu_v2f32_v2i32: 929; NONEON-NOSVE: // %bb.0: 930; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 931; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 932; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 933; NONEON-NOSVE-NEXT: fcvtzu w9, s1 934; NONEON-NOSVE-NEXT: fcvtzu w8, s0 935; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 936; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 937; NONEON-NOSVE-NEXT: add sp, sp, #16 938; NONEON-NOSVE-NEXT: ret 939 %res = fptoui <2 x float> %op1 to <2 x i32> 940 ret <2 x i32> %res 941} 942 943define <4 x i32> @fcvtzu_v4f32_v4i32(<4 x float> %op1) { 944; CHECK-LABEL: fcvtzu_v4f32_v4i32: 945; CHECK: // %bb.0: 946; CHECK-NEXT: ptrue p0.s, vl4 947; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 948; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 949; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 950; CHECK-NEXT: ret 951; 952; NONEON-NOSVE-LABEL: fcvtzu_v4f32_v4i32: 953; NONEON-NOSVE: // %bb.0: 954; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 955; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 956; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 957; NONEON-NOSVE-NEXT: fcvtzu w9, s1 958; NONEON-NOSVE-NEXT: fcvtzu w8, s0 959; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 960; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 961; NONEON-NOSVE-NEXT: fcvtzu w9, s1 962; NONEON-NOSVE-NEXT: fcvtzu w8, s0 963; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 964; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 965; NONEON-NOSVE-NEXT: add sp, sp, #32 966; NONEON-NOSVE-NEXT: ret 967 %res = fptoui <4 x float> %op1 to <4 x i32> 968 ret <4 x i32> %res 969} 970 971define void @fcvtzu_v8f32_v8i32(ptr %a, ptr %b) { 972; CHECK-LABEL: fcvtzu_v8f32_v8i32: 973; CHECK: // %bb.0: 974; CHECK-NEXT: ldp q0, q1, [x0] 975; CHECK-NEXT: ptrue p0.s, vl4 976; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s 977; CHECK-NEXT: fcvtzu z1.s, p0/m, z1.s 978; CHECK-NEXT: stp q0, q1, [x1] 979; CHECK-NEXT: ret 980; 981; NONEON-NOSVE-LABEL: fcvtzu_v8f32_v8i32: 982; NONEON-NOSVE: // %bb.0: 983; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 984; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 985; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 986; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 987; NONEON-NOSVE-NEXT: fcvtzu w9, s1 988; NONEON-NOSVE-NEXT: fcvtzu w8, s0 989; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 990; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 991; NONEON-NOSVE-NEXT: fcvtzu w9, s1 992; NONEON-NOSVE-NEXT: fcvtzu w8, s0 993; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 994; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 995; NONEON-NOSVE-NEXT: fcvtzu w9, s1 996; NONEON-NOSVE-NEXT: fcvtzu w8, s0 997; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 998; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 999; NONEON-NOSVE-NEXT: fcvtzu w9, s1 1000; NONEON-NOSVE-NEXT: fcvtzu w8, s0 1001; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 1002; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1003; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1004; NONEON-NOSVE-NEXT: add sp, sp, #64 1005; NONEON-NOSVE-NEXT: ret 1006 %op1 = load <8 x float>, ptr %a 1007 %res = fptoui <8 x float> %op1 to <8 x i32> 1008 store <8 x i32> %res, ptr %b 1009 ret void 1010} 1011 1012; 1013; FCVTZU S -> D 1014; 1015 1016define <1 x i64> @fcvtzu_v1f32_v1i64(<1 x float> %op1) { 1017; CHECK-LABEL: fcvtzu_v1f32_v1i64: 1018; CHECK: // %bb.0: 1019; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1020; CHECK-NEXT: ptrue p0.d, vl2 1021; CHECK-NEXT: uunpklo z0.d, z0.s 1022; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s 1023; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1024; CHECK-NEXT: ret 1025; 1026; NONEON-NOSVE-LABEL: fcvtzu_v1f32_v1i64: 1027; NONEON-NOSVE: // %bb.0: 1028; NONEON-NOSVE-NEXT: sub sp, sp, #16 1029; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1030; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1031; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 1032; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1033; NONEON-NOSVE-NEXT: fmov d0, x8 1034; NONEON-NOSVE-NEXT: add sp, sp, #16 1035; NONEON-NOSVE-NEXT: ret 1036 %res = fptoui <1 x float> %op1 to <1 x i64> 1037 ret <1 x i64> %res 1038} 1039 1040define <2 x i64> @fcvtzu_v2f32_v2i64(<2 x float> %op1) { 1041; CHECK-LABEL: fcvtzu_v2f32_v2i64: 1042; CHECK: // %bb.0: 1043; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1044; CHECK-NEXT: ptrue p0.d, vl2 1045; CHECK-NEXT: uunpklo z0.d, z0.s 1046; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s 1047; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1048; CHECK-NEXT: ret 1049; 1050; NONEON-NOSVE-LABEL: fcvtzu_v2f32_v2i64: 1051; NONEON-NOSVE: // %bb.0: 1052; NONEON-NOSVE-NEXT: sub sp, sp, #32 1053; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1054; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1055; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 1056; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1057; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1058; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 1059; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1060; NONEON-NOSVE-NEXT: add sp, sp, #32 1061; NONEON-NOSVE-NEXT: ret 1062 %res = fptoui <2 x float> %op1 to <2 x i64> 1063 ret <2 x i64> %res 1064} 1065 1066define void @fcvtzu_v4f32_v4i64(ptr %a, ptr %b) { 1067; CHECK-LABEL: fcvtzu_v4f32_v4i64: 1068; CHECK: // %bb.0: 1069; CHECK-NEXT: ldr q0, [x0] 1070; CHECK-NEXT: ptrue p0.d, vl2 1071; CHECK-NEXT: uunpklo z1.d, z0.s 1072; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1073; CHECK-NEXT: uunpklo z0.d, z0.s 1074; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.s 1075; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s 1076; CHECK-NEXT: stp q1, q0, [x1] 1077; CHECK-NEXT: ret 1078; 1079; NONEON-NOSVE-LABEL: fcvtzu_v4f32_v4i64: 1080; NONEON-NOSVE: // %bb.0: 1081; NONEON-NOSVE-NEXT: ldr q0, [x0] 1082; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 1083; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1084; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1085; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1086; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 1087; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1088; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1089; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 1090; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 1091; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1092; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1093; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 1094; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1095; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1096; NONEON-NOSVE-NEXT: add sp, sp, #64 1097; NONEON-NOSVE-NEXT: ret 1098 %op1 = load <4 x float>, ptr %a 1099 %res = fptoui <4 x float> %op1 to <4 x i64> 1100 store <4 x i64> %res, ptr %b 1101 ret void 1102} 1103 1104define void @fcvtzu_v8f32_v8i64(ptr %a, ptr %b) { 1105; CHECK-LABEL: fcvtzu_v8f32_v8i64: 1106; CHECK: // %bb.0: 1107; CHECK-NEXT: ldp q1, q0, [x0] 1108; CHECK-NEXT: ptrue p0.d, vl2 1109; CHECK-NEXT: uunpklo z2.d, z0.s 1110; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1111; CHECK-NEXT: uunpklo z3.d, z1.s 1112; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1113; CHECK-NEXT: uunpklo z0.d, z0.s 1114; CHECK-NEXT: uunpklo z1.d, z1.s 1115; CHECK-NEXT: fcvtzu z2.d, p0/m, z2.s 1116; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.s 1117; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.s 1118; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.s 1119; CHECK-NEXT: stp q2, q0, [x1, #32] 1120; CHECK-NEXT: stp q3, q1, [x1] 1121; CHECK-NEXT: ret 1122; 1123; NONEON-NOSVE-LABEL: fcvtzu_v8f32_v8i64: 1124; NONEON-NOSVE: // %bb.0: 1125; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 1126; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 1127; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 1128; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1129; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1130; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 1131; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1132; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #40] 1133; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1134; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1135; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #32] 1136; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #80] 1137; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1138; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1139; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #56] 1140; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 1141; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1142; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1143; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #48] 1144; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 1145; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #112] 1146; NONEON-NOSVE-NEXT: fcvtzu x9, s1 1147; NONEON-NOSVE-NEXT: fcvtzu x8, s0 1148; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #96] 1149; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 1150; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 1151; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 1152; NONEON-NOSVE-NEXT: add sp, sp, #128 1153; NONEON-NOSVE-NEXT: ret 1154 %op1 = load <8 x float>, ptr %a 1155 %res = fptoui <8 x float> %op1 to <8 x i64> 1156 store <8 x i64> %res, ptr %b 1157 ret void 1158} 1159 1160; 1161; FCVTZU D -> H 1162; 1163 1164define <1 x i16> @fcvtzu_v1f64_v1i16(<1 x double> %op1) { 1165; CHECK-LABEL: fcvtzu_v1f64_v1i16: 1166; CHECK: // %bb.0: 1167; CHECK-NEXT: fcvtzs w8, d0 1168; CHECK-NEXT: mov z0.h, w8 1169; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1170; CHECK-NEXT: ret 1171; 1172; NONEON-NOSVE-LABEL: fcvtzu_v1f64_v1i16: 1173; NONEON-NOSVE: // %bb.0: 1174; NONEON-NOSVE-NEXT: sub sp, sp, #16 1175; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1176; NONEON-NOSVE-NEXT: fcvtzs w8, d0 1177; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 1178; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1179; NONEON-NOSVE-NEXT: add sp, sp, #16 1180; NONEON-NOSVE-NEXT: ret 1181 %res = fptoui <1 x double> %op1 to <1 x i16> 1182 ret <1 x i16> %res 1183} 1184 1185define <2 x i16> @fcvtzu_v2f64_v2i16(<2 x double> %op1) { 1186; CHECK-LABEL: fcvtzu_v2f64_v2i16: 1187; CHECK: // %bb.0: 1188; CHECK-NEXT: ptrue p0.d, vl2 1189; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1190; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 1191; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1192; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1193; CHECK-NEXT: ret 1194; 1195; NONEON-NOSVE-LABEL: fcvtzu_v2f64_v2i16: 1196; NONEON-NOSVE: // %bb.0: 1197; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1198; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1199; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1200; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1201; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1202; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 1203; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1204; NONEON-NOSVE-NEXT: add sp, sp, #32 1205; NONEON-NOSVE-NEXT: ret 1206 %res = fptoui <2 x double> %op1 to <2 x i16> 1207 ret <2 x i16> %res 1208} 1209 1210define <4 x i16> @fcvtzu_v4f64_v4i16(ptr %a) { 1211; CHECK-LABEL: fcvtzu_v4f64_v4i16: 1212; CHECK: // %bb.0: 1213; CHECK-NEXT: ldp q0, q1, [x0] 1214; CHECK-NEXT: ptrue p0.d, vl2 1215; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 1216; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 1217; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1218; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1219; CHECK-NEXT: mov z2.s, z1.s[1] 1220; CHECK-NEXT: mov z3.s, z0.s[1] 1221; CHECK-NEXT: zip1 z1.h, z1.h, z2.h 1222; CHECK-NEXT: zip1 z0.h, z0.h, z3.h 1223; CHECK-NEXT: zip1 z0.s, z0.s, z1.s 1224; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1225; CHECK-NEXT: ret 1226; 1227; NONEON-NOSVE-LABEL: fcvtzu_v4f64_v4i16: 1228; NONEON-NOSVE: // %bb.0: 1229; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1230; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-80]! 1231; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 1232; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1233; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1234; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1235; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1236; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 1237; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1238; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1239; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 1240; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #40] 1241; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #56] 1242; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #64] 1243; NONEON-NOSVE-NEXT: strh w9, [sp, #78] 1244; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1245; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56] 1246; NONEON-NOSVE-NEXT: strh w9, [sp, #74] 1247; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1248; NONEON-NOSVE-NEXT: ldr d0, [sp, #72] 1249; NONEON-NOSVE-NEXT: add sp, sp, #80 1250; NONEON-NOSVE-NEXT: ret 1251 %op1 = load <4 x double>, ptr %a 1252 %res = fptoui <4 x double> %op1 to <4 x i16> 1253 ret <4 x i16> %res 1254} 1255 1256define <8 x i16> @fcvtzu_v8f64_v8i16(ptr %a) { 1257; CHECK-LABEL: fcvtzu_v8f64_v8i16: 1258; CHECK: // %bb.0: 1259; CHECK-NEXT: ldp q1, q0, [x0, #32] 1260; CHECK-NEXT: ptrue p0.d, vl2 1261; CHECK-NEXT: ldp q2, q3, [x0] 1262; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 1263; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 1264; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.d 1265; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.d 1266; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1267; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1268; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 1269; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 1270; CHECK-NEXT: mov z4.s, z0.s[1] 1271; CHECK-NEXT: mov z5.s, z1.s[1] 1272; CHECK-NEXT: mov z6.s, z3.s[1] 1273; CHECK-NEXT: mov z7.s, z2.s[1] 1274; CHECK-NEXT: zip1 z0.h, z0.h, z4.h 1275; CHECK-NEXT: zip1 z1.h, z1.h, z5.h 1276; CHECK-NEXT: zip1 z3.h, z3.h, z6.h 1277; CHECK-NEXT: zip1 z2.h, z2.h, z7.h 1278; CHECK-NEXT: zip1 z0.s, z1.s, z0.s 1279; CHECK-NEXT: zip1 z1.s, z2.s, z3.s 1280; CHECK-NEXT: zip1 z0.d, z1.d, z0.d 1281; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1282; CHECK-NEXT: ret 1283; 1284; NONEON-NOSVE-LABEL: fcvtzu_v8f64_v8i16: 1285; NONEON-NOSVE: // %bb.0: 1286; NONEON-NOSVE-NEXT: sub sp, sp, #144 1287; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 144 1288; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32] 1289; NONEON-NOSVE-NEXT: ldp q2, q3, [x0] 1290; NONEON-NOSVE-NEXT: str q1, [sp, #48] 1291; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16] 1292; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1293; NONEON-NOSVE-NEXT: str q2, [sp] 1294; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1295; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1296; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1297; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 1298; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1299; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1300; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 1301; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 1302; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1303; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1304; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1305; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 1306; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1307; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1308; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #80] 1309; NONEON-NOSVE-NEXT: ldr d1, [sp, #72] 1310; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #104] 1311; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 1312; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #104] 1313; NONEON-NOSVE-NEXT: str d2, [sp, #120] 1314; NONEON-NOSVE-NEXT: ldr d0, [sp, #64] 1315; NONEON-NOSVE-NEXT: strh w9, [sp, #142] 1316; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 1317; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #120] 1318; NONEON-NOSVE-NEXT: str d0, [sp, #96] 1319; NONEON-NOSVE-NEXT: strh w9, [sp, #138] 1320; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 1321; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #112] 1322; NONEON-NOSVE-NEXT: strh w9, [sp, #134] 1323; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 1324; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #96] 1325; NONEON-NOSVE-NEXT: strh w9, [sp, #130] 1326; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 1327; NONEON-NOSVE-NEXT: ldr q0, [sp, #128] 1328; NONEON-NOSVE-NEXT: add sp, sp, #144 1329; NONEON-NOSVE-NEXT: ret 1330 %op1 = load <8 x double>, ptr %a 1331 %res = fptoui <8 x double> %op1 to <8 x i16> 1332 ret <8 x i16> %res 1333} 1334 1335define void @fcvtzu_v16f64_v16i16(ptr %a, ptr %b) { 1336; CHECK-LABEL: fcvtzu_v16f64_v16i16: 1337; CHECK: // %bb.0: 1338; CHECK-NEXT: ldp q5, q6, [x0, #96] 1339; CHECK-NEXT: ptrue p0.d, vl2 1340; CHECK-NEXT: ldp q0, q4, [x0, #32] 1341; CHECK-NEXT: ldp q2, q7, [x0, #64] 1342; CHECK-NEXT: ldp q1, q3, [x0] 1343; CHECK-NEXT: fcvtzs z6.d, p0/m, z6.d 1344; CHECK-NEXT: fcvtzs z4.d, p0/m, z4.d 1345; CHECK-NEXT: fcvtzs z5.d, p0/m, z5.d 1346; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 1347; CHECK-NEXT: fcvtzs z7.d, p0/m, z7.d 1348; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.d 1349; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.d 1350; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 1351; CHECK-NEXT: uzp1 z6.s, z6.s, z6.s 1352; CHECK-NEXT: uzp1 z4.s, z4.s, z4.s 1353; CHECK-NEXT: uzp1 z5.s, z5.s, z5.s 1354; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1355; CHECK-NEXT: uzp1 z7.s, z7.s, z7.s 1356; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 1357; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 1358; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1359; CHECK-NEXT: mov z17.s, z6.s[1] 1360; CHECK-NEXT: mov z16.s, z4.s[1] 1361; CHECK-NEXT: mov z18.s, z5.s[1] 1362; CHECK-NEXT: mov z21.s, z0.s[1] 1363; CHECK-NEXT: mov z19.s, z7.s[1] 1364; CHECK-NEXT: mov z20.s, z2.s[1] 1365; CHECK-NEXT: mov z22.s, z3.s[1] 1366; CHECK-NEXT: mov z23.s, z1.s[1] 1367; CHECK-NEXT: zip1 z6.h, z6.h, z17.h 1368; CHECK-NEXT: zip1 z4.h, z4.h, z16.h 1369; CHECK-NEXT: zip1 z5.h, z5.h, z18.h 1370; CHECK-NEXT: zip1 z0.h, z0.h, z21.h 1371; CHECK-NEXT: zip1 z7.h, z7.h, z19.h 1372; CHECK-NEXT: zip1 z2.h, z2.h, z20.h 1373; CHECK-NEXT: zip1 z3.h, z3.h, z22.h 1374; CHECK-NEXT: zip1 z1.h, z1.h, z23.h 1375; CHECK-NEXT: zip1 z5.s, z5.s, z6.s 1376; CHECK-NEXT: zip1 z0.s, z0.s, z4.s 1377; CHECK-NEXT: zip1 z2.s, z2.s, z7.s 1378; CHECK-NEXT: zip1 z1.s, z1.s, z3.s 1379; CHECK-NEXT: zip1 z2.d, z2.d, z5.d 1380; CHECK-NEXT: zip1 z0.d, z1.d, z0.d 1381; CHECK-NEXT: stp q0, q2, [x1] 1382; CHECK-NEXT: ret 1383; 1384; NONEON-NOSVE-LABEL: fcvtzu_v16f64_v16i16: 1385; NONEON-NOSVE: // %bb.0: 1386; NONEON-NOSVE-NEXT: sub sp, sp, #304 1387; NONEON-NOSVE-NEXT: str x29, [sp, #288] // 8-byte Folded Spill 1388; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 304 1389; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 1390; NONEON-NOSVE-NEXT: ldp q0, q1, [x0, #32] 1391; NONEON-NOSVE-NEXT: ldr x29, [sp, #288] // 8-byte Folded Reload 1392; NONEON-NOSVE-NEXT: ldp q6, q7, [x0] 1393; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #64] 1394; NONEON-NOSVE-NEXT: ldp q4, q5, [x0, #96] 1395; NONEON-NOSVE-NEXT: stp q1, q7, [sp, #64] 1396; NONEON-NOSVE-NEXT: stp q0, q2, [sp, #96] 1397; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 1398; NONEON-NOSVE-NEXT: stp q6, q4, [sp] 1399; NONEON-NOSVE-NEXT: stp q5, q3, [sp, #32] 1400; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1401; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1402; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #96] 1403; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #168] 1404; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1405; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1406; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #80] 1407; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #184] 1408; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1409; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1410; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1411; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #176] 1412; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1413; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1414; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 1415; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 1416; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1417; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1418; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1419; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 1420; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1421; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1422; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1423; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 1424; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1425; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1426; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #112] 1427; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160] 1428; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1429; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1430; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #176] 1431; NONEON-NOSVE-NEXT: ldr d1, [sp, #168] 1432; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #232] 1433; NONEON-NOSVE-NEXT: ldr d1, [sp, #136] 1434; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #192] 1435; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #232] 1436; NONEON-NOSVE-NEXT: str d2, [sp, #248] 1437; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #144] 1438; NONEON-NOSVE-NEXT: strh w9, [sp, #270] 1439; NONEON-NOSVE-NEXT: strh w8, [sp, #268] 1440; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #248] 1441; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #200] 1442; NONEON-NOSVE-NEXT: ldr d0, [sp, #160] 1443; NONEON-NOSVE-NEXT: strh w9, [sp, #266] 1444; NONEON-NOSVE-NEXT: strh w8, [sp, #264] 1445; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #240] 1446; NONEON-NOSVE-NEXT: stp d2, d0, [sp, #216] 1447; NONEON-NOSVE-NEXT: ldr d0, [sp, #192] 1448; NONEON-NOSVE-NEXT: strh w9, [sp, #262] 1449; NONEON-NOSVE-NEXT: strh w8, [sp, #260] 1450; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #200] 1451; NONEON-NOSVE-NEXT: str d0, [sp, #296] 1452; NONEON-NOSVE-NEXT: strh w9, [sp, #258] 1453; NONEON-NOSVE-NEXT: strh w8, [sp, #256] 1454; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #216] 1455; NONEON-NOSVE-NEXT: strh w9, [sp, #286] 1456; NONEON-NOSVE-NEXT: strh w8, [sp, #284] 1457; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #208] 1458; NONEON-NOSVE-NEXT: strh w9, [sp, #282] 1459; NONEON-NOSVE-NEXT: strh w8, [sp, #280] 1460; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #224] 1461; NONEON-NOSVE-NEXT: strh w8, [sp, #276] 1462; NONEON-NOSVE-NEXT: ldr w8, [sp, #300] 1463; NONEON-NOSVE-NEXT: strh w9, [sp, #278] 1464; NONEON-NOSVE-NEXT: strh w8, [sp, #274] 1465; NONEON-NOSVE-NEXT: ldr w8, [sp, #296] 1466; NONEON-NOSVE-NEXT: strh w8, [sp, #272] 1467; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #256] 1468; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1469; NONEON-NOSVE-NEXT: add sp, sp, #304 1470; NONEON-NOSVE-NEXT: ret 1471 %op1 = load <16 x double>, ptr %a 1472 %res = fptoui <16 x double> %op1 to <16 x i16> 1473 store <16 x i16> %res, ptr %b 1474 ret void 1475} 1476 1477; 1478; FCVTZU D -> S 1479; 1480 1481define <1 x i32> @fcvtzu_v1f64_v1i32(<1 x double> %op1) { 1482; CHECK-LABEL: fcvtzu_v1f64_v1i32: 1483; CHECK: // %bb.0: 1484; CHECK-NEXT: ptrue p0.d, vl2 1485; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1486; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1487; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1488; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1489; CHECK-NEXT: ret 1490; 1491; NONEON-NOSVE-LABEL: fcvtzu_v1f64_v1i32: 1492; NONEON-NOSVE: // %bb.0: 1493; NONEON-NOSVE-NEXT: sub sp, sp, #16 1494; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1495; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1496; NONEON-NOSVE-NEXT: str w8, [sp, #8] 1497; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1498; NONEON-NOSVE-NEXT: add sp, sp, #16 1499; NONEON-NOSVE-NEXT: ret 1500 %res = fptoui <1 x double> %op1 to <1 x i32> 1501 ret <1 x i32> %res 1502} 1503 1504define <2 x i32> @fcvtzu_v2f64_v2i32(<2 x double> %op1) { 1505; CHECK-LABEL: fcvtzu_v2f64_v2i32: 1506; CHECK: // %bb.0: 1507; CHECK-NEXT: ptrue p0.d, vl2 1508; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1509; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1510; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1511; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1512; CHECK-NEXT: ret 1513; 1514; NONEON-NOSVE-LABEL: fcvtzu_v2f64_v2i32: 1515; NONEON-NOSVE: // %bb.0: 1516; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1517; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1518; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1519; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1520; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1521; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 1522; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1523; NONEON-NOSVE-NEXT: add sp, sp, #32 1524; NONEON-NOSVE-NEXT: ret 1525 %res = fptoui <2 x double> %op1 to <2 x i32> 1526 ret <2 x i32> %res 1527} 1528 1529define <4 x i32> @fcvtzu_v4f64_v4i32(ptr %a) { 1530; CHECK-LABEL: fcvtzu_v4f64_v4i32: 1531; CHECK: // %bb.0: 1532; CHECK-NEXT: ldp q0, q1, [x0] 1533; CHECK-NEXT: ptrue p0.d, vl2 1534; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.d 1535; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1536; CHECK-NEXT: ptrue p0.s, vl2 1537; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1538; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1539; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 1540; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1541; CHECK-NEXT: ret 1542; 1543; NONEON-NOSVE-LABEL: fcvtzu_v4f64_v4i32: 1544; NONEON-NOSVE: // %bb.0: 1545; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1546; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 1547; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1548; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1549; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1550; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1551; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1552; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 1553; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1554; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1555; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 1556; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1557; NONEON-NOSVE-NEXT: add sp, sp, #48 1558; NONEON-NOSVE-NEXT: ret 1559 %op1 = load <4 x double>, ptr %a 1560 %res = fptoui <4 x double> %op1 to <4 x i32> 1561 ret <4 x i32> %res 1562} 1563 1564define void @fcvtzu_v8f64_v8i32(ptr %a, ptr %b) { 1565; CHECK-LABEL: fcvtzu_v8f64_v8i32: 1566; CHECK: // %bb.0: 1567; CHECK-NEXT: ldp q0, q1, [x0, #32] 1568; CHECK-NEXT: ptrue p0.d, vl2 1569; CHECK-NEXT: ldp q2, q3, [x0] 1570; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.d 1571; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1572; CHECK-NEXT: fcvtzu z3.d, p0/m, z3.d 1573; CHECK-NEXT: fcvtzu z2.d, p0/m, z2.d 1574; CHECK-NEXT: ptrue p0.s, vl2 1575; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 1576; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 1577; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 1578; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 1579; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 1580; CHECK-NEXT: splice z2.s, p0, z2.s, z3.s 1581; CHECK-NEXT: stp q2, q0, [x1] 1582; CHECK-NEXT: ret 1583; 1584; NONEON-NOSVE-LABEL: fcvtzu_v8f64_v8i32: 1585; NONEON-NOSVE: // %bb.0: 1586; NONEON-NOSVE-NEXT: sub sp, sp, #96 1587; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1588; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1589; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32] 1590; NONEON-NOSVE-NEXT: str q1, [sp] 1591; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16] 1592; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 1593; NONEON-NOSVE-NEXT: str q2, [sp, #48] 1594; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1595; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1596; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1597; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 1598; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1599; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1600; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1601; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 1602; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1603; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1604; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1605; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 1606; NONEON-NOSVE-NEXT: fcvtzu w9, d1 1607; NONEON-NOSVE-NEXT: fcvtzu w8, d0 1608; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 1609; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64] 1610; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 1611; NONEON-NOSVE-NEXT: add sp, sp, #96 1612; NONEON-NOSVE-NEXT: ret 1613 %op1 = load <8 x double>, ptr %a 1614 %res = fptoui <8 x double> %op1 to <8 x i32> 1615 store <8 x i32> %res, ptr %b 1616 ret void 1617} 1618 1619; 1620; FCVTZU D -> D 1621; 1622 1623define <1 x i64> @fcvtzu_v1f64_v1i64(<1 x double> %op1) { 1624; CHECK-LABEL: fcvtzu_v1f64_v1i64: 1625; CHECK: // %bb.0: 1626; CHECK-NEXT: ptrue p0.d, vl1 1627; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1628; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1629; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1630; CHECK-NEXT: ret 1631; 1632; NONEON-NOSVE-LABEL: fcvtzu_v1f64_v1i64: 1633; NONEON-NOSVE: // %bb.0: 1634; NONEON-NOSVE-NEXT: sub sp, sp, #16 1635; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1636; NONEON-NOSVE-NEXT: fcvtzu x8, d0 1637; NONEON-NOSVE-NEXT: str x8, [sp, #8] 1638; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1639; NONEON-NOSVE-NEXT: add sp, sp, #16 1640; NONEON-NOSVE-NEXT: ret 1641 %res = fptoui <1 x double> %op1 to <1 x i64> 1642 ret <1 x i64> %res 1643} 1644 1645define <2 x i64> @fcvtzu_v2f64_v2i64(<2 x double> %op1) { 1646; CHECK-LABEL: fcvtzu_v2f64_v2i64: 1647; CHECK: // %bb.0: 1648; CHECK-NEXT: ptrue p0.d, vl2 1649; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1650; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1651; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1652; CHECK-NEXT: ret 1653; 1654; NONEON-NOSVE-LABEL: fcvtzu_v2f64_v2i64: 1655; NONEON-NOSVE: // %bb.0: 1656; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1657; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1658; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1659; NONEON-NOSVE-NEXT: fcvtzu x9, d1 1660; NONEON-NOSVE-NEXT: fcvtzu x8, d0 1661; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 1662; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1663; NONEON-NOSVE-NEXT: add sp, sp, #32 1664; NONEON-NOSVE-NEXT: ret 1665 %res = fptoui <2 x double> %op1 to <2 x i64> 1666 ret <2 x i64> %res 1667} 1668 1669define void @fcvtzu_v4f64_v4i64(ptr %a, ptr %b) { 1670; CHECK-LABEL: fcvtzu_v4f64_v4i64: 1671; CHECK: // %bb.0: 1672; CHECK-NEXT: ldp q0, q1, [x0] 1673; CHECK-NEXT: ptrue p0.d, vl2 1674; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d 1675; CHECK-NEXT: fcvtzu z1.d, p0/m, z1.d 1676; CHECK-NEXT: stp q0, q1, [x1] 1677; CHECK-NEXT: ret 1678; 1679; NONEON-NOSVE-LABEL: fcvtzu_v4f64_v4i64: 1680; NONEON-NOSVE: // %bb.0: 1681; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1682; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1683; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1684; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1685; NONEON-NOSVE-NEXT: fcvtzu x9, d1 1686; NONEON-NOSVE-NEXT: fcvtzu x8, d0 1687; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 1688; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 1689; NONEON-NOSVE-NEXT: fcvtzu x9, d1 1690; NONEON-NOSVE-NEXT: fcvtzu x8, d0 1691; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 1692; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1693; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1694; NONEON-NOSVE-NEXT: add sp, sp, #64 1695; NONEON-NOSVE-NEXT: ret 1696 %op1 = load <4 x double>, ptr %a 1697 %res = fptoui <4 x double> %op1 to <4 x i64> 1698 store <4 x i64> %res, ptr %b 1699 ret void 1700} 1701 1702; 1703; FCVTZS H -> H 1704; 1705 1706define <4 x i16> @fcvtzs_v4f16_v4i16(<4 x half> %op1) { 1707; CHECK-LABEL: fcvtzs_v4f16_v4i16: 1708; CHECK: // %bb.0: 1709; CHECK-NEXT: ptrue p0.h, vl4 1710; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1711; CHECK-NEXT: fcvtzs z0.h, p0/m, z0.h 1712; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1713; CHECK-NEXT: ret 1714; 1715; NONEON-NOSVE-LABEL: fcvtzs_v4f16_v4i16: 1716; NONEON-NOSVE: // %bb.0: 1717; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1718; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1719; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1720; NONEON-NOSVE-NEXT: fcvt s0, h0 1721; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1722; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1723; NONEON-NOSVE-NEXT: fcvt s0, h0 1724; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 1725; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1726; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1727; NONEON-NOSVE-NEXT: fcvt s0, h0 1728; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 1729; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1730; NONEON-NOSVE-NEXT: ldr h0, [sp] 1731; NONEON-NOSVE-NEXT: fcvt s0, h0 1732; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 1733; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1734; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 1735; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1736; NONEON-NOSVE-NEXT: add sp, sp, #16 1737; NONEON-NOSVE-NEXT: ret 1738 %res = fptosi <4 x half> %op1 to <4 x i16> 1739 ret <4 x i16> %res 1740} 1741 1742define void @fcvtzs_v8f16_v8i16(ptr %a, ptr %b) { 1743; CHECK-LABEL: fcvtzs_v8f16_v8i16: 1744; CHECK: // %bb.0: 1745; CHECK-NEXT: ptrue p0.h, vl8 1746; CHECK-NEXT: ldr q0, [x0] 1747; CHECK-NEXT: fcvtzs z0.h, p0/m, z0.h 1748; CHECK-NEXT: str q0, [x1] 1749; CHECK-NEXT: ret 1750; 1751; NONEON-NOSVE-LABEL: fcvtzs_v8f16_v8i16: 1752; NONEON-NOSVE: // %bb.0: 1753; NONEON-NOSVE-NEXT: ldr q0, [x0] 1754; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1755; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1756; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1757; NONEON-NOSVE-NEXT: fcvt s0, h0 1758; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1759; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1760; NONEON-NOSVE-NEXT: fcvt s0, h0 1761; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1762; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1763; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1764; NONEON-NOSVE-NEXT: fcvt s0, h0 1765; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1766; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1767; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1768; NONEON-NOSVE-NEXT: fcvt s0, h0 1769; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1770; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1771; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1772; NONEON-NOSVE-NEXT: fcvt s0, h0 1773; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1774; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1775; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1776; NONEON-NOSVE-NEXT: fcvt s0, h0 1777; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 1778; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1779; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1780; NONEON-NOSVE-NEXT: fcvt s0, h0 1781; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 1782; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1783; NONEON-NOSVE-NEXT: ldr h0, [sp] 1784; NONEON-NOSVE-NEXT: fcvt s0, h0 1785; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 1786; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1787; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 1788; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1789; NONEON-NOSVE-NEXT: str q0, [x1] 1790; NONEON-NOSVE-NEXT: add sp, sp, #32 1791; NONEON-NOSVE-NEXT: ret 1792 %op1 = load <8 x half>, ptr %a 1793 %res = fptosi <8 x half> %op1 to <8 x i16> 1794 store <8 x i16> %res, ptr %b 1795 ret void 1796} 1797 1798define void @fcvtzs_v16f16_v16i16(ptr %a, ptr %b) { 1799; CHECK-LABEL: fcvtzs_v16f16_v16i16: 1800; CHECK: // %bb.0: 1801; CHECK-NEXT: ldp q0, q1, [x0] 1802; CHECK-NEXT: ptrue p0.h, vl8 1803; CHECK-NEXT: fcvtzs z0.h, p0/m, z0.h 1804; CHECK-NEXT: fcvtzs z1.h, p0/m, z1.h 1805; CHECK-NEXT: stp q0, q1, [x1] 1806; CHECK-NEXT: ret 1807; 1808; NONEON-NOSVE-LABEL: fcvtzs_v16f16_v16i16: 1809; NONEON-NOSVE: // %bb.0: 1810; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1811; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1812; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1813; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 1814; NONEON-NOSVE-NEXT: fcvt s0, h0 1815; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1816; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 1817; NONEON-NOSVE-NEXT: fcvt s0, h0 1818; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 1819; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1820; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 1821; NONEON-NOSVE-NEXT: fcvt s0, h0 1822; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 1823; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1824; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 1825; NONEON-NOSVE-NEXT: fcvt s0, h0 1826; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 1827; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1828; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 1829; NONEON-NOSVE-NEXT: fcvt s0, h0 1830; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 1831; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1832; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 1833; NONEON-NOSVE-NEXT: fcvt s0, h0 1834; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 1835; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1836; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 1837; NONEON-NOSVE-NEXT: fcvt s0, h0 1838; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 1839; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1840; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 1841; NONEON-NOSVE-NEXT: fcvt s0, h0 1842; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 1843; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1844; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1845; NONEON-NOSVE-NEXT: fcvt s0, h0 1846; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 1847; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1848; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1849; NONEON-NOSVE-NEXT: fcvt s0, h0 1850; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1851; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1852; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1853; NONEON-NOSVE-NEXT: fcvt s0, h0 1854; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1855; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1856; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1857; NONEON-NOSVE-NEXT: fcvt s0, h0 1858; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1859; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1860; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1861; NONEON-NOSVE-NEXT: fcvt s0, h0 1862; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1863; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1864; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1865; NONEON-NOSVE-NEXT: fcvt s0, h0 1866; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1867; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1868; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1869; NONEON-NOSVE-NEXT: fcvt s0, h0 1870; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1871; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1872; NONEON-NOSVE-NEXT: ldr h0, [sp] 1873; NONEON-NOSVE-NEXT: fcvt s0, h0 1874; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1875; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1876; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1877; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1878; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1879; NONEON-NOSVE-NEXT: add sp, sp, #64 1880; NONEON-NOSVE-NEXT: ret 1881 %op1 = load <16 x half>, ptr %a 1882 %res = fptosi <16 x half> %op1 to <16 x i16> 1883 store <16 x i16> %res, ptr %b 1884 ret void 1885} 1886 1887; 1888; FCVTZS H -> S 1889; 1890 1891define <2 x i32> @fcvtzs_v2f16_v2i32(<2 x half> %op1) { 1892; CHECK-LABEL: fcvtzs_v2f16_v2i32: 1893; CHECK: // %bb.0: 1894; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1895; CHECK-NEXT: ptrue p0.s, vl4 1896; CHECK-NEXT: uunpklo z0.s, z0.h 1897; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h 1898; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1899; CHECK-NEXT: ret 1900; 1901; NONEON-NOSVE-LABEL: fcvtzs_v2f16_v2i32: 1902; NONEON-NOSVE: // %bb.0: 1903; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1904; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1905; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1906; NONEON-NOSVE-NEXT: fcvt s0, h0 1907; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1908; NONEON-NOSVE-NEXT: ldr h0, [sp] 1909; NONEON-NOSVE-NEXT: fcvt s0, h0 1910; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1911; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 1912; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1913; NONEON-NOSVE-NEXT: add sp, sp, #16 1914; NONEON-NOSVE-NEXT: ret 1915 %res = fptosi <2 x half> %op1 to <2 x i32> 1916 ret <2 x i32> %res 1917} 1918 1919define <4 x i32> @fcvtzs_v4f16_v4i32(<4 x half> %op1) { 1920; CHECK-LABEL: fcvtzs_v4f16_v4i32: 1921; CHECK: // %bb.0: 1922; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1923; CHECK-NEXT: ptrue p0.s, vl4 1924; CHECK-NEXT: uunpklo z0.s, z0.h 1925; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h 1926; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1927; CHECK-NEXT: ret 1928; 1929; NONEON-NOSVE-LABEL: fcvtzs_v4f16_v4i32: 1930; NONEON-NOSVE: // %bb.0: 1931; NONEON-NOSVE-NEXT: sub sp, sp, #32 1932; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1933; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1934; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1935; NONEON-NOSVE-NEXT: fcvt s0, h0 1936; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1937; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1938; NONEON-NOSVE-NEXT: fcvt s0, h0 1939; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1940; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1941; NONEON-NOSVE-NEXT: fcvt s0, h0 1942; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 1943; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1944; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1945; NONEON-NOSVE-NEXT: fcvt s0, h0 1946; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1947; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 1948; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1949; NONEON-NOSVE-NEXT: add sp, sp, #32 1950; NONEON-NOSVE-NEXT: ret 1951 %res = fptosi <4 x half> %op1 to <4 x i32> 1952 ret <4 x i32> %res 1953} 1954 1955define void @fcvtzs_v8f16_v8i32(ptr %a, ptr %b) { 1956; CHECK-LABEL: fcvtzs_v8f16_v8i32: 1957; CHECK: // %bb.0: 1958; CHECK-NEXT: ldr q0, [x0] 1959; CHECK-NEXT: ptrue p0.s, vl4 1960; CHECK-NEXT: uunpklo z1.s, z0.h 1961; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1962; CHECK-NEXT: uunpklo z0.s, z0.h 1963; CHECK-NEXT: fcvtzs z1.s, p0/m, z1.h 1964; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h 1965; CHECK-NEXT: stp q1, q0, [x1] 1966; CHECK-NEXT: ret 1967; 1968; NONEON-NOSVE-LABEL: fcvtzs_v8f16_v8i32: 1969; NONEON-NOSVE: // %bb.0: 1970; NONEON-NOSVE-NEXT: ldr q0, [x0] 1971; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 1972; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1973; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1974; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1975; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 1976; NONEON-NOSVE-NEXT: fcvt s0, h0 1977; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1978; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 1979; NONEON-NOSVE-NEXT: fcvt s0, h0 1980; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1981; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 1982; NONEON-NOSVE-NEXT: fcvt s0, h0 1983; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 1984; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1985; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 1986; NONEON-NOSVE-NEXT: fcvt s0, h0 1987; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1988; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 1989; NONEON-NOSVE-NEXT: fcvt s0, h0 1990; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 1991; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1992; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 1993; NONEON-NOSVE-NEXT: fcvt s0, h0 1994; NONEON-NOSVE-NEXT: fcvtzs w8, s0 1995; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 1996; NONEON-NOSVE-NEXT: fcvt s0, h0 1997; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 1998; NONEON-NOSVE-NEXT: fcvtzs w9, s0 1999; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 2000; NONEON-NOSVE-NEXT: fcvt s0, h0 2001; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2002; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 2003; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2004; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 2005; NONEON-NOSVE-NEXT: add sp, sp, #64 2006; NONEON-NOSVE-NEXT: ret 2007 %op1 = load <8 x half>, ptr %a 2008 %res = fptosi <8 x half> %op1 to <8 x i32> 2009 store <8 x i32> %res, ptr %b 2010 ret void 2011} 2012 2013define void @fcvtzs_v16f16_v16i32(ptr %a, ptr %b) { 2014; CHECK-LABEL: fcvtzs_v16f16_v16i32: 2015; CHECK: // %bb.0: 2016; CHECK-NEXT: ldp q1, q0, [x0] 2017; CHECK-NEXT: ptrue p0.s, vl4 2018; CHECK-NEXT: uunpklo z2.s, z0.h 2019; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2020; CHECK-NEXT: uunpklo z3.s, z1.h 2021; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2022; CHECK-NEXT: uunpklo z0.s, z0.h 2023; CHECK-NEXT: uunpklo z1.s, z1.h 2024; CHECK-NEXT: fcvtzs z2.s, p0/m, z2.h 2025; CHECK-NEXT: fcvtzs z3.s, p0/m, z3.h 2026; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h 2027; CHECK-NEXT: fcvtzs z1.s, p0/m, z1.h 2028; CHECK-NEXT: stp q2, q0, [x1, #32] 2029; CHECK-NEXT: stp q3, q1, [x1] 2030; CHECK-NEXT: ret 2031; 2032; NONEON-NOSVE-LABEL: fcvtzs_v16f16_v16i32: 2033; NONEON-NOSVE: // %bb.0: 2034; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 2035; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 2036; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 2037; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2038; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2039; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 2040; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2041; NONEON-NOSVE-NEXT: ldr h0, [sp, #46] 2042; NONEON-NOSVE-NEXT: fcvt s0, h0 2043; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2044; NONEON-NOSVE-NEXT: ldr h0, [sp, #44] 2045; NONEON-NOSVE-NEXT: fcvt s0, h0 2046; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2047; NONEON-NOSVE-NEXT: ldr h0, [sp, #42] 2048; NONEON-NOSVE-NEXT: fcvt s0, h0 2049; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 2050; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2051; NONEON-NOSVE-NEXT: ldr h0, [sp, #40] 2052; NONEON-NOSVE-NEXT: fcvt s0, h0 2053; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2054; NONEON-NOSVE-NEXT: ldr h0, [sp, #38] 2055; NONEON-NOSVE-NEXT: fcvt s0, h0 2056; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 2057; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2058; NONEON-NOSVE-NEXT: ldr h0, [sp, #36] 2059; NONEON-NOSVE-NEXT: fcvt s0, h0 2060; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2061; NONEON-NOSVE-NEXT: ldr h0, [sp, #34] 2062; NONEON-NOSVE-NEXT: fcvt s0, h0 2063; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 2064; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2065; NONEON-NOSVE-NEXT: ldr h0, [sp, #32] 2066; NONEON-NOSVE-NEXT: fcvt s0, h0 2067; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2068; NONEON-NOSVE-NEXT: ldr h0, [sp, #62] 2069; NONEON-NOSVE-NEXT: fcvt s0, h0 2070; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 2071; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 2072; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2073; NONEON-NOSVE-NEXT: ldr h0, [sp, #60] 2074; NONEON-NOSVE-NEXT: fcvt s0, h0 2075; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2076; NONEON-NOSVE-NEXT: ldr h0, [sp, #58] 2077; NONEON-NOSVE-NEXT: fcvt s0, h0 2078; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 2079; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2080; NONEON-NOSVE-NEXT: ldr h0, [sp, #56] 2081; NONEON-NOSVE-NEXT: fcvt s0, h0 2082; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2083; NONEON-NOSVE-NEXT: ldr h0, [sp, #54] 2084; NONEON-NOSVE-NEXT: fcvt s0, h0 2085; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 2086; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2087; NONEON-NOSVE-NEXT: ldr h0, [sp, #52] 2088; NONEON-NOSVE-NEXT: fcvt s0, h0 2089; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2090; NONEON-NOSVE-NEXT: ldr h0, [sp, #50] 2091; NONEON-NOSVE-NEXT: fcvt s0, h0 2092; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 2093; NONEON-NOSVE-NEXT: fcvtzs w9, s0 2094; NONEON-NOSVE-NEXT: ldr h0, [sp, #48] 2095; NONEON-NOSVE-NEXT: fcvt s0, h0 2096; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2097; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 2098; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 2099; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 2100; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 2101; NONEON-NOSVE-NEXT: add sp, sp, #128 2102; NONEON-NOSVE-NEXT: ret 2103 %op1 = load <16 x half>, ptr %a 2104 %res = fptosi <16 x half> %op1 to <16 x i32> 2105 store <16 x i32> %res, ptr %b 2106 ret void 2107} 2108 2109; 2110; FCVTZS H -> D 2111; 2112 2113define <1 x i64> @fcvtzs_v1f16_v1i64(<1 x half> %op1) { 2114; CHECK-LABEL: fcvtzs_v1f16_v1i64: 2115; CHECK: // %bb.0: 2116; CHECK-NEXT: ptrue p0.d 2117; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0 2118; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h 2119; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2120; CHECK-NEXT: ret 2121; 2122; NONEON-NOSVE-LABEL: fcvtzs_v1f16_v1i64: 2123; NONEON-NOSVE: // %bb.0: 2124; NONEON-NOSVE-NEXT: sub sp, sp, #16 2125; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2126; NONEON-NOSVE-NEXT: fcvt s0, h0 2127; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2128; NONEON-NOSVE-NEXT: str x8, [sp, #8] 2129; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2130; NONEON-NOSVE-NEXT: add sp, sp, #16 2131; NONEON-NOSVE-NEXT: ret 2132 %res = fptosi <1 x half> %op1 to <1 x i64> 2133 ret <1 x i64> %res 2134} 2135 2136; v2f16 is not legal for NEON, so use SVE 2137define <2 x i64> @fcvtzs_v2f16_v2i64(<2 x half> %op1) { 2138; CHECK-LABEL: fcvtzs_v2f16_v2i64: 2139; CHECK: // %bb.0: 2140; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2141; CHECK-NEXT: mov z1.h, z0.h[1] 2142; CHECK-NEXT: ptrue p0.d 2143; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h 2144; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.h 2145; CHECK-NEXT: zip1 z0.d, z0.d, z1.d 2146; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2147; CHECK-NEXT: ret 2148; 2149; NONEON-NOSVE-LABEL: fcvtzs_v2f16_v2i64: 2150; NONEON-NOSVE: // %bb.0: 2151; NONEON-NOSVE-NEXT: sub sp, sp, #32 2152; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2153; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2154; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 2155; NONEON-NOSVE-NEXT: fcvt s0, h0 2156; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2157; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 2158; NONEON-NOSVE-NEXT: fcvt s0, h0 2159; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2160; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 2161; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2162; NONEON-NOSVE-NEXT: add sp, sp, #32 2163; NONEON-NOSVE-NEXT: ret 2164 %res = fptosi <2 x half> %op1 to <2 x i64> 2165 ret <2 x i64> %res 2166} 2167 2168define void @fcvtzs_v4f16_v4i64(ptr %a, ptr %b) { 2169; CHECK-LABEL: fcvtzs_v4f16_v4i64: 2170; CHECK: // %bb.0: 2171; CHECK-NEXT: ldr d0, [x0] 2172; CHECK-NEXT: ptrue p0.d 2173; CHECK-NEXT: mov z1.h, z0.h[3] 2174; CHECK-NEXT: mov z2.h, z0.h[2] 2175; CHECK-NEXT: mov z3.h, z0.h[1] 2176; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h 2177; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.h 2178; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.h 2179; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.h 2180; CHECK-NEXT: zip1 z1.d, z2.d, z1.d 2181; CHECK-NEXT: zip1 z0.d, z0.d, z3.d 2182; CHECK-NEXT: stp q0, q1, [x1] 2183; CHECK-NEXT: ret 2184; 2185; NONEON-NOSVE-LABEL: fcvtzs_v4f16_v4i64: 2186; NONEON-NOSVE: // %bb.0: 2187; NONEON-NOSVE-NEXT: sub sp, sp, #48 2188; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2189; NONEON-NOSVE-NEXT: ldr d0, [x0] 2190; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2191; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 2192; NONEON-NOSVE-NEXT: fcvt s0, h0 2193; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2194; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 2195; NONEON-NOSVE-NEXT: fcvt s0, h0 2196; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2197; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 2198; NONEON-NOSVE-NEXT: fcvt s0, h0 2199; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 2200; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2201; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 2202; NONEON-NOSVE-NEXT: fcvt s0, h0 2203; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2204; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 2205; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #16] 2206; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 2207; NONEON-NOSVE-NEXT: add sp, sp, #48 2208; NONEON-NOSVE-NEXT: ret 2209 %op1 = load <4 x half>, ptr %a 2210 %res = fptosi <4 x half> %op1 to <4 x i64> 2211 store <4 x i64> %res, ptr %b 2212 ret void 2213} 2214 2215define void @fcvtzs_v8f16_v8i64(ptr %a, ptr %b) { 2216; CHECK-LABEL: fcvtzs_v8f16_v8i64: 2217; CHECK: // %bb.0: 2218; CHECK-NEXT: ldr q0, [x0] 2219; CHECK-NEXT: ptrue p0.d 2220; CHECK-NEXT: mov z1.d, z0.d 2221; CHECK-NEXT: mov z2.h, z0.h[3] 2222; CHECK-NEXT: mov z3.h, z0.h[2] 2223; CHECK-NEXT: mov z4.h, z0.h[1] 2224; CHECK-NEXT: ext z1.b, z1.b, z0.b, #8 2225; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.h 2226; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.h 2227; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h 2228; CHECK-NEXT: fcvtzs z4.d, p0/m, z4.h 2229; CHECK-NEXT: mov z5.h, z1.h[3] 2230; CHECK-NEXT: mov z6.h, z1.h[2] 2231; CHECK-NEXT: mov z7.h, z1.h[1] 2232; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.h 2233; CHECK-NEXT: zip1 z2.d, z3.d, z2.d 2234; CHECK-NEXT: zip1 z0.d, z0.d, z4.d 2235; CHECK-NEXT: fcvtzs z5.d, p0/m, z5.h 2236; CHECK-NEXT: fcvtzs z6.d, p0/m, z6.h 2237; CHECK-NEXT: fcvtzs z7.d, p0/m, z7.h 2238; CHECK-NEXT: stp q0, q2, [x1] 2239; CHECK-NEXT: zip1 z3.d, z6.d, z5.d 2240; CHECK-NEXT: zip1 z1.d, z1.d, z7.d 2241; CHECK-NEXT: stp q1, q3, [x1, #32] 2242; CHECK-NEXT: ret 2243; 2244; NONEON-NOSVE-LABEL: fcvtzs_v8f16_v8i64: 2245; NONEON-NOSVE: // %bb.0: 2246; NONEON-NOSVE-NEXT: ldr q0, [x0] 2247; NONEON-NOSVE-NEXT: str q0, [sp, #-96]! 2248; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2249; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2250; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2251; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 2252; NONEON-NOSVE-NEXT: fcvt s0, h0 2253; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2254; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 2255; NONEON-NOSVE-NEXT: fcvt s0, h0 2256; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2257; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 2258; NONEON-NOSVE-NEXT: fcvt s0, h0 2259; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 2260; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2261; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 2262; NONEON-NOSVE-NEXT: fcvt s0, h0 2263; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2264; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 2265; NONEON-NOSVE-NEXT: fcvt s0, h0 2266; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #80] 2267; NONEON-NOSVE-NEXT: ldp q2, q3, [sp, #64] 2268; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2269; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 2270; NONEON-NOSVE-NEXT: fcvt s0, h0 2271; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2272; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 2273; NONEON-NOSVE-NEXT: fcvt s0, h0 2274; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 2275; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2276; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 2277; NONEON-NOSVE-NEXT: fcvt s0, h0 2278; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2279; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 2280; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #32] 2281; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 2282; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 2283; NONEON-NOSVE-NEXT: add sp, sp, #96 2284; NONEON-NOSVE-NEXT: ret 2285 %op1 = load <8 x half>, ptr %a 2286 %res = fptosi <8 x half> %op1 to <8 x i64> 2287 store <8 x i64> %res, ptr %b 2288 ret void 2289} 2290 2291define void @fcvtzs_v16f16_v16i64(ptr %a, ptr %b) { 2292; CHECK-LABEL: fcvtzs_v16f16_v16i64: 2293; CHECK: // %bb.0: 2294; CHECK-NEXT: ldp q1, q0, [x0] 2295; CHECK-NEXT: ptrue p0.d 2296; CHECK-NEXT: mov z3.h, z1.h[1] 2297; CHECK-NEXT: mov z5.h, z0.h[3] 2298; CHECK-NEXT: mov z6.h, z0.h[2] 2299; CHECK-NEXT: mov z16.d, z0.d 2300; CHECK-NEXT: movprfx z2, z1 2301; CHECK-NEXT: fcvtzs z2.d, p0/m, z1.h 2302; CHECK-NEXT: mov z4.h, z1.h[3] 2303; CHECK-NEXT: mov z7.h, z1.h[2] 2304; CHECK-NEXT: mov z17.h, z0.h[1] 2305; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2306; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.h 2307; CHECK-NEXT: fcvtzs z5.d, p0/m, z5.h 2308; CHECK-NEXT: fcvtzs z6.d, p0/m, z6.h 2309; CHECK-NEXT: ext z16.b, z16.b, z0.b, #8 2310; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.h 2311; CHECK-NEXT: fcvtzs z4.d, p0/m, z4.h 2312; CHECK-NEXT: fcvtzs z17.d, p0/m, z17.h 2313; CHECK-NEXT: fcvtzs z7.d, p0/m, z7.h 2314; CHECK-NEXT: mov z20.h, z1.h[3] 2315; CHECK-NEXT: mov z18.h, z16.h[3] 2316; CHECK-NEXT: mov z19.h, z16.h[2] 2317; CHECK-NEXT: mov z21.h, z16.h[1] 2318; CHECK-NEXT: zip1 z2.d, z2.d, z3.d 2319; CHECK-NEXT: mov z3.h, z1.h[2] 2320; CHECK-NEXT: zip1 z5.d, z6.d, z5.d 2321; CHECK-NEXT: mov z6.h, z1.h[1] 2322; CHECK-NEXT: zip1 z0.d, z0.d, z17.d 2323; CHECK-NEXT: fcvtzs z16.d, p0/m, z16.h 2324; CHECK-NEXT: fcvtzs z18.d, p0/m, z18.h 2325; CHECK-NEXT: movprfx z17, z21 2326; CHECK-NEXT: fcvtzs z17.d, p0/m, z21.h 2327; CHECK-NEXT: fcvtzs z19.d, p0/m, z19.h 2328; CHECK-NEXT: zip1 z4.d, z7.d, z4.d 2329; CHECK-NEXT: movprfx z7, z20 2330; CHECK-NEXT: fcvtzs z7.d, p0/m, z20.h 2331; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.h 2332; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.h 2333; CHECK-NEXT: stp q0, q5, [x1, #64] 2334; CHECK-NEXT: fcvtzs z6.d, p0/m, z6.h 2335; CHECK-NEXT: zip1 z0.d, z19.d, z18.d 2336; CHECK-NEXT: zip1 z5.d, z16.d, z17.d 2337; CHECK-NEXT: stp q2, q4, [x1] 2338; CHECK-NEXT: zip1 z2.d, z3.d, z7.d 2339; CHECK-NEXT: zip1 z1.d, z1.d, z6.d 2340; CHECK-NEXT: stp q5, q0, [x1, #96] 2341; CHECK-NEXT: stp q1, q2, [x1, #32] 2342; CHECK-NEXT: ret 2343; 2344; NONEON-NOSVE-LABEL: fcvtzs_v16f16_v16i64: 2345; NONEON-NOSVE: // %bb.0: 2346; NONEON-NOSVE-NEXT: sub sp, sp, #192 2347; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 192 2348; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 2349; NONEON-NOSVE-NEXT: stp q0, q1, [sp] 2350; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2351; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2352; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 2353; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2354; NONEON-NOSVE-NEXT: ldr h0, [sp, #42] 2355; NONEON-NOSVE-NEXT: fcvt s0, h0 2356; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2357; NONEON-NOSVE-NEXT: ldr h0, [sp, #40] 2358; NONEON-NOSVE-NEXT: fcvt s0, h0 2359; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2360; NONEON-NOSVE-NEXT: ldr h0, [sp, #46] 2361; NONEON-NOSVE-NEXT: fcvt s0, h0 2362; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #96] 2363; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2364; NONEON-NOSVE-NEXT: ldr h0, [sp, #44] 2365; NONEON-NOSVE-NEXT: fcvt s0, h0 2366; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2367; NONEON-NOSVE-NEXT: ldr h0, [sp, #34] 2368; NONEON-NOSVE-NEXT: fcvt s0, h0 2369; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #112] 2370; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2371; NONEON-NOSVE-NEXT: ldr h0, [sp, #32] 2372; NONEON-NOSVE-NEXT: fcvt s0, h0 2373; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2374; NONEON-NOSVE-NEXT: ldr h0, [sp, #38] 2375; NONEON-NOSVE-NEXT: fcvt s0, h0 2376; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 2377; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2378; NONEON-NOSVE-NEXT: ldr h0, [sp, #36] 2379; NONEON-NOSVE-NEXT: fcvt s0, h0 2380; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2381; NONEON-NOSVE-NEXT: ldr h0, [sp, #58] 2382; NONEON-NOSVE-NEXT: fcvt s0, h0 2383; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #80] 2384; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #64] 2385; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2386; NONEON-NOSVE-NEXT: ldr h0, [sp, #56] 2387; NONEON-NOSVE-NEXT: fcvt s0, h0 2388; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2389; NONEON-NOSVE-NEXT: ldr h0, [sp, #62] 2390; NONEON-NOSVE-NEXT: fcvt s0, h0 2391; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #160] 2392; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2393; NONEON-NOSVE-NEXT: ldr h0, [sp, #60] 2394; NONEON-NOSVE-NEXT: fcvt s0, h0 2395; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2396; NONEON-NOSVE-NEXT: ldr h0, [sp, #50] 2397; NONEON-NOSVE-NEXT: fcvt s0, h0 2398; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #176] 2399; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #160] 2400; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2401; NONEON-NOSVE-NEXT: ldr h0, [sp, #48] 2402; NONEON-NOSVE-NEXT: fcvt s0, h0 2403; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2404; NONEON-NOSVE-NEXT: ldr h0, [sp, #54] 2405; NONEON-NOSVE-NEXT: fcvt s0, h0 2406; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #128] 2407; NONEON-NOSVE-NEXT: fcvtzs x9, s0 2408; NONEON-NOSVE-NEXT: ldr h0, [sp, #52] 2409; NONEON-NOSVE-NEXT: fcvt s0, h0 2410; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2411; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 2412; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #144] 2413; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #128] 2414; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 2415; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 2416; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 2417; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 2418; NONEON-NOSVE-NEXT: add sp, sp, #192 2419; NONEON-NOSVE-NEXT: ret 2420 %op1 = load <16 x half>, ptr %a 2421 %res = fptosi <16 x half> %op1 to <16 x i64> 2422 store <16 x i64> %res, ptr %b 2423 ret void 2424} 2425 2426; 2427; FCVTZS S -> H 2428; 2429 2430define <2 x i16> @fcvtzs_v2f32_v2i16(<2 x float> %op1) { 2431; CHECK-LABEL: fcvtzs_v2f32_v2i16: 2432; CHECK: // %bb.0: 2433; CHECK-NEXT: ptrue p0.s, vl2 2434; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2435; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2436; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2437; CHECK-NEXT: ret 2438; 2439; NONEON-NOSVE-LABEL: fcvtzs_v2f32_v2i16: 2440; NONEON-NOSVE: // %bb.0: 2441; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2442; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2443; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2444; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2445; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2446; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 2447; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2448; NONEON-NOSVE-NEXT: add sp, sp, #16 2449; NONEON-NOSVE-NEXT: ret 2450 %res = fptosi <2 x float> %op1 to <2 x i16> 2451 ret <2 x i16> %res 2452} 2453 2454define <4 x i16> @fcvtzs_v4f32_v4i16(<4 x float> %op1) { 2455; CHECK-LABEL: fcvtzs_v4f32_v4i16: 2456; CHECK: // %bb.0: 2457; CHECK-NEXT: ptrue p0.s, vl4 2458; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2459; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2460; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2461; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2462; CHECK-NEXT: ret 2463; 2464; NONEON-NOSVE-LABEL: fcvtzs_v4f32_v4i16: 2465; NONEON-NOSVE: // %bb.0: 2466; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2467; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2468; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 2469; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2470; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 2471; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2472; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2473; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 2474; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2475; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 2476; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2477; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 2478; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2479; NONEON-NOSVE-NEXT: add sp, sp, #32 2480; NONEON-NOSVE-NEXT: ret 2481 %res = fptosi <4 x float> %op1 to <4 x i16> 2482 ret <4 x i16> %res 2483} 2484 2485define <8 x i16> @fcvtzs_v8f32_v8i16(ptr %a) { 2486; CHECK-LABEL: fcvtzs_v8f32_v8i16: 2487; CHECK: // %bb.0: 2488; CHECK-NEXT: ldp q0, q1, [x0] 2489; CHECK-NEXT: ptrue p0.s, vl4 2490; CHECK-NEXT: fcvtzs z1.s, p0/m, z1.s 2491; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2492; CHECK-NEXT: ptrue p0.h, vl4 2493; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 2494; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2495; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 2496; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2497; CHECK-NEXT: ret 2498; 2499; NONEON-NOSVE-LABEL: fcvtzs_v8f32_v8i16: 2500; NONEON-NOSVE: // %bb.0: 2501; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2502; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 2503; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2504; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 2505; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2506; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2507; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2508; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 2509; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2510; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2511; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2512; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2513; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 2514; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2515; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2516; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2517; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2518; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2519; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2520; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2521; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2522; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2523; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2524; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2525; NONEON-NOSVE-NEXT: add sp, sp, #48 2526; NONEON-NOSVE-NEXT: ret 2527 %op1 = load <8 x float>, ptr %a 2528 %res = fptosi <8 x float> %op1 to <8 x i16> 2529 ret <8 x i16> %res 2530} 2531 2532define void @fcvtzs_v16f32_v16i16(ptr %a, ptr %b) { 2533; CHECK-LABEL: fcvtzs_v16f32_v16i16: 2534; CHECK: // %bb.0: 2535; CHECK-NEXT: ldp q0, q1, [x0, #32] 2536; CHECK-NEXT: ptrue p0.s, vl4 2537; CHECK-NEXT: ldp q2, q3, [x0] 2538; CHECK-NEXT: fcvtzs z1.s, p0/m, z1.s 2539; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2540; CHECK-NEXT: fcvtzs z3.s, p0/m, z3.s 2541; CHECK-NEXT: fcvtzs z2.s, p0/m, z2.s 2542; CHECK-NEXT: ptrue p0.h, vl4 2543; CHECK-NEXT: uzp1 z1.h, z1.h, z1.h 2544; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 2545; CHECK-NEXT: uzp1 z3.h, z3.h, z3.h 2546; CHECK-NEXT: uzp1 z2.h, z2.h, z2.h 2547; CHECK-NEXT: splice z0.h, p0, z0.h, z1.h 2548; CHECK-NEXT: splice z2.h, p0, z2.h, z3.h 2549; CHECK-NEXT: stp q2, q0, [x1] 2550; CHECK-NEXT: ret 2551; 2552; NONEON-NOSVE-LABEL: fcvtzs_v16f32_v16i16: 2553; NONEON-NOSVE: // %bb.0: 2554; NONEON-NOSVE-NEXT: sub sp, sp, #96 2555; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2556; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2557; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32] 2558; NONEON-NOSVE-NEXT: str q1, [sp] 2559; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16] 2560; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #40] 2561; NONEON-NOSVE-NEXT: str q2, [sp, #48] 2562; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2563; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 2564; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2565; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #32] 2566; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 2567; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2568; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 2569; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2570; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 2571; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 2572; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2573; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 2574; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2575; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2576; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 2577; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2578; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 2579; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2580; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 2581; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 2582; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2583; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 2584; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2585; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 2586; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 2587; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2588; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 2589; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2590; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #56] 2591; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 2592; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2593; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 2594; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2595; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #48] 2596; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 2597; NONEON-NOSVE-NEXT: fcvtzs w8, s1 2598; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 2599; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2600; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 2601; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64] 2602; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 2603; NONEON-NOSVE-NEXT: add sp, sp, #96 2604; NONEON-NOSVE-NEXT: ret 2605 %op1 = load <16 x float>, ptr %a 2606 %res = fptosi <16 x float> %op1 to <16 x i16> 2607 store <16 x i16> %res, ptr %b 2608 ret void 2609} 2610 2611; 2612; FCVTZS S -> S 2613; 2614 2615define <2 x i32> @fcvtzs_v2f32_v2i32(<2 x float> %op1) { 2616; CHECK-LABEL: fcvtzs_v2f32_v2i32: 2617; CHECK: // %bb.0: 2618; CHECK-NEXT: ptrue p0.s, vl2 2619; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2620; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2621; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2622; CHECK-NEXT: ret 2623; 2624; NONEON-NOSVE-LABEL: fcvtzs_v2f32_v2i32: 2625; NONEON-NOSVE: // %bb.0: 2626; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2627; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2628; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2629; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2630; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2631; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 2632; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2633; NONEON-NOSVE-NEXT: add sp, sp, #16 2634; NONEON-NOSVE-NEXT: ret 2635 %res = fptosi <2 x float> %op1 to <2 x i32> 2636 ret <2 x i32> %res 2637} 2638 2639define <4 x i32> @fcvtzs_v4f32_v4i32(<4 x float> %op1) { 2640; CHECK-LABEL: fcvtzs_v4f32_v4i32: 2641; CHECK: // %bb.0: 2642; CHECK-NEXT: ptrue p0.s, vl4 2643; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2644; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2645; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2646; CHECK-NEXT: ret 2647; 2648; NONEON-NOSVE-LABEL: fcvtzs_v4f32_v4i32: 2649; NONEON-NOSVE: // %bb.0: 2650; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2651; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2652; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 2653; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2654; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2655; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2656; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 2657; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2658; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2659; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 2660; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2661; NONEON-NOSVE-NEXT: add sp, sp, #32 2662; NONEON-NOSVE-NEXT: ret 2663 %res = fptosi <4 x float> %op1 to <4 x i32> 2664 ret <4 x i32> %res 2665} 2666 2667define void @fcvtzs_v8f32_v8i32(ptr %a, ptr %b) { 2668; CHECK-LABEL: fcvtzs_v8f32_v8i32: 2669; CHECK: // %bb.0: 2670; CHECK-NEXT: ldp q0, q1, [x0] 2671; CHECK-NEXT: ptrue p0.s, vl4 2672; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s 2673; CHECK-NEXT: fcvtzs z1.s, p0/m, z1.s 2674; CHECK-NEXT: stp q0, q1, [x1] 2675; CHECK-NEXT: ret 2676; 2677; NONEON-NOSVE-LABEL: fcvtzs_v8f32_v8i32: 2678; NONEON-NOSVE: // %bb.0: 2679; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2680; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2681; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2682; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 2683; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2684; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2685; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 2686; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 2687; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2688; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2689; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 2690; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 2691; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2692; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2693; NONEON-NOSVE-NEXT: ldp s0, s1, [sp] 2694; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 2695; NONEON-NOSVE-NEXT: fcvtzs w9, s1 2696; NONEON-NOSVE-NEXT: fcvtzs w8, s0 2697; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 2698; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2699; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 2700; NONEON-NOSVE-NEXT: add sp, sp, #64 2701; NONEON-NOSVE-NEXT: ret 2702 %op1 = load <8 x float>, ptr %a 2703 %res = fptosi <8 x float> %op1 to <8 x i32> 2704 store <8 x i32> %res, ptr %b 2705 ret void 2706} 2707 2708; 2709; FCVTZS S -> D 2710; 2711 2712define <1 x i64> @fcvtzs_v1f32_v1i64(<1 x float> %op1) { 2713; CHECK-LABEL: fcvtzs_v1f32_v1i64: 2714; CHECK: // %bb.0: 2715; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2716; CHECK-NEXT: ptrue p0.d, vl2 2717; CHECK-NEXT: uunpklo z0.d, z0.s 2718; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s 2719; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2720; CHECK-NEXT: ret 2721; 2722; NONEON-NOSVE-LABEL: fcvtzs_v1f32_v1i64: 2723; NONEON-NOSVE: // %bb.0: 2724; NONEON-NOSVE-NEXT: sub sp, sp, #16 2725; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2726; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2727; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2728; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2729; NONEON-NOSVE-NEXT: fmov d0, x8 2730; NONEON-NOSVE-NEXT: add sp, sp, #16 2731; NONEON-NOSVE-NEXT: ret 2732 %res = fptosi <1 x float> %op1 to <1 x i64> 2733 ret <1 x i64> %res 2734} 2735 2736define <2 x i64> @fcvtzs_v2f32_v2i64(<2 x float> %op1) { 2737; CHECK-LABEL: fcvtzs_v2f32_v2i64: 2738; CHECK: // %bb.0: 2739; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2740; CHECK-NEXT: ptrue p0.d, vl2 2741; CHECK-NEXT: uunpklo z0.d, z0.s 2742; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s 2743; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2744; CHECK-NEXT: ret 2745; 2746; NONEON-NOSVE-LABEL: fcvtzs_v2f32_v2i64: 2747; NONEON-NOSVE: // %bb.0: 2748; NONEON-NOSVE-NEXT: sub sp, sp, #32 2749; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2750; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2751; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #8] 2752; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2753; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2754; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 2755; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2756; NONEON-NOSVE-NEXT: add sp, sp, #32 2757; NONEON-NOSVE-NEXT: ret 2758 %res = fptosi <2 x float> %op1 to <2 x i64> 2759 ret <2 x i64> %res 2760} 2761 2762define void @fcvtzs_v4f32_v4i64(ptr %a, ptr %b) { 2763; CHECK-LABEL: fcvtzs_v4f32_v4i64: 2764; CHECK: // %bb.0: 2765; CHECK-NEXT: ldr q0, [x0] 2766; CHECK-NEXT: ptrue p0.d, vl2 2767; CHECK-NEXT: uunpklo z1.d, z0.s 2768; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2769; CHECK-NEXT: uunpklo z0.d, z0.s 2770; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.s 2771; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s 2772; CHECK-NEXT: stp q1, q0, [x1] 2773; CHECK-NEXT: ret 2774; 2775; NONEON-NOSVE-LABEL: fcvtzs_v4f32_v4i64: 2776; NONEON-NOSVE: // %bb.0: 2777; NONEON-NOSVE-NEXT: ldr q0, [x0] 2778; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 2779; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2780; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2781; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2782; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #24] 2783; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2784; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2785; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #16] 2786; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 2787; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2788; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2789; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 2790; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2791; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 2792; NONEON-NOSVE-NEXT: add sp, sp, #64 2793; NONEON-NOSVE-NEXT: ret 2794 %op1 = load <4 x float>, ptr %a 2795 %res = fptosi <4 x float> %op1 to <4 x i64> 2796 store <4 x i64> %res, ptr %b 2797 ret void 2798} 2799 2800define void @fcvtzs_v8f32_v8i64(ptr %a, ptr %b) { 2801; CHECK-LABEL: fcvtzs_v8f32_v8i64: 2802; CHECK: // %bb.0: 2803; CHECK-NEXT: ldp q1, q0, [x0] 2804; CHECK-NEXT: ptrue p0.d, vl2 2805; CHECK-NEXT: uunpklo z2.d, z0.s 2806; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2807; CHECK-NEXT: uunpklo z3.d, z1.s 2808; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2809; CHECK-NEXT: uunpklo z0.d, z0.s 2810; CHECK-NEXT: uunpklo z1.d, z1.s 2811; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.s 2812; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.s 2813; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.s 2814; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.s 2815; CHECK-NEXT: stp q2, q0, [x1, #32] 2816; CHECK-NEXT: stp q3, q1, [x1] 2817; CHECK-NEXT: ret 2818; 2819; NONEON-NOSVE-LABEL: fcvtzs_v8f32_v8i64: 2820; NONEON-NOSVE: // %bb.0: 2821; NONEON-NOSVE-NEXT: ldp q0, q1, [x0] 2822; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-128]! 2823; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 128 2824; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2825; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2826; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 2827; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2828; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #40] 2829; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2830; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2831; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #32] 2832; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #80] 2833; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2834; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2835; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #56] 2836; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 2837; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2838; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2839; NONEON-NOSVE-NEXT: ldp s0, s1, [sp, #48] 2840; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64] 2841; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #112] 2842; NONEON-NOSVE-NEXT: fcvtzs x9, s1 2843; NONEON-NOSVE-NEXT: fcvtzs x8, s0 2844; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #96] 2845; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 2846; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 2847; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 2848; NONEON-NOSVE-NEXT: add sp, sp, #128 2849; NONEON-NOSVE-NEXT: ret 2850 %op1 = load <8 x float>, ptr %a 2851 %res = fptosi <8 x float> %op1 to <8 x i64> 2852 store <8 x i64> %res, ptr %b 2853 ret void 2854} 2855 2856 2857; 2858; FCVTZS D -> H 2859; 2860 2861; v1f64 is perfered to be widened to v4f64, so use SVE 2862define <1 x i16> @fcvtzs_v1f64_v1i16(<1 x double> %op1) { 2863; CHECK-LABEL: fcvtzs_v1f64_v1i16: 2864; CHECK: // %bb.0: 2865; CHECK-NEXT: fcvtzs w8, d0 2866; CHECK-NEXT: mov z0.h, w8 2867; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2868; CHECK-NEXT: ret 2869; 2870; NONEON-NOSVE-LABEL: fcvtzs_v1f64_v1i16: 2871; NONEON-NOSVE: // %bb.0: 2872; NONEON-NOSVE-NEXT: sub sp, sp, #16 2873; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2874; NONEON-NOSVE-NEXT: fcvtzs w8, d0 2875; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 2876; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2877; NONEON-NOSVE-NEXT: add sp, sp, #16 2878; NONEON-NOSVE-NEXT: ret 2879 %res = fptosi <1 x double> %op1 to <1 x i16> 2880 ret <1 x i16> %res 2881} 2882 2883define <2 x i16> @fcvtzs_v2f64_v2i16(<2 x double> %op1) { 2884; CHECK-LABEL: fcvtzs_v2f64_v2i16: 2885; CHECK: // %bb.0: 2886; CHECK-NEXT: ptrue p0.d, vl2 2887; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2888; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 2889; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 2890; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2891; CHECK-NEXT: ret 2892; 2893; NONEON-NOSVE-LABEL: fcvtzs_v2f64_v2i16: 2894; NONEON-NOSVE: // %bb.0: 2895; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2896; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2897; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 2898; NONEON-NOSVE-NEXT: fcvtzs w9, d1 2899; NONEON-NOSVE-NEXT: fcvtzs w8, d0 2900; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 2901; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2902; NONEON-NOSVE-NEXT: add sp, sp, #32 2903; NONEON-NOSVE-NEXT: ret 2904 %res = fptosi <2 x double> %op1 to <2 x i16> 2905 ret <2 x i16> %res 2906} 2907 2908define <4 x i16> @fcvtzs_v4f64_v4i16(ptr %a) { 2909; CHECK-LABEL: fcvtzs_v4f64_v4i16: 2910; CHECK: // %bb.0: 2911; CHECK-NEXT: ldp q0, q1, [x0] 2912; CHECK-NEXT: ptrue p0.d, vl2 2913; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 2914; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 2915; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 2916; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 2917; CHECK-NEXT: mov z2.s, z1.s[1] 2918; CHECK-NEXT: mov z3.s, z0.s[1] 2919; CHECK-NEXT: zip1 z1.h, z1.h, z2.h 2920; CHECK-NEXT: zip1 z0.h, z0.h, z3.h 2921; CHECK-NEXT: zip1 z0.s, z0.s, z1.s 2922; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2923; CHECK-NEXT: ret 2924; 2925; NONEON-NOSVE-LABEL: fcvtzs_v4f64_v4i16: 2926; NONEON-NOSVE: // %bb.0: 2927; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2928; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-80]! 2929; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 2930; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 2931; NONEON-NOSVE-NEXT: fcvtzs w9, d1 2932; NONEON-NOSVE-NEXT: fcvtzs w8, d0 2933; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 2934; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 2935; NONEON-NOSVE-NEXT: fcvtzs w9, d1 2936; NONEON-NOSVE-NEXT: fcvtzs w8, d0 2937; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 2938; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #40] 2939; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #56] 2940; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #64] 2941; NONEON-NOSVE-NEXT: strh w9, [sp, #78] 2942; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 2943; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #56] 2944; NONEON-NOSVE-NEXT: strh w9, [sp, #74] 2945; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 2946; NONEON-NOSVE-NEXT: ldr d0, [sp, #72] 2947; NONEON-NOSVE-NEXT: add sp, sp, #80 2948; NONEON-NOSVE-NEXT: ret 2949 %op1 = load <4 x double>, ptr %a 2950 %res = fptosi <4 x double> %op1 to <4 x i16> 2951 ret <4 x i16> %res 2952} 2953 2954define <8 x i16> @fcvtzs_v8f64_v8i16(ptr %a) { 2955; CHECK-LABEL: fcvtzs_v8f64_v8i16: 2956; CHECK: // %bb.0: 2957; CHECK-NEXT: ldp q1, q0, [x0, #32] 2958; CHECK-NEXT: ptrue p0.d, vl2 2959; CHECK-NEXT: ldp q2, q3, [x0] 2960; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 2961; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 2962; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.d 2963; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.d 2964; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 2965; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 2966; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 2967; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 2968; CHECK-NEXT: mov z4.s, z0.s[1] 2969; CHECK-NEXT: mov z5.s, z1.s[1] 2970; CHECK-NEXT: mov z6.s, z3.s[1] 2971; CHECK-NEXT: mov z7.s, z2.s[1] 2972; CHECK-NEXT: zip1 z0.h, z0.h, z4.h 2973; CHECK-NEXT: zip1 z1.h, z1.h, z5.h 2974; CHECK-NEXT: zip1 z3.h, z3.h, z6.h 2975; CHECK-NEXT: zip1 z2.h, z2.h, z7.h 2976; CHECK-NEXT: zip1 z0.s, z1.s, z0.s 2977; CHECK-NEXT: zip1 z1.s, z2.s, z3.s 2978; CHECK-NEXT: zip1 z0.d, z1.d, z0.d 2979; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2980; CHECK-NEXT: ret 2981; 2982; NONEON-NOSVE-LABEL: fcvtzs_v8f64_v8i16: 2983; NONEON-NOSVE: // %bb.0: 2984; NONEON-NOSVE-NEXT: sub sp, sp, #144 2985; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 144 2986; NONEON-NOSVE-NEXT: ldp q1, q0, [x0, #32] 2987; NONEON-NOSVE-NEXT: ldp q2, q3, [x0] 2988; NONEON-NOSVE-NEXT: str q1, [sp, #48] 2989; NONEON-NOSVE-NEXT: stp q0, q3, [sp, #16] 2990; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 2991; NONEON-NOSVE-NEXT: str q2, [sp] 2992; NONEON-NOSVE-NEXT: fcvtzs w9, d1 2993; NONEON-NOSVE-NEXT: fcvtzs w8, d0 2994; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 2995; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 2996; NONEON-NOSVE-NEXT: fcvtzs w9, d1 2997; NONEON-NOSVE-NEXT: fcvtzs w8, d0 2998; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 2999; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 3000; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3001; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3002; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3003; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 3004; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3005; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3006; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #80] 3007; NONEON-NOSVE-NEXT: ldr d1, [sp, #72] 3008; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #104] 3009; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 3010; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #104] 3011; NONEON-NOSVE-NEXT: str d2, [sp, #120] 3012; NONEON-NOSVE-NEXT: ldr d0, [sp, #64] 3013; NONEON-NOSVE-NEXT: strh w9, [sp, #142] 3014; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 3015; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #120] 3016; NONEON-NOSVE-NEXT: str d0, [sp, #96] 3017; NONEON-NOSVE-NEXT: strh w9, [sp, #138] 3018; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 3019; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #112] 3020; NONEON-NOSVE-NEXT: strh w9, [sp, #134] 3021; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 3022; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #96] 3023; NONEON-NOSVE-NEXT: strh w9, [sp, #130] 3024; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 3025; NONEON-NOSVE-NEXT: ldr q0, [sp, #128] 3026; NONEON-NOSVE-NEXT: add sp, sp, #144 3027; NONEON-NOSVE-NEXT: ret 3028 %op1 = load <8 x double>, ptr %a 3029 %res = fptosi <8 x double> %op1 to <8 x i16> 3030 ret <8 x i16> %res 3031} 3032 3033define void @fcvtzs_v16f64_v16i16(ptr %a, ptr %b) { 3034; CHECK-LABEL: fcvtzs_v16f64_v16i16: 3035; CHECK: // %bb.0: 3036; CHECK-NEXT: ldp q5, q6, [x0, #96] 3037; CHECK-NEXT: ptrue p0.d, vl2 3038; CHECK-NEXT: ldp q0, q4, [x0, #32] 3039; CHECK-NEXT: ldp q2, q7, [x0, #64] 3040; CHECK-NEXT: ldp q1, q3, [x0] 3041; CHECK-NEXT: fcvtzs z6.d, p0/m, z6.d 3042; CHECK-NEXT: fcvtzs z4.d, p0/m, z4.d 3043; CHECK-NEXT: fcvtzs z5.d, p0/m, z5.d 3044; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3045; CHECK-NEXT: fcvtzs z7.d, p0/m, z7.d 3046; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.d 3047; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.d 3048; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 3049; CHECK-NEXT: uzp1 z6.s, z6.s, z6.s 3050; CHECK-NEXT: uzp1 z4.s, z4.s, z4.s 3051; CHECK-NEXT: uzp1 z5.s, z5.s, z5.s 3052; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 3053; CHECK-NEXT: uzp1 z7.s, z7.s, z7.s 3054; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 3055; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 3056; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 3057; CHECK-NEXT: mov z17.s, z6.s[1] 3058; CHECK-NEXT: mov z16.s, z4.s[1] 3059; CHECK-NEXT: mov z18.s, z5.s[1] 3060; CHECK-NEXT: mov z21.s, z0.s[1] 3061; CHECK-NEXT: mov z19.s, z7.s[1] 3062; CHECK-NEXT: mov z20.s, z2.s[1] 3063; CHECK-NEXT: mov z22.s, z3.s[1] 3064; CHECK-NEXT: mov z23.s, z1.s[1] 3065; CHECK-NEXT: zip1 z6.h, z6.h, z17.h 3066; CHECK-NEXT: zip1 z4.h, z4.h, z16.h 3067; CHECK-NEXT: zip1 z5.h, z5.h, z18.h 3068; CHECK-NEXT: zip1 z0.h, z0.h, z21.h 3069; CHECK-NEXT: zip1 z7.h, z7.h, z19.h 3070; CHECK-NEXT: zip1 z2.h, z2.h, z20.h 3071; CHECK-NEXT: zip1 z3.h, z3.h, z22.h 3072; CHECK-NEXT: zip1 z1.h, z1.h, z23.h 3073; CHECK-NEXT: zip1 z5.s, z5.s, z6.s 3074; CHECK-NEXT: zip1 z0.s, z0.s, z4.s 3075; CHECK-NEXT: zip1 z2.s, z2.s, z7.s 3076; CHECK-NEXT: zip1 z1.s, z1.s, z3.s 3077; CHECK-NEXT: zip1 z2.d, z2.d, z5.d 3078; CHECK-NEXT: zip1 z0.d, z1.d, z0.d 3079; CHECK-NEXT: stp q0, q2, [x1] 3080; CHECK-NEXT: ret 3081; 3082; NONEON-NOSVE-LABEL: fcvtzs_v16f64_v16i16: 3083; NONEON-NOSVE: // %bb.0: 3084; NONEON-NOSVE-NEXT: sub sp, sp, #304 3085; NONEON-NOSVE-NEXT: str x29, [sp, #288] // 8-byte Folded Spill 3086; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 304 3087; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 3088; NONEON-NOSVE-NEXT: ldp q0, q1, [x0, #32] 3089; NONEON-NOSVE-NEXT: ldr x29, [sp, #288] // 8-byte Folded Reload 3090; NONEON-NOSVE-NEXT: ldp q6, q7, [x0] 3091; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #64] 3092; NONEON-NOSVE-NEXT: ldp q4, q5, [x0, #96] 3093; NONEON-NOSVE-NEXT: stp q1, q7, [sp, #64] 3094; NONEON-NOSVE-NEXT: stp q0, q2, [sp, #96] 3095; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 3096; NONEON-NOSVE-NEXT: stp q6, q4, [sp] 3097; NONEON-NOSVE-NEXT: stp q5, q3, [sp, #32] 3098; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3099; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3100; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #96] 3101; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #168] 3102; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3103; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3104; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #80] 3105; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #184] 3106; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3107; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3108; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3109; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #176] 3110; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3111; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3112; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 3113; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 3114; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3115; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3116; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 3117; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 3118; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3119; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3120; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 3121; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 3122; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3123; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3124; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #112] 3125; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160] 3126; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3127; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3128; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #176] 3129; NONEON-NOSVE-NEXT: ldr d1, [sp, #168] 3130; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #232] 3131; NONEON-NOSVE-NEXT: ldr d1, [sp, #136] 3132; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #192] 3133; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #232] 3134; NONEON-NOSVE-NEXT: str d2, [sp, #248] 3135; NONEON-NOSVE-NEXT: ldp d0, d2, [sp, #144] 3136; NONEON-NOSVE-NEXT: strh w9, [sp, #270] 3137; NONEON-NOSVE-NEXT: strh w8, [sp, #268] 3138; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #248] 3139; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #200] 3140; NONEON-NOSVE-NEXT: ldr d0, [sp, #160] 3141; NONEON-NOSVE-NEXT: strh w9, [sp, #266] 3142; NONEON-NOSVE-NEXT: strh w8, [sp, #264] 3143; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #240] 3144; NONEON-NOSVE-NEXT: stp d2, d0, [sp, #216] 3145; NONEON-NOSVE-NEXT: ldr d0, [sp, #192] 3146; NONEON-NOSVE-NEXT: strh w9, [sp, #262] 3147; NONEON-NOSVE-NEXT: strh w8, [sp, #260] 3148; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #200] 3149; NONEON-NOSVE-NEXT: str d0, [sp, #296] 3150; NONEON-NOSVE-NEXT: strh w9, [sp, #258] 3151; NONEON-NOSVE-NEXT: strh w8, [sp, #256] 3152; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #216] 3153; NONEON-NOSVE-NEXT: strh w9, [sp, #286] 3154; NONEON-NOSVE-NEXT: strh w8, [sp, #284] 3155; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #208] 3156; NONEON-NOSVE-NEXT: strh w9, [sp, #282] 3157; NONEON-NOSVE-NEXT: strh w8, [sp, #280] 3158; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #224] 3159; NONEON-NOSVE-NEXT: strh w8, [sp, #276] 3160; NONEON-NOSVE-NEXT: ldr w8, [sp, #300] 3161; NONEON-NOSVE-NEXT: strh w9, [sp, #278] 3162; NONEON-NOSVE-NEXT: strh w8, [sp, #274] 3163; NONEON-NOSVE-NEXT: ldr w8, [sp, #296] 3164; NONEON-NOSVE-NEXT: strh w8, [sp, #272] 3165; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #256] 3166; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 3167; NONEON-NOSVE-NEXT: add sp, sp, #304 3168; NONEON-NOSVE-NEXT: ret 3169 %op1 = load <16 x double>, ptr %a 3170 %res = fptosi <16 x double> %op1 to <16 x i16> 3171 store <16 x i16> %res, ptr %b 3172 ret void 3173} 3174 3175; 3176; FCVTZS D -> S 3177; 3178 3179define <1 x i32> @fcvtzs_v1f64_v1i32(<1 x double> %op1) { 3180; CHECK-LABEL: fcvtzs_v1f64_v1i32: 3181; CHECK: // %bb.0: 3182; CHECK-NEXT: ptrue p0.d, vl2 3183; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 3184; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3185; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 3186; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3187; CHECK-NEXT: ret 3188; 3189; NONEON-NOSVE-LABEL: fcvtzs_v1f64_v1i32: 3190; NONEON-NOSVE: // %bb.0: 3191; NONEON-NOSVE-NEXT: sub sp, sp, #16 3192; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 3193; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3194; NONEON-NOSVE-NEXT: str w8, [sp, #8] 3195; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 3196; NONEON-NOSVE-NEXT: add sp, sp, #16 3197; NONEON-NOSVE-NEXT: ret 3198 %res = fptosi <1 x double> %op1 to <1 x i32> 3199 ret <1 x i32> %res 3200} 3201 3202define <2 x i32> @fcvtzs_v2f64_v2i32(<2 x double> %op1) { 3203; CHECK-LABEL: fcvtzs_v2f64_v2i32: 3204; CHECK: // %bb.0: 3205; CHECK-NEXT: ptrue p0.d, vl2 3206; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3207; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3208; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 3209; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3210; CHECK-NEXT: ret 3211; 3212; NONEON-NOSVE-LABEL: fcvtzs_v2f64_v2i32: 3213; NONEON-NOSVE: // %bb.0: 3214; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 3215; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 3216; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3217; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3218; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3219; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 3220; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 3221; NONEON-NOSVE-NEXT: add sp, sp, #32 3222; NONEON-NOSVE-NEXT: ret 3223 %res = fptosi <2 x double> %op1 to <2 x i32> 3224 ret <2 x i32> %res 3225} 3226 3227define <4 x i32> @fcvtzs_v4f64_v4i32(ptr %a) { 3228; CHECK-LABEL: fcvtzs_v4f64_v4i32: 3229; CHECK: // %bb.0: 3230; CHECK-NEXT: ldp q0, q1, [x0] 3231; CHECK-NEXT: ptrue p0.d, vl2 3232; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 3233; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3234; CHECK-NEXT: ptrue p0.s, vl2 3235; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 3236; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 3237; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 3238; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 3239; CHECK-NEXT: ret 3240; 3241; NONEON-NOSVE-LABEL: fcvtzs_v4f64_v4i32: 3242; NONEON-NOSVE: // %bb.0: 3243; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3244; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-48]! 3245; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 3246; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 3247; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3248; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3249; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3250; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 3251; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3252; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3253; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 3254; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 3255; NONEON-NOSVE-NEXT: add sp, sp, #48 3256; NONEON-NOSVE-NEXT: ret 3257 %op1 = load <4 x double>, ptr %a 3258 %res = fptosi <4 x double> %op1 to <4 x i32> 3259 ret <4 x i32> %res 3260} 3261 3262define void @fcvtzs_v8f64_v8i32(ptr %a, ptr %b) { 3263; CHECK-LABEL: fcvtzs_v8f64_v8i32: 3264; CHECK: // %bb.0: 3265; CHECK-NEXT: ldp q0, q1, [x0, #32] 3266; CHECK-NEXT: ptrue p0.d, vl2 3267; CHECK-NEXT: ldp q2, q3, [x0] 3268; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 3269; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3270; CHECK-NEXT: fcvtzs z3.d, p0/m, z3.d 3271; CHECK-NEXT: fcvtzs z2.d, p0/m, z2.d 3272; CHECK-NEXT: ptrue p0.s, vl2 3273; CHECK-NEXT: uzp1 z1.s, z1.s, z1.s 3274; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 3275; CHECK-NEXT: uzp1 z3.s, z3.s, z3.s 3276; CHECK-NEXT: uzp1 z2.s, z2.s, z2.s 3277; CHECK-NEXT: splice z0.s, p0, z0.s, z1.s 3278; CHECK-NEXT: splice z2.s, p0, z2.s, z3.s 3279; CHECK-NEXT: stp q2, q0, [x1] 3280; CHECK-NEXT: ret 3281; 3282; NONEON-NOSVE-LABEL: fcvtzs_v8f64_v8i32: 3283; NONEON-NOSVE: // %bb.0: 3284; NONEON-NOSVE-NEXT: sub sp, sp, #96 3285; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 3286; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3287; NONEON-NOSVE-NEXT: ldp q2, q3, [x0, #32] 3288; NONEON-NOSVE-NEXT: str q1, [sp] 3289; NONEON-NOSVE-NEXT: stp q3, q0, [sp, #16] 3290; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 3291; NONEON-NOSVE-NEXT: str q2, [sp, #48] 3292; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3293; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3294; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3295; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 3296; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3297; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3298; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 3299; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 3300; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3301; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3302; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 3303; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88] 3304; NONEON-NOSVE-NEXT: fcvtzs w9, d1 3305; NONEON-NOSVE-NEXT: fcvtzs w8, d0 3306; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80] 3307; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64] 3308; NONEON-NOSVE-NEXT: stp q1, q0, [x1] 3309; NONEON-NOSVE-NEXT: add sp, sp, #96 3310; NONEON-NOSVE-NEXT: ret 3311 %op1 = load <8 x double>, ptr %a 3312 %res = fptosi <8 x double> %op1 to <8 x i32> 3313 store <8 x i32> %res, ptr %b 3314 ret void 3315} 3316 3317; 3318; FCVTZS D -> D 3319; 3320 3321define <1 x i64> @fcvtzs_v1f64_v1i64(<1 x double> %op1) { 3322; CHECK-LABEL: fcvtzs_v1f64_v1i64: 3323; CHECK: // %bb.0: 3324; CHECK-NEXT: ptrue p0.d, vl1 3325; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 3326; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3327; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3328; CHECK-NEXT: ret 3329; 3330; NONEON-NOSVE-LABEL: fcvtzs_v1f64_v1i64: 3331; NONEON-NOSVE: // %bb.0: 3332; NONEON-NOSVE-NEXT: sub sp, sp, #16 3333; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 3334; NONEON-NOSVE-NEXT: fcvtzs x8, d0 3335; NONEON-NOSVE-NEXT: str x8, [sp, #8] 3336; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 3337; NONEON-NOSVE-NEXT: add sp, sp, #16 3338; NONEON-NOSVE-NEXT: ret 3339 %res = fptosi <1 x double> %op1 to <1 x i64> 3340 ret <1 x i64> %res 3341} 3342 3343define <2 x i64> @fcvtzs_v2f64_v2i64(<2 x double> %op1) { 3344; CHECK-LABEL: fcvtzs_v2f64_v2i64: 3345; CHECK: // %bb.0: 3346; CHECK-NEXT: ptrue p0.d, vl2 3347; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3348; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3349; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 3350; CHECK-NEXT: ret 3351; 3352; NONEON-NOSVE-LABEL: fcvtzs_v2f64_v2i64: 3353; NONEON-NOSVE: // %bb.0: 3354; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 3355; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 3356; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3357; NONEON-NOSVE-NEXT: fcvtzs x9, d1 3358; NONEON-NOSVE-NEXT: fcvtzs x8, d0 3359; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 3360; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 3361; NONEON-NOSVE-NEXT: add sp, sp, #32 3362; NONEON-NOSVE-NEXT: ret 3363 %res = fptosi <2 x double> %op1 to <2 x i64> 3364 ret <2 x i64> %res 3365} 3366 3367define void @fcvtzs_v4f64_v4i64(ptr %a, ptr %b) { 3368; CHECK-LABEL: fcvtzs_v4f64_v4i64: 3369; CHECK: // %bb.0: 3370; CHECK-NEXT: ldp q0, q1, [x0] 3371; CHECK-NEXT: ptrue p0.d, vl2 3372; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d 3373; CHECK-NEXT: fcvtzs z1.d, p0/m, z1.d 3374; CHECK-NEXT: stp q0, q1, [x1] 3375; CHECK-NEXT: ret 3376; 3377; NONEON-NOSVE-LABEL: fcvtzs_v4f64_v4i64: 3378; NONEON-NOSVE: // %bb.0: 3379; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3380; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 3381; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 3382; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 3383; NONEON-NOSVE-NEXT: fcvtzs x9, d1 3384; NONEON-NOSVE-NEXT: fcvtzs x8, d0 3385; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 3386; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 3387; NONEON-NOSVE-NEXT: fcvtzs x9, d1 3388; NONEON-NOSVE-NEXT: fcvtzs x8, d0 3389; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 3390; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 3391; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 3392; NONEON-NOSVE-NEXT: add sp, sp, #64 3393; NONEON-NOSVE-NEXT: ret 3394 %op1 = load <4 x double>, ptr %a 3395 %res = fptosi <4 x double> %op1 to <4 x i64> 3396 store <4 x i64> %res, ptr %b 3397 ret void 3398} 3399