1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc < %s -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes X64,SDAG-X64 3; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes X64,GISEL-X64 4; RUN: llc < %s -mattr=+avx512f -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes AVX512,SDAG-AVX512 5; RUN: llc < %s -global-isel -global-isel-abort=1 -mattr=+avx512f -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes AVX512,GISEL-AVX512 6 7define i64 @test_double_to_ui64(double %x) { 8; SDAG-X64-LABEL: test_double_to_ui64: 9; SDAG-X64: # %bb.0: # %entry 10; SDAG-X64-NEXT: cvttsd2si %xmm0, %rcx 11; SDAG-X64-NEXT: movq %rcx, %rdx 12; SDAG-X64-NEXT: sarq $63, %rdx 13; SDAG-X64-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 14; SDAG-X64-NEXT: cvttsd2si %xmm0, %rax 15; SDAG-X64-NEXT: andq %rdx, %rax 16; SDAG-X64-NEXT: orq %rcx, %rax 17; SDAG-X64-NEXT: retq 18; 19; GISEL-X64-LABEL: test_double_to_ui64: 20; GISEL-X64: # %bb.0: # %entry 21; GISEL-X64-NEXT: cvttsd2si %xmm0, %rcx 22; GISEL-X64-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0] 23; GISEL-X64-NEXT: movapd %xmm0, %xmm2 24; GISEL-X64-NEXT: subsd %xmm1, %xmm2 25; GISEL-X64-NEXT: cvttsd2si %xmm2, %rdx 26; GISEL-X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 27; GISEL-X64-NEXT: xorq %rdx, %rax 28; GISEL-X64-NEXT: xorl %edx, %edx 29; GISEL-X64-NEXT: ucomisd %xmm1, %xmm0 30; GISEL-X64-NEXT: setb %dl 31; GISEL-X64-NEXT: andl $1, %edx 32; GISEL-X64-NEXT: cmovneq %rcx, %rax 33; GISEL-X64-NEXT: retq 34; 35; AVX512-LABEL: test_double_to_ui64: 36; AVX512: # %bb.0: # %entry 37; AVX512-NEXT: vcvttsd2usi %xmm0, %rax 38; AVX512-NEXT: retq 39entry: 40 %conv = fptoui double %x to i64 41 ret i64 %conv 42} 43 44define i32 @test_double_to_ui32(double %x) { 45; X64-LABEL: test_double_to_ui32: 46; X64: # %bb.0: # %entry 47; X64-NEXT: cvttsd2si %xmm0, %rax 48; X64-NEXT: # kill: def $eax killed $eax killed $rax 49; X64-NEXT: retq 50; 51; AVX512-LABEL: test_double_to_ui32: 52; AVX512: # %bb.0: # %entry 53; AVX512-NEXT: vcvttsd2usi %xmm0, %eax 54; AVX512-NEXT: retq 55entry: 56 %conv = fptoui double %x to i32 57 ret i32 %conv 58} 59 60define zeroext i16 @test_double_to_ui16(double %x) { 61; X64-LABEL: test_double_to_ui16: 62; X64: # %bb.0: # %entry 63; X64-NEXT: cvttsd2si %xmm0, %eax 64; X64-NEXT: # kill: def $ax killed $ax killed $eax 65; X64-NEXT: retq 66; 67; SDAG-AVX512-LABEL: test_double_to_ui16: 68; SDAG-AVX512: # %bb.0: # %entry 69; SDAG-AVX512-NEXT: vcvttsd2si %xmm0, %eax 70; SDAG-AVX512-NEXT: # kill: def $ax killed $ax killed $eax 71; SDAG-AVX512-NEXT: retq 72; 73; GISEL-AVX512-LABEL: test_double_to_ui16: 74; GISEL-AVX512: # %bb.0: # %entry 75; GISEL-AVX512-NEXT: vcvttsd2usi %xmm0, %eax 76; GISEL-AVX512-NEXT: # kill: def $ax killed $ax killed $eax 77; GISEL-AVX512-NEXT: retq 78entry: 79 %conv = fptoui double %x to i16 80 ret i16 %conv 81} 82 83define zeroext i8 @test_double_to_ui8(double %x) { 84; X64-LABEL: test_double_to_ui8: 85; X64: # %bb.0: # %entry 86; X64-NEXT: cvttsd2si %xmm0, %eax 87; X64-NEXT: # kill: def $al killed $al killed $eax 88; X64-NEXT: retq 89; 90; SDAG-AVX512-LABEL: test_double_to_ui8: 91; SDAG-AVX512: # %bb.0: # %entry 92; SDAG-AVX512-NEXT: vcvttsd2si %xmm0, %eax 93; SDAG-AVX512-NEXT: # kill: def $al killed $al killed $eax 94; SDAG-AVX512-NEXT: retq 95; 96; GISEL-AVX512-LABEL: test_double_to_ui8: 97; GISEL-AVX512: # %bb.0: # %entry 98; GISEL-AVX512-NEXT: vcvttsd2usi %xmm0, %eax 99; GISEL-AVX512-NEXT: # kill: def $al killed $al killed $eax 100; GISEL-AVX512-NEXT: retq 101entry: 102 %conv = fptoui double %x to i8 103 ret i8 %conv 104} 105 106define i64 @test_float_to_ui64(float %x) { 107; SDAG-X64-LABEL: test_float_to_ui64: 108; SDAG-X64: # %bb.0: # %entry 109; SDAG-X64-NEXT: cvttss2si %xmm0, %rcx 110; SDAG-X64-NEXT: movq %rcx, %rdx 111; SDAG-X64-NEXT: sarq $63, %rdx 112; SDAG-X64-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 113; SDAG-X64-NEXT: cvttss2si %xmm0, %rax 114; SDAG-X64-NEXT: andq %rdx, %rax 115; SDAG-X64-NEXT: orq %rcx, %rax 116; SDAG-X64-NEXT: retq 117; 118; GISEL-X64-LABEL: test_float_to_ui64: 119; GISEL-X64: # %bb.0: # %entry 120; GISEL-X64-NEXT: cvttss2si %xmm0, %rcx 121; GISEL-X64-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0] 122; GISEL-X64-NEXT: movaps %xmm0, %xmm2 123; GISEL-X64-NEXT: subss %xmm1, %xmm2 124; GISEL-X64-NEXT: cvttss2si %xmm2, %rdx 125; GISEL-X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 126; GISEL-X64-NEXT: xorq %rdx, %rax 127; GISEL-X64-NEXT: xorl %edx, %edx 128; GISEL-X64-NEXT: ucomiss %xmm1, %xmm0 129; GISEL-X64-NEXT: setb %dl 130; GISEL-X64-NEXT: andl $1, %edx 131; GISEL-X64-NEXT: cmovneq %rcx, %rax 132; GISEL-X64-NEXT: retq 133; 134; AVX512-LABEL: test_float_to_ui64: 135; AVX512: # %bb.0: # %entry 136; AVX512-NEXT: vcvttss2usi %xmm0, %rax 137; AVX512-NEXT: retq 138entry: 139 %conv = fptoui float %x to i64 140 ret i64 %conv 141} 142 143define i32 @test_float_to_ui32(float %x) { 144; X64-LABEL: test_float_to_ui32: 145; X64: # %bb.0: # %entry 146; X64-NEXT: cvttss2si %xmm0, %rax 147; X64-NEXT: # kill: def $eax killed $eax killed $rax 148; X64-NEXT: retq 149; 150; AVX512-LABEL: test_float_to_ui32: 151; AVX512: # %bb.0: # %entry 152; AVX512-NEXT: vcvttss2usi %xmm0, %eax 153; AVX512-NEXT: retq 154entry: 155 %conv = fptoui float %x to i32 156 ret i32 %conv 157} 158 159define zeroext i16 @test_float_to_ui16(float %x) { 160; X64-LABEL: test_float_to_ui16: 161; X64: # %bb.0: # %entry 162; X64-NEXT: cvttss2si %xmm0, %eax 163; X64-NEXT: # kill: def $ax killed $ax killed $eax 164; X64-NEXT: retq 165; 166; SDAG-AVX512-LABEL: test_float_to_ui16: 167; SDAG-AVX512: # %bb.0: # %entry 168; SDAG-AVX512-NEXT: vcvttss2si %xmm0, %eax 169; SDAG-AVX512-NEXT: # kill: def $ax killed $ax killed $eax 170; SDAG-AVX512-NEXT: retq 171; 172; GISEL-AVX512-LABEL: test_float_to_ui16: 173; GISEL-AVX512: # %bb.0: # %entry 174; GISEL-AVX512-NEXT: vcvttss2usi %xmm0, %eax 175; GISEL-AVX512-NEXT: # kill: def $ax killed $ax killed $eax 176; GISEL-AVX512-NEXT: retq 177entry: 178 %conv = fptoui float %x to i16 179 ret i16 %conv 180} 181 182define zeroext i8 @test_float_to_ui8(float %x) { 183; X64-LABEL: test_float_to_ui8: 184; X64: # %bb.0: # %entry 185; X64-NEXT: cvttss2si %xmm0, %eax 186; X64-NEXT: # kill: def $al killed $al killed $eax 187; X64-NEXT: retq 188; 189; SDAG-AVX512-LABEL: test_float_to_ui8: 190; SDAG-AVX512: # %bb.0: # %entry 191; SDAG-AVX512-NEXT: vcvttss2si %xmm0, %eax 192; SDAG-AVX512-NEXT: # kill: def $al killed $al killed $eax 193; SDAG-AVX512-NEXT: retq 194; 195; GISEL-AVX512-LABEL: test_float_to_ui8: 196; GISEL-AVX512: # %bb.0: # %entry 197; GISEL-AVX512-NEXT: vcvttss2usi %xmm0, %eax 198; GISEL-AVX512-NEXT: # kill: def $al killed $al killed $eax 199; GISEL-AVX512-NEXT: retq 200entry: 201 %conv = fptoui float %x to i8 202 ret i8 %conv 203} 204 205define i64 @test_double_to_si64(double %x) { 206; X64-LABEL: test_double_to_si64: 207; X64: # %bb.0: # %entry 208; X64-NEXT: cvttsd2si %xmm0, %rax 209; X64-NEXT: retq 210; 211; AVX512-LABEL: test_double_to_si64: 212; AVX512: # %bb.0: # %entry 213; AVX512-NEXT: vcvttsd2si %xmm0, %rax 214; AVX512-NEXT: retq 215entry: 216 %conv = fptosi double %x to i64 217 ret i64 %conv 218} 219 220define i32 @test_double_to_si32(double %x) { 221; X64-LABEL: test_double_to_si32: 222; X64: # %bb.0: # %entry 223; X64-NEXT: cvttsd2si %xmm0, %eax 224; X64-NEXT: retq 225; 226; AVX512-LABEL: test_double_to_si32: 227; AVX512: # %bb.0: # %entry 228; AVX512-NEXT: vcvttsd2si %xmm0, %eax 229; AVX512-NEXT: retq 230entry: 231 %conv = fptosi double %x to i32 232 ret i32 %conv 233} 234 235define signext i16 @test_double_to_si16(double %x) { 236; X64-LABEL: test_double_to_si16: 237; X64: # %bb.0: # %entry 238; X64-NEXT: cvttsd2si %xmm0, %eax 239; X64-NEXT: # kill: def $ax killed $ax killed $eax 240; X64-NEXT: retq 241; 242; AVX512-LABEL: test_double_to_si16: 243; AVX512: # %bb.0: # %entry 244; AVX512-NEXT: vcvttsd2si %xmm0, %eax 245; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 246; AVX512-NEXT: retq 247entry: 248 %conv = fptosi double %x to i16 249 ret i16 %conv 250} 251 252define signext i8 @test_double_to_si8(double %x) { 253; X64-LABEL: test_double_to_si8: 254; X64: # %bb.0: # %entry 255; X64-NEXT: cvttsd2si %xmm0, %eax 256; X64-NEXT: # kill: def $al killed $al killed $eax 257; X64-NEXT: retq 258; 259; AVX512-LABEL: test_double_to_si8: 260; AVX512: # %bb.0: # %entry 261; AVX512-NEXT: vcvttsd2si %xmm0, %eax 262; AVX512-NEXT: # kill: def $al killed $al killed $eax 263; AVX512-NEXT: retq 264entry: 265 %conv = fptosi double %x to i8 266 ret i8 %conv 267} 268 269define i31 @test_double_to_si31(double %x) { 270; X64-LABEL: test_double_to_si31: 271; X64: # %bb.0: # %entry 272; X64-NEXT: cvttsd2si %xmm0, %eax 273; X64-NEXT: retq 274; 275; AVX512-LABEL: test_double_to_si31: 276; AVX512: # %bb.0: # %entry 277; AVX512-NEXT: vcvttsd2si %xmm0, %eax 278; AVX512-NEXT: retq 279entry: 280 %conv = fptosi double %x to i31 281 ret i31 %conv 282} 283 284define i33 @test_double_to_si33(double %x) { 285; X64-LABEL: test_double_to_si33: 286; X64: # %bb.0: # %entry 287; X64-NEXT: cvttsd2si %xmm0, %rax 288; X64-NEXT: retq 289; 290; AVX512-LABEL: test_double_to_si33: 291; AVX512: # %bb.0: # %entry 292; AVX512-NEXT: vcvttsd2si %xmm0, %rax 293; AVX512-NEXT: retq 294entry: 295 %conv = fptosi double %x to i33 296 ret i33 %conv 297} 298 299define i64 @test_float_to_si64(float %x) { 300; X64-LABEL: test_float_to_si64: 301; X64: # %bb.0: # %entry 302; X64-NEXT: cvttss2si %xmm0, %rax 303; X64-NEXT: retq 304; 305; AVX512-LABEL: test_float_to_si64: 306; AVX512: # %bb.0: # %entry 307; AVX512-NEXT: vcvttss2si %xmm0, %rax 308; AVX512-NEXT: retq 309entry: 310 %conv = fptosi float %x to i64 311 ret i64 %conv 312} 313 314define i32 @test_float_to_si32(float %x) { 315; X64-LABEL: test_float_to_si32: 316; X64: # %bb.0: # %entry 317; X64-NEXT: cvttss2si %xmm0, %eax 318; X64-NEXT: retq 319; 320; AVX512-LABEL: test_float_to_si32: 321; AVX512: # %bb.0: # %entry 322; AVX512-NEXT: vcvttss2si %xmm0, %eax 323; AVX512-NEXT: retq 324entry: 325 %conv = fptosi float %x to i32 326 ret i32 %conv 327} 328 329define signext i16 @test_float_to_si16(float %x) { 330; X64-LABEL: test_float_to_si16: 331; X64: # %bb.0: # %entry 332; X64-NEXT: cvttss2si %xmm0, %eax 333; X64-NEXT: # kill: def $ax killed $ax killed $eax 334; X64-NEXT: retq 335; 336; AVX512-LABEL: test_float_to_si16: 337; AVX512: # %bb.0: # %entry 338; AVX512-NEXT: vcvttss2si %xmm0, %eax 339; AVX512-NEXT: # kill: def $ax killed $ax killed $eax 340; AVX512-NEXT: retq 341entry: 342 %conv = fptosi float %x to i16 343 ret i16 %conv 344} 345 346define signext i8 @test_float_to_si8(float %x) { 347; X64-LABEL: test_float_to_si8: 348; X64: # %bb.0: # %entry 349; X64-NEXT: cvttss2si %xmm0, %eax 350; X64-NEXT: # kill: def $al killed $al killed $eax 351; X64-NEXT: retq 352; 353; AVX512-LABEL: test_float_to_si8: 354; AVX512: # %bb.0: # %entry 355; AVX512-NEXT: vcvttss2si %xmm0, %eax 356; AVX512-NEXT: # kill: def $al killed $al killed $eax 357; AVX512-NEXT: retq 358entry: 359 %conv = fptosi float %x to i8 360 ret i8 %conv 361} 362 363define i31 @test_float_to_si31(float %x) { 364; X64-LABEL: test_float_to_si31: 365; X64: # %bb.0: # %entry 366; X64-NEXT: cvttss2si %xmm0, %eax 367; X64-NEXT: retq 368; 369; AVX512-LABEL: test_float_to_si31: 370; AVX512: # %bb.0: # %entry 371; AVX512-NEXT: vcvttss2si %xmm0, %eax 372; AVX512-NEXT: retq 373entry: 374 %conv = fptosi float %x to i31 375 ret i31 %conv 376} 377 378define i33 @test_float_to_si33(float %x) { 379; X64-LABEL: test_float_to_si33: 380; X64: # %bb.0: # %entry 381; X64-NEXT: cvttss2si %xmm0, %rax 382; X64-NEXT: retq 383; 384; AVX512-LABEL: test_float_to_si33: 385; AVX512: # %bb.0: # %entry 386; AVX512-NEXT: vcvttss2si %xmm0, %rax 387; AVX512-NEXT: retq 388entry: 389 %conv = fptosi float %x to i33 390 ret i33 %conv 391} 392