523 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=CHECK-X64,CHECK-X64-V33; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=CHECK-X64,CHECK-X64-V44 5define <2 x i64> @udiv_identity_const(<2 x i1> %c, <2 x i64> %x) {6; CHECK-X64-V3-LABEL: udiv_identity_const:7; CHECK-X64-V3: # %bb.0:8; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm09; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]10; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]11; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm012; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx13; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax14; CHECK-X64-V3-NEXT: xorl %edx, %edx15; CHECK-X64-V3-NEXT: divq %rcx16; CHECK-X64-V3-NEXT: movq %rax, %rcx17; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi18; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax19; CHECK-X64-V3-NEXT: xorl %edx, %edx20; CHECK-X64-V3-NEXT: divq %rsi21; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm022; CHECK-X64-V3-NEXT: vmovq %rax, %xmm123; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]24; CHECK-X64-V3-NEXT: retq25;26; CHECK-X64-V4-LABEL: udiv_identity_const:27; CHECK-X64-V4: # %bb.0:28; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm029; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k130; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rdx31; CHECK-X64-V4-NEXT: movabsq $3353953467947191203, %rax # imm = 0x2E8BA2E8BA2E8BA332; CHECK-X64-V4-NEXT: mulxq %rax, %rcx, %rcx33; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm034; CHECK-X64-V4-NEXT: vmovq %xmm1, %rdx35; CHECK-X64-V4-NEXT: mulxq %rax, %rax, %rax36; CHECK-X64-V4-NEXT: vmovq %rax, %xmm237; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]38; CHECK-X64-V4-NEXT: vpsrlq $1, %xmm0, %xmm1 {%k1}39; CHECK-X64-V4-NEXT: vmovdqa %xmm1, %xmm040; CHECK-X64-V4-NEXT: retq41 %d = select <2 x i1> %c, <2 x i64> <i64 11, i64 11>, <2 x i64> <i64 1, i64 1>42 %r = udiv <2 x i64> %x, %d43 ret <2 x i64> %r44}45 46 47define <2 x i64> @udiv_identity_const_todo_getter_nonzero(<2 x i1> %c, <2 x i64> %x) {48; CHECK-X64-V3-LABEL: udiv_identity_const_todo_getter_nonzero:49; CHECK-X64-V3: # %bb.0:50; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm051; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]52; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]53; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm054; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx55; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax56; CHECK-X64-V3-NEXT: xorl %edx, %edx57; CHECK-X64-V3-NEXT: divq %rcx58; CHECK-X64-V3-NEXT: movq %rax, %rcx59; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi60; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax61; CHECK-X64-V3-NEXT: xorl %edx, %edx62; CHECK-X64-V3-NEXT: divq %rsi63; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm064; CHECK-X64-V3-NEXT: vmovq %rax, %xmm165; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]66; CHECK-X64-V3-NEXT: retq67;68; CHECK-X64-V4-LABEL: udiv_identity_const_todo_getter_nonzero:69; CHECK-X64-V4: # %bb.0:70; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm071; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k172; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rdx73; CHECK-X64-V4-NEXT: movabsq $-3689348814741910323, %rax # imm = 0xCCCCCCCCCCCCCCCD74; CHECK-X64-V4-NEXT: mulxq %rax, %rcx, %rcx75; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm076; CHECK-X64-V4-NEXT: vmovq %xmm1, %rdx77; CHECK-X64-V4-NEXT: mulxq %rax, %rax, %rax78; CHECK-X64-V4-NEXT: vmovq %rax, %xmm279; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]80; CHECK-X64-V4-NEXT: vpsrlq $3, %xmm0, %xmm1 {%k1}81; CHECK-X64-V4-NEXT: vmovdqa %xmm1, %xmm082; CHECK-X64-V4-NEXT: retq83 84 ;; Fails at the moment because `10` is even so there is no common85 ;; bit between the arms of the select so the default case of86 ;; isKnownNeverZero has no guaranteed 1 bits.87 %d = select <2 x i1> %c, <2 x i64> <i64 10, i64 10>, <2 x i64> <i64 1, i64 1>88 %r = udiv <2 x i64> %x, %d89 ret <2 x i64> %r90}91 92define <2 x i64> @udiv_indentity_non_zero(<2 x i1> %c, <2 x i64> %x, <2 x i64> %y) {93; CHECK-X64-V3-LABEL: udiv_indentity_non_zero:94; CHECK-X64-V3: # %bb.0:95; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm096; CHECK-X64-V3-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm397; CHECK-X64-V3-NEXT: vpsubq %xmm3, %xmm2, %xmm298; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm3 = [1,1]99; CHECK-X64-V3-NEXT: # xmm3 = mem[0,0]100; CHECK-X64-V3-NEXT: vblendvpd %xmm0, %xmm2, %xmm3, %xmm0101; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx102; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax103; CHECK-X64-V3-NEXT: xorl %edx, %edx104; CHECK-X64-V3-NEXT: divq %rcx105; CHECK-X64-V3-NEXT: movq %rax, %rcx106; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi107; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax108; CHECK-X64-V3-NEXT: xorl %edx, %edx109; CHECK-X64-V3-NEXT: divq %rsi110; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0111; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1112; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]113; CHECK-X64-V3-NEXT: retq114;115; CHECK-X64-V4-LABEL: udiv_indentity_non_zero:116; CHECK-X64-V4: # %bb.0:117; CHECK-X64-V4-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3118; CHECK-X64-V4-NEXT: vpsubq %xmm3, %xmm2, %xmm2119; CHECK-X64-V4-NEXT: vpextrq $1, %xmm2, %rcx120; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax121; CHECK-X64-V4-NEXT: xorl %edx, %edx122; CHECK-X64-V4-NEXT: divq %rcx123; CHECK-X64-V4-NEXT: movq %rax, %rcx124; CHECK-X64-V4-NEXT: vmovq %xmm2, %rsi125; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax126; CHECK-X64-V4-NEXT: xorl %edx, %edx127; CHECK-X64-V4-NEXT: divq %rsi128; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0129; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1130; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0131; CHECK-X64-V4-NEXT: vmovq %rax, %xmm2132; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm1 {%k1} = xmm2[0],xmm0[0]133; CHECK-X64-V4-NEXT: vmovdqa %xmm1, %xmm0134; CHECK-X64-V4-NEXT: retq135 %non_zero = add nsw nuw <2 x i64> %y, <i64 1, i64 1>136 %d = select <2 x i1> %c, <2 x i64> %non_zero, <2 x i64> <i64 1, i64 1>137 %r = udiv <2 x i64> %x, %d138 ret <2 x i64> %r139}140 141define <2 x i64> @udiv_indentity_zero(<2 x i1> %c, <2 x i64> %x) {142; CHECK-X64-V3-LABEL: udiv_indentity_zero:143; CHECK-X64-V3: # %bb.0:144; CHECK-X64-V3-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0145; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax146; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx147; CHECK-X64-V3-NEXT: xorl %edx, %edx148; CHECK-X64-V3-NEXT: divq %rcx149; CHECK-X64-V3-NEXT: movq %rax, %rcx150; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax151; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi152; CHECK-X64-V3-NEXT: xorl %edx, %edx153; CHECK-X64-V3-NEXT: divq %rsi154; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0155; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1156; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]157; CHECK-X64-V3-NEXT: retq158;159; CHECK-X64-V4-LABEL: udiv_indentity_zero:160; CHECK-X64-V4: # %bb.0:161; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0162; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k0163; CHECK-X64-V4-NEXT: knotw %k0, %k1164; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k1} {z} = [1,1]165; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax166; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx167; CHECK-X64-V4-NEXT: xorl %edx, %edx168; CHECK-X64-V4-NEXT: divq %rcx169; CHECK-X64-V4-NEXT: movq %rax, %rcx170; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax171; CHECK-X64-V4-NEXT: vmovq %xmm0, %rsi172; CHECK-X64-V4-NEXT: xorl %edx, %edx173; CHECK-X64-V4-NEXT: divq %rsi174; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0175; CHECK-X64-V4-NEXT: vmovq %rax, %xmm1176; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]177; CHECK-X64-V4-NEXT: retq178 %d = select <2 x i1> %c, <2 x i64> zeroinitializer, <2 x i64> <i64 1, i64 1>179 %r = udiv <2 x i64> %x, %d180 ret <2 x i64> %r181}182 183define <2 x i64> @udiv_indentity_partial_zero(<2 x i1> %c, <2 x i64> %x) {184; CHECK-X64-V3-LABEL: udiv_indentity_partial_zero:185; CHECK-X64-V3: # %bb.0:186; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0187; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]188; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]189; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0190; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx191; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax192; CHECK-X64-V3-NEXT: xorl %edx, %edx193; CHECK-X64-V3-NEXT: divq %rcx194; CHECK-X64-V3-NEXT: movq %rax, %rcx195; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi196; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax197; CHECK-X64-V3-NEXT: xorl %edx, %edx198; CHECK-X64-V3-NEXT: divq %rsi199; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0200; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1201; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]202; CHECK-X64-V3-NEXT: retq203;204; CHECK-X64-V4-LABEL: udiv_indentity_partial_zero:205; CHECK-X64-V4: # %bb.0:206; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0207; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1208; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [1,1]209; CHECK-X64-V4-NEXT: vmovdqa64 {{.*#+}} xmm0 {%k1} = [0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0]210; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx211; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax212; CHECK-X64-V4-NEXT: xorl %edx, %edx213; CHECK-X64-V4-NEXT: divq %rcx214; CHECK-X64-V4-NEXT: movq %rax, %rcx215; CHECK-X64-V4-NEXT: vmovq %xmm0, %rsi216; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax217; CHECK-X64-V4-NEXT: xorl %edx, %edx218; CHECK-X64-V4-NEXT: divq %rsi219; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0220; CHECK-X64-V4-NEXT: vmovq %rax, %xmm1221; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]222; CHECK-X64-V4-NEXT: retq223 %d = select <2 x i1> %c, <2 x i64> <i64 0, i64 5>, <2 x i64> <i64 1, i64 1>224 %r = udiv <2 x i64> %x, %d225 ret <2 x i64> %r226}227 228define <2 x i64> @urem_identity_const(<2 x i1> %c, <2 x i64> %x) {229; CHECK-X64-V3-LABEL: urem_identity_const:230; CHECK-X64-V3: # %bb.0:231; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0232; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [11,11]233; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]234; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0235; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx236; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax237; CHECK-X64-V3-NEXT: xorl %edx, %edx238; CHECK-X64-V3-NEXT: divq %rcx239; CHECK-X64-V3-NEXT: movq %rdx, %rcx240; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi241; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax242; CHECK-X64-V3-NEXT: xorl %edx, %edx243; CHECK-X64-V3-NEXT: divq %rsi244; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0245; CHECK-X64-V3-NEXT: vmovq %rdx, %xmm1246; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]247; CHECK-X64-V3-NEXT: retq248;249; CHECK-X64-V4-LABEL: urem_identity_const:250; CHECK-X64-V4: # %bb.0:251; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0252; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1253; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [11,11]254; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k1} = [1,1]255; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx256; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax257; CHECK-X64-V4-NEXT: xorl %edx, %edx258; CHECK-X64-V4-NEXT: divq %rcx259; CHECK-X64-V4-NEXT: movq %rdx, %rcx260; CHECK-X64-V4-NEXT: vmovq %xmm0, %rsi261; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax262; CHECK-X64-V4-NEXT: xorl %edx, %edx263; CHECK-X64-V4-NEXT: divq %rsi264; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0265; CHECK-X64-V4-NEXT: vmovq %rdx, %xmm1266; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]267; CHECK-X64-V4-NEXT: retq268 %d = select <2 x i1> %c, <2 x i64> <i64 1, i64 1>, <2 x i64> <i64 11, i64 11>269 %r = urem <2 x i64> %x, %d270 ret <2 x i64> %r271}272 273define <2 x i64> @sdiv_identity_const(<2 x i1> %c, <2 x i64> %x) {274; CHECK-X64-V3-LABEL: sdiv_identity_const:275; CHECK-X64-V3: # %bb.0:276; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0277; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]278; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]279; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0280; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx281; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax282; CHECK-X64-V3-NEXT: cqto283; CHECK-X64-V3-NEXT: idivq %rcx284; CHECK-X64-V3-NEXT: movq %rax, %rcx285; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi286; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax287; CHECK-X64-V3-NEXT: cqto288; CHECK-X64-V3-NEXT: idivq %rsi289; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0290; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1291; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]292; CHECK-X64-V3-NEXT: retq293;294; CHECK-X64-V4-LABEL: sdiv_identity_const:295; CHECK-X64-V4: # %bb.0:296; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0297; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1298; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [1,1]299; CHECK-X64-V4-NEXT: vmovdqa64 {{.*#+}} xmm0 {%k1} = [11,13]300; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx301; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax302; CHECK-X64-V4-NEXT: cqto303; CHECK-X64-V4-NEXT: idivq %rcx304; CHECK-X64-V4-NEXT: movq %rax, %rcx305; CHECK-X64-V4-NEXT: vmovq %xmm0, %rsi306; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax307; CHECK-X64-V4-NEXT: cqto308; CHECK-X64-V4-NEXT: idivq %rsi309; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0310; CHECK-X64-V4-NEXT: vmovq %rax, %xmm1311; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]312; CHECK-X64-V4-NEXT: retq313 %d = select <2 x i1> %c, <2 x i64> <i64 11, i64 13>, <2 x i64> <i64 1, i64 1>314 %r = sdiv <2 x i64> %x, %d315 ret <2 x i64> %r316}317 318define <2 x i64> @sdiv_identity_const_todo_better_nonzero(<2 x i1> %c, <2 x i64> %x) {319; CHECK-X64-V3-LABEL: sdiv_identity_const_todo_better_nonzero:320; CHECK-X64-V3: # %bb.0:321; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0322; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]323; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]324; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0325; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx326; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax327; CHECK-X64-V3-NEXT: cqto328; CHECK-X64-V3-NEXT: idivq %rcx329; CHECK-X64-V3-NEXT: movq %rax, %rcx330; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi331; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax332; CHECK-X64-V3-NEXT: cqto333; CHECK-X64-V3-NEXT: idivq %rsi334; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0335; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1336; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]337; CHECK-X64-V3-NEXT: retq338;339; CHECK-X64-V4-LABEL: sdiv_identity_const_todo_better_nonzero:340; CHECK-X64-V4: # %bb.0:341; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0342; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1343; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [1,1]344; CHECK-X64-V4-NEXT: vmovdqa64 {{.*#+}} xmm0 {%k1} = [11,17]345; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx346; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax347; CHECK-X64-V4-NEXT: cqto348; CHECK-X64-V4-NEXT: idivq %rcx349; CHECK-X64-V4-NEXT: movq %rax, %rcx350; CHECK-X64-V4-NEXT: vmovq %xmm0, %rsi351; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax352; CHECK-X64-V4-NEXT: cqto353; CHECK-X64-V4-NEXT: idivq %rsi354; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0355; CHECK-X64-V4-NEXT: vmovq %rax, %xmm1356; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]357; CHECK-X64-V4-NEXT: retq358 %d = select <2 x i1> %c, <2 x i64> <i64 11, i64 17>, <2 x i64> <i64 1, i64 1>359 %r = sdiv <2 x i64> %x, %d360 ret <2 x i64> %r361}362 363define <2 x i64> @srem_identity_const(<2 x i1> %c, <2 x i64> %x) {364; CHECK-X64-V3-LABEL: srem_identity_const:365; CHECK-X64-V3: # %bb.0:366; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0367; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [11,11]368; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]369; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0370; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx371; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax372; CHECK-X64-V3-NEXT: cqto373; CHECK-X64-V3-NEXT: idivq %rcx374; CHECK-X64-V3-NEXT: movq %rdx, %rcx375; CHECK-X64-V3-NEXT: vmovq %xmm0, %rsi376; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax377; CHECK-X64-V3-NEXT: cqto378; CHECK-X64-V3-NEXT: idivq %rsi379; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0380; CHECK-X64-V3-NEXT: vmovq %rdx, %xmm1381; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]382; CHECK-X64-V3-NEXT: retq383;384; CHECK-X64-V4-LABEL: srem_identity_const:385; CHECK-X64-V4: # %bb.0:386; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0387; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1388; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [11,11]389; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k1} = [1,1]390; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx391; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax392; CHECK-X64-V4-NEXT: cqto393; CHECK-X64-V4-NEXT: idivq %rcx394; CHECK-X64-V4-NEXT: movq %rdx, %rcx395; CHECK-X64-V4-NEXT: vmovq %xmm0, %rsi396; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax397; CHECK-X64-V4-NEXT: cqto398; CHECK-X64-V4-NEXT: idivq %rsi399; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0400; CHECK-X64-V4-NEXT: vmovq %rdx, %xmm1401; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]402; CHECK-X64-V4-NEXT: retq403 %d = select <2 x i1> %c, <2 x i64> <i64 1, i64 1>, <2 x i64> <i64 11, i64 11>404 %r = srem <2 x i64> %x, %d405 ret <2 x i64> %r406}407 408define <2 x i64> @udivrem_identity_const(<2 x i1> %c, <2 x i64> %x) {409; CHECK-X64-V3-LABEL: udivrem_identity_const:410; CHECK-X64-V3: # %bb.0:411; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0412; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]413; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]414; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0415; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx416; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax417; CHECK-X64-V3-NEXT: xorl %edx, %edx418; CHECK-X64-V3-NEXT: divq %rcx419; CHECK-X64-V3-NEXT: movq %rax, %rcx420; CHECK-X64-V3-NEXT: movq %rdx, %rsi421; CHECK-X64-V3-NEXT: vmovq %xmm0, %rdi422; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax423; CHECK-X64-V3-NEXT: xorl %edx, %edx424; CHECK-X64-V3-NEXT: divq %rdi425; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0426; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1427; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]428; CHECK-X64-V3-NEXT: vmovq %rsi, %xmm1429; CHECK-X64-V3-NEXT: vmovq %rdx, %xmm2430; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]431; CHECK-X64-V3-NEXT: vpaddq %xmm1, %xmm0, %xmm0432; CHECK-X64-V3-NEXT: retq433;434; CHECK-X64-V4-LABEL: udivrem_identity_const:435; CHECK-X64-V4: # %bb.0:436; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0437; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1438; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [1,1]439; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k1} = [11,11]440; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx441; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax442; CHECK-X64-V4-NEXT: xorl %edx, %edx443; CHECK-X64-V4-NEXT: divq %rcx444; CHECK-X64-V4-NEXT: movq %rax, %rcx445; CHECK-X64-V4-NEXT: movq %rdx, %rsi446; CHECK-X64-V4-NEXT: vmovq %xmm0, %rdi447; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax448; CHECK-X64-V4-NEXT: xorl %edx, %edx449; CHECK-X64-V4-NEXT: divq %rdi450; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0451; CHECK-X64-V4-NEXT: vmovq %rax, %xmm1452; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]453; CHECK-X64-V4-NEXT: vmovq %rsi, %xmm1454; CHECK-X64-V4-NEXT: vmovq %rdx, %xmm2455; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]456; CHECK-X64-V4-NEXT: vpaddq %xmm1, %xmm0, %xmm0457; CHECK-X64-V4-NEXT: retq458 %d = select <2 x i1> %c, <2 x i64> <i64 11, i64 11>, <2 x i64> <i64 1, i64 1>459 %div = udiv <2 x i64> %x, %d460 %rem = urem <2 x i64> %x, %d461 %r = add <2 x i64> %div, %rem462 ret <2 x i64> %r463}464 465define <2 x i64> @sdivrem_identity_const(<2 x i1> %c, <2 x i64> %x) {466; CHECK-X64-V3-LABEL: sdivrem_identity_const:467; CHECK-X64-V3: # %bb.0:468; CHECK-X64-V3-NEXT: vpsllq $63, %xmm0, %xmm0469; CHECK-X64-V3-NEXT: vmovddup {{.*#+}} xmm2 = [1,1]470; CHECK-X64-V3-NEXT: # xmm2 = mem[0,0]471; CHECK-X64-V3-NEXT: vblendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0472; CHECK-X64-V3-NEXT: vpextrq $1, %xmm0, %rcx473; CHECK-X64-V3-NEXT: vpextrq $1, %xmm1, %rax474; CHECK-X64-V3-NEXT: cqto475; CHECK-X64-V3-NEXT: idivq %rcx476; CHECK-X64-V3-NEXT: movq %rax, %rcx477; CHECK-X64-V3-NEXT: movq %rdx, %rsi478; CHECK-X64-V3-NEXT: vmovq %xmm0, %rdi479; CHECK-X64-V3-NEXT: vmovq %xmm1, %rax480; CHECK-X64-V3-NEXT: cqto481; CHECK-X64-V3-NEXT: idivq %rdi482; CHECK-X64-V3-NEXT: vmovq %rcx, %xmm0483; CHECK-X64-V3-NEXT: vmovq %rax, %xmm1484; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]485; CHECK-X64-V3-NEXT: vmovq %rsi, %xmm1486; CHECK-X64-V3-NEXT: vmovq %rdx, %xmm2487; CHECK-X64-V3-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]488; CHECK-X64-V3-NEXT: vpaddq %xmm1, %xmm0, %xmm0489; CHECK-X64-V3-NEXT: retq490;491; CHECK-X64-V4-LABEL: sdivrem_identity_const:492; CHECK-X64-V4: # %bb.0:493; CHECK-X64-V4-NEXT: vpsllq $63, %xmm0, %xmm0494; CHECK-X64-V4-NEXT: vpmovq2m %xmm0, %k1495; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 = [1,1]496; CHECK-X64-V4-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k1} = [11,11]497; CHECK-X64-V4-NEXT: vpextrq $1, %xmm0, %rcx498; CHECK-X64-V4-NEXT: vpextrq $1, %xmm1, %rax499; CHECK-X64-V4-NEXT: cqto500; CHECK-X64-V4-NEXT: idivq %rcx501; CHECK-X64-V4-NEXT: movq %rax, %rcx502; CHECK-X64-V4-NEXT: movq %rdx, %rsi503; CHECK-X64-V4-NEXT: vmovq %xmm0, %rdi504; CHECK-X64-V4-NEXT: vmovq %xmm1, %rax505; CHECK-X64-V4-NEXT: cqto506; CHECK-X64-V4-NEXT: idivq %rdi507; CHECK-X64-V4-NEXT: vmovq %rcx, %xmm0508; CHECK-X64-V4-NEXT: vmovq %rax, %xmm1509; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]510; CHECK-X64-V4-NEXT: vmovq %rsi, %xmm1511; CHECK-X64-V4-NEXT: vmovq %rdx, %xmm2512; CHECK-X64-V4-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]513; CHECK-X64-V4-NEXT: vpaddq %xmm1, %xmm0, %xmm0514; CHECK-X64-V4-NEXT: retq515 %d = select <2 x i1> %c, <2 x i64> <i64 11, i64 11>, <2 x i64> <i64 1, i64 1>516 %div = sdiv <2 x i64> %x, %d517 %rem = srem <2 x i64> %x, %d518 %r = add <2 x i64> %div, %rem519 ret <2 x i64> %r520}521;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:522; CHECK-X64: {{.*}}523