1; RUN: llc -march=x86-64 -mcpu=core2 -mattr=+sse4.1 < %s | FileCheck %s --check-prefix=SSE41 2; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s --check-prefix=SSE 3; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s --check-prefix=AVX 4 5target triple = "x86_64-unknown-unknown" 6 7define <4 x i32> @test1(<4 x i32> %a) { 8; SSE41-LABEL: test1: 9; SSE41: # BB#0: 10; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757] 11; SSE41-NEXT: movdqa %xmm0, %xmm2 12; SSE41-NEXT: pmuludq %xmm1, %xmm2 13; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 14; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 15; SSE41-NEXT: pmuludq %xmm1, %xmm3 16; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3] 17; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 18; SSE41-NEXT: psubd %xmm2, %xmm0 19; SSE41-NEXT: psrld $1, %xmm0 20; SSE41-NEXT: paddd %xmm2, %xmm0 21; SSE41-NEXT: psrld $2, %xmm0 22; SSE41-NEXT: retq 23; 24; SSE-LABEL: test1: 25; SSE: # BB#0: 26; SSE-NEXT: movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757] 27; SSE-NEXT: movdqa %xmm0, %xmm2 28; SSE-NEXT: pmuludq %xmm1, %xmm2 29; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 30; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 31; SSE-NEXT: pmuludq %xmm1, %xmm3 32; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3] 33; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 34; SSE-NEXT: psubd %xmm2, %xmm0 35; SSE-NEXT: psrld $1, %xmm0 36; SSE-NEXT: paddd %xmm2, %xmm0 37; SSE-NEXT: psrld $2, %xmm0 38; SSE-NEXT: retq 39; 40; AVX-LABEL: test1: 41; AVX: # BB#0: 42; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1 43; AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm2 44; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 45; AVX-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 46; AVX-NEXT: vpmuludq %xmm1, %xmm3, %xmm1 47; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm2[1,3],xmm1[1,3] 48; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 49; AVX-NEXT: vpsubd %xmm1, %xmm0, %xmm0 50; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 51; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 52; AVX-NEXT: vpsrld $2, %xmm0, %xmm0 53; AVX-NEXT: retq 54 %div = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7> 55 ret <4 x i32> %div 56} 57 58define <8 x i32> @test2(<8 x i32> %a) { 59; SSE41-LABEL: test2: 60; SSE41: # BB#0: 61; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757] 62; SSE41-NEXT: movdqa %xmm0, %xmm3 63; SSE41-NEXT: pmuludq %xmm2, %xmm3 64; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 65; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 66; SSE41-NEXT: pmuludq %xmm4, %xmm5 67; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3] 68; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2,1,3] 69; SSE41-NEXT: psubd %xmm3, %xmm0 70; SSE41-NEXT: psrld $1, %xmm0 71; SSE41-NEXT: paddd %xmm3, %xmm0 72; SSE41-NEXT: psrld $2, %xmm0 73; SSE41-NEXT: pmuludq %xmm1, %xmm2 74; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 75; SSE41-NEXT: pmuludq %xmm4, %xmm3 76; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3] 77; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 78; SSE41-NEXT: psubd %xmm2, %xmm1 79; SSE41-NEXT: psrld $1, %xmm1 80; SSE41-NEXT: paddd %xmm2, %xmm1 81; SSE41-NEXT: psrld $2, %xmm1 82; SSE41-NEXT: retq 83; 84; SSE-LABEL: test2: 85; SSE: # BB#0: 86; SSE-NEXT: movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757] 87; SSE-NEXT: movdqa %xmm0, %xmm3 88; SSE-NEXT: pmuludq %xmm2, %xmm3 89; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 90; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 91; SSE-NEXT: pmuludq %xmm4, %xmm5 92; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3] 93; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2,1,3] 94; SSE-NEXT: psubd %xmm3, %xmm0 95; SSE-NEXT: psrld $1, %xmm0 96; SSE-NEXT: paddd %xmm3, %xmm0 97; SSE-NEXT: psrld $2, %xmm0 98; SSE-NEXT: pmuludq %xmm1, %xmm2 99; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 100; SSE-NEXT: pmuludq %xmm4, %xmm3 101; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3] 102; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 103; SSE-NEXT: psubd %xmm2, %xmm1 104; SSE-NEXT: psrld $1, %xmm1 105; SSE-NEXT: paddd %xmm2, %xmm1 106; SSE-NEXT: psrld $2, %xmm1 107; SSE-NEXT: retq 108; 109; AVX-LABEL: test2: 110; AVX: # BB#0: 111; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %ymm1 112; AVX-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7] 113; AVX-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7] 114; AVX-NEXT: vpmuludq %ymm2, %ymm3, %ymm2 115; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm1 116; AVX-NEXT: vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7] 117; AVX-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7] 118; AVX-NEXT: vpsubd %ymm1, %ymm0, %ymm0 119; AVX-NEXT: vpsrld $1, %ymm0, %ymm0 120; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 121; AVX-NEXT: vpsrld $2, %ymm0, %ymm0 122; AVX-NEXT: retq 123 %div = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> 124 ret <8 x i32> %div 125} 126 127define <8 x i16> @test3(<8 x i16> %a) { 128; SSE41-LABEL: test3: 129; SSE41: # BB#0: 130; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363] 131; SSE41-NEXT: pmulhuw %xmm0, %xmm1 132; SSE41-NEXT: psubw %xmm1, %xmm0 133; SSE41-NEXT: psrlw $1, %xmm0 134; SSE41-NEXT: paddw %xmm1, %xmm0 135; SSE41-NEXT: psrlw $2, %xmm0 136; SSE41-NEXT: retq 137; 138; SSE-LABEL: test3: 139; SSE: # BB#0: 140; SSE-NEXT: movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363] 141; SSE-NEXT: pmulhuw %xmm0, %xmm1 142; SSE-NEXT: psubw %xmm1, %xmm0 143; SSE-NEXT: psrlw $1, %xmm0 144; SSE-NEXT: paddw %xmm1, %xmm0 145; SSE-NEXT: psrlw $2, %xmm0 146; SSE-NEXT: retq 147; 148; AVX-LABEL: test3: 149; AVX: # BB#0: 150; AVX-NEXT: vpmulhuw {{.*}}(%rip), %xmm0, %xmm1 151; AVX-NEXT: vpsubw %xmm1, %xmm0, %xmm0 152; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 153; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 154; AVX-NEXT: vpsrlw $2, %xmm0, %xmm0 155; AVX-NEXT: retq 156 %div = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 157 ret <8 x i16> %div 158} 159 160define <16 x i16> @test4(<16 x i16> %a) { 161; SSE41-LABEL: test4: 162; SSE41: # BB#0: 163; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363] 164; SSE41-NEXT: movdqa %xmm0, %xmm3 165; SSE41-NEXT: pmulhuw %xmm2, %xmm3 166; SSE41-NEXT: psubw %xmm3, %xmm0 167; SSE41-NEXT: psrlw $1, %xmm0 168; SSE41-NEXT: paddw %xmm3, %xmm0 169; SSE41-NEXT: psrlw $2, %xmm0 170; SSE41-NEXT: pmulhuw %xmm1, %xmm2 171; SSE41-NEXT: psubw %xmm2, %xmm1 172; SSE41-NEXT: psrlw $1, %xmm1 173; SSE41-NEXT: paddw %xmm2, %xmm1 174; SSE41-NEXT: psrlw $2, %xmm1 175; SSE41-NEXT: retq 176; 177; SSE-LABEL: test4: 178; SSE: # BB#0: 179; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363] 180; SSE-NEXT: movdqa %xmm0, %xmm3 181; SSE-NEXT: pmulhuw %xmm2, %xmm3 182; SSE-NEXT: psubw %xmm3, %xmm0 183; SSE-NEXT: psrlw $1, %xmm0 184; SSE-NEXT: paddw %xmm3, %xmm0 185; SSE-NEXT: psrlw $2, %xmm0 186; SSE-NEXT: pmulhuw %xmm1, %xmm2 187; SSE-NEXT: psubw %xmm2, %xmm1 188; SSE-NEXT: psrlw $1, %xmm1 189; SSE-NEXT: paddw %xmm2, %xmm1 190; SSE-NEXT: psrlw $2, %xmm1 191; SSE-NEXT: retq 192; 193; AVX-LABEL: test4: 194; AVX: # BB#0: 195; AVX-NEXT: vpmulhuw {{.*}}(%rip), %ymm0, %ymm1 196; AVX-NEXT: vpsubw %ymm1, %ymm0, %ymm0 197; AVX-NEXT: vpsrlw $1, %ymm0, %ymm0 198; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 199; AVX-NEXT: vpsrlw $2, %ymm0, %ymm0 200; AVX-NEXT: retq 201 %div = udiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7> 202 ret <16 x i16> %div 203} 204 205define <8 x i16> @test5(<8 x i16> %a) { 206; SSE41-LABEL: test5: 207; SSE41: # BB#0: 208; SSE41-NEXT: pmulhw {{.*}}(%rip), %xmm0 209; SSE41-NEXT: movdqa %xmm0, %xmm1 210; SSE41-NEXT: psrlw $15, %xmm1 211; SSE41-NEXT: psraw $1, %xmm0 212; SSE41-NEXT: paddw %xmm1, %xmm0 213; SSE41-NEXT: retq 214; 215; SSE-LABEL: test5: 216; SSE: # BB#0: 217; SSE-NEXT: pmulhw {{.*}}(%rip), %xmm0 218; SSE-NEXT: movdqa %xmm0, %xmm1 219; SSE-NEXT: psrlw $15, %xmm1 220; SSE-NEXT: psraw $1, %xmm0 221; SSE-NEXT: paddw %xmm1, %xmm0 222; SSE-NEXT: retq 223; 224; AVX-LABEL: test5: 225; AVX: # BB#0: 226; AVX-NEXT: vpmulhw {{.*}}(%rip), %xmm0, %xmm0 227; AVX-NEXT: vpsrlw $15, %xmm0, %xmm1 228; AVX-NEXT: vpsraw $1, %xmm0, %xmm0 229; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 230; AVX-NEXT: retq 231 %div = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 232 ret <8 x i16> %div 233} 234 235define <16 x i16> @test6(<16 x i16> %a) { 236; SSE41-LABEL: test6: 237; SSE41: # BB#0: 238; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725] 239; SSE41-NEXT: pmulhw %xmm2, %xmm0 240; SSE41-NEXT: movdqa %xmm0, %xmm3 241; SSE41-NEXT: psrlw $15, %xmm3 242; SSE41-NEXT: psraw $1, %xmm0 243; SSE41-NEXT: paddw %xmm3, %xmm0 244; SSE41-NEXT: pmulhw %xmm2, %xmm1 245; SSE41-NEXT: movdqa %xmm1, %xmm2 246; SSE41-NEXT: psrlw $15, %xmm2 247; SSE41-NEXT: psraw $1, %xmm1 248; SSE41-NEXT: paddw %xmm2, %xmm1 249; SSE41-NEXT: retq 250; 251; SSE-LABEL: test6: 252; SSE: # BB#0: 253; SSE-NEXT: movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725] 254; SSE-NEXT: pmulhw %xmm2, %xmm0 255; SSE-NEXT: movdqa %xmm0, %xmm3 256; SSE-NEXT: psrlw $15, %xmm3 257; SSE-NEXT: psraw $1, %xmm0 258; SSE-NEXT: paddw %xmm3, %xmm0 259; SSE-NEXT: pmulhw %xmm2, %xmm1 260; SSE-NEXT: movdqa %xmm1, %xmm2 261; SSE-NEXT: psrlw $15, %xmm2 262; SSE-NEXT: psraw $1, %xmm1 263; SSE-NEXT: paddw %xmm2, %xmm1 264; SSE-NEXT: retq 265; 266; AVX-LABEL: test6: 267; AVX: # BB#0: 268; AVX-NEXT: vpmulhw {{.*}}(%rip), %ymm0, %ymm0 269; AVX-NEXT: vpsrlw $15, %ymm0, %ymm1 270; AVX-NEXT: vpsraw $1, %ymm0, %ymm0 271; AVX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 272; AVX-NEXT: retq 273 %div = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7> 274 ret <16 x i16> %div 275} 276 277define <16 x i8> @test7(<16 x i8> %a) { 278; SSE41-LABEL: test7: 279; SSE41: # BB#0: 280; SSE41-NEXT: pextrb $1, %xmm0, %eax 281; SSE41-NEXT: movsbl %al, %eax 282; SSE41-NEXT: imull $-109, %eax, %ecx 283; SSE41-NEXT: shrl $8, %ecx 284; SSE41-NEXT: addb %cl, %al 285; SSE41-NEXT: movb %al, %cl 286; SSE41-NEXT: shrb $7, %cl 287; SSE41-NEXT: sarb $2, %al 288; SSE41-NEXT: addb %cl, %al 289; SSE41-NEXT: movzbl %al, %eax 290; SSE41-NEXT: pextrb $0, %xmm0, %ecx 291; SSE41-NEXT: movsbl %cl, %ecx 292; SSE41-NEXT: imull $-109, %ecx, %edx 293; SSE41-NEXT: shrl $8, %edx 294; SSE41-NEXT: addb %dl, %cl 295; SSE41-NEXT: movb %cl, %dl 296; SSE41-NEXT: shrb $7, %dl 297; SSE41-NEXT: sarb $2, %cl 298; SSE41-NEXT: addb %dl, %cl 299; SSE41-NEXT: movzbl %cl, %ecx 300; SSE41-NEXT: movd %ecx, %xmm1 301; SSE41-NEXT: pinsrb $1, %eax, %xmm1 302; SSE41-NEXT: pextrb $2, %xmm0, %eax 303; SSE41-NEXT: movsbl %al, %eax 304; SSE41-NEXT: imull $-109, %eax, %ecx 305; SSE41-NEXT: shrl $8, %ecx 306; SSE41-NEXT: addb %cl, %al 307; SSE41-NEXT: movb %al, %cl 308; SSE41-NEXT: shrb $7, %cl 309; SSE41-NEXT: sarb $2, %al 310; SSE41-NEXT: addb %cl, %al 311; SSE41-NEXT: movzbl %al, %eax 312; SSE41-NEXT: pinsrb $2, %eax, %xmm1 313; SSE41-NEXT: pextrb $3, %xmm0, %eax 314; SSE41-NEXT: movsbl %al, %eax 315; SSE41-NEXT: imull $-109, %eax, %ecx 316; SSE41-NEXT: shrl $8, %ecx 317; SSE41-NEXT: addb %cl, %al 318; SSE41-NEXT: movb %al, %cl 319; SSE41-NEXT: shrb $7, %cl 320; SSE41-NEXT: sarb $2, %al 321; SSE41-NEXT: addb %cl, %al 322; SSE41-NEXT: movzbl %al, %eax 323; SSE41-NEXT: pinsrb $3, %eax, %xmm1 324; SSE41-NEXT: pextrb $4, %xmm0, %eax 325; SSE41-NEXT: movsbl %al, %eax 326; SSE41-NEXT: imull $-109, %eax, %ecx 327; SSE41-NEXT: shrl $8, %ecx 328; SSE41-NEXT: addb %cl, %al 329; SSE41-NEXT: movb %al, %cl 330; SSE41-NEXT: shrb $7, %cl 331; SSE41-NEXT: sarb $2, %al 332; SSE41-NEXT: addb %cl, %al 333; SSE41-NEXT: movzbl %al, %eax 334; SSE41-NEXT: pinsrb $4, %eax, %xmm1 335; SSE41-NEXT: pextrb $5, %xmm0, %eax 336; SSE41-NEXT: movsbl %al, %eax 337; SSE41-NEXT: imull $-109, %eax, %ecx 338; SSE41-NEXT: shrl $8, %ecx 339; SSE41-NEXT: addb %cl, %al 340; SSE41-NEXT: movb %al, %cl 341; SSE41-NEXT: shrb $7, %cl 342; SSE41-NEXT: sarb $2, %al 343; SSE41-NEXT: addb %cl, %al 344; SSE41-NEXT: movzbl %al, %eax 345; SSE41-NEXT: pinsrb $5, %eax, %xmm1 346; SSE41-NEXT: pextrb $6, %xmm0, %eax 347; SSE41-NEXT: movsbl %al, %eax 348; SSE41-NEXT: imull $-109, %eax, %ecx 349; SSE41-NEXT: shrl $8, %ecx 350; SSE41-NEXT: addb %cl, %al 351; SSE41-NEXT: movb %al, %cl 352; SSE41-NEXT: shrb $7, %cl 353; SSE41-NEXT: sarb $2, %al 354; SSE41-NEXT: addb %cl, %al 355; SSE41-NEXT: movzbl %al, %eax 356; SSE41-NEXT: pinsrb $6, %eax, %xmm1 357; SSE41-NEXT: pextrb $7, %xmm0, %eax 358; SSE41-NEXT: movsbl %al, %eax 359; SSE41-NEXT: imull $-109, %eax, %ecx 360; SSE41-NEXT: shrl $8, %ecx 361; SSE41-NEXT: addb %cl, %al 362; SSE41-NEXT: movb %al, %cl 363; SSE41-NEXT: shrb $7, %cl 364; SSE41-NEXT: sarb $2, %al 365; SSE41-NEXT: addb %cl, %al 366; SSE41-NEXT: movzbl %al, %eax 367; SSE41-NEXT: pinsrb $7, %eax, %xmm1 368; SSE41-NEXT: pextrb $8, %xmm0, %eax 369; SSE41-NEXT: movsbl %al, %eax 370; SSE41-NEXT: imull $-109, %eax, %ecx 371; SSE41-NEXT: shrl $8, %ecx 372; SSE41-NEXT: addb %cl, %al 373; SSE41-NEXT: movb %al, %cl 374; SSE41-NEXT: shrb $7, %cl 375; SSE41-NEXT: sarb $2, %al 376; SSE41-NEXT: addb %cl, %al 377; SSE41-NEXT: movzbl %al, %eax 378; SSE41-NEXT: pinsrb $8, %eax, %xmm1 379; SSE41-NEXT: pextrb $9, %xmm0, %eax 380; SSE41-NEXT: movsbl %al, %eax 381; SSE41-NEXT: imull $-109, %eax, %ecx 382; SSE41-NEXT: shrl $8, %ecx 383; SSE41-NEXT: addb %cl, %al 384; SSE41-NEXT: movb %al, %cl 385; SSE41-NEXT: shrb $7, %cl 386; SSE41-NEXT: sarb $2, %al 387; SSE41-NEXT: addb %cl, %al 388; SSE41-NEXT: movzbl %al, %eax 389; SSE41-NEXT: pinsrb $9, %eax, %xmm1 390; SSE41-NEXT: pextrb $10, %xmm0, %eax 391; SSE41-NEXT: movsbl %al, %eax 392; SSE41-NEXT: imull $-109, %eax, %ecx 393; SSE41-NEXT: shrl $8, %ecx 394; SSE41-NEXT: addb %cl, %al 395; SSE41-NEXT: movb %al, %cl 396; SSE41-NEXT: shrb $7, %cl 397; SSE41-NEXT: sarb $2, %al 398; SSE41-NEXT: addb %cl, %al 399; SSE41-NEXT: movzbl %al, %eax 400; SSE41-NEXT: pinsrb $10, %eax, %xmm1 401; SSE41-NEXT: pextrb $11, %xmm0, %eax 402; SSE41-NEXT: movsbl %al, %eax 403; SSE41-NEXT: imull $-109, %eax, %ecx 404; SSE41-NEXT: shrl $8, %ecx 405; SSE41-NEXT: addb %cl, %al 406; SSE41-NEXT: movb %al, %cl 407; SSE41-NEXT: shrb $7, %cl 408; SSE41-NEXT: sarb $2, %al 409; SSE41-NEXT: addb %cl, %al 410; SSE41-NEXT: movzbl %al, %eax 411; SSE41-NEXT: pinsrb $11, %eax, %xmm1 412; SSE41-NEXT: pextrb $12, %xmm0, %eax 413; SSE41-NEXT: movsbl %al, %eax 414; SSE41-NEXT: imull $-109, %eax, %ecx 415; SSE41-NEXT: shrl $8, %ecx 416; SSE41-NEXT: addb %cl, %al 417; SSE41-NEXT: movb %al, %cl 418; SSE41-NEXT: shrb $7, %cl 419; SSE41-NEXT: sarb $2, %al 420; SSE41-NEXT: addb %cl, %al 421; SSE41-NEXT: movzbl %al, %eax 422; SSE41-NEXT: pinsrb $12, %eax, %xmm1 423; SSE41-NEXT: pextrb $13, %xmm0, %eax 424; SSE41-NEXT: movsbl %al, %eax 425; SSE41-NEXT: imull $-109, %eax, %ecx 426; SSE41-NEXT: shrl $8, %ecx 427; SSE41-NEXT: addb %cl, %al 428; SSE41-NEXT: movb %al, %cl 429; SSE41-NEXT: shrb $7, %cl 430; SSE41-NEXT: sarb $2, %al 431; SSE41-NEXT: addb %cl, %al 432; SSE41-NEXT: movzbl %al, %eax 433; SSE41-NEXT: pinsrb $13, %eax, %xmm1 434; SSE41-NEXT: pextrb $14, %xmm0, %eax 435; SSE41-NEXT: movsbl %al, %eax 436; SSE41-NEXT: imull $-109, %eax, %ecx 437; SSE41-NEXT: shrl $8, %ecx 438; SSE41-NEXT: addb %cl, %al 439; SSE41-NEXT: movb %al, %cl 440; SSE41-NEXT: shrb $7, %cl 441; SSE41-NEXT: sarb $2, %al 442; SSE41-NEXT: addb %cl, %al 443; SSE41-NEXT: movzbl %al, %eax 444; SSE41-NEXT: pinsrb $14, %eax, %xmm1 445; SSE41-NEXT: pextrb $15, %xmm0, %eax 446; SSE41-NEXT: movsbl %al, %eax 447; SSE41-NEXT: imull $-109, %eax, %ecx 448; SSE41-NEXT: shrl $8, %ecx 449; SSE41-NEXT: addb %cl, %al 450; SSE41-NEXT: movb %al, %cl 451; SSE41-NEXT: shrb $7, %cl 452; SSE41-NEXT: sarb $2, %al 453; SSE41-NEXT: addb %cl, %al 454; SSE41-NEXT: movzbl %al, %eax 455; SSE41-NEXT: pinsrb $15, %eax, %xmm1 456; SSE41-NEXT: movdqa %xmm1, %xmm0 457; SSE41-NEXT: retq 458; 459; SSE-LABEL: test7: 460; SSE: # BB#0: 461; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) 462; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 463; SSE-NEXT: imull $-109, %eax, %ecx 464; SSE-NEXT: shrl $8, %ecx 465; SSE-NEXT: addb %al, %cl 466; SSE-NEXT: movb %cl, %al 467; SSE-NEXT: shrb $7, %al 468; SSE-NEXT: sarb $2, %cl 469; SSE-NEXT: addb %al, %cl 470; SSE-NEXT: movzbl %cl, %eax 471; SSE-NEXT: movd %eax, %xmm0 472; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 473; SSE-NEXT: imull $-109, %eax, %ecx 474; SSE-NEXT: shrl $8, %ecx 475; SSE-NEXT: addb %al, %cl 476; SSE-NEXT: movb %cl, %al 477; SSE-NEXT: shrb $7, %al 478; SSE-NEXT: sarb $2, %cl 479; SSE-NEXT: addb %al, %cl 480; SSE-NEXT: movzbl %cl, %eax 481; SSE-NEXT: movd %eax, %xmm1 482; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 483; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 484; SSE-NEXT: imull $-109, %eax, %ecx 485; SSE-NEXT: shrl $8, %ecx 486; SSE-NEXT: addb %al, %cl 487; SSE-NEXT: movb %cl, %al 488; SSE-NEXT: shrb $7, %al 489; SSE-NEXT: sarb $2, %cl 490; SSE-NEXT: addb %al, %cl 491; SSE-NEXT: movzbl %cl, %eax 492; SSE-NEXT: movd %eax, %xmm2 493; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 494; SSE-NEXT: imull $-109, %eax, %ecx 495; SSE-NEXT: shrl $8, %ecx 496; SSE-NEXT: addb %al, %cl 497; SSE-NEXT: movb %cl, %al 498; SSE-NEXT: shrb $7, %al 499; SSE-NEXT: sarb $2, %cl 500; SSE-NEXT: addb %al, %cl 501; SSE-NEXT: movzbl %cl, %eax 502; SSE-NEXT: movd %eax, %xmm0 503; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 504; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 505; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 506; SSE-NEXT: imull $-109, %eax, %ecx 507; SSE-NEXT: shrl $8, %ecx 508; SSE-NEXT: addb %al, %cl 509; SSE-NEXT: movb %cl, %al 510; SSE-NEXT: shrb $7, %al 511; SSE-NEXT: sarb $2, %cl 512; SSE-NEXT: addb %al, %cl 513; SSE-NEXT: movzbl %cl, %eax 514; SSE-NEXT: movd %eax, %xmm1 515; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 516; SSE-NEXT: imull $-109, %eax, %ecx 517; SSE-NEXT: shrl $8, %ecx 518; SSE-NEXT: addb %al, %cl 519; SSE-NEXT: movb %cl, %al 520; SSE-NEXT: shrb $7, %al 521; SSE-NEXT: sarb $2, %cl 522; SSE-NEXT: addb %al, %cl 523; SSE-NEXT: movzbl %cl, %eax 524; SSE-NEXT: movd %eax, %xmm2 525; SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7] 526; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 527; SSE-NEXT: imull $-109, %eax, %ecx 528; SSE-NEXT: shrl $8, %ecx 529; SSE-NEXT: addb %al, %cl 530; SSE-NEXT: movb %cl, %al 531; SSE-NEXT: shrb $7, %al 532; SSE-NEXT: sarb $2, %cl 533; SSE-NEXT: addb %al, %cl 534; SSE-NEXT: movzbl %cl, %eax 535; SSE-NEXT: movd %eax, %xmm3 536; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 537; SSE-NEXT: imull $-109, %eax, %ecx 538; SSE-NEXT: shrl $8, %ecx 539; SSE-NEXT: addb %al, %cl 540; SSE-NEXT: movb %cl, %al 541; SSE-NEXT: shrb $7, %al 542; SSE-NEXT: sarb $2, %cl 543; SSE-NEXT: addb %al, %cl 544; SSE-NEXT: movzbl %cl, %eax 545; SSE-NEXT: movd %eax, %xmm1 546; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7] 547; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7] 548; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 549; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 550; SSE-NEXT: imull $-109, %eax, %ecx 551; SSE-NEXT: shrl $8, %ecx 552; SSE-NEXT: addb %al, %cl 553; SSE-NEXT: movb %cl, %al 554; SSE-NEXT: shrb $7, %al 555; SSE-NEXT: sarb $2, %cl 556; SSE-NEXT: addb %al, %cl 557; SSE-NEXT: movzbl %cl, %eax 558; SSE-NEXT: movd %eax, %xmm2 559; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 560; SSE-NEXT: imull $-109, %eax, %ecx 561; SSE-NEXT: shrl $8, %ecx 562; SSE-NEXT: addb %al, %cl 563; SSE-NEXT: movb %cl, %al 564; SSE-NEXT: shrb $7, %al 565; SSE-NEXT: sarb $2, %cl 566; SSE-NEXT: addb %al, %cl 567; SSE-NEXT: movzbl %cl, %eax 568; SSE-NEXT: movd %eax, %xmm0 569; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 570; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 571; SSE-NEXT: imull $-109, %eax, %ecx 572; SSE-NEXT: shrl $8, %ecx 573; SSE-NEXT: addb %al, %cl 574; SSE-NEXT: movb %cl, %al 575; SSE-NEXT: shrb $7, %al 576; SSE-NEXT: sarb $2, %cl 577; SSE-NEXT: addb %al, %cl 578; SSE-NEXT: movzbl %cl, %eax 579; SSE-NEXT: movd %eax, %xmm3 580; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 581; SSE-NEXT: imull $-109, %eax, %ecx 582; SSE-NEXT: shrl $8, %ecx 583; SSE-NEXT: addb %al, %cl 584; SSE-NEXT: movb %cl, %al 585; SSE-NEXT: shrb $7, %al 586; SSE-NEXT: sarb $2, %cl 587; SSE-NEXT: addb %al, %cl 588; SSE-NEXT: movzbl %cl, %eax 589; SSE-NEXT: movd %eax, %xmm2 590; SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7] 591; SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7] 592; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 593; SSE-NEXT: imull $-109, %eax, %ecx 594; SSE-NEXT: shrl $8, %ecx 595; SSE-NEXT: addb %al, %cl 596; SSE-NEXT: movb %cl, %al 597; SSE-NEXT: shrb $7, %al 598; SSE-NEXT: sarb $2, %cl 599; SSE-NEXT: addb %al, %cl 600; SSE-NEXT: movzbl %cl, %eax 601; SSE-NEXT: movd %eax, %xmm0 602; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 603; SSE-NEXT: imull $-109, %eax, %ecx 604; SSE-NEXT: shrl $8, %ecx 605; SSE-NEXT: addb %al, %cl 606; SSE-NEXT: movb %cl, %al 607; SSE-NEXT: shrb $7, %al 608; SSE-NEXT: sarb $2, %cl 609; SSE-NEXT: addb %al, %cl 610; SSE-NEXT: movzbl %cl, %eax 611; SSE-NEXT: movd %eax, %xmm3 612; SSE-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7] 613; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 614; SSE-NEXT: imull $-109, %eax, %ecx 615; SSE-NEXT: shrl $8, %ecx 616; SSE-NEXT: addb %al, %cl 617; SSE-NEXT: movb %cl, %al 618; SSE-NEXT: shrb $7, %al 619; SSE-NEXT: sarb $2, %cl 620; SSE-NEXT: addb %al, %cl 621; SSE-NEXT: movzbl %cl, %eax 622; SSE-NEXT: movd %eax, %xmm4 623; SSE-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax 624; SSE-NEXT: imull $-109, %eax, %ecx 625; SSE-NEXT: shrl $8, %ecx 626; SSE-NEXT: addb %al, %cl 627; SSE-NEXT: movb %cl, %al 628; SSE-NEXT: shrb $7, %al 629; SSE-NEXT: sarb $2, %cl 630; SSE-NEXT: addb %al, %cl 631; SSE-NEXT: movzbl %cl, %eax 632; SSE-NEXT: movd %eax, %xmm0 633; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7] 634; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7] 635; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7] 636; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7] 637; SSE-NEXT: retq 638; 639; AVX-LABEL: test7: 640; AVX: # BB#0: 641; AVX-NEXT: vpextrb $1, %xmm0, %eax 642; AVX-NEXT: movsbl %al, %eax 643; AVX-NEXT: imull $-109, %eax, %ecx 644; AVX-NEXT: shrl $8, %ecx 645; AVX-NEXT: addb %cl, %al 646; AVX-NEXT: movb %al, %cl 647; AVX-NEXT: shrb $7, %cl 648; AVX-NEXT: sarb $2, %al 649; AVX-NEXT: addb %cl, %al 650; AVX-NEXT: movzbl %al, %eax 651; AVX-NEXT: vpextrb $0, %xmm0, %ecx 652; AVX-NEXT: movsbl %cl, %ecx 653; AVX-NEXT: imull $-109, %ecx, %edx 654; AVX-NEXT: shrl $8, %edx 655; AVX-NEXT: addb %dl, %cl 656; AVX-NEXT: movb %cl, %dl 657; AVX-NEXT: shrb $7, %dl 658; AVX-NEXT: sarb $2, %cl 659; AVX-NEXT: addb %dl, %cl 660; AVX-NEXT: movzbl %cl, %ecx 661; AVX-NEXT: vmovd %ecx, %xmm1 662; AVX-NEXT: vpextrb $2, %xmm0, %ecx 663; AVX-NEXT: movsbl %cl, %ecx 664; AVX-NEXT: imull $-109, %ecx, %edx 665; AVX-NEXT: vpinsrb $1, %eax, %xmm1, %xmm1 666; AVX-NEXT: shrl $8, %edx 667; AVX-NEXT: addb %dl, %cl 668; AVX-NEXT: movb %cl, %al 669; AVX-NEXT: shrb $7, %al 670; AVX-NEXT: sarb $2, %cl 671; AVX-NEXT: addb %al, %cl 672; AVX-NEXT: movzbl %cl, %eax 673; AVX-NEXT: vpextrb $3, %xmm0, %ecx 674; AVX-NEXT: movsbl %cl, %ecx 675; AVX-NEXT: imull $-109, %ecx, %edx 676; AVX-NEXT: vpinsrb $2, %eax, %xmm1, %xmm1 677; AVX-NEXT: shrl $8, %edx 678; AVX-NEXT: addb %dl, %cl 679; AVX-NEXT: movb %cl, %al 680; AVX-NEXT: shrb $7, %al 681; AVX-NEXT: sarb $2, %cl 682; AVX-NEXT: addb %al, %cl 683; AVX-NEXT: movzbl %cl, %eax 684; AVX-NEXT: vpextrb $4, %xmm0, %ecx 685; AVX-NEXT: movsbl %cl, %ecx 686; AVX-NEXT: imull $-109, %ecx, %edx 687; AVX-NEXT: vpinsrb $3, %eax, %xmm1, %xmm1 688; AVX-NEXT: shrl $8, %edx 689; AVX-NEXT: addb %dl, %cl 690; AVX-NEXT: movb %cl, %al 691; AVX-NEXT: shrb $7, %al 692; AVX-NEXT: sarb $2, %cl 693; AVX-NEXT: addb %al, %cl 694; AVX-NEXT: movzbl %cl, %eax 695; AVX-NEXT: vpextrb $5, %xmm0, %ecx 696; AVX-NEXT: movsbl %cl, %ecx 697; AVX-NEXT: imull $-109, %ecx, %edx 698; AVX-NEXT: vpinsrb $4, %eax, %xmm1, %xmm1 699; AVX-NEXT: shrl $8, %edx 700; AVX-NEXT: addb %dl, %cl 701; AVX-NEXT: movb %cl, %al 702; AVX-NEXT: shrb $7, %al 703; AVX-NEXT: sarb $2, %cl 704; AVX-NEXT: addb %al, %cl 705; AVX-NEXT: movzbl %cl, %eax 706; AVX-NEXT: vpextrb $6, %xmm0, %ecx 707; AVX-NEXT: movsbl %cl, %ecx 708; AVX-NEXT: imull $-109, %ecx, %edx 709; AVX-NEXT: vpinsrb $5, %eax, %xmm1, %xmm1 710; AVX-NEXT: shrl $8, %edx 711; AVX-NEXT: addb %dl, %cl 712; AVX-NEXT: movb %cl, %al 713; AVX-NEXT: shrb $7, %al 714; AVX-NEXT: sarb $2, %cl 715; AVX-NEXT: addb %al, %cl 716; AVX-NEXT: movzbl %cl, %eax 717; AVX-NEXT: vpextrb $7, %xmm0, %ecx 718; AVX-NEXT: movsbl %cl, %ecx 719; AVX-NEXT: imull $-109, %ecx, %edx 720; AVX-NEXT: vpinsrb $6, %eax, %xmm1, %xmm1 721; AVX-NEXT: shrl $8, %edx 722; AVX-NEXT: addb %dl, %cl 723; AVX-NEXT: movb %cl, %al 724; AVX-NEXT: shrb $7, %al 725; AVX-NEXT: sarb $2, %cl 726; AVX-NEXT: addb %al, %cl 727; AVX-NEXT: movzbl %cl, %eax 728; AVX-NEXT: vpextrb $8, %xmm0, %ecx 729; AVX-NEXT: movsbl %cl, %ecx 730; AVX-NEXT: imull $-109, %ecx, %edx 731; AVX-NEXT: vpinsrb $7, %eax, %xmm1, %xmm1 732; AVX-NEXT: shrl $8, %edx 733; AVX-NEXT: addb %dl, %cl 734; AVX-NEXT: movb %cl, %al 735; AVX-NEXT: shrb $7, %al 736; AVX-NEXT: sarb $2, %cl 737; AVX-NEXT: addb %al, %cl 738; AVX-NEXT: movzbl %cl, %eax 739; AVX-NEXT: vpextrb $9, %xmm0, %ecx 740; AVX-NEXT: movsbl %cl, %ecx 741; AVX-NEXT: imull $-109, %ecx, %edx 742; AVX-NEXT: vpinsrb $8, %eax, %xmm1, %xmm1 743; AVX-NEXT: shrl $8, %edx 744; AVX-NEXT: addb %dl, %cl 745; AVX-NEXT: movb %cl, %al 746; AVX-NEXT: shrb $7, %al 747; AVX-NEXT: sarb $2, %cl 748; AVX-NEXT: addb %al, %cl 749; AVX-NEXT: movzbl %cl, %eax 750; AVX-NEXT: vpextrb $10, %xmm0, %ecx 751; AVX-NEXT: movsbl %cl, %ecx 752; AVX-NEXT: imull $-109, %ecx, %edx 753; AVX-NEXT: vpinsrb $9, %eax, %xmm1, %xmm1 754; AVX-NEXT: shrl $8, %edx 755; AVX-NEXT: addb %dl, %cl 756; AVX-NEXT: movb %cl, %al 757; AVX-NEXT: shrb $7, %al 758; AVX-NEXT: sarb $2, %cl 759; AVX-NEXT: addb %al, %cl 760; AVX-NEXT: movzbl %cl, %eax 761; AVX-NEXT: vpextrb $11, %xmm0, %ecx 762; AVX-NEXT: movsbl %cl, %ecx 763; AVX-NEXT: imull $-109, %ecx, %edx 764; AVX-NEXT: vpinsrb $10, %eax, %xmm1, %xmm1 765; AVX-NEXT: shrl $8, %edx 766; AVX-NEXT: addb %dl, %cl 767; AVX-NEXT: movb %cl, %al 768; AVX-NEXT: shrb $7, %al 769; AVX-NEXT: sarb $2, %cl 770; AVX-NEXT: addb %al, %cl 771; AVX-NEXT: movzbl %cl, %eax 772; AVX-NEXT: vpextrb $12, %xmm0, %ecx 773; AVX-NEXT: movsbl %cl, %ecx 774; AVX-NEXT: imull $-109, %ecx, %edx 775; AVX-NEXT: vpinsrb $11, %eax, %xmm1, %xmm1 776; AVX-NEXT: shrl $8, %edx 777; AVX-NEXT: addb %dl, %cl 778; AVX-NEXT: movb %cl, %al 779; AVX-NEXT: shrb $7, %al 780; AVX-NEXT: sarb $2, %cl 781; AVX-NEXT: addb %al, %cl 782; AVX-NEXT: movzbl %cl, %eax 783; AVX-NEXT: vpextrb $13, %xmm0, %ecx 784; AVX-NEXT: movsbl %cl, %ecx 785; AVX-NEXT: imull $-109, %ecx, %edx 786; AVX-NEXT: vpinsrb $12, %eax, %xmm1, %xmm1 787; AVX-NEXT: shrl $8, %edx 788; AVX-NEXT: addb %dl, %cl 789; AVX-NEXT: movb %cl, %al 790; AVX-NEXT: shrb $7, %al 791; AVX-NEXT: sarb $2, %cl 792; AVX-NEXT: addb %al, %cl 793; AVX-NEXT: movzbl %cl, %eax 794; AVX-NEXT: vpextrb $14, %xmm0, %ecx 795; AVX-NEXT: movsbl %cl, %ecx 796; AVX-NEXT: imull $-109, %ecx, %edx 797; AVX-NEXT: vpinsrb $13, %eax, %xmm1, %xmm1 798; AVX-NEXT: shrl $8, %edx 799; AVX-NEXT: addb %dl, %cl 800; AVX-NEXT: movb %cl, %al 801; AVX-NEXT: shrb $7, %al 802; AVX-NEXT: sarb $2, %cl 803; AVX-NEXT: addb %al, %cl 804; AVX-NEXT: movzbl %cl, %eax 805; AVX-NEXT: vpextrb $15, %xmm0, %ecx 806; AVX-NEXT: movsbl %cl, %ecx 807; AVX-NEXT: imull $-109, %ecx, %edx 808; AVX-NEXT: vpinsrb $14, %eax, %xmm1, %xmm0 809; AVX-NEXT: shrl $8, %edx 810; AVX-NEXT: addb %dl, %cl 811; AVX-NEXT: movb %cl, %al 812; AVX-NEXT: shrb $7, %al 813; AVX-NEXT: sarb $2, %cl 814; AVX-NEXT: addb %al, %cl 815; AVX-NEXT: movzbl %cl, %eax 816; AVX-NEXT: vpinsrb $15, %eax, %xmm0, %xmm0 817; AVX-NEXT: retq 818 %div = sdiv <16 x i8> %a, <i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7> 819 ret <16 x i8> %div 820} 821 822define <4 x i32> @test8(<4 x i32> %a) { 823; SSE41-LABEL: test8: 824; SSE41: # BB#0: 825; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 826; SSE41-NEXT: movdqa %xmm0, %xmm1 827; SSE41-NEXT: pmuldq %xmm2, %xmm1 828; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 829; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 830; SSE41-NEXT: pmuldq %xmm2, %xmm3 831; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm3[1,3] 832; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 833; SSE41-NEXT: paddd %xmm0, %xmm1 834; SSE41-NEXT: movdqa %xmm1, %xmm0 835; SSE41-NEXT: psrld $31, %xmm0 836; SSE41-NEXT: psrad $2, %xmm1 837; SSE41-NEXT: paddd %xmm0, %xmm1 838; SSE41-NEXT: movdqa %xmm1, %xmm0 839; SSE41-NEXT: retq 840; 841; SSE-LABEL: test8: 842; SSE: # BB#0: 843; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 844; SSE-NEXT: movdqa %xmm2, %xmm1 845; SSE-NEXT: psrad $31, %xmm1 846; SSE-NEXT: pand %xmm0, %xmm1 847; SSE-NEXT: movdqa %xmm0, %xmm3 848; SSE-NEXT: psrad $31, %xmm3 849; SSE-NEXT: pand %xmm2, %xmm3 850; SSE-NEXT: paddd %xmm1, %xmm3 851; SSE-NEXT: movdqa %xmm0, %xmm1 852; SSE-NEXT: pmuludq %xmm2, %xmm1 853; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 854; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 855; SSE-NEXT: pmuludq %xmm2, %xmm4 856; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm4[1,3] 857; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 858; SSE-NEXT: psubd %xmm3, %xmm1 859; SSE-NEXT: paddd %xmm0, %xmm1 860; SSE-NEXT: movdqa %xmm1, %xmm0 861; SSE-NEXT: psrld $31, %xmm0 862; SSE-NEXT: psrad $2, %xmm1 863; SSE-NEXT: paddd %xmm0, %xmm1 864; SSE-NEXT: movdqa %xmm1, %xmm0 865; SSE-NEXT: retq 866; 867; AVX-LABEL: test8: 868; AVX: # BB#0: 869; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1 870; AVX-NEXT: vpmuldq %xmm1, %xmm0, %xmm2 871; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 872; AVX-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 873; AVX-NEXT: vpmuldq %xmm1, %xmm3, %xmm1 874; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm2[1,3],xmm1[1,3] 875; AVX-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 876; AVX-NEXT: vpaddd %xmm0, %xmm1, %xmm0 877; AVX-NEXT: vpsrld $31, %xmm0, %xmm1 878; AVX-NEXT: vpsrad $2, %xmm0, %xmm0 879; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 880; AVX-NEXT: retq 881 %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7> 882 ret <4 x i32> %div 883} 884 885define <8 x i32> @test9(<8 x i32> %a) { 886; SSE41-LABEL: test9: 887; SSE41: # BB#0: 888; SSE41-NEXT: movdqa %xmm1, %xmm2 889; SSE41-NEXT: movdqa %xmm0, %xmm3 890; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 891; SSE41-NEXT: # kill: XMM0<def> XMM3<kill> 892; SSE41-NEXT: pmuldq %xmm1, %xmm0 893; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 894; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3] 895; SSE41-NEXT: pmuldq %xmm4, %xmm5 896; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm5[1,3] 897; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 898; SSE41-NEXT: paddd %xmm3, %xmm0 899; SSE41-NEXT: movdqa %xmm0, %xmm3 900; SSE41-NEXT: psrld $31, %xmm3 901; SSE41-NEXT: psrad $2, %xmm0 902; SSE41-NEXT: paddd %xmm3, %xmm0 903; SSE41-NEXT: pmuldq %xmm2, %xmm1 904; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] 905; SSE41-NEXT: pmuldq %xmm4, %xmm3 906; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm3[1,3] 907; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 908; SSE41-NEXT: paddd %xmm2, %xmm1 909; SSE41-NEXT: movdqa %xmm1, %xmm2 910; SSE41-NEXT: psrld $31, %xmm2 911; SSE41-NEXT: psrad $2, %xmm1 912; SSE41-NEXT: paddd %xmm2, %xmm1 913; SSE41-NEXT: retq 914; 915; SSE-LABEL: test9: 916; SSE: # BB#0: 917; SSE-NEXT: movdqa %xmm1, %xmm2 918; SSE-NEXT: movdqa %xmm0, %xmm3 919; SSE-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 920; SSE-NEXT: movdqa %xmm1, %xmm4 921; SSE-NEXT: psrad $31, %xmm4 922; SSE-NEXT: movdqa %xmm4, %xmm0 923; SSE-NEXT: pand %xmm3, %xmm0 924; SSE-NEXT: movdqa %xmm3, %xmm5 925; SSE-NEXT: psrad $31, %xmm5 926; SSE-NEXT: pand %xmm1, %xmm5 927; SSE-NEXT: paddd %xmm0, %xmm5 928; SSE-NEXT: movdqa %xmm3, %xmm0 929; SSE-NEXT: pmuludq %xmm1, %xmm0 930; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3] 931; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 932; SSE-NEXT: pmuludq %xmm6, %xmm7 933; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm7[1,3] 934; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 935; SSE-NEXT: psubd %xmm5, %xmm0 936; SSE-NEXT: paddd %xmm3, %xmm0 937; SSE-NEXT: movdqa %xmm0, %xmm3 938; SSE-NEXT: psrld $31, %xmm3 939; SSE-NEXT: psrad $2, %xmm0 940; SSE-NEXT: paddd %xmm3, %xmm0 941; SSE-NEXT: pand %xmm2, %xmm4 942; SSE-NEXT: movdqa %xmm2, %xmm3 943; SSE-NEXT: psrad $31, %xmm3 944; SSE-NEXT: pand %xmm1, %xmm3 945; SSE-NEXT: paddd %xmm4, %xmm3 946; SSE-NEXT: pmuludq %xmm2, %xmm1 947; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 948; SSE-NEXT: pmuludq %xmm6, %xmm4 949; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm4[1,3] 950; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 951; SSE-NEXT: psubd %xmm3, %xmm1 952; SSE-NEXT: paddd %xmm2, %xmm1 953; SSE-NEXT: movdqa %xmm1, %xmm2 954; SSE-NEXT: psrld $31, %xmm2 955; SSE-NEXT: psrad $2, %xmm1 956; SSE-NEXT: paddd %xmm2, %xmm1 957; SSE-NEXT: retq 958; 959; AVX-LABEL: test9: 960; AVX: # BB#0: 961; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %ymm1 962; AVX-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7] 963; AVX-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7] 964; AVX-NEXT: vpmuldq %ymm2, %ymm3, %ymm2 965; AVX-NEXT: vpmuldq %ymm1, %ymm0, %ymm1 966; AVX-NEXT: vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7] 967; AVX-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7] 968; AVX-NEXT: vpaddd %ymm0, %ymm1, %ymm0 969; AVX-NEXT: vpsrld $31, %ymm0, %ymm1 970; AVX-NEXT: vpsrad $2, %ymm0, %ymm0 971; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 972; AVX-NEXT: retq 973 %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> 974 ret <8 x i32> %div 975} 976 977define <8 x i32> @test10(<8 x i32> %a) { 978; SSE41-LABEL: test10: 979; SSE41: # BB#0: 980; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757] 981; SSE41-NEXT: movdqa %xmm0, %xmm3 982; SSE41-NEXT: pmuludq %xmm2, %xmm3 983; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 984; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 985; SSE41-NEXT: pmuludq %xmm4, %xmm5 986; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3] 987; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2,1,3] 988; SSE41-NEXT: movdqa %xmm0, %xmm5 989; SSE41-NEXT: psubd %xmm3, %xmm5 990; SSE41-NEXT: psrld $1, %xmm5 991; SSE41-NEXT: paddd %xmm3, %xmm5 992; SSE41-NEXT: psrld $2, %xmm5 993; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [7,7,7,7] 994; SSE41-NEXT: pmulld %xmm3, %xmm5 995; SSE41-NEXT: psubd %xmm5, %xmm0 996; SSE41-NEXT: pmuludq %xmm1, %xmm2 997; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 998; SSE41-NEXT: pmuludq %xmm4, %xmm5 999; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3] 1000; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 1001; SSE41-NEXT: movdqa %xmm1, %xmm4 1002; SSE41-NEXT: psubd %xmm2, %xmm4 1003; SSE41-NEXT: psrld $1, %xmm4 1004; SSE41-NEXT: paddd %xmm2, %xmm4 1005; SSE41-NEXT: psrld $2, %xmm4 1006; SSE41-NEXT: pmulld %xmm3, %xmm4 1007; SSE41-NEXT: psubd %xmm4, %xmm1 1008; SSE41-NEXT: retq 1009; 1010; SSE-LABEL: test10: 1011; SSE: # BB#0: 1012; SSE-NEXT: movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757] 1013; SSE-NEXT: movdqa %xmm0, %xmm3 1014; SSE-NEXT: pmuludq %xmm2, %xmm3 1015; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1016; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 1017; SSE-NEXT: pmuludq %xmm4, %xmm5 1018; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3] 1019; SSE-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2,1,3] 1020; SSE-NEXT: movdqa %xmm0, %xmm5 1021; SSE-NEXT: psubd %xmm3, %xmm5 1022; SSE-NEXT: psrld $1, %xmm5 1023; SSE-NEXT: paddd %xmm3, %xmm5 1024; SSE-NEXT: psrld $2, %xmm5 1025; SSE-NEXT: movdqa {{.*#+}} xmm3 = [7,7,7,7] 1026; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3] 1027; SSE-NEXT: pmuludq %xmm3, %xmm5 1028; SSE-NEXT: pmuludq %xmm3, %xmm6 1029; SSE-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm6[0,2] 1030; SSE-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2,1,3] 1031; SSE-NEXT: psubd %xmm5, %xmm0 1032; SSE-NEXT: pmuludq %xmm1, %xmm2 1033; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3] 1034; SSE-NEXT: pmuludq %xmm4, %xmm5 1035; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3] 1036; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 1037; SSE-NEXT: movdqa %xmm1, %xmm4 1038; SSE-NEXT: psubd %xmm2, %xmm4 1039; SSE-NEXT: psrld $1, %xmm4 1040; SSE-NEXT: paddd %xmm2, %xmm4 1041; SSE-NEXT: psrld $2, %xmm4 1042; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] 1043; SSE-NEXT: pmuludq %xmm3, %xmm4 1044; SSE-NEXT: pmuludq %xmm3, %xmm2 1045; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm2[0,2] 1046; SSE-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2,1,3] 1047; SSE-NEXT: psubd %xmm4, %xmm1 1048; SSE-NEXT: retq 1049; 1050; AVX-LABEL: test10: 1051; AVX: # BB#0: 1052; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %ymm1 1053; AVX-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7] 1054; AVX-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7] 1055; AVX-NEXT: vpmuludq %ymm2, %ymm3, %ymm2 1056; AVX-NEXT: vpmuludq %ymm1, %ymm0, %ymm1 1057; AVX-NEXT: vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7] 1058; AVX-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7] 1059; AVX-NEXT: vpsubd %ymm1, %ymm0, %ymm2 1060; AVX-NEXT: vpsrld $1, %ymm2, %ymm2 1061; AVX-NEXT: vpaddd %ymm1, %ymm2, %ymm1 1062; AVX-NEXT: vpsrld $2, %ymm1, %ymm1 1063; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %ymm2 1064; AVX-NEXT: vpmulld %ymm2, %ymm1, %ymm1 1065; AVX-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1066; AVX-NEXT: retq 1067 %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> 1068 ret <8 x i32> %rem 1069} 1070 1071define <8 x i32> @test11(<8 x i32> %a) { 1072; SSE41-LABEL: test11: 1073; SSE41: # BB#0: 1074; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 1075; SSE41-NEXT: movdqa %xmm0, %xmm3 1076; SSE41-NEXT: pmuldq %xmm2, %xmm3 1077; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3] 1078; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3] 1079; SSE41-NEXT: pmuldq %xmm4, %xmm5 1080; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3] 1081; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2,1,3] 1082; SSE41-NEXT: paddd %xmm0, %xmm3 1083; SSE41-NEXT: movdqa %xmm3, %xmm5 1084; SSE41-NEXT: psrld $31, %xmm5 1085; SSE41-NEXT: psrad $2, %xmm3 1086; SSE41-NEXT: paddd %xmm5, %xmm3 1087; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [7,7,7,7] 1088; SSE41-NEXT: pmulld %xmm5, %xmm3 1089; SSE41-NEXT: psubd %xmm3, %xmm0 1090; SSE41-NEXT: pmuldq %xmm1, %xmm2 1091; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 1092; SSE41-NEXT: pmuldq %xmm4, %xmm3 1093; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3] 1094; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 1095; SSE41-NEXT: paddd %xmm1, %xmm2 1096; SSE41-NEXT: movdqa %xmm2, %xmm3 1097; SSE41-NEXT: psrld $31, %xmm3 1098; SSE41-NEXT: psrad $2, %xmm2 1099; SSE41-NEXT: paddd %xmm3, %xmm2 1100; SSE41-NEXT: pmulld %xmm5, %xmm2 1101; SSE41-NEXT: psubd %xmm2, %xmm1 1102; SSE41-NEXT: retq 1103; 1104; SSE-LABEL: test11: 1105; SSE: # BB#0: 1106; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 1107; SSE-NEXT: movdqa %xmm2, %xmm3 1108; SSE-NEXT: psrad $31, %xmm3 1109; SSE-NEXT: movdqa %xmm3, %xmm4 1110; SSE-NEXT: pand %xmm0, %xmm4 1111; SSE-NEXT: movdqa %xmm0, %xmm6 1112; SSE-NEXT: psrad $31, %xmm6 1113; SSE-NEXT: pand %xmm2, %xmm6 1114; SSE-NEXT: paddd %xmm4, %xmm6 1115; SSE-NEXT: movdqa %xmm0, %xmm7 1116; SSE-NEXT: pmuludq %xmm2, %xmm7 1117; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3] 1118; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3] 1119; SSE-NEXT: pmuludq %xmm5, %xmm4 1120; SSE-NEXT: shufps {{.*#+}} xmm7 = xmm7[1,3],xmm4[1,3] 1121; SSE-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2,1,3] 1122; SSE-NEXT: psubd %xmm6, %xmm7 1123; SSE-NEXT: paddd %xmm0, %xmm7 1124; SSE-NEXT: movdqa %xmm7, %xmm4 1125; SSE-NEXT: psrld $31, %xmm4 1126; SSE-NEXT: psrad $2, %xmm7 1127; SSE-NEXT: paddd %xmm4, %xmm7 1128; SSE-NEXT: movdqa {{.*#+}} xmm4 = [7,7,7,7] 1129; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3] 1130; SSE-NEXT: pmuludq %xmm4, %xmm7 1131; SSE-NEXT: pmuludq %xmm4, %xmm6 1132; SSE-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2],xmm6[0,2] 1133; SSE-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2,1,3] 1134; SSE-NEXT: psubd %xmm7, %xmm0 1135; SSE-NEXT: pand %xmm1, %xmm3 1136; SSE-NEXT: movdqa %xmm1, %xmm6 1137; SSE-NEXT: psrad $31, %xmm6 1138; SSE-NEXT: pand %xmm2, %xmm6 1139; SSE-NEXT: paddd %xmm3, %xmm6 1140; SSE-NEXT: pmuludq %xmm1, %xmm2 1141; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 1142; SSE-NEXT: pmuludq %xmm5, %xmm3 1143; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3] 1144; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 1145; SSE-NEXT: psubd %xmm6, %xmm2 1146; SSE-NEXT: paddd %xmm1, %xmm2 1147; SSE-NEXT: movdqa %xmm2, %xmm3 1148; SSE-NEXT: psrld $31, %xmm3 1149; SSE-NEXT: psrad $2, %xmm2 1150; SSE-NEXT: paddd %xmm3, %xmm2 1151; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] 1152; SSE-NEXT: pmuludq %xmm4, %xmm2 1153; SSE-NEXT: pmuludq %xmm4, %xmm3 1154; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] 1155; SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2,1,3] 1156; SSE-NEXT: psubd %xmm2, %xmm1 1157; SSE-NEXT: retq 1158; 1159; AVX-LABEL: test11: 1160; AVX: # BB#0: 1161; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %ymm1 1162; AVX-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7] 1163; AVX-NEXT: vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7] 1164; AVX-NEXT: vpmuldq %ymm2, %ymm3, %ymm2 1165; AVX-NEXT: vpmuldq %ymm1, %ymm0, %ymm1 1166; AVX-NEXT: vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7] 1167; AVX-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7] 1168; AVX-NEXT: vpaddd %ymm0, %ymm1, %ymm1 1169; AVX-NEXT: vpsrld $31, %ymm1, %ymm2 1170; AVX-NEXT: vpsrad $2, %ymm1, %ymm1 1171; AVX-NEXT: vpaddd %ymm2, %ymm1, %ymm1 1172; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %ymm2 1173; AVX-NEXT: vpmulld %ymm2, %ymm1, %ymm1 1174; AVX-NEXT: vpsubd %ymm1, %ymm0, %ymm0 1175; AVX-NEXT: retq 1176 %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> 1177 ret <8 x i32> %rem 1178} 1179 1180define <2 x i16> @test12() { 1181; SSE41-LABEL: test12: 1182; SSE41: # BB#0: 1183; SSE41-NEXT: xorps %xmm0, %xmm0 1184; SSE41-NEXT: retq 1185; 1186; SSE-LABEL: test12: 1187; SSE: # BB#0: 1188; SSE-NEXT: xorps %xmm0, %xmm0 1189; SSE-NEXT: retq 1190; 1191; AVX-LABEL: test12: 1192; AVX: # BB#0: 1193; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0 1194; AVX-NEXT: retq 1195 %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0 1196 %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1 1197 %B9 = urem <2 x i16> %I9, %I9 1198 ret <2 x i16> %B9 1199} 1200 1201define <4 x i32> @PR20355(<4 x i32> %a) { 1202; SSE41-LABEL: PR20355: 1203; SSE41: # BB#0: # %entry 1204; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766] 1205; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 1206; SSE41-NEXT: pmuldq %xmm1, %xmm0 1207; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1208; SSE41-NEXT: pmuldq %xmm2, %xmm1 1209; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3] 1210; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 1211; SSE41-NEXT: movaps %xmm0, %xmm1 1212; SSE41-NEXT: psrld $31, %xmm1 1213; SSE41-NEXT: paddd %xmm0, %xmm1 1214; SSE41-NEXT: movdqa %xmm1, %xmm0 1215; SSE41-NEXT: retq 1216; 1217; SSE-LABEL: PR20355: 1218; SSE: # BB#0: # %entry 1219; SSE-NEXT: movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766] 1220; SSE-NEXT: movdqa %xmm1, %xmm2 1221; SSE-NEXT: psrad $31, %xmm2 1222; SSE-NEXT: pand %xmm0, %xmm2 1223; SSE-NEXT: movdqa %xmm0, %xmm3 1224; SSE-NEXT: psrad $31, %xmm3 1225; SSE-NEXT: pand %xmm1, %xmm3 1226; SSE-NEXT: paddd %xmm2, %xmm3 1227; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 1228; SSE-NEXT: pmuludq %xmm1, %xmm0 1229; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1230; SSE-NEXT: pmuludq %xmm2, %xmm1 1231; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3] 1232; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 1233; SSE-NEXT: psubd %xmm3, %xmm0 1234; SSE-NEXT: movdqa %xmm0, %xmm1 1235; SSE-NEXT: psrld $31, %xmm1 1236; SSE-NEXT: paddd %xmm0, %xmm1 1237; SSE-NEXT: movdqa %xmm1, %xmm0 1238; SSE-NEXT: retq 1239; 1240; AVX-LABEL: PR20355: 1241; AVX: # BB#0: # %entry 1242; AVX-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1 1243; AVX-NEXT: vpmuldq %xmm1, %xmm0, %xmm2 1244; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1245; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1246; AVX-NEXT: vpmuldq %xmm1, %xmm0, %xmm0 1247; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm2[1,3],xmm0[1,3] 1248; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 1249; AVX-NEXT: vpsrld $31, %xmm0, %xmm1 1250; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 1251; AVX-NEXT: retq 1252entry: 1253 %sdiv = sdiv <4 x i32> %a, <i32 3, i32 3, i32 3, i32 3> 1254 ret <4 x i32> %sdiv 1255} 1256