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