diff options
author | Craig Topper <craig.topper@gmail.com> | 2013-10-03 04:16:45 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2013-10-03 04:16:45 +0000 |
commit | fafe4bbd6c25551b7ea92cf63a8bb4a79c6c4324 (patch) | |
tree | 0270461d0c9ccb5a77a6a13328b69387a3fa56d2 /test/CodeGen/X86 | |
parent | da750239bd1f02aef403baa4805805fb580e78e1 (diff) | |
download | llvm-fafe4bbd6c25551b7ea92cf63a8bb4a79c6c4324.tar.gz llvm-fafe4bbd6c25551b7ea92cf63a8bb4a79c6c4324.tar.bz2 llvm-fafe4bbd6c25551b7ea92cf63a8bb4a79c6c4324.tar.xz |
Add patterns for selecting TBM instructions from logical operations. Patch from Yunzhong Gao.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191871 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86')
-rw-r--r-- | test/CodeGen/X86/tbm-intrinsics-x86_64.ll | 6 | ||||
-rw-r--r-- | test/CodeGen/X86/tbm_patterns.ll | 466 |
2 files changed, 469 insertions, 3 deletions
diff --git a/test/CodeGen/X86/tbm-intrinsics-x86_64.ll b/test/CodeGen/X86/tbm-intrinsics-x86_64.ll index add061fc7f..16343c0dba 100644 --- a/test/CodeGen/X86/tbm-intrinsics-x86_64.ll +++ b/test/CodeGen/X86/tbm-intrinsics-x86_64.ll @@ -26,11 +26,11 @@ entry: ; CHECK-LABEL: test_x86_tbm_bextri_u64: ; CHECK-NOT: mov ; CHECK: bextr $ - %0 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i32 2814) + %0 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %a, i64 2814) ret i64 %0 } -declare i64 @llvm.x86.tbm.bextri.u64(i64, i32) nounwind readnone +declare i64 @llvm.x86.tbm.bextri.u64(i64, i64) nounwind readnone define i64 @test_x86_tbm_bextri_u64_m(i64* nocapture %a) nounwind readonly { entry: @@ -38,7 +38,7 @@ entry: ; CHECK-NOT: mov ; CHECK: bextr $ %tmp1 = load i64* %a, align 8 - %0 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %tmp1, i32 2814) + %0 = tail call i64 @llvm.x86.tbm.bextri.u64(i64 %tmp1, i64 2814) ret i64 %0 } diff --git a/test/CodeGen/X86/tbm_patterns.ll b/test/CodeGen/X86/tbm_patterns.ll new file mode 100644 index 0000000000..a8d55481b5 --- /dev/null +++ b/test/CodeGen/X86/tbm_patterns.ll @@ -0,0 +1,466 @@ +; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+tbm < %s | FileCheck %s + +define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u32: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = lshr i32 %a, 4 + %1 = and i32 %0, 4095 + ret i32 %1 +} + +define i32 @test_x86_tbm_bextri_u32_m(i32* nocapture %a) nounwind readonly { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u32_m: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = load i32* %a + %1 = lshr i32 %0, 4 + %2 = and i32 %1, 4095 + ret i32 %2 +} + +define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u64: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = lshr i64 %a, 4 + %1 = and i64 %0, 4095 + ret i64 %1 +} + +define i64 @test_x86_tbm_bextri_u64_m(i64* nocapture %a) nounwind readonly { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u64_m: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = load i64* %a + %1 = lshr i64 %0, 4 + %2 = and i64 %1, 4095 + ret i64 %2 +} + +define i32 @test_x86_tbm_blcfill_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcfill_u32: + ; CHECK-NOT: mov + ; CHECK: blcfill % + %0 = add i32 %a, 1 + %1 = and i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blcfill_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcfill_u64: + ; CHECK-NOT: mov + ; CHECK: blcfill % + %0 = add i64 %a, 1 + %1 = and i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blci_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blci_u32: + ; CHECK-NOT: mov + ; CHECK: blci % + %0 = add i32 1, %a + %1 = xor i32 %0, -1 + %2 = or i32 %1, %a + ret i32 %2 +} + +define i64 @test_x86_tbm_blci_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blci_u64: + ; CHECK-NOT: mov + ; CHECK: blci % + %0 = add i64 1, %a + %1 = xor i64 %0, -1 + %2 = or i64 %1, %a + ret i64 %2 +} + +define i32 @test_x86_tbm_blcic_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcic_u32: + ; CHECK-NOT: mov + ; CHECK: blcic % + %0 = xor i32 %a, -1 + %1 = add i32 %a, 1 + %2 = and i32 %1, %0 + ret i32 %2 +} + +define i64 @test_x86_tbm_blcic_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcic_u64: + ; CHECK-NOT: mov + ; CHECK: blcic % + %0 = xor i64 %a, -1 + %1 = add i64 %a, 1 + %2 = and i64 %1, %0 + ret i64 %2 +} + +define i32 @test_x86_tbm_blcmsk_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcmsk_u32: + ; CHECK-NOT: mov + ; CHECK: blcmsk % + %0 = add i32 %a, 1 + %1 = xor i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blcmsk_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcmsk_u64: + ; CHECK-NOT: mov + ; CHECK: blcmsk % + %0 = add i64 %a, 1 + %1 = xor i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blcs_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcs_u32: + ; CHECK-NOT: mov + ; CHECK: blcs % + %0 = add i32 %a, 1 + %1 = or i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blcs_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcs_u64: + ; CHECK-NOT: mov + ; CHECK: blcs % + %0 = add i64 %a, 1 + %1 = or i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blsfill_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsfill_u32: + ; CHECK-NOT: mov + ; CHECK: blsfill % + %0 = add i32 %a, -1 + %1 = or i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blsfill_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsfill_u64: + ; CHECK-NOT: mov + ; CHECK: blsfill % + %0 = add i64 %a, -1 + %1 = or i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blsic_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsic_u32: + ; CHECK-NOT: mov + ; CHECK: blsic % + %0 = xor i32 %a, -1 + %1 = add i32 %a, -1 + %2 = or i32 %0, %1 + ret i32 %2 +} + +define i64 @test_x86_tbm_blsic_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsic_u64: + ; CHECK-NOT: mov + ; CHECK: blsic % + %0 = xor i64 %a, -1 + %1 = add i64 %a, -1 + %2 = or i64 %0, %1 + ret i64 %2 +} + +define i32 @test_x86_tbm_t1mskc_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_t1mskc_u32: + ; CHECK-NOT: mov + ; CHECK: t1mskc % + %0 = xor i32 %a, -1 + %1 = add i32 %a, 1 + %2 = or i32 %0, %1 + ret i32 %2 +} + +define i64 @Ttest_x86_tbm_t1mskc_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_t1mskc_u64: + ; CHECK-NOT: mov + ; CHECK: t1mskc % + %0 = xor i64 %a, -1 + %1 = add i64 %a, 1 + %2 = or i64 %0, %1 + ret i64 %2 +} + +define i32 @test_x86_tbm_tzmsk_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_tzmsk_u32: + ; CHECK-NOT: mov + ; CHECK: tzmsk % + %0 = xor i32 %a, -1 + %1 = add i32 %a, -1 + %2 = and i32 %0, %1 + ret i32 %2 +} + +define i64 @test_x86_tbm_tzmsk_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_tzmsk_u64: + ; CHECK-NOT: mov + ; CHECK: tzmsk % + %0 = xor i64 %a, -1 + %1 = add i64 %a, -1 + %2 = and i64 %0, %1 + ret i64 %2 +} +; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+tbm < %s | FileCheck %s + +define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u32: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = lshr i32 %a, 4 + %1 = and i32 %0, 4095 + ret i32 %1 +} + +define i32 @test_x86_tbm_bextri_u32_m(i32* nocapture %a) nounwind readonly { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u32_m: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = load i32* %a + %1 = lshr i32 %0, 4 + %2 = and i32 %1, 4095 + ret i32 %2 +} + +define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u64: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = lshr i64 %a, 4 + %1 = and i64 %0, 4095 + ret i64 %1 +} + +define i64 @test_x86_tbm_bextri_u64_m(i64* nocapture %a) nounwind readonly { +entry: + ; CHECK-LABEL: test_x86_tbm_bextri_u64_m: + ; CHECK-NOT: mov + ; CHECK: bextr $ + %0 = load i64* %a + %1 = lshr i64 %0, 4 + %2 = and i64 %1, 4095 + ret i64 %2 +} + +define i32 @test_x86_tbm_blcfill_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcfill_u32: + ; CHECK-NOT: mov + ; CHECK: blcfill % + %0 = add i32 %a, 1 + %1 = and i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blcfill_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcfill_u64: + ; CHECK-NOT: mov + ; CHECK: blcfill % + %0 = add i64 %a, 1 + %1 = and i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blci_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blci_u32: + ; CHECK-NOT: mov + ; CHECK: blci % + %0 = add i32 1, %a + %1 = xor i32 %0, -1 + %2 = or i32 %1, %a + ret i32 %2 +} + +define i64 @test_x86_tbm_blci_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blci_u64: + ; CHECK-NOT: mov + ; CHECK: blci % + %0 = add i64 1, %a + %1 = xor i64 %0, -1 + %2 = or i64 %1, %a + ret i64 %2 +} + +define i32 @test_x86_tbm_blcic_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcic_u32: + ; CHECK-NOT: mov + ; CHECK: blcic % + %0 = xor i32 %a, -1 + %1 = add i32 %a, 1 + %2 = and i32 %1, %0 + ret i32 %2 +} + +define i64 @test_x86_tbm_blcic_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcic_u64: + ; CHECK-NOT: mov + ; CHECK: blcic % + %0 = xor i64 %a, -1 + %1 = add i64 %a, 1 + %2 = and i64 %1, %0 + ret i64 %2 +} + +define i32 @test_x86_tbm_blcmsk_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcmsk_u32: + ; CHECK-NOT: mov + ; CHECK: blcmsk % + %0 = add i32 %a, 1 + %1 = xor i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blcmsk_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcmsk_u64: + ; CHECK-NOT: mov + ; CHECK: blcmsk % + %0 = add i64 %a, 1 + %1 = xor i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blcs_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcs_u32: + ; CHECK-NOT: mov + ; CHECK: blcs % + %0 = add i32 %a, 1 + %1 = or i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blcs_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blcs_u64: + ; CHECK-NOT: mov + ; CHECK: blcs % + %0 = add i64 %a, 1 + %1 = or i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blsfill_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsfill_u32: + ; CHECK-NOT: mov + ; CHECK: blsfill % + %0 = add i32 %a, -1 + %1 = or i32 %0, %a + ret i32 %1 +} + +define i64 @test_x86_tbm_blsfill_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsfill_u64: + ; CHECK-NOT: mov + ; CHECK: blsfill % + %0 = add i64 %a, -1 + %1 = or i64 %0, %a + ret i64 %1 +} + +define i32 @test_x86_tbm_blsic_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsic_u32: + ; CHECK-NOT: mov + ; CHECK: blsic % + %0 = xor i32 %a, -1 + %1 = add i32 %a, -1 + %2 = or i32 %0, %1 + ret i32 %2 +} + +define i64 @test_x86_tbm_blsic_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_blsic_u64: + ; CHECK-NOT: mov + ; CHECK: blsic % + %0 = xor i64 %a, -1 + %1 = add i64 %a, -1 + %2 = or i64 %0, %1 + ret i64 %2 +} + +define i32 @test_x86_tbm_t1mskc_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_t1mskc_u32: + ; CHECK-NOT: mov + ; CHECK: t1mskc % + %0 = xor i32 %a, -1 + %1 = add i32 %a, 1 + %2 = or i32 %0, %1 + ret i32 %2 +} + +define i64 @Ttest_x86_tbm_t1mskc_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_t1mskc_u64: + ; CHECK-NOT: mov + ; CHECK: t1mskc % + %0 = xor i64 %a, -1 + %1 = add i64 %a, 1 + %2 = or i64 %0, %1 + ret i64 %2 +} + +define i32 @test_x86_tbm_tzmsk_u32(i32 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_tzmsk_u32: + ; CHECK-NOT: mov + ; CHECK: tzmsk % + %0 = xor i32 %a, -1 + %1 = add i32 %a, -1 + %2 = and i32 %0, %1 + ret i32 %2 +} + +define i64 @test_x86_tbm_tzmsk_u64(i64 %a) nounwind readnone { +entry: + ; CHECK-LABEL: test_x86_tbm_tzmsk_u64: + ; CHECK-NOT: mov + ; CHECK: tzmsk % + %0 = xor i64 %a, -1 + %1 = add i64 %a, -1 + %2 = and i64 %0, %1 + ret i64 %2 +} |