1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi,+bmi2 | FileCheck %s --check-prefixes=CHECK 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi,+bmi2,egpr --show-mc-encoding | FileCheck %s --check-prefixes=EGPR 4 5define i64 @bzhi64(i64 %x, i64 %y) { 6; CHECK-LABEL: bzhi64: 7; CHECK: # %bb.0: 8; CHECK-NEXT: bzhiq %rsi, %rdi, %rax 9; CHECK-NEXT: retq 10; 11; EGPR-LABEL: bzhi64: 12; EGPR: # %bb.0: 13; EGPR-NEXT: bzhiq %rsi, %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc8,0xf5,0xc7] 14; EGPR-NEXT: retq # encoding: [0xc3] 15 %tmp = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %x, i64 %y) 16 ret i64 %tmp 17} 18 19define i64 @bzhi64_load(ptr %x, i64 %y) { 20; CHECK-LABEL: bzhi64_load: 21; CHECK: # %bb.0: 22; CHECK-NEXT: bzhiq %rsi, (%rdi), %rax 23; CHECK-NEXT: retq 24; 25; EGPR-LABEL: bzhi64_load: 26; EGPR: # %bb.0: 27; EGPR-NEXT: bzhiq %rsi, (%rdi), %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc8,0xf5,0x07] 28; EGPR-NEXT: retq # encoding: [0xc3] 29 %x1 = load i64, ptr %x 30 %tmp = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %x1, i64 %y) 31 ret i64 %tmp 32} 33 34declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) 35 36define i64 @pdep64(i64 %x, i64 %y) { 37; CHECK-LABEL: pdep64: 38; CHECK: # %bb.0: 39; CHECK-NEXT: pdepq %rsi, %rdi, %rax 40; CHECK-NEXT: retq 41; 42; EGPR-LABEL: pdep64: 43; EGPR: # %bb.0: 44; EGPR-NEXT: pdepq %rsi, %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc3,0xf5,0xc6] 45; EGPR-NEXT: retq # encoding: [0xc3] 46 %tmp = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 %y) 47 ret i64 %tmp 48} 49 50define i64 @pdep64_load(i64 %x, ptr %y) { 51; CHECK-LABEL: pdep64_load: 52; CHECK: # %bb.0: 53; CHECK-NEXT: pdepq (%rsi), %rdi, %rax 54; CHECK-NEXT: retq 55; 56; EGPR-LABEL: pdep64_load: 57; EGPR: # %bb.0: 58; EGPR-NEXT: pdepq (%rsi), %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc3,0xf5,0x06] 59; EGPR-NEXT: retq # encoding: [0xc3] 60 %y1 = load i64, ptr %y 61 %tmp = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x, i64 %y1) 62 ret i64 %tmp 63} 64 65define i64 @pdep64_anyext(i32 %x) { 66; CHECK-LABEL: pdep64_anyext: 67; CHECK: # %bb.0: 68; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 69; CHECK-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555 70; CHECK-NEXT: pdepq %rax, %rdi, %rax 71; CHECK-NEXT: retq 72; 73; EGPR-LABEL: pdep64_anyext: 74; EGPR: # %bb.0: 75; EGPR-NEXT: # kill: def $edi killed $edi def $rdi 76; EGPR-NEXT: movabsq $6148914691236517205, %rax # encoding: [0x48,0xb8,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55] 77; EGPR-NEXT: # imm = 0x5555555555555555 78; EGPR-NEXT: pdepq %rax, %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc3,0xf5,0xc0] 79; EGPR-NEXT: retq # encoding: [0xc3] 80 %x1 = sext i32 %x to i64 81 %tmp = tail call i64 @llvm.x86.bmi.pdep.64(i64 %x1, i64 6148914691236517205) 82 ret i64 %tmp 83} 84 85declare i64 @llvm.x86.bmi.pdep.64(i64, i64) 86 87define i64 @pext64(i64 %x, i64 %y) { 88; CHECK-LABEL: pext64: 89; CHECK: # %bb.0: 90; CHECK-NEXT: pextq %rsi, %rdi, %rax 91; CHECK-NEXT: retq 92; 93; EGPR-LABEL: pext64: 94; EGPR: # %bb.0: 95; EGPR-NEXT: pextq %rsi, %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc2,0xf5,0xc6] 96; EGPR-NEXT: retq # encoding: [0xc3] 97 %tmp = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 %y) 98 ret i64 %tmp 99} 100 101define i64 @pext64_load(i64 %x, ptr %y) { 102; CHECK-LABEL: pext64_load: 103; CHECK: # %bb.0: 104; CHECK-NEXT: pextq (%rsi), %rdi, %rax 105; CHECK-NEXT: retq 106; 107; EGPR-LABEL: pext64_load: 108; EGPR: # %bb.0: 109; EGPR-NEXT: pextq (%rsi), %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc2,0xf5,0x06] 110; EGPR-NEXT: retq # encoding: [0xc3] 111 %y1 = load i64, ptr %y 112 %tmp = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 %y1) 113 ret i64 %tmp 114} 115 116define i64 @pext64_knownbits(i64 %x, i64 %y) { 117; CHECK-LABEL: pext64_knownbits: 118; CHECK: # %bb.0: 119; CHECK-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555 120; CHECK-NEXT: pextq %rax, %rdi, %rax 121; CHECK-NEXT: retq 122; 123; EGPR-LABEL: pext64_knownbits: 124; EGPR: # %bb.0: 125; EGPR-NEXT: movabsq $6148914691236517205, %rax # encoding: [0x48,0xb8,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55] 126; EGPR-NEXT: # imm = 0x5555555555555555 127; EGPR-NEXT: pextq %rax, %rdi, %rax # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xc2,0xf5,0xc0] 128; EGPR-NEXT: retq # encoding: [0xc3] 129 %tmp = tail call i64 @llvm.x86.bmi.pext.64(i64 %x, i64 6148914691236517205) 130 %tmp2 = and i64 %tmp, 4294967295 131 ret i64 %tmp2 132} 133 134declare i64 @llvm.x86.bmi.pext.64(i64, i64) 135 136define i64 @mulx64(i64 %x, i64 %y, ptr %p) { 137; CHECK-LABEL: mulx64: 138; CHECK: # %bb.0: 139; CHECK-NEXT: movq %rdx, %rcx 140; CHECK-NEXT: movq %rdi, %rdx 141; CHECK-NEXT: mulxq %rsi, %rax, %rdx 142; CHECK-NEXT: movq %rdx, (%rcx) 143; CHECK-NEXT: retq 144; 145; EGPR-LABEL: mulx64: 146; EGPR: # %bb.0: 147; EGPR-NEXT: movq %rdx, %rcx # encoding: [0x48,0x89,0xd1] 148; EGPR-NEXT: movq %rdi, %rdx # encoding: [0x48,0x89,0xfa] 149; EGPR-NEXT: mulxq %rsi, %rax, %rdx # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xfb,0xf6,0xd6] 150; EGPR-NEXT: movq %rdx, (%rcx) # encoding: [0x48,0x89,0x11] 151; EGPR-NEXT: retq # encoding: [0xc3] 152 %x1 = zext i64 %x to i128 153 %y1 = zext i64 %y to i128 154 %r1 = mul i128 %x1, %y1 155 %h1 = lshr i128 %r1, 64 156 %h = trunc i128 %h1 to i64 157 %l = trunc i128 %r1 to i64 158 store i64 %h, ptr %p 159 ret i64 %l 160} 161 162define i64 @mulx64_load(i64 %x, ptr %y, ptr %p) { 163; CHECK-LABEL: mulx64_load: 164; CHECK: # %bb.0: 165; CHECK-NEXT: movq %rdx, %rcx 166; CHECK-NEXT: movq %rdi, %rdx 167; CHECK-NEXT: mulxq (%rsi), %rax, %rdx 168; CHECK-NEXT: movq %rdx, (%rcx) 169; CHECK-NEXT: retq 170; 171; EGPR-LABEL: mulx64_load: 172; EGPR: # %bb.0: 173; EGPR-NEXT: movq %rdx, %rcx # encoding: [0x48,0x89,0xd1] 174; EGPR-NEXT: movq %rdi, %rdx # encoding: [0x48,0x89,0xfa] 175; EGPR-NEXT: mulxq (%rsi), %rax, %rdx # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xfb,0xf6,0x16] 176; EGPR-NEXT: movq %rdx, (%rcx) # encoding: [0x48,0x89,0x11] 177; EGPR-NEXT: retq # encoding: [0xc3] 178 %y1 = load i64, ptr %y 179 %x2 = zext i64 %x to i128 180 %y2 = zext i64 %y1 to i128 181 %r1 = mul i128 %x2, %y2 182 %h1 = lshr i128 %r1, 64 183 %h = trunc i128 %h1 to i64 184 %l = trunc i128 %r1 to i64 185 store i64 %h, ptr %p 186 ret i64 %l 187} 188