From 978165bf02776a2b957c795a5c1d94f9f208fc8e Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 5 Aug 2020 15:53:49 -0700 Subject: [PATCH] [X86] Rename mod128.ll to divmod128.ll and add test cases for sdiv/udiv/urem. This improves code coverage on the switch in LowerWin64_i128OP. --- llvm/test/CodeGen/X86/divmod128.ll | 125 +++++++++++++++++++++++++++++++++++++ llvm/test/CodeGen/X86/mod128.ll | 26 -------- 2 files changed, 125 insertions(+), 26 deletions(-) create mode 100644 llvm/test/CodeGen/X86/divmod128.ll delete mode 100644 llvm/test/CodeGen/X86/mod128.ll diff --git a/llvm/test/CodeGen/X86/divmod128.ll b/llvm/test/CodeGen/X86/divmod128.ll new file mode 100644 index 0000000..6004d99 --- /dev/null +++ b/llvm/test/CodeGen/X86/divmod128.ll @@ -0,0 +1,125 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X86-64 +; RUN: llc < %s -mtriple=x86_64-cygwin | FileCheck %s -check-prefix=WIN64 +; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s -check-prefix=WIN64 +; RUN: llc < %s -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=WIN64 + +define i64 @mod128(i128 %x) nounwind { +; X86-64-LABEL: mod128: +; X86-64: # %bb.0: +; X86-64-NEXT: pushq %rax +; X86-64-NEXT: movl $3, %edx +; X86-64-NEXT: xorl %ecx, %ecx +; X86-64-NEXT: callq __modti3 +; X86-64-NEXT: popq %rcx +; X86-64-NEXT: retq +; +; WIN64-LABEL: mod128: +; WIN64: # %bb.0: +; WIN64-NEXT: subq $72, %rsp +; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $3, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp) +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx +; WIN64-NEXT: callq __modti3 +; WIN64-NEXT: movq %xmm0, %rax +; WIN64-NEXT: addq $72, %rsp +; WIN64-NEXT: retq + + + %1 = srem i128 %x, 3 + %2 = trunc i128 %1 to i64 + ret i64 %2 +} + +define i64 @div128(i128 %x) nounwind { +; X86-64-LABEL: div128: +; X86-64: # %bb.0: +; X86-64-NEXT: pushq %rax +; X86-64-NEXT: movl $3, %edx +; X86-64-NEXT: xorl %ecx, %ecx +; X86-64-NEXT: callq __divti3 +; X86-64-NEXT: popq %rcx +; X86-64-NEXT: retq +; +; WIN64-LABEL: div128: +; WIN64: # %bb.0: +; WIN64-NEXT: subq $72, %rsp +; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $3, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp) +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx +; WIN64-NEXT: callq __divti3 +; WIN64-NEXT: movq %xmm0, %rax +; WIN64-NEXT: addq $72, %rsp +; WIN64-NEXT: retq + + + %1 = sdiv i128 %x, 3 + %2 = trunc i128 %1 to i64 + ret i64 %2 +} + +define i64 @umod128(i128 %x) nounwind { +; X86-64-LABEL: umod128: +; X86-64: # %bb.0: +; X86-64-NEXT: pushq %rax +; X86-64-NEXT: movl $3, %edx +; X86-64-NEXT: xorl %ecx, %ecx +; X86-64-NEXT: callq __umodti3 +; X86-64-NEXT: popq %rcx +; X86-64-NEXT: retq +; +; WIN64-LABEL: umod128: +; WIN64: # %bb.0: +; WIN64-NEXT: subq $72, %rsp +; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $3, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp) +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx +; WIN64-NEXT: callq __umodti3 +; WIN64-NEXT: movq %xmm0, %rax +; WIN64-NEXT: addq $72, %rsp +; WIN64-NEXT: retq + + + %1 = urem i128 %x, 3 + %2 = trunc i128 %1 to i64 + ret i64 %2 +} + +define i64 @udiv128(i128 %x) nounwind { +; X86-64-LABEL: udiv128: +; X86-64: # %bb.0: +; X86-64-NEXT: pushq %rax +; X86-64-NEXT: movl $3, %edx +; X86-64-NEXT: xorl %ecx, %ecx +; X86-64-NEXT: callq __udivti3 +; X86-64-NEXT: popq %rcx +; X86-64-NEXT: retq +; +; WIN64-LABEL: udiv128: +; WIN64: # %bb.0: +; WIN64-NEXT: subq $72, %rsp +; WIN64-NEXT: movq %rdx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq %rcx, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $3, {{[0-9]+}}(%rsp) +; WIN64-NEXT: movq $0, {{[0-9]+}}(%rsp) +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx +; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx +; WIN64-NEXT: callq __udivti3 +; WIN64-NEXT: movq %xmm0, %rax +; WIN64-NEXT: addq $72, %rsp +; WIN64-NEXT: retq + + + %1 = udiv i128 %x, 3 + %2 = trunc i128 %1 to i64 + ret i64 %2 +} diff --git a/llvm/test/CodeGen/X86/mod128.ll b/llvm/test/CodeGen/X86/mod128.ll deleted file mode 100644 index ae28fab..0000000 --- a/llvm/test/CodeGen/X86/mod128.ll +++ /dev/null @@ -1,26 +0,0 @@ -; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefix=X86-64 -; RUN: llc < %s -mtriple=x86_64-cygwin | FileCheck %s -check-prefix=WIN64 -; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s -check-prefix=WIN64 -; RUN: llc < %s -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=WIN64 - -define i64 @mod128(i128 %x) { - ; X86-64: movl $3, %edx - ; X86-64: xorl %ecx, %ecx - ; X86-64: callq __modti3 - ; X86-64-NOT: movd %xmm0, %rax - - ; WIN64-NOT: movl $3, %r8d - ; WIN64-NOT: xorl %r9d, %r9d - ; WIN64-DAG: movq %rdx, 56(%rsp) - ; WIN64-DAG: movq %rcx, 48(%rsp) - ; WIN64-DAG: leaq 48(%rsp), %rcx - ; WIN64-DAG: leaq 32(%rsp), %rdx - ; WIN64-DAG: movq $0, 40(%rsp) - ; WIN64-DAG: movq $3, 32(%rsp) - ; WIN64: callq __modti3 - ; WIN64: movq %xmm0, %rax - - %1 = srem i128 %x, 3 - %2 = trunc i128 %1 to i64 - ret i64 %2 -} -- 2.7.4