brintos

brintos / llvm-project-archived public Read only

0
0
Text · 50.1 KiB · b12be7c Raw
1355 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2   | FileCheck %s --check-prefixes=ANY,SSE,SSE23; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=ANY,SSE,SSE4,SSE414; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=ANY,SSE,SSE4,SSE425; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2   | FileCheck %s --check-prefixes=ANY,AVX,AVX26; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl | FileCheck %s --check-prefixes=ANY,AVX,AVX5127 8; There are at least 3 potential patterns corresponding to an unsigned saturated add: min, cmp with sum, cmp with not.9; Test each of those patterns with i8/i16/i32/i64.10; Test each of those with a constant operand and a variable operand.11; Test each of those with a 128-bit vector type.12 13define i8 @unsigned_sat_constant_i8_using_min(i8 %x) {14; ANY-LABEL: unsigned_sat_constant_i8_using_min:15; ANY:       # %bb.0:16; ANY-NEXT:    cmpb $-43, %dil17; ANY-NEXT:    movl $213, %eax18; ANY-NEXT:    cmovbl %edi, %eax19; ANY-NEXT:    addb $42, %al20; ANY-NEXT:    # kill: def $al killed $al killed $eax21; ANY-NEXT:    retq22  %c = icmp ult i8 %x, -4323  %s = select i1 %c, i8 %x, i8 -4324  %r = add i8 %s, 4225  ret i8 %r26}27 28define i8 @unsigned_sat_constant_i8_using_cmp_sum(i8 %x) {29; ANY-LABEL: unsigned_sat_constant_i8_using_cmp_sum:30; ANY:       # %bb.0:31; ANY-NEXT:    addb $42, %dil32; ANY-NEXT:    movzbl %dil, %ecx33; ANY-NEXT:    movl $255, %eax34; ANY-NEXT:    cmovael %ecx, %eax35; ANY-NEXT:    # kill: def $al killed $al killed $eax36; ANY-NEXT:    retq37  %a = add i8 %x, 4238  %c = icmp ugt i8 %x, %a39  %r = select i1 %c, i8 -1, i8 %a40  ret i8 %r41}42 43define i8 @unsigned_sat_constant_i8_using_cmp_notval(i8 %x) {44; ANY-LABEL: unsigned_sat_constant_i8_using_cmp_notval:45; ANY:       # %bb.0:46; ANY-NEXT:    addb $42, %dil47; ANY-NEXT:    movzbl %dil, %ecx48; ANY-NEXT:    movl $255, %eax49; ANY-NEXT:    cmovael %ecx, %eax50; ANY-NEXT:    # kill: def $al killed $al killed $eax51; ANY-NEXT:    retq52  %a = add i8 %x, 4253  %c = icmp ugt i8 %x, -4354  %r = select i1 %c, i8 -1, i8 %a55  ret i8 %r56}57 58define i16 @unsigned_sat_constant_i16_using_min(i16 %x) {59; ANY-LABEL: unsigned_sat_constant_i16_using_min:60; ANY:       # %bb.0:61; ANY-NEXT:    cmpw $-43, %di62; ANY-NEXT:    movl $65493, %eax # imm = 0xFFD563; ANY-NEXT:    cmovbl %edi, %eax64; ANY-NEXT:    addl $42, %eax65; ANY-NEXT:    # kill: def $ax killed $ax killed $eax66; ANY-NEXT:    retq67  %c = icmp ult i16 %x, -4368  %s = select i1 %c, i16 %x, i16 -4369  %r = add i16 %s, 4270  ret i16 %r71}72 73define i16 @unsigned_sat_constant_i16_using_cmp_sum(i16 %x) {74; ANY-LABEL: unsigned_sat_constant_i16_using_cmp_sum:75; ANY:       # %bb.0:76; ANY-NEXT:    addw $42, %di77; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF78; ANY-NEXT:    cmovael %edi, %eax79; ANY-NEXT:    # kill: def $ax killed $ax killed $eax80; ANY-NEXT:    retq81  %a = add i16 %x, 4282  %c = icmp ugt i16 %x, %a83  %r = select i1 %c, i16 -1, i16 %a84  ret i16 %r85}86 87define i16 @unsigned_sat_constant_i16_using_cmp_notval(i16 %x) {88; ANY-LABEL: unsigned_sat_constant_i16_using_cmp_notval:89; ANY:       # %bb.0:90; ANY-NEXT:    addw $42, %di91; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF92; ANY-NEXT:    cmovael %edi, %eax93; ANY-NEXT:    # kill: def $ax killed $ax killed $eax94; ANY-NEXT:    retq95  %a = add i16 %x, 4296  %c = icmp ugt i16 %x, -4397  %r = select i1 %c, i16 -1, i16 %a98  ret i16 %r99}100 101define i32 @unsigned_sat_constant_i32_using_min(i32 %x) {102; ANY-LABEL: unsigned_sat_constant_i32_using_min:103; ANY:       # %bb.0:104; ANY-NEXT:    cmpl $-43, %edi105; ANY-NEXT:    movl $-43, %eax106; ANY-NEXT:    cmovbl %edi, %eax107; ANY-NEXT:    addl $42, %eax108; ANY-NEXT:    retq109  %c = icmp ult i32 %x, -43110  %s = select i1 %c, i32 %x, i32 -43111  %r = add i32 %s, 42112  ret i32 %r113}114 115define i32 @unsigned_sat_constant_i32_using_cmp_sum(i32 %x) {116; ANY-LABEL: unsigned_sat_constant_i32_using_cmp_sum:117; ANY:       # %bb.0:118; ANY-NEXT:    addl $42, %edi119; ANY-NEXT:    movl $-1, %eax120; ANY-NEXT:    cmovael %edi, %eax121; ANY-NEXT:    retq122  %a = add i32 %x, 42123  %c = icmp ugt i32 %x, %a124  %r = select i1 %c, i32 -1, i32 %a125  ret i32 %r126}127 128define i32 @unsigned_sat_constant_i32_using_cmp_notval(i32 %x) {129; ANY-LABEL: unsigned_sat_constant_i32_using_cmp_notval:130; ANY:       # %bb.0:131; ANY-NEXT:    addl $42, %edi132; ANY-NEXT:    movl $-1, %eax133; ANY-NEXT:    cmovael %edi, %eax134; ANY-NEXT:    retq135  %a = add i32 %x, 42136  %c = icmp ugt i32 %x, -43137  %r = select i1 %c, i32 -1, i32 %a138  ret i32 %r139}140 141define i64 @unsigned_sat_constant_i64_using_min(i64 %x) {142; ANY-LABEL: unsigned_sat_constant_i64_using_min:143; ANY:       # %bb.0:144; ANY-NEXT:    cmpq $-43, %rdi145; ANY-NEXT:    movq $-43, %rax146; ANY-NEXT:    cmovbq %rdi, %rax147; ANY-NEXT:    addq $42, %rax148; ANY-NEXT:    retq149  %c = icmp ult i64 %x, -43150  %s = select i1 %c, i64 %x, i64 -43151  %r = add i64 %s, 42152  ret i64 %r153}154 155define i64 @unsigned_sat_constant_i64_using_cmp_sum(i64 %x) {156; ANY-LABEL: unsigned_sat_constant_i64_using_cmp_sum:157; ANY:       # %bb.0:158; ANY-NEXT:    addq $42, %rdi159; ANY-NEXT:    movq $-1, %rax160; ANY-NEXT:    cmovaeq %rdi, %rax161; ANY-NEXT:    retq162  %a = add i64 %x, 42163  %c = icmp ugt i64 %x, %a164  %r = select i1 %c, i64 -1, i64 %a165  ret i64 %r166}167 168define i64 @unsigned_sat_constant_i64_using_cmp_notval(i64 %x) {169; ANY-LABEL: unsigned_sat_constant_i64_using_cmp_notval:170; ANY:       # %bb.0:171; ANY-NEXT:    addq $42, %rdi172; ANY-NEXT:    movq $-1, %rax173; ANY-NEXT:    cmovaeq %rdi, %rax174; ANY-NEXT:    retq175  %a = add i64 %x, 42176  %c = icmp ugt i64 %x, -43177  %r = select i1 %c, i64 -1, i64 %a178  ret i64 %r179}180 181define i8 @unsigned_sat_variable_i8_using_min(i8 %x, i8 %y) {182; ANY-LABEL: unsigned_sat_variable_i8_using_min:183; ANY:       # %bb.0:184; ANY-NEXT:    movl %esi, %eax185; ANY-NEXT:    notb %al186; ANY-NEXT:    cmpb %al, %dil187; ANY-NEXT:    movzbl %al, %eax188; ANY-NEXT:    cmovbl %edi, %eax189; ANY-NEXT:    addb %sil, %al190; ANY-NEXT:    # kill: def $al killed $al killed $eax191; ANY-NEXT:    retq192  %noty = xor i8 %y, -1193  %c = icmp ult i8 %x, %noty194  %s = select i1 %c, i8 %x, i8 %noty195  %r = add i8 %s, %y196  ret i8 %r197}198 199define i8 @unsigned_sat_variable_i8_using_cmp_sum(i8 %x, i8 %y) {200; ANY-LABEL: unsigned_sat_variable_i8_using_cmp_sum:201; ANY:       # %bb.0:202; ANY-NEXT:    addb %sil, %dil203; ANY-NEXT:    movzbl %dil, %ecx204; ANY-NEXT:    movl $255, %eax205; ANY-NEXT:    cmovael %ecx, %eax206; ANY-NEXT:    # kill: def $al killed $al killed $eax207; ANY-NEXT:    retq208  %a = add i8 %x, %y209  %c = icmp ugt i8 %x, %a210  %r = select i1 %c, i8 -1, i8 %a211  ret i8 %r212}213 214define i8 @unsigned_sat_variable_i8_using_cmp_notval(i8 %x, i8 %y) {215; ANY-LABEL: unsigned_sat_variable_i8_using_cmp_notval:216; ANY:       # %bb.0:217; ANY-NEXT:    addb %dil, %sil218; ANY-NEXT:    movzbl %sil, %ecx219; ANY-NEXT:    movl $255, %eax220; ANY-NEXT:    cmovael %ecx, %eax221; ANY-NEXT:    # kill: def $al killed $al killed $eax222; ANY-NEXT:    retq223  %noty = xor i8 %y, -1224  %a = add i8 %x, %y225  %c = icmp ugt i8 %x, %noty226  %r = select i1 %c, i8 -1, i8 %a227  ret i8 %r228}229 230define i16 @unsigned_sat_variable_i16_using_min(i16 %x, i16 %y) {231; ANY-LABEL: unsigned_sat_variable_i16_using_min:232; ANY:       # %bb.0:233; ANY-NEXT:    movl %esi, %eax234; ANY-NEXT:    notl %eax235; ANY-NEXT:    cmpw %ax, %di236; ANY-NEXT:    cmovbl %edi, %eax237; ANY-NEXT:    addl %esi, %eax238; ANY-NEXT:    # kill: def $ax killed $ax killed $eax239; ANY-NEXT:    retq240  %noty = xor i16 %y, -1241  %c = icmp ult i16 %x, %noty242  %s = select i1 %c, i16 %x, i16 %noty243  %r = add i16 %s, %y244  ret i16 %r245}246 247define i16 @unsigned_sat_variable_i16_using_cmp_sum(i16 %x, i16 %y) {248; ANY-LABEL: unsigned_sat_variable_i16_using_cmp_sum:249; ANY:       # %bb.0:250; ANY-NEXT:    addw %si, %di251; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF252; ANY-NEXT:    cmovael %edi, %eax253; ANY-NEXT:    # kill: def $ax killed $ax killed $eax254; ANY-NEXT:    retq255  %a = add i16 %x, %y256  %c = icmp ugt i16 %x, %a257  %r = select i1 %c, i16 -1, i16 %a258  ret i16 %r259}260 261define i16 @unsigned_sat_variable_i16_using_cmp_notval(i16 %x, i16 %y) {262; ANY-LABEL: unsigned_sat_variable_i16_using_cmp_notval:263; ANY:       # %bb.0:264; ANY-NEXT:    addw %di, %si265; ANY-NEXT:    movl $65535, %eax # imm = 0xFFFF266; ANY-NEXT:    cmovael %esi, %eax267; ANY-NEXT:    # kill: def $ax killed $ax killed $eax268; ANY-NEXT:    retq269  %noty = xor i16 %y, -1270  %a = add i16 %x, %y271  %c = icmp ugt i16 %x, %noty272  %r = select i1 %c, i16 -1, i16 %a273  ret i16 %r274}275 276define i32 @unsigned_sat_variable_i32_using_min(i32 %x, i32 %y) {277; ANY-LABEL: unsigned_sat_variable_i32_using_min:278; ANY:       # %bb.0:279; ANY-NEXT:    movl %esi, %eax280; ANY-NEXT:    notl %eax281; ANY-NEXT:    cmpl %eax, %edi282; ANY-NEXT:    cmovbl %edi, %eax283; ANY-NEXT:    addl %esi, %eax284; ANY-NEXT:    retq285  %noty = xor i32 %y, -1286  %c = icmp ult i32 %x, %noty287  %s = select i1 %c, i32 %x, i32 %noty288  %r = add i32 %s, %y289  ret i32 %r290}291 292define i32 @unsigned_sat_variable_i32_using_cmp_sum(i32 %x, i32 %y) {293; ANY-LABEL: unsigned_sat_variable_i32_using_cmp_sum:294; ANY:       # %bb.0:295; ANY-NEXT:    addl %esi, %edi296; ANY-NEXT:    movl $-1, %eax297; ANY-NEXT:    cmovael %edi, %eax298; ANY-NEXT:    retq299  %a = add i32 %x, %y300  %c = icmp ugt i32 %x, %a301  %r = select i1 %c, i32 -1, i32 %a302  ret i32 %r303}304 305define i32 @unsigned_sat_variable_i32_using_cmp_notval(i32 %x, i32 %y) {306; ANY-LABEL: unsigned_sat_variable_i32_using_cmp_notval:307; ANY:       # %bb.0:308; ANY-NEXT:    addl %esi, %edi309; ANY-NEXT:    movl $-1, %eax310; ANY-NEXT:    cmovael %edi, %eax311; ANY-NEXT:    retq312  %noty = xor i32 %y, -1313  %a = add i32 %x, %y314  %c = icmp ugt i32 %x, %noty315  %r = select i1 %c, i32 -1, i32 %a316  ret i32 %r317}318 319define i64 @unsigned_sat_variable_i64_using_min(i64 %x, i64 %y) {320; ANY-LABEL: unsigned_sat_variable_i64_using_min:321; ANY:       # %bb.0:322; ANY-NEXT:    movq %rsi, %rax323; ANY-NEXT:    notq %rax324; ANY-NEXT:    cmpq %rax, %rdi325; ANY-NEXT:    cmovbq %rdi, %rax326; ANY-NEXT:    addq %rsi, %rax327; ANY-NEXT:    retq328  %noty = xor i64 %y, -1329  %c = icmp ult i64 %x, %noty330  %s = select i1 %c, i64 %x, i64 %noty331  %r = add i64 %s, %y332  ret i64 %r333}334 335define i64 @unsigned_sat_variable_i64_using_cmp_sum(i64 %x, i64 %y) {336; ANY-LABEL: unsigned_sat_variable_i64_using_cmp_sum:337; ANY:       # %bb.0:338; ANY-NEXT:    addq %rsi, %rdi339; ANY-NEXT:    movq $-1, %rax340; ANY-NEXT:    cmovaeq %rdi, %rax341; ANY-NEXT:    retq342  %a = add i64 %x, %y343  %c = icmp ugt i64 %x, %a344  %r = select i1 %c, i64 -1, i64 %a345  ret i64 %r346}347 348define i64 @unsigned_sat_variable_i64_using_cmp_notval(i64 %x, i64 %y) {349; ANY-LABEL: unsigned_sat_variable_i64_using_cmp_notval:350; ANY:       # %bb.0:351; ANY-NEXT:    addq %rsi, %rdi352; ANY-NEXT:    movq $-1, %rax353; ANY-NEXT:    cmovaeq %rdi, %rax354; ANY-NEXT:    retq355  %noty = xor i64 %y, -1356  %a = add i64 %x, %y357  %c = icmp ugt i64 %x, %noty358  %r = select i1 %c, i64 -1, i64 %a359  ret i64 %r360}361 362define <16 x i8> @unsigned_sat_constant_v16i8_using_min(<16 x i8> %x) {363; SSE-LABEL: unsigned_sat_constant_v16i8_using_min:364; SSE:       # %bb.0:365; SSE-NEXT:    pminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0366; SSE-NEXT:    paddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0367; SSE-NEXT:    retq368;369; AVX-LABEL: unsigned_sat_constant_v16i8_using_min:370; AVX:       # %bb.0:371; AVX-NEXT:    vpminub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0372; AVX-NEXT:    vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0373; AVX-NEXT:    retq374  %c = icmp ult <16 x i8> %x, <i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43>375  %s = select <16 x i1> %c, <16 x i8> %x, <16 x i8> <i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43>376  %r = add <16 x i8> %s, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>377  ret <16 x i8> %r378}379 380define <16 x i8> @unsigned_sat_constant_v16i8_using_cmp_sum(<16 x i8> %x) {381; SSE-LABEL: unsigned_sat_constant_v16i8_using_cmp_sum:382; SSE:       # %bb.0:383; SSE-NEXT:    paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0384; SSE-NEXT:    retq385;386; AVX-LABEL: unsigned_sat_constant_v16i8_using_cmp_sum:387; AVX:       # %bb.0:388; AVX-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0389; AVX-NEXT:    retq390  %a = add <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>391  %c = icmp ugt <16 x i8> %x, %a392  %r = select <16 x i1> %c, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %a393  ret <16 x i8> %r394}395 396define <16 x i8> @unsigned_sat_constant_v16i8_using_cmp_notval(<16 x i8> %x) {397; SSE-LABEL: unsigned_sat_constant_v16i8_using_cmp_notval:398; SSE:       # %bb.0:399; SSE-NEXT:    paddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0400; SSE-NEXT:    retq401;402; AVX-LABEL: unsigned_sat_constant_v16i8_using_cmp_notval:403; AVX:       # %bb.0:404; AVX-NEXT:    vpaddusb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0405; AVX-NEXT:    retq406  %a = add <16 x i8> %x, <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>407  %c = icmp ugt <16 x i8> %x, <i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43, i8 -43>408  %r = select <16 x i1> %c, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %a409  ret <16 x i8> %r410}411 412define <8 x i16> @unsigned_sat_constant_v8i16_using_min(<8 x i16> %x) {413; SSE2-LABEL: unsigned_sat_constant_v8i16_using_min:414; SSE2:       # %bb.0:415; SSE2-NEXT:    movdqa %xmm0, %xmm1416; SSE2-NEXT:    psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1417; SSE2-NEXT:    psubw %xmm1, %xmm0418; SSE2-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0419; SSE2-NEXT:    retq420;421; SSE4-LABEL: unsigned_sat_constant_v8i16_using_min:422; SSE4:       # %bb.0:423; SSE4-NEXT:    pminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0424; SSE4-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0425; SSE4-NEXT:    retq426;427; AVX-LABEL: unsigned_sat_constant_v8i16_using_min:428; AVX:       # %bb.0:429; AVX-NEXT:    vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0430; AVX-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0431; AVX-NEXT:    retq432  %c = icmp ult <8 x i16> %x, <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>433  %s = select <8 x i1> %c, <8 x i16> %x, <8 x i16> <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>434  %r = add <8 x i16> %s, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>435  ret <8 x i16> %r436}437 438define <8 x i16> @unsigned_sat_constant_v8i16_using_cmp_sum(<8 x i16> %x) {439; SSE-LABEL: unsigned_sat_constant_v8i16_using_cmp_sum:440; SSE:       # %bb.0:441; SSE-NEXT:    paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0442; SSE-NEXT:    retq443;444; AVX-LABEL: unsigned_sat_constant_v8i16_using_cmp_sum:445; AVX:       # %bb.0:446; AVX-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0447; AVX-NEXT:    retq448  %a = add <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>449  %c = icmp ugt <8 x i16> %x, %a450  %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a451  ret <8 x i16> %r452}453 454define <8 x i16> @unsigned_sat_constant_v8i16_using_cmp_notval(<8 x i16> %x) {455; SSE-LABEL: unsigned_sat_constant_v8i16_using_cmp_notval:456; SSE:       # %bb.0:457; SSE-NEXT:    paddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0458; SSE-NEXT:    retq459;460; AVX-LABEL: unsigned_sat_constant_v8i16_using_cmp_notval:461; AVX:       # %bb.0:462; AVX-NEXT:    vpaddusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0463; AVX-NEXT:    retq464  %a = add <8 x i16> %x, <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>465  %c = icmp ugt <8 x i16> %x, <i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43, i16 -43>466  %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a467  ret <8 x i16> %r468}469 470define <4 x i32> @unsigned_sat_constant_v4i32_using_min(<4 x i32> %x) {471; SSE2-LABEL: unsigned_sat_constant_v4i32_using_min:472; SSE2:       # %bb.0:473; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]474; SSE2-NEXT:    pxor %xmm0, %xmm1475; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1476; SSE2-NEXT:    movdqa %xmm1, %xmm2477; SSE2-NEXT:    pandn %xmm0, %xmm2478; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1479; SSE2-NEXT:    por %xmm2, %xmm1480; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1481; SSE2-NEXT:    movdqa %xmm1, %xmm0482; SSE2-NEXT:    retq483;484; SSE4-LABEL: unsigned_sat_constant_v4i32_using_min:485; SSE4:       # %bb.0:486; SSE4-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0487; SSE4-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0488; SSE4-NEXT:    retq489;490; AVX2-LABEL: unsigned_sat_constant_v4i32_using_min:491; AVX2:       # %bb.0:492; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [4294967253,4294967253,4294967253,4294967253]493; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0494; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [42,42,42,42]495; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0496; AVX2-NEXT:    retq497;498; AVX512-LABEL: unsigned_sat_constant_v4i32_using_min:499; AVX512:       # %bb.0:500; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0501; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0502; AVX512-NEXT:    retq503  %c = icmp ult <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>504  %s = select <4 x i1> %c, <4 x i32> %x, <4 x i32> <i32 -43, i32 -43, i32 -43, i32 -43>505  %r = add <4 x i32> %s, <i32 42, i32 42, i32 42, i32 42>506  ret <4 x i32> %r507}508 509define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_sum(<4 x i32> %x) {510; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:511; SSE2:       # %bb.0:512; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]513; SSE2-NEXT:    paddd %xmm0, %xmm1514; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]515; SSE2-NEXT:    pxor %xmm2, %xmm0516; SSE2-NEXT:    pxor %xmm1, %xmm2517; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0518; SSE2-NEXT:    por %xmm1, %xmm0519; SSE2-NEXT:    retq520;521; SSE4-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:522; SSE4:       # %bb.0:523; SSE4-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0524; SSE4-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0525; SSE4-NEXT:    retq526;527; AVX2-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:528; AVX2:       # %bb.0:529; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [42,42,42,42]530; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [4294967253,4294967253,4294967253,4294967253]531; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0532; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0533; AVX2-NEXT:    retq534;535; AVX512-LABEL: unsigned_sat_constant_v4i32_using_cmp_sum:536; AVX512:       # %bb.0:537; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0538; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0539; AVX512-NEXT:    retq540  %a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>541  %c = icmp ugt <4 x i32> %x, %a542  %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a543  ret <4 x i32> %r544}545 546define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_notval(<4 x i32> %x) {547; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:548; SSE2:       # %bb.0:549; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42,42,42]550; SSE2-NEXT:    paddd %xmm0, %xmm1551; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0552; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0553; SSE2-NEXT:    por %xmm1, %xmm0554; SSE2-NEXT:    retq555;556; SSE4-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:557; SSE4:       # %bb.0:558; SSE4-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0559; SSE4-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0560; SSE4-NEXT:    retq561;562; AVX2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:563; AVX2:       # %bb.0:564; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [42,42,42,42]565; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [4294967253,4294967253,4294967253,4294967253]566; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm0567; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0568; AVX2-NEXT:    retq569;570; AVX512-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval:571; AVX512:       # %bb.0:572; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0573; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0574; AVX512-NEXT:    retq575  %a = add <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42>576  %c = icmp ugt <4 x i32> %x, <i32 -43, i32 -43, i32 -43, i32 -43>577  %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a578  ret <4 x i32> %r579}580 581define <4 x i32> @unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat(<4 x i32> %x) {582; SSE2-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:583; SSE2:       # %bb.0:584; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [43,44,45,46]585; SSE2-NEXT:    paddd %xmm0, %xmm1586; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0587; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0588; SSE2-NEXT:    por %xmm1, %xmm0589; SSE2-NEXT:    retq590;591; SSE4-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:592; SSE4:       # %bb.0:593; SSE4-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0594; SSE4-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0595; SSE4-NEXT:    retq596;597; AVX-LABEL: unsigned_sat_constant_v4i32_using_cmp_notval_nonsplat:598; AVX:       # %bb.0:599; AVX-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0600; AVX-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0601; AVX-NEXT:    retq602  %a = add <4 x i32> %x, <i32 43, i32 44, i32 45, i32 46>603  %c = icmp ugt <4 x i32> %x, <i32 -44, i32 -45, i32 -46, i32 -47>604  %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a605  ret <4 x i32> %r606}607 608define <2 x i64> @unsigned_sat_constant_v2i64_using_min(<2 x i64> %x) {609; SSE2-LABEL: unsigned_sat_constant_v2i64_using_min:610; SSE2:       # %bb.0:611; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]612; SSE2-NEXT:    pxor %xmm0, %xmm1613; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372034707292117,9223372034707292117]614; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2615; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]616; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]617; SSE2-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1618; SSE2-NEXT:    pand %xmm3, %xmm1619; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]620; SSE2-NEXT:    por %xmm1, %xmm2621; SSE2-NEXT:    pand %xmm2, %xmm0622; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2623; SSE2-NEXT:    por %xmm2, %xmm0624; SSE2-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0625; SSE2-NEXT:    retq626;627; SSE41-LABEL: unsigned_sat_constant_v2i64_using_min:628; SSE41:       # %bb.0:629; SSE41-NEXT:    movdqa %xmm0, %xmm1630; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744073709551573,18446744073709551573]631; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]632; SSE41-NEXT:    pxor %xmm1, %xmm0633; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372034707292117,9223372034707292117]634; SSE41-NEXT:    movdqa %xmm0, %xmm4635; SSE41-NEXT:    pcmpeqd %xmm3, %xmm4636; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3637; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]638; SSE41-NEXT:    pand %xmm4, %xmm0639; SSE41-NEXT:    por %xmm3, %xmm0640; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2641; SSE41-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2642; SSE41-NEXT:    movdqa %xmm2, %xmm0643; SSE41-NEXT:    retq644;645; SSE42-LABEL: unsigned_sat_constant_v2i64_using_min:646; SSE42:       # %bb.0:647; SSE42-NEXT:    movdqa %xmm0, %xmm1648; SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]649; SSE42-NEXT:    pxor %xmm1, %xmm0650; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0651; SSE42-NEXT:    blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1652; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1653; SSE42-NEXT:    movdqa %xmm1, %xmm0654; SSE42-NEXT:    retq655;656; AVX2-LABEL: unsigned_sat_constant_v2i64_using_min:657; AVX2:       # %bb.0:658; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1659; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1660; AVX2-NEXT:    vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0661; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0662; AVX2-NEXT:    retq663;664; AVX512-LABEL: unsigned_sat_constant_v2i64_using_min:665; AVX512:       # %bb.0:666; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0667; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0668; AVX512-NEXT:    retq669  %c = icmp ult <2 x i64> %x, <i64 -43, i64 -43>670  %s = select <2 x i1> %c, <2 x i64> %x, <2 x i64> <i64 -43, i64 -43>671  %r = add <2 x i64> %s, <i64 42, i64 42>672  ret <2 x i64> %r673}674 675define <2 x i64> @unsigned_sat_constant_v2i64_using_cmp_sum(<2 x i64> %x) {676; SSE2-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:677; SSE2:       # %bb.0:678; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42]679; SSE2-NEXT:    paddq %xmm0, %xmm1680; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]681; SSE2-NEXT:    pxor %xmm2, %xmm0682; SSE2-NEXT:    pxor %xmm1, %xmm2683; SSE2-NEXT:    movdqa %xmm0, %xmm3684; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3685; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]686; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2687; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]688; SSE2-NEXT:    pand %xmm4, %xmm2689; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]690; SSE2-NEXT:    por %xmm1, %xmm0691; SSE2-NEXT:    por %xmm2, %xmm0692; SSE2-NEXT:    retq693;694; SSE41-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:695; SSE41:       # %bb.0:696; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm1 = [42,42]697; SSE41-NEXT:    paddq %xmm0, %xmm1698; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]699; SSE41-NEXT:    pxor %xmm2, %xmm0700; SSE41-NEXT:    pxor %xmm1, %xmm2701; SSE41-NEXT:    movdqa %xmm0, %xmm3702; SSE41-NEXT:    pcmpgtd %xmm2, %xmm3703; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]704; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2705; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]706; SSE41-NEXT:    pand %xmm4, %xmm2707; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]708; SSE41-NEXT:    por %xmm1, %xmm0709; SSE41-NEXT:    por %xmm2, %xmm0710; SSE41-NEXT:    retq711;712; SSE42-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:713; SSE42:       # %bb.0:714; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]715; SSE42-NEXT:    movdqa %xmm0, %xmm2716; SSE42-NEXT:    pxor %xmm1, %xmm2717; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0718; SSE42-NEXT:    pxor %xmm0, %xmm1719; SSE42-NEXT:    pcmpgtq %xmm1, %xmm2720; SSE42-NEXT:    por %xmm2, %xmm0721; SSE42-NEXT:    retq722;723; AVX2-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:724; AVX2:       # %bb.0:725; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]726; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm2727; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0728; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1729; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1730; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0731; AVX2-NEXT:    retq732;733; AVX512-LABEL: unsigned_sat_constant_v2i64_using_cmp_sum:734; AVX512:       # %bb.0:735; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0736; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0737; AVX512-NEXT:    retq738  %a = add <2 x i64> %x, <i64 42, i64 42>739  %c = icmp ugt <2 x i64> %x, %a740  %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a741  ret <2 x i64> %r742}743 744define <2 x i64> @unsigned_sat_constant_v2i64_using_cmp_notval(<2 x i64> %x) {745; SSE2-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:746; SSE2:       # %bb.0:747; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [42,42]748; SSE2-NEXT:    paddq %xmm0, %xmm1749; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0750; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]751; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2752; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]753; SSE2-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0754; SSE2-NEXT:    pand %xmm2, %xmm0755; SSE2-NEXT:    por %xmm1, %xmm0756; SSE2-NEXT:    retq757;758; SSE41-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:759; SSE41:       # %bb.0:760; SSE41-NEXT:    pmovsxbq {{.*#+}} xmm1 = [42,42]761; SSE41-NEXT:    paddq %xmm0, %xmm1762; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0763; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]764; SSE41-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2765; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]766; SSE41-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0767; SSE41-NEXT:    pand %xmm2, %xmm0768; SSE41-NEXT:    por %xmm1, %xmm0769; SSE41-NEXT:    retq770;771; SSE42-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:772; SSE42:       # %bb.0:773; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]774; SSE42-NEXT:    movdqa %xmm0, %xmm2775; SSE42-NEXT:    pxor %xmm1, %xmm2776; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0777; SSE42-NEXT:    pxor %xmm0, %xmm1778; SSE42-NEXT:    pcmpgtq %xmm1, %xmm2779; SSE42-NEXT:    por %xmm2, %xmm0780; SSE42-NEXT:    retq781;782; AVX2-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:783; AVX2:       # %bb.0:784; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]785; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm2786; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0787; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1788; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1789; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0790; AVX2-NEXT:    retq791;792; AVX512-LABEL: unsigned_sat_constant_v2i64_using_cmp_notval:793; AVX512:       # %bb.0:794; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0795; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0796; AVX512-NEXT:    retq797  %a = add <2 x i64> %x, <i64 42, i64 42>798  %c = icmp ugt <2 x i64> %x, <i64 -43, i64 -43>799  %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a800  ret <2 x i64> %r801}802 803define <16 x i8> @unsigned_sat_variable_v16i8_using_min(<16 x i8> %x, <16 x i8> %y) {804; SSE-LABEL: unsigned_sat_variable_v16i8_using_min:805; SSE:       # %bb.0:806; SSE-NEXT:    pcmpeqd %xmm2, %xmm2807; SSE-NEXT:    pxor %xmm1, %xmm2808; SSE-NEXT:    pminub %xmm2, %xmm0809; SSE-NEXT:    paddb %xmm1, %xmm0810; SSE-NEXT:    retq811;812; AVX2-LABEL: unsigned_sat_variable_v16i8_using_min:813; AVX2:       # %bb.0:814; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2815; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2816; AVX2-NEXT:    vpminub %xmm2, %xmm0, %xmm0817; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0818; AVX2-NEXT:    retq819;820; AVX512-LABEL: unsigned_sat_variable_v16i8_using_min:821; AVX512:       # %bb.0:822; AVX512-NEXT:    vmovdqa %xmm1, %xmm2823; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = ~xmm2824; AVX512-NEXT:    vpminub %xmm2, %xmm0, %xmm0825; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0826; AVX512-NEXT:    retq827  %noty = xor <16 x i8> %y, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>828  %c = icmp ult <16 x i8> %x, %noty829  %s = select <16 x i1> %c, <16 x i8> %x, <16 x i8> %noty830  %r = add <16 x i8> %s, %y831  ret <16 x i8> %r832}833 834define <16 x i8> @unsigned_sat_variable_v16i8_using_cmp_sum(<16 x i8> %x, <16 x i8> %y) {835; SSE-LABEL: unsigned_sat_variable_v16i8_using_cmp_sum:836; SSE:       # %bb.0:837; SSE-NEXT:    paddusb %xmm1, %xmm0838; SSE-NEXT:    retq839;840; AVX-LABEL: unsigned_sat_variable_v16i8_using_cmp_sum:841; AVX:       # %bb.0:842; AVX-NEXT:    vpaddusb %xmm1, %xmm0, %xmm0843; AVX-NEXT:    retq844  %a = add <16 x i8> %x, %y845  %c = icmp ugt <16 x i8> %x, %a846  %r = select <16 x i1> %c, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %a847  ret <16 x i8> %r848}849 850define <16 x i8> @unsigned_sat_variable_v16i8_using_cmp_notval(<16 x i8> %x, <16 x i8> %y) {851; SSE-LABEL: unsigned_sat_variable_v16i8_using_cmp_notval:852; SSE:       # %bb.0:853; SSE-NEXT:    pcmpeqd %xmm2, %xmm2854; SSE-NEXT:    movdqa %xmm0, %xmm3855; SSE-NEXT:    paddb %xmm1, %xmm3856; SSE-NEXT:    pxor %xmm2, %xmm1857; SSE-NEXT:    pminub %xmm0, %xmm1858; SSE-NEXT:    pcmpeqb %xmm1, %xmm0859; SSE-NEXT:    pxor %xmm2, %xmm0860; SSE-NEXT:    por %xmm3, %xmm0861; SSE-NEXT:    retq862;863; AVX2-LABEL: unsigned_sat_variable_v16i8_using_cmp_notval:864; AVX2:       # %bb.0:865; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2866; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3867; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm1868; AVX2-NEXT:    vpminub %xmm3, %xmm0, %xmm3869; AVX2-NEXT:    vpcmpeqb %xmm3, %xmm0, %xmm0870; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0871; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0872; AVX2-NEXT:    retq873;874; AVX512-LABEL: unsigned_sat_variable_v16i8_using_cmp_notval:875; AVX512:       # %bb.0:876; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2877; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm3878; AVX512-NEXT:    vpternlogq {{.*#+}} xmm1 = ~xmm1879; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm1880; AVX512-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0881; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm3 | (xmm0 ^ xmm2)882; AVX512-NEXT:    retq883  %noty = xor <16 x i8> %y, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>884  %a = add <16 x i8> %x, %y885  %c = icmp ugt <16 x i8> %x, %noty886  %r = select <16 x i1> %c, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %a887  ret <16 x i8> %r888}889 890define <8 x i16> @unsigned_sat_variable_v8i16_using_min(<8 x i16> %x, <8 x i16> %y) {891; SSE2-LABEL: unsigned_sat_variable_v8i16_using_min:892; SSE2:       # %bb.0:893; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2894; SSE2-NEXT:    pxor %xmm1, %xmm2895; SSE2-NEXT:    movdqa %xmm0, %xmm3896; SSE2-NEXT:    psubusw %xmm2, %xmm3897; SSE2-NEXT:    psubw %xmm3, %xmm0898; SSE2-NEXT:    paddw %xmm1, %xmm0899; SSE2-NEXT:    retq900;901; SSE4-LABEL: unsigned_sat_variable_v8i16_using_min:902; SSE4:       # %bb.0:903; SSE4-NEXT:    pcmpeqd %xmm2, %xmm2904; SSE4-NEXT:    pxor %xmm1, %xmm2905; SSE4-NEXT:    pminuw %xmm2, %xmm0906; SSE4-NEXT:    paddw %xmm1, %xmm0907; SSE4-NEXT:    retq908;909; AVX2-LABEL: unsigned_sat_variable_v8i16_using_min:910; AVX2:       # %bb.0:911; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2912; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2913; AVX2-NEXT:    vpminuw %xmm2, %xmm0, %xmm0914; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0915; AVX2-NEXT:    retq916;917; AVX512-LABEL: unsigned_sat_variable_v8i16_using_min:918; AVX512:       # %bb.0:919; AVX512-NEXT:    vmovdqa %xmm1, %xmm2920; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = ~xmm2921; AVX512-NEXT:    vpminuw %xmm2, %xmm0, %xmm0922; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0923; AVX512-NEXT:    retq924  %noty = xor <8 x i16> %y, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>925  %c = icmp ult <8 x i16> %x, %noty926  %s = select <8 x i1> %c, <8 x i16> %x, <8 x i16> %noty927  %r = add <8 x i16> %s, %y928  ret <8 x i16> %r929}930 931define <8 x i16> @unsigned_sat_variable_v8i16_using_cmp_sum(<8 x i16> %x, <8 x i16> %y) {932; SSE-LABEL: unsigned_sat_variable_v8i16_using_cmp_sum:933; SSE:       # %bb.0:934; SSE-NEXT:    paddusw %xmm1, %xmm0935; SSE-NEXT:    retq936;937; AVX-LABEL: unsigned_sat_variable_v8i16_using_cmp_sum:938; AVX:       # %bb.0:939; AVX-NEXT:    vpaddusw %xmm1, %xmm0, %xmm0940; AVX-NEXT:    retq941  %a = add <8 x i16> %x, %y942  %c = icmp ugt <8 x i16> %x, %a943  %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a944  ret <8 x i16> %r945}946 947define <8 x i16> @unsigned_sat_variable_v8i16_using_cmp_notval(<8 x i16> %x, <8 x i16> %y) {948; SSE2-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:949; SSE2:       # %bb.0:950; SSE2-NEXT:    movdqa %xmm0, %xmm2951; SSE2-NEXT:    paddw %xmm1, %xmm2952; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1953; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0954; SSE2-NEXT:    pcmpgtw %xmm1, %xmm0955; SSE2-NEXT:    por %xmm2, %xmm0956; SSE2-NEXT:    retq957;958; SSE4-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:959; SSE4:       # %bb.0:960; SSE4-NEXT:    pcmpeqd %xmm2, %xmm2961; SSE4-NEXT:    movdqa %xmm0, %xmm3962; SSE4-NEXT:    paddw %xmm1, %xmm3963; SSE4-NEXT:    pxor %xmm2, %xmm1964; SSE4-NEXT:    pminuw %xmm0, %xmm1965; SSE4-NEXT:    pcmpeqw %xmm1, %xmm0966; SSE4-NEXT:    pxor %xmm2, %xmm0967; SSE4-NEXT:    por %xmm3, %xmm0968; SSE4-NEXT:    retq969;970; AVX2-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:971; AVX2:       # %bb.0:972; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2973; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3974; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm1975; AVX2-NEXT:    vpminuw %xmm3, %xmm0, %xmm3976; AVX2-NEXT:    vpcmpeqw %xmm3, %xmm0, %xmm0977; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0978; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0979; AVX2-NEXT:    retq980;981; AVX512-LABEL: unsigned_sat_variable_v8i16_using_cmp_notval:982; AVX512:       # %bb.0:983; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2984; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm3985; AVX512-NEXT:    vpternlogq {{.*#+}} xmm1 = ~xmm1986; AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm1987; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0988; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm3 | (xmm0 ^ xmm2)989; AVX512-NEXT:    retq990  %noty = xor <8 x i16> %y, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>991  %a = add <8 x i16> %x, %y992  %c = icmp ugt <8 x i16> %x, %noty993  %r = select <8 x i1> %c, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %a994  ret <8 x i16> %r995}996 997define <4 x i32> @unsigned_sat_variable_v4i32_using_min(<4 x i32> %x, <4 x i32> %y) {998; SSE2-LABEL: unsigned_sat_variable_v4i32_using_min:999; SSE2:       # %bb.0:1000; SSE2-NEXT:    pcmpeqd %xmm2, %xmm21001; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]1002; SSE2-NEXT:    pxor %xmm0, %xmm31003; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647,2147483647,2147483647]1004; SSE2-NEXT:    pxor %xmm1, %xmm41005; SSE2-NEXT:    pcmpgtd %xmm3, %xmm41006; SSE2-NEXT:    pand %xmm4, %xmm01007; SSE2-NEXT:    por %xmm1, %xmm41008; SSE2-NEXT:    pxor %xmm2, %xmm41009; SSE2-NEXT:    por %xmm4, %xmm01010; SSE2-NEXT:    paddd %xmm1, %xmm01011; SSE2-NEXT:    retq1012;1013; SSE4-LABEL: unsigned_sat_variable_v4i32_using_min:1014; SSE4:       # %bb.0:1015; SSE4-NEXT:    pcmpeqd %xmm2, %xmm21016; SSE4-NEXT:    pxor %xmm1, %xmm21017; SSE4-NEXT:    pminud %xmm2, %xmm01018; SSE4-NEXT:    paddd %xmm1, %xmm01019; SSE4-NEXT:    retq1020;1021; AVX2-LABEL: unsigned_sat_variable_v4i32_using_min:1022; AVX2:       # %bb.0:1023; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21024; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm21025; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm01026; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01027; AVX2-NEXT:    retq1028;1029; AVX512-LABEL: unsigned_sat_variable_v4i32_using_min:1030; AVX512:       # %bb.0:1031; AVX512-NEXT:    vmovdqa %xmm1, %xmm21032; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = ~xmm21033; AVX512-NEXT:    vpminud %xmm2, %xmm0, %xmm01034; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01035; AVX512-NEXT:    retq1036  %noty = xor <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>1037  %c = icmp ult <4 x i32> %x, %noty1038  %s = select <4 x i1> %c, <4 x i32> %x, <4 x i32> %noty1039  %r = add <4 x i32> %s, %y1040  ret <4 x i32> %r1041}1042 1043define <4 x i32> @unsigned_sat_variable_v4i32_using_cmp_sum(<4 x i32> %x, <4 x i32> %y) {1044; SSE2-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:1045; SSE2:       # %bb.0:1046; SSE2-NEXT:    paddd %xmm0, %xmm11047; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]1048; SSE2-NEXT:    pxor %xmm2, %xmm01049; SSE2-NEXT:    pxor %xmm1, %xmm21050; SSE2-NEXT:    pcmpgtd %xmm2, %xmm01051; SSE2-NEXT:    por %xmm1, %xmm01052; SSE2-NEXT:    retq1053;1054; SSE4-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:1055; SSE4:       # %bb.0:1056; SSE4-NEXT:    pcmpeqd %xmm2, %xmm21057; SSE4-NEXT:    pxor %xmm1, %xmm21058; SSE4-NEXT:    pminud %xmm2, %xmm01059; SSE4-NEXT:    paddd %xmm1, %xmm01060; SSE4-NEXT:    retq1061;1062; AVX2-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:1063; AVX2:       # %bb.0:1064; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21065; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm21066; AVX2-NEXT:    vpminud %xmm2, %xmm0, %xmm01067; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01068; AVX2-NEXT:    retq1069;1070; AVX512-LABEL: unsigned_sat_variable_v4i32_using_cmp_sum:1071; AVX512:       # %bb.0:1072; AVX512-NEXT:    vmovdqa %xmm1, %xmm21073; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = ~xmm21074; AVX512-NEXT:    vpminud %xmm2, %xmm0, %xmm01075; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01076; AVX512-NEXT:    retq1077  %a = add <4 x i32> %x, %y1078  %c = icmp ugt <4 x i32> %x, %a1079  %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a1080  ret <4 x i32> %r1081}1082 1083define <4 x i32> @unsigned_sat_variable_v4i32_using_cmp_notval(<4 x i32> %x, <4 x i32> %y) {1084; SSE2-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:1085; SSE2:       # %bb.0:1086; SSE2-NEXT:    movdqa %xmm0, %xmm21087; SSE2-NEXT:    paddd %xmm1, %xmm21088; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11089; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01090; SSE2-NEXT:    pcmpgtd %xmm1, %xmm01091; SSE2-NEXT:    por %xmm2, %xmm01092; SSE2-NEXT:    retq1093;1094; SSE4-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:1095; SSE4:       # %bb.0:1096; SSE4-NEXT:    pcmpeqd %xmm2, %xmm21097; SSE4-NEXT:    movdqa %xmm0, %xmm31098; SSE4-NEXT:    paddd %xmm1, %xmm31099; SSE4-NEXT:    pxor %xmm2, %xmm11100; SSE4-NEXT:    pminud %xmm0, %xmm11101; SSE4-NEXT:    pcmpeqd %xmm1, %xmm01102; SSE4-NEXT:    pxor %xmm2, %xmm01103; SSE4-NEXT:    por %xmm3, %xmm01104; SSE4-NEXT:    retq1105;1106; AVX2-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:1107; AVX2:       # %bb.0:1108; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21109; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm31110; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm11111; AVX2-NEXT:    vpminud %xmm3, %xmm0, %xmm31112; AVX2-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm01113; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm01114; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm01115; AVX2-NEXT:    retq1116;1117; AVX512-LABEL: unsigned_sat_variable_v4i32_using_cmp_notval:1118; AVX512:       # %bb.0:1119; AVX512-NEXT:    vmovdqa %xmm1, %xmm31120; AVX512-NEXT:    vpternlogq {{.*#+}} xmm3 = ~xmm31121; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21122; AVX512-NEXT:    vpcmpleud %xmm3, %xmm0, %k11123; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm2 {%k1}1124; AVX512-NEXT:    vmovdqa %xmm2, %xmm01125; AVX512-NEXT:    retq1126  %noty = xor <4 x i32> %y, <i32 -1, i32 -1, i32 -1, i32 -1>1127  %a = add <4 x i32> %x, %y1128  %c = icmp ugt <4 x i32> %x, %noty1129  %r = select <4 x i1> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %a1130  ret <4 x i32> %r1131}1132 1133define <2 x i64> @unsigned_sat_variable_v2i64_using_min(<2 x i64> %x, <2 x i64> %y) {1134; SSE2-LABEL: unsigned_sat_variable_v2i64_using_min:1135; SSE2:       # %bb.0:1136; SSE2-NEXT:    pcmpeqd %xmm2, %xmm21137; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]1138; SSE2-NEXT:    pxor %xmm0, %xmm31139; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]1140; SSE2-NEXT:    pxor %xmm1, %xmm41141; SSE2-NEXT:    movdqa %xmm4, %xmm51142; SSE2-NEXT:    pcmpgtd %xmm3, %xmm51143; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]1144; SSE2-NEXT:    pcmpeqd %xmm3, %xmm41145; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]1146; SSE2-NEXT:    pand %xmm6, %xmm31147; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]1148; SSE2-NEXT:    por %xmm3, %xmm41149; SSE2-NEXT:    pand %xmm4, %xmm01150; SSE2-NEXT:    por %xmm1, %xmm41151; SSE2-NEXT:    pxor %xmm2, %xmm41152; SSE2-NEXT:    por %xmm4, %xmm01153; SSE2-NEXT:    paddq %xmm1, %xmm01154; SSE2-NEXT:    retq1155;1156; SSE41-LABEL: unsigned_sat_variable_v2i64_using_min:1157; SSE41:       # %bb.0:1158; SSE41-NEXT:    movdqa %xmm0, %xmm21159; SSE41-NEXT:    pcmpeqd %xmm3, %xmm31160; SSE41-NEXT:    pxor %xmm1, %xmm31161; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]1162; SSE41-NEXT:    pxor %xmm2, %xmm01163; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]1164; SSE41-NEXT:    pxor %xmm1, %xmm41165; SSE41-NEXT:    movdqa %xmm4, %xmm51166; SSE41-NEXT:    pcmpeqd %xmm0, %xmm51167; SSE41-NEXT:    pcmpgtd %xmm0, %xmm41168; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]1169; SSE41-NEXT:    pand %xmm5, %xmm01170; SSE41-NEXT:    por %xmm4, %xmm01171; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm31172; SSE41-NEXT:    paddq %xmm1, %xmm31173; SSE41-NEXT:    movdqa %xmm3, %xmm01174; SSE41-NEXT:    retq1175;1176; SSE42-LABEL: unsigned_sat_variable_v2i64_using_min:1177; SSE42:       # %bb.0:1178; SSE42-NEXT:    movdqa %xmm0, %xmm21179; SSE42-NEXT:    pcmpeqd %xmm3, %xmm31180; SSE42-NEXT:    pxor %xmm1, %xmm31181; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]1182; SSE42-NEXT:    pxor %xmm0, %xmm41183; SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775807,9223372036854775807]1184; SSE42-NEXT:    pxor %xmm1, %xmm01185; SSE42-NEXT:    pcmpgtq %xmm4, %xmm01186; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm31187; SSE42-NEXT:    paddq %xmm1, %xmm31188; SSE42-NEXT:    movdqa %xmm3, %xmm01189; SSE42-NEXT:    retq1190;1191; AVX2-LABEL: unsigned_sat_variable_v2i64_using_min:1192; AVX2:       # %bb.0:1193; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21194; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm21195; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm31196; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm41197; AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm31198; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm2, %xmm01199; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01200; AVX2-NEXT:    retq1201;1202; AVX512-LABEL: unsigned_sat_variable_v2i64_using_min:1203; AVX512:       # %bb.0:1204; AVX512-NEXT:    vmovdqa %xmm1, %xmm21205; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = ~xmm21206; AVX512-NEXT:    vpminuq %xmm2, %xmm0, %xmm01207; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm01208; AVX512-NEXT:    retq1209  %noty = xor <2 x i64> %y, <i64 -1, i64 -1>1210  %c = icmp ult <2 x i64> %x, %noty1211  %s = select <2 x i1> %c, <2 x i64> %x, <2 x i64> %noty1212  %r = add <2 x i64> %s, %y1213  ret <2 x i64> %r1214}1215 1216define <2 x i64> @unsigned_sat_variable_v2i64_using_cmp_sum(<2 x i64> %x, <2 x i64> %y) {1217; SSE2-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:1218; SSE2:       # %bb.0:1219; SSE2-NEXT:    paddq %xmm0, %xmm11220; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]1221; SSE2-NEXT:    pxor %xmm2, %xmm01222; SSE2-NEXT:    pxor %xmm1, %xmm21223; SSE2-NEXT:    movdqa %xmm0, %xmm31224; SSE2-NEXT:    pcmpgtd %xmm2, %xmm31225; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]1226; SSE2-NEXT:    pcmpeqd %xmm0, %xmm21227; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1228; SSE2-NEXT:    pand %xmm4, %xmm21229; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]1230; SSE2-NEXT:    por %xmm1, %xmm01231; SSE2-NEXT:    por %xmm2, %xmm01232; SSE2-NEXT:    retq1233;1234; SSE41-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:1235; SSE41:       # %bb.0:1236; SSE41-NEXT:    paddq %xmm0, %xmm11237; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]1238; SSE41-NEXT:    pxor %xmm2, %xmm01239; SSE41-NEXT:    pxor %xmm1, %xmm21240; SSE41-NEXT:    movdqa %xmm0, %xmm31241; SSE41-NEXT:    pcmpgtd %xmm2, %xmm31242; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]1243; SSE41-NEXT:    pcmpeqd %xmm0, %xmm21244; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1245; SSE41-NEXT:    pand %xmm4, %xmm21246; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]1247; SSE41-NEXT:    por %xmm1, %xmm01248; SSE41-NEXT:    por %xmm2, %xmm01249; SSE41-NEXT:    retq1250;1251; SSE42-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:1252; SSE42:       # %bb.0:1253; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]1254; SSE42-NEXT:    movdqa %xmm0, %xmm31255; SSE42-NEXT:    pxor %xmm2, %xmm31256; SSE42-NEXT:    paddq %xmm1, %xmm01257; SSE42-NEXT:    pxor %xmm0, %xmm21258; SSE42-NEXT:    pcmpgtq %xmm2, %xmm31259; SSE42-NEXT:    por %xmm3, %xmm01260; SSE42-NEXT:    retq1261;1262; AVX2-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:1263; AVX2:       # %bb.0:1264; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]1265; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm31266; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm01267; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm11268; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm11269; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm01270; AVX2-NEXT:    retq1271;1272; AVX512-LABEL: unsigned_sat_variable_v2i64_using_cmp_sum:1273; AVX512:       # %bb.0:1274; AVX512-NEXT:    vmovdqa %xmm1, %xmm21275; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = ~xmm21276; AVX512-NEXT:    vpminuq %xmm2, %xmm0, %xmm01277; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm01278; AVX512-NEXT:    retq1279  %a = add <2 x i64> %x, %y1280  %c = icmp ugt <2 x i64> %x, %a1281  %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a1282  ret <2 x i64> %r1283}1284 1285define <2 x i64> @unsigned_sat_variable_v2i64_using_cmp_notval(<2 x i64> %x, <2 x i64> %y) {1286; SSE2-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:1287; SSE2:       # %bb.0:1288; SSE2-NEXT:    movdqa %xmm0, %xmm21289; SSE2-NEXT:    paddq %xmm1, %xmm21290; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11291; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01292; SSE2-NEXT:    movdqa %xmm0, %xmm31293; SSE2-NEXT:    pcmpgtd %xmm1, %xmm31294; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]1295; SSE2-NEXT:    pcmpeqd %xmm1, %xmm01296; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1297; SSE2-NEXT:    pand %xmm4, %xmm11298; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]1299; SSE2-NEXT:    por %xmm2, %xmm01300; SSE2-NEXT:    por %xmm1, %xmm01301; SSE2-NEXT:    retq1302;1303; SSE41-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:1304; SSE41:       # %bb.0:1305; SSE41-NEXT:    movdqa %xmm0, %xmm21306; SSE41-NEXT:    paddq %xmm1, %xmm21307; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11308; SSE41-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01309; SSE41-NEXT:    movdqa %xmm0, %xmm31310; SSE41-NEXT:    pcmpgtd %xmm1, %xmm31311; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]1312; SSE41-NEXT:    pcmpeqd %xmm1, %xmm01313; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1314; SSE41-NEXT:    pand %xmm4, %xmm11315; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]1316; SSE41-NEXT:    por %xmm2, %xmm01317; SSE41-NEXT:    por %xmm1, %xmm01318; SSE41-NEXT:    retq1319;1320; SSE42-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:1321; SSE42:       # %bb.0:1322; SSE42-NEXT:    movdqa %xmm0, %xmm21323; SSE42-NEXT:    paddq %xmm1, %xmm21324; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11325; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01326; SSE42-NEXT:    pcmpgtq %xmm1, %xmm01327; SSE42-NEXT:    por %xmm2, %xmm01328; SSE42-NEXT:    retq1329;1330; AVX2-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:1331; AVX2:       # %bb.0:1332; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm21333; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11334; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01335; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm01336; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm01337; AVX2-NEXT:    retq1338;1339; AVX512-LABEL: unsigned_sat_variable_v2i64_using_cmp_notval:1340; AVX512:       # %bb.0:1341; AVX512-NEXT:    vmovdqa %xmm1, %xmm31342; AVX512-NEXT:    vpternlogq {{.*#+}} xmm3 = ~xmm31343; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21344; AVX512-NEXT:    vpcmpleuq %xmm3, %xmm0, %k11345; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm2 {%k1}1346; AVX512-NEXT:    vmovdqa %xmm2, %xmm01347; AVX512-NEXT:    retq1348  %noty = xor <2 x i64> %y, <i64 -1, i64 -1>1349  %a = add <2 x i64> %x, %y1350  %c = icmp ugt <2 x i64> %x, %noty1351  %r = select <2 x i1> %c, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %a1352  ret <2 x i64> %r1353}1354 1355