diff options
Diffstat (limited to 'test/CodeGen/X86/vector-idiv.ll')
| -rw-r--r-- | test/CodeGen/X86/vector-idiv.ll | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/test/CodeGen/X86/vector-idiv.ll b/test/CodeGen/X86/vector-idiv.ll new file mode 100644 index 000000000000..a3229073751b --- /dev/null +++ b/test/CodeGen/X86/vector-idiv.ll @@ -0,0 +1,218 @@ +; RUN: llc -march=x86-64 -mcpu=core2 -mattr=+sse4.1 < %s | FileCheck %s -check-prefix=SSE41 +; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s -check-prefix=SSE +; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s -check-prefix=AVX + +define <4 x i32> @test1(<4 x i32> %a) { + %div = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7> + ret <4 x i32> %div + +; SSE41-LABEL: test1: +; SSE41: pmuludq +; SSE41: pshufd $49 +; SSE41: pmuludq +; SSE41: shufps $-35 +; SSE41: psubd +; SSE41: psrld $1 +; SSE41: padd +; SSE41: psrld $2 + +; AVX-LABEL: test1: +; AVX: vpmuludq +; AVX: vpshufd $49 +; AVX: vpmuludq +; AVX: vshufps $-35 +; AVX: vpsubd +; AVX: vpsrld $1 +; AVX: vpadd +; AVX: vpsrld $2 +} + +define <8 x i32> @test2(<8 x i32> %a) { + %div = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> + ret <8 x i32> %div + +; AVX-LABEL: test2: +; AVX: vpbroadcastd +; AVX: vpalignr $4 +; AVX: vpmuludq +; AVX: vpmuludq +; AVX: vpblendd $170 +; AVX: vpsubd +; AVX: vpsrld $1 +; AVX: vpadd +; AVX: vpsrld $2 +} + +define <8 x i16> @test3(<8 x i16> %a) { + %div = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> + ret <8 x i16> %div + +; SSE41-LABEL: test3: +; SSE41: pmulhuw +; SSE41: psubw +; SSE41: psrlw $1 +; SSE41: paddw +; SSE41: psrlw $2 + +; AVX-LABEL: test3: +; AVX: vpmulhuw +; AVX: vpsubw +; AVX: vpsrlw $1 +; AVX: vpaddw +; AVX: vpsrlw $2 +} + +define <16 x i16> @test4(<16 x i16> %a) { + %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> + ret <16 x i16> %div + +; AVX-LABEL: test4: +; AVX: vpmulhuw +; AVX: vpsubw +; AVX: vpsrlw $1 +; AVX: vpaddw +; AVX: vpsrlw $2 +; AVX-NOT: vpmulhuw +} + +define <8 x i16> @test5(<8 x i16> %a) { + %div = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> + ret <8 x i16> %div + +; SSE41-LABEL: test5: +; SSE41: pmulhw +; SSE41: psrlw $15 +; SSE41: psraw $1 +; SSE41: paddw + +; AVX-LABEL: test5: +; AVX: vpmulhw +; AVX: vpsrlw $15 +; AVX: vpsraw $1 +; AVX: vpaddw +} + +define <16 x i16> @test6(<16 x i16> %a) { + %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> + ret <16 x i16> %div + +; AVX-LABEL: test6: +; AVX: vpmulhw +; AVX: vpsrlw $15 +; AVX: vpsraw $1 +; AVX: vpaddw +; AVX-NOT: vpmulhw +} + +define <16 x i8> @test7(<16 x i8> %a) { + %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> + ret <16 x i8> %div + +; FIXME: scalarized +; SSE41-LABEL: test7: +; SSE41: pext +; AVX-LABEL: test7: +; AVX: pext +} + +define <4 x i32> @test8(<4 x i32> %a) { + %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7> + ret <4 x i32> %div + +; SSE41-LABEL: test8: +; SSE41: pmuldq +; SSE41: pshufd $49 +; SSE41-NOT: pshufd $49 +; SSE41: pmuldq +; SSE41: shufps $-35 +; SSE41: pshufd $-40 +; SSE41: padd +; SSE41: psrld $31 +; SSE41: psrad $2 +; SSE41: padd + +; SSE-LABEL: test8: +; SSE: pmuludq +; SSE: pshufd $49 +; SSE-NOT: pshufd $49 +; SSE: pmuludq +; SSE: shufps $-35 +; SSE: pshufd $-40 +; SSE: psubd +; SSE: padd +; SSE: psrld $31 +; SSE: psrad $2 +; SSE: padd + +; AVX-LABEL: test8: +; AVX: vpmuldq +; AVX: vpshufd $49 +; AVX-NOT: vpshufd $49 +; AVX: vpmuldq +; AVX: vshufps $-35 +; AVX: vpshufd $-40 +; AVX: vpadd +; AVX: vpsrld $31 +; AVX: vpsrad $2 +; AVX: vpadd +} + +define <8 x i32> @test9(<8 x i32> %a) { + %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> + ret <8 x i32> %div + +; AVX-LABEL: test9: +; AVX: vpalignr $4 +; AVX: vpbroadcastd +; AVX: vpmuldq +; AVX: vpmuldq +; AVX: vpblendd $170 +; AVX: vpadd +; AVX: vpsrld $31 +; AVX: vpsrad $2 +; AVX: vpadd +} + +define <8 x i32> @test10(<8 x i32> %a) { + %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> + ret <8 x i32> %rem + +; AVX-LABEL: test10: +; AVX: vpbroadcastd +; AVX: vpalignr $4 +; AVX: vpmuludq +; AVX: vpmuludq +; AVX: vpblendd $170 +; AVX: vpsubd +; AVX: vpsrld $1 +; AVX: vpadd +; AVX: vpsrld $2 +; AVX: vpmulld +} + +define <8 x i32> @test11(<8 x i32> %a) { + %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7> + ret <8 x i32> %rem + +; AVX-LABEL: test11: +; AVX: vpalignr $4 +; AVX: vpbroadcastd +; AVX: vpmuldq +; AVX: vpmuldq +; AVX: vpblendd $170 +; AVX: vpadd +; AVX: vpsrld $31 +; AVX: vpsrad $2 +; AVX: vpadd +; AVX: vpmulld +} + +define <2 x i16> @test12() { + %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0 + %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1 + %B9 = urem <2 x i16> %I9, %I9 + ret <2 x i16> %B9 + +; AVX-LABEL: test12: +; AVX: xorps +} |
