1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \ 5; RUN: -verify-machineinstrs < %s | FileCheck -check-prefix=CHECK-PWR8 %s 6 7; ========================================== 8; Tests for store of fp_to_sint converstions 9; ========================================== 10 11; Function Attrs: norecurse nounwind 12define void @qpConv2sdw(fp128* nocapture readonly %a, i64* nocapture %b) { 13; CHECK-LABEL: qpConv2sdw: 14; CHECK: # %bb.0: # %entry 15; CHECK-NEXT: lxv 2, 0(3) 16; CHECK-NEXT: xscvqpsdz 2, 2 17; CHECK-NEXT: stxsd 2, 0(4) 18; CHECK-NEXT: blr 19; 20; CHECK-PWR8-LABEL: qpConv2sdw: 21; CHECK-PWR8: # %bb.0: # %entry 22; CHECK-PWR8-NEXT: mflr 0 23; CHECK-PWR8-NEXT: .cfi_def_cfa_offset 48 24; CHECK-PWR8-NEXT: .cfi_offset lr, 16 25; CHECK-PWR8-NEXT: .cfi_offset r30, -16 26; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill 27; CHECK-PWR8-NEXT: std 0, 16(1) 28; CHECK-PWR8-NEXT: stdu 1, -48(1) 29; CHECK-PWR8-NEXT: lvx 2, 0, 3 30; CHECK-PWR8-NEXT: mr 30, 4 31; CHECK-PWR8-NEXT: bl __fixkfdi 32; CHECK-PWR8-NEXT: nop 33; CHECK-PWR8-NEXT: std 3, 0(30) 34; CHECK-PWR8-NEXT: addi 1, 1, 48 35; CHECK-PWR8-NEXT: ld 0, 16(1) 36; CHECK-PWR8-NEXT: ld 30, -16(1) # 8-byte Folded Reload 37; CHECK-PWR8-NEXT: mtlr 0 38; CHECK-PWR8-NEXT: blr 39entry: 40 %0 = load fp128, fp128* %a, align 16 41 %conv = fptosi fp128 %0 to i64 42 store i64 %conv, i64* %b, align 8 43 ret void 44 45 46} 47 48; Function Attrs: norecurse nounwind 49define void @qpConv2sw(fp128* nocapture readonly %a, i32* nocapture %b) { 50; CHECK-LABEL: qpConv2sw: 51; CHECK: # %bb.0: # %entry 52; CHECK-NEXT: lxv 2, 0(3) 53; CHECK-NEXT: xscvqpswz 2, 2 54; CHECK-NEXT: stxsiwx 2, 0, 4 55; CHECK-NEXT: blr 56; 57; CHECK-PWR8-LABEL: qpConv2sw: 58; CHECK-PWR8: # %bb.0: # %entry 59; CHECK-PWR8-NEXT: mflr 0 60; CHECK-PWR8-NEXT: .cfi_def_cfa_offset 48 61; CHECK-PWR8-NEXT: .cfi_offset lr, 16 62; CHECK-PWR8-NEXT: .cfi_offset r30, -16 63; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill 64; CHECK-PWR8-NEXT: std 0, 16(1) 65; CHECK-PWR8-NEXT: stdu 1, -48(1) 66; CHECK-PWR8-NEXT: lvx 2, 0, 3 67; CHECK-PWR8-NEXT: mr 30, 4 68; CHECK-PWR8-NEXT: bl __fixkfsi 69; CHECK-PWR8-NEXT: nop 70; CHECK-PWR8-NEXT: stw 3, 0(30) 71; CHECK-PWR8-NEXT: addi 1, 1, 48 72; CHECK-PWR8-NEXT: ld 0, 16(1) 73; CHECK-PWR8-NEXT: ld 30, -16(1) # 8-byte Folded Reload 74; CHECK-PWR8-NEXT: mtlr 0 75; CHECK-PWR8-NEXT: blr 76entry: 77 %0 = load fp128, fp128* %a, align 16 78 %conv = fptosi fp128 %0 to i32 79 store i32 %conv, i32* %b, align 4 80 ret void 81 82 83} 84 85; Function Attrs: norecurse nounwind 86define void @qpConv2udw(fp128* nocapture readonly %a, i64* nocapture %b) { 87; CHECK-LABEL: qpConv2udw: 88; CHECK: # %bb.0: # %entry 89; CHECK-NEXT: lxv 2, 0(3) 90; CHECK-NEXT: xscvqpudz 2, 2 91; CHECK-NEXT: stxsd 2, 0(4) 92; CHECK-NEXT: blr 93; 94; CHECK-PWR8-LABEL: qpConv2udw: 95; CHECK-PWR8: # %bb.0: # %entry 96; CHECK-PWR8-NEXT: mflr 0 97; CHECK-PWR8-NEXT: .cfi_def_cfa_offset 48 98; CHECK-PWR8-NEXT: .cfi_offset lr, 16 99; CHECK-PWR8-NEXT: .cfi_offset r30, -16 100; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill 101; CHECK-PWR8-NEXT: std 0, 16(1) 102; CHECK-PWR8-NEXT: stdu 1, -48(1) 103; CHECK-PWR8-NEXT: lvx 2, 0, 3 104; CHECK-PWR8-NEXT: mr 30, 4 105; CHECK-PWR8-NEXT: bl __fixunskfdi 106; CHECK-PWR8-NEXT: nop 107; CHECK-PWR8-NEXT: std 3, 0(30) 108; CHECK-PWR8-NEXT: addi 1, 1, 48 109; CHECK-PWR8-NEXT: ld 0, 16(1) 110; CHECK-PWR8-NEXT: ld 30, -16(1) # 8-byte Folded Reload 111; CHECK-PWR8-NEXT: mtlr 0 112; CHECK-PWR8-NEXT: blr 113entry: 114 %0 = load fp128, fp128* %a, align 16 115 %conv = fptoui fp128 %0 to i64 116 store i64 %conv, i64* %b, align 8 117 ret void 118 119 120} 121 122; Function Attrs: norecurse nounwind 123define void @qpConv2uw(fp128* nocapture readonly %a, i32* nocapture %b) { 124; CHECK-LABEL: qpConv2uw: 125; CHECK: # %bb.0: # %entry 126; CHECK-NEXT: lxv 2, 0(3) 127; CHECK-NEXT: xscvqpuwz 2, 2 128; CHECK-NEXT: stxsiwx 2, 0, 4 129; CHECK-NEXT: blr 130; 131; CHECK-PWR8-LABEL: qpConv2uw: 132; CHECK-PWR8: # %bb.0: # %entry 133; CHECK-PWR8-NEXT: mflr 0 134; CHECK-PWR8-NEXT: .cfi_def_cfa_offset 48 135; CHECK-PWR8-NEXT: .cfi_offset lr, 16 136; CHECK-PWR8-NEXT: .cfi_offset r30, -16 137; CHECK-PWR8-NEXT: std 30, -16(1) # 8-byte Folded Spill 138; CHECK-PWR8-NEXT: std 0, 16(1) 139; CHECK-PWR8-NEXT: stdu 1, -48(1) 140; CHECK-PWR8-NEXT: lvx 2, 0, 3 141; CHECK-PWR8-NEXT: mr 30, 4 142; CHECK-PWR8-NEXT: bl __fixunskfsi 143; CHECK-PWR8-NEXT: nop 144; CHECK-PWR8-NEXT: stw 3, 0(30) 145; CHECK-PWR8-NEXT: addi 1, 1, 48 146; CHECK-PWR8-NEXT: ld 0, 16(1) 147; CHECK-PWR8-NEXT: ld 30, -16(1) # 8-byte Folded Reload 148; CHECK-PWR8-NEXT: mtlr 0 149; CHECK-PWR8-NEXT: blr 150entry: 151 %0 = load fp128, fp128* %a, align 16 152 %conv = fptoui fp128 %0 to i32 153 store i32 %conv, i32* %b, align 4 154 ret void 155 156 157} 158 159; Function Attrs: norecurse nounwind 160define void @dpConv2sdw(double* nocapture readonly %a, i64* nocapture %b) { 161; CHECK-LABEL: dpConv2sdw: 162; CHECK: # %bb.0: # %entry 163; CHECK-NEXT: lfd 0, 0(3) 164; CHECK-NEXT: xscvdpsxds 2, 0 165; CHECK-NEXT: stxsd 2, 0(4) 166; CHECK-NEXT: blr 167; 168; CHECK-PWR8-LABEL: dpConv2sdw: 169; CHECK-PWR8: # %bb.0: # %entry 170; CHECK-PWR8-NEXT: lfdx 0, 0, 3 171; CHECK-PWR8-NEXT: xscvdpsxds 0, 0 172; CHECK-PWR8-NEXT: stxsdx 0, 0, 4 173; CHECK-PWR8-NEXT: blr 174entry: 175 %0 = load double, double* %a, align 8 176 %conv = fptosi double %0 to i64 177 store i64 %conv, i64* %b, align 8 178 ret void 179 180 181} 182 183; Function Attrs: norecurse nounwind 184define void @dpConv2sw(double* nocapture readonly %a, i32* nocapture %b) { 185; CHECK-LABEL: dpConv2sw: 186; CHECK: # %bb.0: # %entry 187; CHECK-NEXT: lfd 0, 0(3) 188; CHECK-NEXT: xscvdpsxws 0, 0 189; CHECK-NEXT: stfiwx 0, 0, 4 190; CHECK-NEXT: blr 191; 192; CHECK-PWR8-LABEL: dpConv2sw: 193; CHECK-PWR8: # %bb.0: # %entry 194; CHECK-PWR8-NEXT: lfdx 0, 0, 3 195; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 196; CHECK-PWR8-NEXT: stfiwx 0, 0, 4 197; CHECK-PWR8-NEXT: blr 198entry: 199 %0 = load double, double* %a, align 8 200 %conv = fptosi double %0 to i32 201 store i32 %conv, i32* %b, align 4 202 ret void 203 204 205} 206 207; Function Attrs: norecurse nounwind 208define void @dpConv2shw(double* nocapture readonly %a, i16* nocapture %b) { 209; CHECK-LABEL: dpConv2shw: 210; CHECK: # %bb.0: # %entry 211; CHECK-NEXT: lfd 0, 0(3) 212; CHECK-NEXT: xscvdpsxws 0, 0 213; CHECK-NEXT: stxsihx 0, 0, 4 214; CHECK-NEXT: blr 215; 216; CHECK-PWR8-LABEL: dpConv2shw: 217; CHECK-PWR8: # %bb.0: # %entry 218; CHECK-PWR8-NEXT: lfdx 0, 0, 3 219; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 220; CHECK-PWR8-NEXT: mffprwz 3, 0 221; CHECK-PWR8-NEXT: sth 3, 0(4) 222; CHECK-PWR8-NEXT: blr 223entry: 224 %0 = load double, double* %a, align 8 225 %conv = fptosi double %0 to i16 226 store i16 %conv, i16* %b, align 2 227 ret void 228 229 230} 231 232; Function Attrs: norecurse nounwind 233define void @dpConv2sb(double* nocapture readonly %a, i8* nocapture %b) { 234; CHECK-LABEL: dpConv2sb: 235; CHECK: # %bb.0: # %entry 236; CHECK-NEXT: lfd 0, 0(3) 237; CHECK-NEXT: xscvdpsxws 0, 0 238; CHECK-NEXT: stxsibx 0, 0, 4 239; CHECK-NEXT: blr 240; 241; CHECK-PWR8-LABEL: dpConv2sb: 242; CHECK-PWR8: # %bb.0: # %entry 243; CHECK-PWR8-NEXT: lfdx 0, 0, 3 244; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 245; CHECK-PWR8-NEXT: mffprwz 3, 0 246; CHECK-PWR8-NEXT: stb 3, 0(4) 247; CHECK-PWR8-NEXT: blr 248entry: 249 %0 = load double, double* %a, align 8 250 %conv = fptosi double %0 to i8 251 store i8 %conv, i8* %b, align 1 252 ret void 253 254 255} 256 257; Function Attrs: norecurse nounwind 258define void @spConv2sdw(float* nocapture readonly %a, i64* nocapture %b) { 259; CHECK-LABEL: spConv2sdw: 260; CHECK: # %bb.0: # %entry 261; CHECK-NEXT: lfs 0, 0(3) 262; CHECK-NEXT: xscvdpsxds 2, 0 263; CHECK-NEXT: stxsd 2, 0(4) 264; CHECK-NEXT: blr 265; 266; CHECK-PWR8-LABEL: spConv2sdw: 267; CHECK-PWR8: # %bb.0: # %entry 268; CHECK-PWR8-NEXT: lfsx 0, 0, 3 269; CHECK-PWR8-NEXT: xscvdpsxds 0, 0 270; CHECK-PWR8-NEXT: stxsdx 0, 0, 4 271; CHECK-PWR8-NEXT: blr 272entry: 273 %0 = load float, float* %a, align 4 274 %conv = fptosi float %0 to i64 275 store i64 %conv, i64* %b, align 8 276 ret void 277 278 279} 280 281; Function Attrs: norecurse nounwind 282define void @spConv2sw(float* nocapture readonly %a, i32* nocapture %b) { 283; CHECK-LABEL: spConv2sw: 284; CHECK: # %bb.0: # %entry 285; CHECK-NEXT: lfs 0, 0(3) 286; CHECK-NEXT: xscvdpsxws 0, 0 287; CHECK-NEXT: stfiwx 0, 0, 4 288; CHECK-NEXT: blr 289; 290; CHECK-PWR8-LABEL: spConv2sw: 291; CHECK-PWR8: # %bb.0: # %entry 292; CHECK-PWR8-NEXT: lfsx 0, 0, 3 293; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 294; CHECK-PWR8-NEXT: stfiwx 0, 0, 4 295; CHECK-PWR8-NEXT: blr 296entry: 297 %0 = load float, float* %a, align 4 298 %conv = fptosi float %0 to i32 299 store i32 %conv, i32* %b, align 4 300 ret void 301 302 303} 304 305; Function Attrs: norecurse nounwind 306define void @spConv2shw(float* nocapture readonly %a, i16* nocapture %b) { 307; CHECK-LABEL: spConv2shw: 308; CHECK: # %bb.0: # %entry 309; CHECK-NEXT: lfs 0, 0(3) 310; CHECK-NEXT: xscvdpsxws 0, 0 311; CHECK-NEXT: stxsihx 0, 0, 4 312; CHECK-NEXT: blr 313; 314; CHECK-PWR8-LABEL: spConv2shw: 315; CHECK-PWR8: # %bb.0: # %entry 316; CHECK-PWR8-NEXT: lfsx 0, 0, 3 317; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 318; CHECK-PWR8-NEXT: mffprwz 3, 0 319; CHECK-PWR8-NEXT: sth 3, 0(4) 320; CHECK-PWR8-NEXT: blr 321entry: 322 %0 = load float, float* %a, align 4 323 %conv = fptosi float %0 to i16 324 store i16 %conv, i16* %b, align 2 325 ret void 326 327 328} 329 330; Function Attrs: norecurse nounwind 331define void @spConv2sb(float* nocapture readonly %a, i8* nocapture %b) { 332; CHECK-LABEL: spConv2sb: 333; CHECK: # %bb.0: # %entry 334; CHECK-NEXT: lfs 0, 0(3) 335; CHECK-NEXT: xscvdpsxws 0, 0 336; CHECK-NEXT: stxsibx 0, 0, 4 337; CHECK-NEXT: blr 338; 339; CHECK-PWR8-LABEL: spConv2sb: 340; CHECK-PWR8: # %bb.0: # %entry 341; CHECK-PWR8-NEXT: lfsx 0, 0, 3 342; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 343; CHECK-PWR8-NEXT: mffprwz 3, 0 344; CHECK-PWR8-NEXT: stb 3, 0(4) 345; CHECK-PWR8-NEXT: blr 346entry: 347 %0 = load float, float* %a, align 4 348 %conv = fptosi float %0 to i8 349 store i8 %conv, i8* %b, align 1 350 ret void 351 352 353} 354 355; Function Attrs: norecurse nounwind 356define void @dpConv2sdw_x(double* nocapture readonly %a, i64* nocapture %b, 357; CHECK-LABEL: dpConv2sdw_x: 358; CHECK: # %bb.0: # %entry 359; CHECK-NEXT: lfd 0, 0(3) 360; CHECK-NEXT: sldi 3, 5, 3 361; CHECK-NEXT: xscvdpsxds 0, 0 362; CHECK-NEXT: stxsdx 0, 4, 3 363; CHECK-NEXT: blr 364; 365; CHECK-PWR8-LABEL: dpConv2sdw_x: 366; CHECK-PWR8: # %bb.0: # %entry 367; CHECK-PWR8-NEXT: lfdx 0, 0, 3 368; CHECK-PWR8-NEXT: sldi 3, 5, 3 369; CHECK-PWR8-NEXT: xscvdpsxds 0, 0 370; CHECK-PWR8-NEXT: stxsdx 0, 4, 3 371; CHECK-PWR8-NEXT: blr 372 i32 signext %idx) { 373entry: 374 %0 = load double, double* %a, align 8 375 %conv = fptosi double %0 to i64 376 %idxprom = sext i32 %idx to i64 377 %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom 378 store i64 %conv, i64* %arrayidx, align 8 379 ret void 380 381 382} 383 384; Function Attrs: norecurse nounwind 385define void @dpConv2sw_x(double* nocapture readonly %a, i32* nocapture %b, 386; CHECK-LABEL: dpConv2sw_x: 387; CHECK: # %bb.0: # %entry 388; CHECK-NEXT: lfd 0, 0(3) 389; CHECK-NEXT: sldi 3, 5, 2 390; CHECK-NEXT: xscvdpsxws 0, 0 391; CHECK-NEXT: stfiwx 0, 4, 3 392; CHECK-NEXT: blr 393; 394; CHECK-PWR8-LABEL: dpConv2sw_x: 395; CHECK-PWR8: # %bb.0: # %entry 396; CHECK-PWR8-NEXT: lfdx 0, 0, 3 397; CHECK-PWR8-NEXT: sldi 3, 5, 2 398; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 399; CHECK-PWR8-NEXT: stfiwx 0, 4, 3 400; CHECK-PWR8-NEXT: blr 401 i32 signext %idx) { 402entry: 403 %0 = load double, double* %a, align 8 404 %conv = fptosi double %0 to i32 405 %idxprom = sext i32 %idx to i64 406 %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom 407 store i32 %conv, i32* %arrayidx, align 4 408 ret void 409 410 411} 412 413; Function Attrs: norecurse nounwind 414define void @dpConv2shw_x(double* nocapture readonly %a, i16* nocapture %b, 415; CHECK-LABEL: dpConv2shw_x: 416; CHECK: # %bb.0: # %entry 417; CHECK-NEXT: lfd 0, 0(3) 418; CHECK-NEXT: sldi 3, 5, 1 419; CHECK-NEXT: xscvdpsxws 0, 0 420; CHECK-NEXT: stxsihx 0, 4, 3 421; CHECK-NEXT: blr 422; 423; CHECK-PWR8-LABEL: dpConv2shw_x: 424; CHECK-PWR8: # %bb.0: # %entry 425; CHECK-PWR8-NEXT: lfdx 0, 0, 3 426; CHECK-PWR8-NEXT: sldi 5, 5, 1 427; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 428; CHECK-PWR8-NEXT: mffprwz 3, 0 429; CHECK-PWR8-NEXT: sthx 3, 4, 5 430; CHECK-PWR8-NEXT: blr 431 i32 signext %idx) { 432entry: 433 %0 = load double, double* %a, align 8 434 %conv = fptosi double %0 to i16 435 %idxprom = sext i32 %idx to i64 436 %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom 437 store i16 %conv, i16* %arrayidx, align 2 438 ret void 439 440 441} 442 443; Function Attrs: norecurse nounwind 444define void @dpConv2sb_x(double* nocapture readonly %a, i8* nocapture %b, 445; CHECK-LABEL: dpConv2sb_x: 446; CHECK: # %bb.0: # %entry 447; CHECK-NEXT: lfd 0, 0(3) 448; CHECK-NEXT: xscvdpsxws 0, 0 449; CHECK-NEXT: stxsibx 0, 4, 5 450; CHECK-NEXT: blr 451; 452; CHECK-PWR8-LABEL: dpConv2sb_x: 453; CHECK-PWR8: # %bb.0: # %entry 454; CHECK-PWR8-NEXT: lfdx 0, 0, 3 455; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 456; CHECK-PWR8-NEXT: mffprwz 3, 0 457; CHECK-PWR8-NEXT: stbx 3, 4, 5 458; CHECK-PWR8-NEXT: blr 459 i32 signext %idx) { 460entry: 461 %0 = load double, double* %a, align 8 462 %conv = fptosi double %0 to i8 463 %idxprom = sext i32 %idx to i64 464 %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom 465 store i8 %conv, i8* %arrayidx, align 1 466 ret void 467 468 469} 470 471; Function Attrs: norecurse nounwind 472define void @spConv2sdw_x(float* nocapture readonly %a, i64* nocapture %b, 473; CHECK-LABEL: spConv2sdw_x: 474; CHECK: # %bb.0: # %entry 475; CHECK-NEXT: lfs 0, 0(3) 476; CHECK-NEXT: xscvdpsxds 0, 0 477; CHECK-NEXT: sldi 5, 5, 3 478; CHECK-NEXT: stxsdx 0, 4, 5 479; CHECK-NEXT: blr 480; 481; CHECK-PWR8-LABEL: spConv2sdw_x: 482; CHECK-PWR8: # %bb.0: # %entry 483; CHECK-PWR8-NEXT: lfsx 0, 0, 3 484; CHECK-PWR8-NEXT: sldi 3, 5, 3 485; CHECK-PWR8-NEXT: xscvdpsxds 0, 0 486; CHECK-PWR8-NEXT: stxsdx 0, 4, 3 487; CHECK-PWR8-NEXT: blr 488 i32 signext %idx) { 489entry: 490 %0 = load float, float* %a, align 4 491 %conv = fptosi float %0 to i64 492 %idxprom = sext i32 %idx to i64 493 %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom 494 store i64 %conv, i64* %arrayidx, align 8 495 ret void 496 497 498} 499 500; Function Attrs: norecurse nounwind 501define void @spConv2sw_x(float* nocapture readonly %a, i32* nocapture %b, 502; CHECK-LABEL: spConv2sw_x: 503; CHECK: # %bb.0: # %entry 504; CHECK-NEXT: lfs 0, 0(3) 505; CHECK-NEXT: xscvdpsxws 0, 0 506; CHECK-NEXT: sldi 5, 5, 2 507; CHECK-NEXT: stfiwx 0, 4, 5 508; CHECK-NEXT: blr 509; 510; CHECK-PWR8-LABEL: spConv2sw_x: 511; CHECK-PWR8: # %bb.0: # %entry 512; CHECK-PWR8-NEXT: lfsx 0, 0, 3 513; CHECK-PWR8-NEXT: sldi 3, 5, 2 514; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 515; CHECK-PWR8-NEXT: stfiwx 0, 4, 3 516; CHECK-PWR8-NEXT: blr 517 i32 signext %idx) { 518entry: 519 %0 = load float, float* %a, align 4 520 %conv = fptosi float %0 to i32 521 %idxprom = sext i32 %idx to i64 522 %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom 523 store i32 %conv, i32* %arrayidx, align 4 524 ret void 525 526 527} 528 529; Function Attrs: norecurse nounwind 530define void @spConv2shw_x(float* nocapture readonly %a, i16* nocapture %b, 531; CHECK-LABEL: spConv2shw_x: 532; CHECK: # %bb.0: # %entry 533; CHECK-NEXT: lfs 0, 0(3) 534; CHECK-NEXT: xscvdpsxws 0, 0 535; CHECK-NEXT: sldi 5, 5, 1 536; CHECK-NEXT: stxsihx 0, 4, 5 537; CHECK-NEXT: blr 538; 539; CHECK-PWR8-LABEL: spConv2shw_x: 540; CHECK-PWR8: # %bb.0: # %entry 541; CHECK-PWR8-NEXT: lfsx 0, 0, 3 542; CHECK-PWR8-NEXT: sldi 5, 5, 1 543; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 544; CHECK-PWR8-NEXT: mffprwz 3, 0 545; CHECK-PWR8-NEXT: sthx 3, 4, 5 546; CHECK-PWR8-NEXT: blr 547 i32 signext %idx) { 548entry: 549 %0 = load float, float* %a, align 4 550 %conv = fptosi float %0 to i16 551 %idxprom = sext i32 %idx to i64 552 %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom 553 store i16 %conv, i16* %arrayidx, align 2 554 ret void 555 556 557} 558 559; Function Attrs: norecurse nounwind 560define void @spConv2sb_x(float* nocapture readonly %a, i8* nocapture %b, 561; CHECK-LABEL: spConv2sb_x: 562; CHECK: # %bb.0: # %entry 563; CHECK-NEXT: lfs 0, 0(3) 564; CHECK-NEXT: xscvdpsxws 0, 0 565; CHECK-NEXT: stxsibx 0, 4, 5 566; CHECK-NEXT: blr 567; 568; CHECK-PWR8-LABEL: spConv2sb_x: 569; CHECK-PWR8: # %bb.0: # %entry 570; CHECK-PWR8-NEXT: lfsx 0, 0, 3 571; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 572; CHECK-PWR8-NEXT: mffprwz 3, 0 573; CHECK-PWR8-NEXT: stbx 3, 4, 5 574; CHECK-PWR8-NEXT: blr 575 i32 signext %idx) { 576entry: 577 %0 = load float, float* %a, align 4 578 %conv = fptosi float %0 to i8 579 %idxprom = sext i32 %idx to i64 580 %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom 581 store i8 %conv, i8* %arrayidx, align 1 582 ret void 583 584 585} 586 587; ========================================== 588; Tests for store of fp_to_uint converstions 589; ========================================== 590 591; Function Attrs: norecurse nounwind 592define void @dpConv2udw(double* nocapture readonly %a, i64* nocapture %b) { 593; CHECK-LABEL: dpConv2udw: 594; CHECK: # %bb.0: # %entry 595; CHECK-NEXT: lfd 0, 0(3) 596; CHECK-NEXT: xscvdpuxds 2, 0 597; CHECK-NEXT: stxsd 2, 0(4) 598; CHECK-NEXT: blr 599; 600; CHECK-PWR8-LABEL: dpConv2udw: 601; CHECK-PWR8: # %bb.0: # %entry 602; CHECK-PWR8-NEXT: lfdx 0, 0, 3 603; CHECK-PWR8-NEXT: xscvdpuxds 0, 0 604; CHECK-PWR8-NEXT: stxsdx 0, 0, 4 605; CHECK-PWR8-NEXT: blr 606entry: 607 %0 = load double, double* %a, align 8 608 %conv = fptoui double %0 to i64 609 store i64 %conv, i64* %b, align 8 610 ret void 611 612 613} 614 615; Function Attrs: norecurse nounwind 616define void @dpConv2uw(double* nocapture readonly %a, i32* nocapture %b) { 617; CHECK-LABEL: dpConv2uw: 618; CHECK: # %bb.0: # %entry 619; CHECK-NEXT: lfd 0, 0(3) 620; CHECK-NEXT: xscvdpuxws 0, 0 621; CHECK-NEXT: stfiwx 0, 0, 4 622; CHECK-NEXT: blr 623; 624; CHECK-PWR8-LABEL: dpConv2uw: 625; CHECK-PWR8: # %bb.0: # %entry 626; CHECK-PWR8-NEXT: lfdx 0, 0, 3 627; CHECK-PWR8-NEXT: xscvdpuxws 0, 0 628; CHECK-PWR8-NEXT: stfiwx 0, 0, 4 629; CHECK-PWR8-NEXT: blr 630entry: 631 %0 = load double, double* %a, align 8 632 %conv = fptoui double %0 to i32 633 store i32 %conv, i32* %b, align 4 634 ret void 635 636 637} 638 639; Function Attrs: norecurse nounwind 640define void @dpConv2uhw(double* nocapture readonly %a, i16* nocapture %b) { 641; CHECK-LABEL: dpConv2uhw: 642; CHECK: # %bb.0: # %entry 643; CHECK-NEXT: lfd 0, 0(3) 644; CHECK-NEXT: xscvdpuxws 0, 0 645; CHECK-NEXT: stxsihx 0, 0, 4 646; CHECK-NEXT: blr 647; 648; CHECK-PWR8-LABEL: dpConv2uhw: 649; CHECK-PWR8: # %bb.0: # %entry 650; CHECK-PWR8-NEXT: lfdx 0, 0, 3 651; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 652; CHECK-PWR8-NEXT: mffprwz 3, 0 653; CHECK-PWR8-NEXT: sth 3, 0(4) 654; CHECK-PWR8-NEXT: blr 655entry: 656 %0 = load double, double* %a, align 8 657 %conv = fptoui double %0 to i16 658 store i16 %conv, i16* %b, align 2 659 ret void 660 661 662} 663 664; Function Attrs: norecurse nounwind 665define void @dpConv2ub(double* nocapture readonly %a, i8* nocapture %b) { 666; CHECK-LABEL: dpConv2ub: 667; CHECK: # %bb.0: # %entry 668; CHECK-NEXT: lfd 0, 0(3) 669; CHECK-NEXT: xscvdpuxws 0, 0 670; CHECK-NEXT: stxsibx 0, 0, 4 671; CHECK-NEXT: blr 672; 673; CHECK-PWR8-LABEL: dpConv2ub: 674; CHECK-PWR8: # %bb.0: # %entry 675; CHECK-PWR8-NEXT: lfdx 0, 0, 3 676; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 677; CHECK-PWR8-NEXT: mffprwz 3, 0 678; CHECK-PWR8-NEXT: stb 3, 0(4) 679; CHECK-PWR8-NEXT: blr 680entry: 681 %0 = load double, double* %a, align 8 682 %conv = fptoui double %0 to i8 683 store i8 %conv, i8* %b, align 1 684 ret void 685 686 687} 688 689; Function Attrs: norecurse nounwind 690define void @spConv2udw(float* nocapture readonly %a, i64* nocapture %b) { 691; CHECK-LABEL: spConv2udw: 692; CHECK: # %bb.0: # %entry 693; CHECK-NEXT: lfs 0, 0(3) 694; CHECK-NEXT: xscvdpuxds 2, 0 695; CHECK-NEXT: stxsd 2, 0(4) 696; CHECK-NEXT: blr 697; 698; CHECK-PWR8-LABEL: spConv2udw: 699; CHECK-PWR8: # %bb.0: # %entry 700; CHECK-PWR8-NEXT: lfsx 0, 0, 3 701; CHECK-PWR8-NEXT: xscvdpuxds 0, 0 702; CHECK-PWR8-NEXT: stxsdx 0, 0, 4 703; CHECK-PWR8-NEXT: blr 704entry: 705 %0 = load float, float* %a, align 4 706 %conv = fptoui float %0 to i64 707 store i64 %conv, i64* %b, align 8 708 ret void 709 710 711} 712 713; Function Attrs: norecurse nounwind 714define void @spConv2uw(float* nocapture readonly %a, i32* nocapture %b) { 715; CHECK-LABEL: spConv2uw: 716; CHECK: # %bb.0: # %entry 717; CHECK-NEXT: lfs 0, 0(3) 718; CHECK-NEXT: xscvdpuxws 0, 0 719; CHECK-NEXT: stfiwx 0, 0, 4 720; CHECK-NEXT: blr 721; 722; CHECK-PWR8-LABEL: spConv2uw: 723; CHECK-PWR8: # %bb.0: # %entry 724; CHECK-PWR8-NEXT: lfsx 0, 0, 3 725; CHECK-PWR8-NEXT: xscvdpuxws 0, 0 726; CHECK-PWR8-NEXT: stfiwx 0, 0, 4 727; CHECK-PWR8-NEXT: blr 728entry: 729 %0 = load float, float* %a, align 4 730 %conv = fptoui float %0 to i32 731 store i32 %conv, i32* %b, align 4 732 ret void 733 734 735} 736 737; Function Attrs: norecurse nounwind 738define void @spConv2uhw(float* nocapture readonly %a, i16* nocapture %b) { 739; CHECK-LABEL: spConv2uhw: 740; CHECK: # %bb.0: # %entry 741; CHECK-NEXT: lfs 0, 0(3) 742; CHECK-NEXT: xscvdpuxws 0, 0 743; CHECK-NEXT: stxsihx 0, 0, 4 744; CHECK-NEXT: blr 745; 746; CHECK-PWR8-LABEL: spConv2uhw: 747; CHECK-PWR8: # %bb.0: # %entry 748; CHECK-PWR8-NEXT: lfsx 0, 0, 3 749; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 750; CHECK-PWR8-NEXT: mffprwz 3, 0 751; CHECK-PWR8-NEXT: sth 3, 0(4) 752; CHECK-PWR8-NEXT: blr 753entry: 754 %0 = load float, float* %a, align 4 755 %conv = fptoui float %0 to i16 756 store i16 %conv, i16* %b, align 2 757 ret void 758 759 760} 761 762; Function Attrs: norecurse nounwind 763define void @spConv2ub(float* nocapture readonly %a, i8* nocapture %b) { 764; CHECK-LABEL: spConv2ub: 765; CHECK: # %bb.0: # %entry 766; CHECK-NEXT: lfs 0, 0(3) 767; CHECK-NEXT: xscvdpuxws 0, 0 768; CHECK-NEXT: stxsibx 0, 0, 4 769; CHECK-NEXT: blr 770; 771; CHECK-PWR8-LABEL: spConv2ub: 772; CHECK-PWR8: # %bb.0: # %entry 773; CHECK-PWR8-NEXT: lfsx 0, 0, 3 774; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 775; CHECK-PWR8-NEXT: mffprwz 3, 0 776; CHECK-PWR8-NEXT: stb 3, 0(4) 777; CHECK-PWR8-NEXT: blr 778entry: 779 %0 = load float, float* %a, align 4 780 %conv = fptoui float %0 to i8 781 store i8 %conv, i8* %b, align 1 782 ret void 783 784 785} 786 787; Function Attrs: norecurse nounwind 788define void @dpConv2udw_x(double* nocapture readonly %a, i64* nocapture %b, 789; CHECK-LABEL: dpConv2udw_x: 790; CHECK: # %bb.0: # %entry 791; CHECK-NEXT: lfd 0, 0(3) 792; CHECK-NEXT: sldi 3, 5, 3 793; CHECK-NEXT: xscvdpuxds 0, 0 794; CHECK-NEXT: stxsdx 0, 4, 3 795; CHECK-NEXT: blr 796; 797; CHECK-PWR8-LABEL: dpConv2udw_x: 798; CHECK-PWR8: # %bb.0: # %entry 799; CHECK-PWR8-NEXT: lfdx 0, 0, 3 800; CHECK-PWR8-NEXT: sldi 3, 5, 3 801; CHECK-PWR8-NEXT: xscvdpuxds 0, 0 802; CHECK-PWR8-NEXT: stxsdx 0, 4, 3 803; CHECK-PWR8-NEXT: blr 804 i32 zeroext %idx) { 805entry: 806 %0 = load double, double* %a, align 8 807 %conv = fptoui double %0 to i64 808 %idxprom = zext i32 %idx to i64 809 %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom 810 store i64 %conv, i64* %arrayidx, align 8 811 ret void 812 813 814} 815 816; Function Attrs: norecurse nounwind 817define void @dpConv2uw_x(double* nocapture readonly %a, i32* nocapture %b, 818; CHECK-LABEL: dpConv2uw_x: 819; CHECK: # %bb.0: # %entry 820; CHECK-NEXT: lfd 0, 0(3) 821; CHECK-NEXT: sldi 3, 5, 2 822; CHECK-NEXT: xscvdpuxws 0, 0 823; CHECK-NEXT: stfiwx 0, 4, 3 824; CHECK-NEXT: blr 825; 826; CHECK-PWR8-LABEL: dpConv2uw_x: 827; CHECK-PWR8: # %bb.0: # %entry 828; CHECK-PWR8-NEXT: lfdx 0, 0, 3 829; CHECK-PWR8-NEXT: sldi 3, 5, 2 830; CHECK-PWR8-NEXT: xscvdpuxws 0, 0 831; CHECK-PWR8-NEXT: stfiwx 0, 4, 3 832; CHECK-PWR8-NEXT: blr 833 i32 zeroext %idx) { 834entry: 835 %0 = load double, double* %a, align 8 836 %conv = fptoui double %0 to i32 837 %idxprom = zext i32 %idx to i64 838 %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom 839 store i32 %conv, i32* %arrayidx, align 4 840 ret void 841 842 843} 844 845; Function Attrs: norecurse nounwind 846define void @dpConv2uhw_x(double* nocapture readonly %a, i16* nocapture %b, 847; CHECK-LABEL: dpConv2uhw_x: 848; CHECK: # %bb.0: # %entry 849; CHECK-NEXT: lfd 0, 0(3) 850; CHECK-NEXT: sldi 3, 5, 1 851; CHECK-NEXT: xscvdpuxws 0, 0 852; CHECK-NEXT: stxsihx 0, 4, 3 853; CHECK-NEXT: blr 854; 855; CHECK-PWR8-LABEL: dpConv2uhw_x: 856; CHECK-PWR8: # %bb.0: # %entry 857; CHECK-PWR8-NEXT: lfdx 0, 0, 3 858; CHECK-PWR8-NEXT: sldi 5, 5, 1 859; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 860; CHECK-PWR8-NEXT: mffprwz 3, 0 861; CHECK-PWR8-NEXT: sthx 3, 4, 5 862; CHECK-PWR8-NEXT: blr 863 i32 zeroext %idx) { 864entry: 865 %0 = load double, double* %a, align 8 866 %conv = fptoui double %0 to i16 867 %idxprom = zext i32 %idx to i64 868 %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom 869 store i16 %conv, i16* %arrayidx, align 2 870 ret void 871 872 873} 874 875; Function Attrs: norecurse nounwind 876define void @dpConv2ub_x(double* nocapture readonly %a, i8* nocapture %b, 877; CHECK-LABEL: dpConv2ub_x: 878; CHECK: # %bb.0: # %entry 879; CHECK-NEXT: lfd 0, 0(3) 880; CHECK-NEXT: xscvdpuxws 0, 0 881; CHECK-NEXT: stxsibx 0, 4, 5 882; CHECK-NEXT: blr 883; 884; CHECK-PWR8-LABEL: dpConv2ub_x: 885; CHECK-PWR8: # %bb.0: # %entry 886; CHECK-PWR8-NEXT: lfdx 0, 0, 3 887; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 888; CHECK-PWR8-NEXT: mffprwz 3, 0 889; CHECK-PWR8-NEXT: stbx 3, 4, 5 890; CHECK-PWR8-NEXT: blr 891 i32 zeroext %idx) { 892entry: 893 %0 = load double, double* %a, align 8 894 %conv = fptoui double %0 to i8 895 %idxprom = zext i32 %idx to i64 896 %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom 897 store i8 %conv, i8* %arrayidx, align 1 898 ret void 899 900 901} 902 903; Function Attrs: norecurse nounwind 904define void @spConv2udw_x(float* nocapture readonly %a, i64* nocapture %b, 905; CHECK-LABEL: spConv2udw_x: 906; CHECK: # %bb.0: # %entry 907; CHECK-NEXT: lfs 0, 0(3) 908; CHECK-NEXT: xscvdpuxds 0, 0 909; CHECK-NEXT: sldi 5, 5, 3 910; CHECK-NEXT: stxsdx 0, 4, 5 911; CHECK-NEXT: blr 912; 913; CHECK-PWR8-LABEL: spConv2udw_x: 914; CHECK-PWR8: # %bb.0: # %entry 915; CHECK-PWR8-NEXT: lfsx 0, 0, 3 916; CHECK-PWR8-NEXT: sldi 3, 5, 3 917; CHECK-PWR8-NEXT: xscvdpuxds 0, 0 918; CHECK-PWR8-NEXT: stxsdx 0, 4, 3 919; CHECK-PWR8-NEXT: blr 920 i32 zeroext %idx) { 921entry: 922 %0 = load float, float* %a, align 4 923 %conv = fptoui float %0 to i64 924 %idxprom = zext i32 %idx to i64 925 %arrayidx = getelementptr inbounds i64, i64* %b, i64 %idxprom 926 store i64 %conv, i64* %arrayidx, align 8 927 ret void 928 929 930} 931 932; Function Attrs: norecurse nounwind 933define void @spConv2uw_x(float* nocapture readonly %a, i32* nocapture %b, 934; CHECK-LABEL: spConv2uw_x: 935; CHECK: # %bb.0: # %entry 936; CHECK-NEXT: lfs 0, 0(3) 937; CHECK-NEXT: xscvdpuxws 0, 0 938; CHECK-NEXT: sldi 5, 5, 2 939; CHECK-NEXT: stfiwx 0, 4, 5 940; CHECK-NEXT: blr 941; 942; CHECK-PWR8-LABEL: spConv2uw_x: 943; CHECK-PWR8: # %bb.0: # %entry 944; CHECK-PWR8-NEXT: lfsx 0, 0, 3 945; CHECK-PWR8-NEXT: sldi 3, 5, 2 946; CHECK-PWR8-NEXT: xscvdpuxws 0, 0 947; CHECK-PWR8-NEXT: stfiwx 0, 4, 3 948; CHECK-PWR8-NEXT: blr 949 i32 zeroext %idx) { 950entry: 951 %0 = load float, float* %a, align 4 952 %conv = fptoui float %0 to i32 953 %idxprom = zext i32 %idx to i64 954 %arrayidx = getelementptr inbounds i32, i32* %b, i64 %idxprom 955 store i32 %conv, i32* %arrayidx, align 4 956 ret void 957 958 959} 960 961; Function Attrs: norecurse nounwind 962define void @spConv2uhw_x(float* nocapture readonly %a, i16* nocapture %b, 963; CHECK-LABEL: spConv2uhw_x: 964; CHECK: # %bb.0: # %entry 965; CHECK-NEXT: lfs 0, 0(3) 966; CHECK-NEXT: xscvdpuxws 0, 0 967; CHECK-NEXT: sldi 5, 5, 1 968; CHECK-NEXT: stxsihx 0, 4, 5 969; CHECK-NEXT: blr 970; 971; CHECK-PWR8-LABEL: spConv2uhw_x: 972; CHECK-PWR8: # %bb.0: # %entry 973; CHECK-PWR8-NEXT: lfsx 0, 0, 3 974; CHECK-PWR8-NEXT: sldi 5, 5, 1 975; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 976; CHECK-PWR8-NEXT: mffprwz 3, 0 977; CHECK-PWR8-NEXT: sthx 3, 4, 5 978; CHECK-PWR8-NEXT: blr 979 i32 zeroext %idx) { 980entry: 981 %0 = load float, float* %a, align 4 982 %conv = fptoui float %0 to i16 983 %idxprom = zext i32 %idx to i64 984 %arrayidx = getelementptr inbounds i16, i16* %b, i64 %idxprom 985 store i16 %conv, i16* %arrayidx, align 2 986 ret void 987 988 989} 990 991; Function Attrs: norecurse nounwind 992define void @spConv2ub_x(float* nocapture readonly %a, i8* nocapture %b, 993; CHECK-LABEL: spConv2ub_x: 994; CHECK: # %bb.0: # %entry 995; CHECK-NEXT: lfs 0, 0(3) 996; CHECK-NEXT: xscvdpuxws 0, 0 997; CHECK-NEXT: stxsibx 0, 4, 5 998; CHECK-NEXT: blr 999; 1000; CHECK-PWR8-LABEL: spConv2ub_x: 1001; CHECK-PWR8: # %bb.0: # %entry 1002; CHECK-PWR8-NEXT: lfsx 0, 0, 3 1003; CHECK-PWR8-NEXT: xscvdpsxws 0, 0 1004; CHECK-PWR8-NEXT: mffprwz 3, 0 1005; CHECK-PWR8-NEXT: stbx 3, 4, 5 1006; CHECK-PWR8-NEXT: blr 1007 i32 zeroext %idx) { 1008entry: 1009 %0 = load float, float* %a, align 4 1010 %conv = fptoui float %0 to i8 1011 %idxprom = zext i32 %idx to i64 1012 %arrayidx = getelementptr inbounds i8, i8* %b, i64 %idxprom 1013 store i8 %conv, i8* %arrayidx, align 1 1014 ret void 1015 1016 1017} 1018