392 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes X64,SDAG-X643; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes X64,GISEL-X644; RUN: llc < %s -mattr=+avx512f -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes AVX512,SDAG-AVX5125; RUN: llc < %s -global-isel -global-isel-abort=1 -mattr=+avx512f -mtriple=x86_64-- -verify-machineinstrs | FileCheck %s --check-prefixes AVX512,GISEL-AVX5126 7define i64 @test_double_to_ui64(double %x) {8; SDAG-X64-LABEL: test_double_to_ui64:9; SDAG-X64: # %bb.0: # %entry10; SDAG-X64-NEXT: cvttsd2si %xmm0, %rcx11; SDAG-X64-NEXT: movq %rcx, %rdx12; SDAG-X64-NEXT: sarq $63, %rdx13; SDAG-X64-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm014; SDAG-X64-NEXT: cvttsd2si %xmm0, %rax15; SDAG-X64-NEXT: andq %rdx, %rax16; SDAG-X64-NEXT: orq %rcx, %rax17; SDAG-X64-NEXT: retq18;19; GISEL-X64-LABEL: test_double_to_ui64:20; GISEL-X64: # %bb.0: # %entry21; GISEL-X64-NEXT: cvttsd2si %xmm0, %rcx22; GISEL-X64-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]23; GISEL-X64-NEXT: movapd %xmm0, %xmm224; GISEL-X64-NEXT: subsd %xmm1, %xmm225; GISEL-X64-NEXT: cvttsd2si %xmm2, %rdx26; GISEL-X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x800000000000000027; GISEL-X64-NEXT: xorq %rdx, %rax28; GISEL-X64-NEXT: xorl %edx, %edx29; GISEL-X64-NEXT: ucomisd %xmm1, %xmm030; GISEL-X64-NEXT: setb %dl31; GISEL-X64-NEXT: andl $1, %edx32; GISEL-X64-NEXT: cmovneq %rcx, %rax33; GISEL-X64-NEXT: retq34;35; AVX512-LABEL: test_double_to_ui64:36; AVX512: # %bb.0: # %entry37; AVX512-NEXT: vcvttsd2usi %xmm0, %rax38; AVX512-NEXT: retq39entry:40 %conv = fptoui double %x to i6441 ret i64 %conv42}43 44define i32 @test_double_to_ui32(double %x) {45; X64-LABEL: test_double_to_ui32:46; X64: # %bb.0: # %entry47; X64-NEXT: cvttsd2si %xmm0, %rax48; X64-NEXT: # kill: def $eax killed $eax killed $rax49; X64-NEXT: retq50;51; AVX512-LABEL: test_double_to_ui32:52; AVX512: # %bb.0: # %entry53; AVX512-NEXT: vcvttsd2usi %xmm0, %eax54; AVX512-NEXT: retq55entry:56 %conv = fptoui double %x to i3257 ret i32 %conv58}59 60define zeroext i16 @test_double_to_ui16(double %x) {61; X64-LABEL: test_double_to_ui16:62; X64: # %bb.0: # %entry63; X64-NEXT: cvttsd2si %xmm0, %eax64; X64-NEXT: # kill: def $ax killed $ax killed $eax65; X64-NEXT: retq66;67; SDAG-AVX512-LABEL: test_double_to_ui16:68; SDAG-AVX512: # %bb.0: # %entry69; SDAG-AVX512-NEXT: vcvttsd2si %xmm0, %eax70; SDAG-AVX512-NEXT: # kill: def $ax killed $ax killed $eax71; SDAG-AVX512-NEXT: retq72;73; GISEL-AVX512-LABEL: test_double_to_ui16:74; GISEL-AVX512: # %bb.0: # %entry75; GISEL-AVX512-NEXT: vcvttsd2usi %xmm0, %eax76; GISEL-AVX512-NEXT: # kill: def $ax killed $ax killed $eax77; GISEL-AVX512-NEXT: retq78entry:79 %conv = fptoui double %x to i1680 ret i16 %conv81}82 83define zeroext i8 @test_double_to_ui8(double %x) {84; X64-LABEL: test_double_to_ui8:85; X64: # %bb.0: # %entry86; X64-NEXT: cvttsd2si %xmm0, %eax87; X64-NEXT: # kill: def $al killed $al killed $eax88; X64-NEXT: retq89;90; SDAG-AVX512-LABEL: test_double_to_ui8:91; SDAG-AVX512: # %bb.0: # %entry92; SDAG-AVX512-NEXT: vcvttsd2si %xmm0, %eax93; SDAG-AVX512-NEXT: # kill: def $al killed $al killed $eax94; SDAG-AVX512-NEXT: retq95;96; GISEL-AVX512-LABEL: test_double_to_ui8:97; GISEL-AVX512: # %bb.0: # %entry98; GISEL-AVX512-NEXT: vcvttsd2usi %xmm0, %eax99; GISEL-AVX512-NEXT: # kill: def $al killed $al killed $eax100; GISEL-AVX512-NEXT: retq101entry:102 %conv = fptoui double %x to i8103 ret i8 %conv104}105 106define i64 @test_float_to_ui64(float %x) {107; SDAG-X64-LABEL: test_float_to_ui64:108; SDAG-X64: # %bb.0: # %entry109; SDAG-X64-NEXT: cvttss2si %xmm0, %rcx110; SDAG-X64-NEXT: movq %rcx, %rdx111; SDAG-X64-NEXT: sarq $63, %rdx112; SDAG-X64-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0113; SDAG-X64-NEXT: cvttss2si %xmm0, %rax114; SDAG-X64-NEXT: andq %rdx, %rax115; SDAG-X64-NEXT: orq %rcx, %rax116; SDAG-X64-NEXT: retq117;118; GISEL-X64-LABEL: test_float_to_ui64:119; GISEL-X64: # %bb.0: # %entry120; GISEL-X64-NEXT: cvttss2si %xmm0, %rcx121; GISEL-X64-NEXT: movss {{.*#+}} xmm1 = [9.22337203E+18,0.0E+0,0.0E+0,0.0E+0]122; GISEL-X64-NEXT: movaps %xmm0, %xmm2123; GISEL-X64-NEXT: subss %xmm1, %xmm2124; GISEL-X64-NEXT: cvttss2si %xmm2, %rdx125; GISEL-X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000126; GISEL-X64-NEXT: xorq %rdx, %rax127; GISEL-X64-NEXT: xorl %edx, %edx128; GISEL-X64-NEXT: ucomiss %xmm1, %xmm0129; GISEL-X64-NEXT: setb %dl130; GISEL-X64-NEXT: andl $1, %edx131; GISEL-X64-NEXT: cmovneq %rcx, %rax132; GISEL-X64-NEXT: retq133;134; AVX512-LABEL: test_float_to_ui64:135; AVX512: # %bb.0: # %entry136; AVX512-NEXT: vcvttss2usi %xmm0, %rax137; AVX512-NEXT: retq138entry:139 %conv = fptoui float %x to i64140 ret i64 %conv141}142 143define i32 @test_float_to_ui32(float %x) {144; X64-LABEL: test_float_to_ui32:145; X64: # %bb.0: # %entry146; X64-NEXT: cvttss2si %xmm0, %rax147; X64-NEXT: # kill: def $eax killed $eax killed $rax148; X64-NEXT: retq149;150; AVX512-LABEL: test_float_to_ui32:151; AVX512: # %bb.0: # %entry152; AVX512-NEXT: vcvttss2usi %xmm0, %eax153; AVX512-NEXT: retq154entry:155 %conv = fptoui float %x to i32156 ret i32 %conv157}158 159define zeroext i16 @test_float_to_ui16(float %x) {160; X64-LABEL: test_float_to_ui16:161; X64: # %bb.0: # %entry162; X64-NEXT: cvttss2si %xmm0, %eax163; X64-NEXT: # kill: def $ax killed $ax killed $eax164; X64-NEXT: retq165;166; SDAG-AVX512-LABEL: test_float_to_ui16:167; SDAG-AVX512: # %bb.0: # %entry168; SDAG-AVX512-NEXT: vcvttss2si %xmm0, %eax169; SDAG-AVX512-NEXT: # kill: def $ax killed $ax killed $eax170; SDAG-AVX512-NEXT: retq171;172; GISEL-AVX512-LABEL: test_float_to_ui16:173; GISEL-AVX512: # %bb.0: # %entry174; GISEL-AVX512-NEXT: vcvttss2usi %xmm0, %eax175; GISEL-AVX512-NEXT: # kill: def $ax killed $ax killed $eax176; GISEL-AVX512-NEXT: retq177entry:178 %conv = fptoui float %x to i16179 ret i16 %conv180}181 182define zeroext i8 @test_float_to_ui8(float %x) {183; X64-LABEL: test_float_to_ui8:184; X64: # %bb.0: # %entry185; X64-NEXT: cvttss2si %xmm0, %eax186; X64-NEXT: # kill: def $al killed $al killed $eax187; X64-NEXT: retq188;189; SDAG-AVX512-LABEL: test_float_to_ui8:190; SDAG-AVX512: # %bb.0: # %entry191; SDAG-AVX512-NEXT: vcvttss2si %xmm0, %eax192; SDAG-AVX512-NEXT: # kill: def $al killed $al killed $eax193; SDAG-AVX512-NEXT: retq194;195; GISEL-AVX512-LABEL: test_float_to_ui8:196; GISEL-AVX512: # %bb.0: # %entry197; GISEL-AVX512-NEXT: vcvttss2usi %xmm0, %eax198; GISEL-AVX512-NEXT: # kill: def $al killed $al killed $eax199; GISEL-AVX512-NEXT: retq200entry:201 %conv = fptoui float %x to i8202 ret i8 %conv203}204 205define i64 @test_double_to_si64(double %x) {206; X64-LABEL: test_double_to_si64:207; X64: # %bb.0: # %entry208; X64-NEXT: cvttsd2si %xmm0, %rax209; X64-NEXT: retq210;211; AVX512-LABEL: test_double_to_si64:212; AVX512: # %bb.0: # %entry213; AVX512-NEXT: vcvttsd2si %xmm0, %rax214; AVX512-NEXT: retq215entry:216 %conv = fptosi double %x to i64217 ret i64 %conv218}219 220define i32 @test_double_to_si32(double %x) {221; X64-LABEL: test_double_to_si32:222; X64: # %bb.0: # %entry223; X64-NEXT: cvttsd2si %xmm0, %eax224; X64-NEXT: retq225;226; AVX512-LABEL: test_double_to_si32:227; AVX512: # %bb.0: # %entry228; AVX512-NEXT: vcvttsd2si %xmm0, %eax229; AVX512-NEXT: retq230entry:231 %conv = fptosi double %x to i32232 ret i32 %conv233}234 235define signext i16 @test_double_to_si16(double %x) {236; X64-LABEL: test_double_to_si16:237; X64: # %bb.0: # %entry238; X64-NEXT: cvttsd2si %xmm0, %eax239; X64-NEXT: # kill: def $ax killed $ax killed $eax240; X64-NEXT: retq241;242; AVX512-LABEL: test_double_to_si16:243; AVX512: # %bb.0: # %entry244; AVX512-NEXT: vcvttsd2si %xmm0, %eax245; AVX512-NEXT: # kill: def $ax killed $ax killed $eax246; AVX512-NEXT: retq247entry:248 %conv = fptosi double %x to i16249 ret i16 %conv250}251 252define signext i8 @test_double_to_si8(double %x) {253; X64-LABEL: test_double_to_si8:254; X64: # %bb.0: # %entry255; X64-NEXT: cvttsd2si %xmm0, %eax256; X64-NEXT: # kill: def $al killed $al killed $eax257; X64-NEXT: retq258;259; AVX512-LABEL: test_double_to_si8:260; AVX512: # %bb.0: # %entry261; AVX512-NEXT: vcvttsd2si %xmm0, %eax262; AVX512-NEXT: # kill: def $al killed $al killed $eax263; AVX512-NEXT: retq264entry:265 %conv = fptosi double %x to i8266 ret i8 %conv267}268 269define i31 @test_double_to_si31(double %x) {270; X64-LABEL: test_double_to_si31:271; X64: # %bb.0: # %entry272; X64-NEXT: cvttsd2si %xmm0, %eax273; X64-NEXT: retq274;275; AVX512-LABEL: test_double_to_si31:276; AVX512: # %bb.0: # %entry277; AVX512-NEXT: vcvttsd2si %xmm0, %eax278; AVX512-NEXT: retq279entry:280 %conv = fptosi double %x to i31281 ret i31 %conv282}283 284define i33 @test_double_to_si33(double %x) {285; X64-LABEL: test_double_to_si33:286; X64: # %bb.0: # %entry287; X64-NEXT: cvttsd2si %xmm0, %rax288; X64-NEXT: retq289;290; AVX512-LABEL: test_double_to_si33:291; AVX512: # %bb.0: # %entry292; AVX512-NEXT: vcvttsd2si %xmm0, %rax293; AVX512-NEXT: retq294entry:295 %conv = fptosi double %x to i33296 ret i33 %conv297}298 299define i64 @test_float_to_si64(float %x) {300; X64-LABEL: test_float_to_si64:301; X64: # %bb.0: # %entry302; X64-NEXT: cvttss2si %xmm0, %rax303; X64-NEXT: retq304;305; AVX512-LABEL: test_float_to_si64:306; AVX512: # %bb.0: # %entry307; AVX512-NEXT: vcvttss2si %xmm0, %rax308; AVX512-NEXT: retq309entry:310 %conv = fptosi float %x to i64311 ret i64 %conv312}313 314define i32 @test_float_to_si32(float %x) {315; X64-LABEL: test_float_to_si32:316; X64: # %bb.0: # %entry317; X64-NEXT: cvttss2si %xmm0, %eax318; X64-NEXT: retq319;320; AVX512-LABEL: test_float_to_si32:321; AVX512: # %bb.0: # %entry322; AVX512-NEXT: vcvttss2si %xmm0, %eax323; AVX512-NEXT: retq324entry:325 %conv = fptosi float %x to i32326 ret i32 %conv327}328 329define signext i16 @test_float_to_si16(float %x) {330; X64-LABEL: test_float_to_si16:331; X64: # %bb.0: # %entry332; X64-NEXT: cvttss2si %xmm0, %eax333; X64-NEXT: # kill: def $ax killed $ax killed $eax334; X64-NEXT: retq335;336; AVX512-LABEL: test_float_to_si16:337; AVX512: # %bb.0: # %entry338; AVX512-NEXT: vcvttss2si %xmm0, %eax339; AVX512-NEXT: # kill: def $ax killed $ax killed $eax340; AVX512-NEXT: retq341entry:342 %conv = fptosi float %x to i16343 ret i16 %conv344}345 346define signext i8 @test_float_to_si8(float %x) {347; X64-LABEL: test_float_to_si8:348; X64: # %bb.0: # %entry349; X64-NEXT: cvttss2si %xmm0, %eax350; X64-NEXT: # kill: def $al killed $al killed $eax351; X64-NEXT: retq352;353; AVX512-LABEL: test_float_to_si8:354; AVX512: # %bb.0: # %entry355; AVX512-NEXT: vcvttss2si %xmm0, %eax356; AVX512-NEXT: # kill: def $al killed $al killed $eax357; AVX512-NEXT: retq358entry:359 %conv = fptosi float %x to i8360 ret i8 %conv361}362 363define i31 @test_float_to_si31(float %x) {364; X64-LABEL: test_float_to_si31:365; X64: # %bb.0: # %entry366; X64-NEXT: cvttss2si %xmm0, %eax367; X64-NEXT: retq368;369; AVX512-LABEL: test_float_to_si31:370; AVX512: # %bb.0: # %entry371; AVX512-NEXT: vcvttss2si %xmm0, %eax372; AVX512-NEXT: retq373entry:374 %conv = fptosi float %x to i31375 ret i31 %conv376}377 378define i33 @test_float_to_si33(float %x) {379; X64-LABEL: test_float_to_si33:380; X64: # %bb.0: # %entry381; X64-NEXT: cvttss2si %xmm0, %rax382; X64-NEXT: retq383;384; AVX512-LABEL: test_float_to_si33:385; AVX512: # %bb.0: # %entry386; AVX512-NEXT: vcvttss2si %xmm0, %rax387; AVX512-NEXT: retq388entry:389 %conv = fptosi float %x to i33390 ret i33 %conv391}392