216 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -fast-isel -mtriple=i686-unknown-unknown -mattr=+tbm | FileCheck %s --check-prefix=X863; RUN: llc < %s -fast-isel -mtriple=x86_64-unknown-unknown -mattr=+tbm | FileCheck %s --check-prefix=X644 5; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/tbm-builtins.c6 7define i32 @test__bextri_u32(i32 %a0) {8; X86-LABEL: test__bextri_u32:9; X86: # %bb.0:10; X86-NEXT: bextrl $3841, {{[0-9]+}}(%esp), %eax # imm = 0xF0111; X86-NEXT: retl12;13; X64-LABEL: test__bextri_u32:14; X64: # %bb.0:15; X64-NEXT: bextrl $3841, %edi, %eax # imm = 0xF0116; X64-NEXT: retq17 %1 = call i32 @llvm.x86.tbm.bextri.u32(i32 %a0, i32 3841)18 ret i32 %119}20 21define i32 @test__blcfill_u32(i32 %a0) {22; X86-LABEL: test__blcfill_u32:23; X86: # %bb.0:24; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx25; X86-NEXT: leal 1(%ecx), %eax26; X86-NEXT: andl %ecx, %eax27; X86-NEXT: retl28;29; X64-LABEL: test__blcfill_u32:30; X64: # %bb.0:31; X64-NEXT: # kill: def $edi killed $edi def $rdi32; X64-NEXT: leal 1(%rdi), %eax33; X64-NEXT: andl %edi, %eax34; X64-NEXT: retq35 %1 = add i32 %a0, 136 %2 = and i32 %a0, %137 ret i32 %238}39 40define i32 @test__blci_u32(i32 %a0) {41; X86-LABEL: test__blci_u32:42; X86: # %bb.0:43; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx44; X86-NEXT: leal 1(%ecx), %eax45; X86-NEXT: xorl $-1, %eax46; X86-NEXT: orl %ecx, %eax47; X86-NEXT: retl48;49; X64-LABEL: test__blci_u32:50; X64: # %bb.0:51; X64-NEXT: # kill: def $edi killed $edi def $rdi52; X64-NEXT: leal 1(%rdi), %eax53; X64-NEXT: xorl $-1, %eax54; X64-NEXT: orl %edi, %eax55; X64-NEXT: retq56 %1 = add i32 %a0, 157 %2 = xor i32 %1, -158 %3 = or i32 %a0, %259 ret i32 %360}61 62define i32 @test__blcic_u32(i32 %a0) {63; X86-LABEL: test__blcic_u32:64; X86: # %bb.0:65; X86-NEXT: movl {{[0-9]+}}(%esp), %eax66; X86-NEXT: movl %eax, %ecx67; X86-NEXT: xorl $-1, %ecx68; X86-NEXT: addl $1, %eax69; X86-NEXT: andl %ecx, %eax70; X86-NEXT: retl71;72; X64-LABEL: test__blcic_u32:73; X64: # %bb.0:74; X64-NEXT: # kill: def $edi killed $edi def $rdi75; X64-NEXT: leal 1(%rdi), %eax76; X64-NEXT: movl %edi, %ecx77; X64-NEXT: xorl $-1, %ecx78; X64-NEXT: andl %ecx, %eax79; X64-NEXT: retq80 %1 = xor i32 %a0, -181 %2 = add i32 %a0, 182 %3 = and i32 %1, %283 ret i32 %384}85 86define i32 @test__blcmsk_u32(i32 %a0) {87; X86-LABEL: test__blcmsk_u32:88; X86: # %bb.0:89; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx90; X86-NEXT: leal 1(%ecx), %eax91; X86-NEXT: xorl %ecx, %eax92; X86-NEXT: retl93;94; X64-LABEL: test__blcmsk_u32:95; X64: # %bb.0:96; X64-NEXT: # kill: def $edi killed $edi def $rdi97; X64-NEXT: leal 1(%rdi), %eax98; X64-NEXT: xorl %edi, %eax99; X64-NEXT: retq100 %1 = add i32 %a0, 1101 %2 = xor i32 %a0, %1102 ret i32 %2103}104 105define i32 @test__blcs_u32(i32 %a0) {106; X86-LABEL: test__blcs_u32:107; X86: # %bb.0:108; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx109; X86-NEXT: leal 1(%ecx), %eax110; X86-NEXT: orl %ecx, %eax111; X86-NEXT: retl112;113; X64-LABEL: test__blcs_u32:114; X64: # %bb.0:115; X64-NEXT: # kill: def $edi killed $edi def $rdi116; X64-NEXT: leal 1(%rdi), %eax117; X64-NEXT: orl %edi, %eax118; X64-NEXT: retq119 %1 = add i32 %a0, 1120 %2 = or i32 %a0, %1121 ret i32 %2122}123 124define i32 @test__blsfill_u32(i32 %a0) {125; X86-LABEL: test__blsfill_u32:126; X86: # %bb.0:127; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx128; X86-NEXT: leal -1(%ecx), %eax129; X86-NEXT: orl %ecx, %eax130; X86-NEXT: retl131;132; X64-LABEL: test__blsfill_u32:133; X64: # %bb.0:134; X64-NEXT: # kill: def $edi killed $edi def $rdi135; X64-NEXT: leal -1(%rdi), %eax136; X64-NEXT: orl %edi, %eax137; X64-NEXT: retq138 %1 = sub i32 %a0, 1139 %2 = or i32 %a0, %1140 ret i32 %2141}142 143define i32 @test__blsic_u32(i32 %a0) {144; X86-LABEL: test__blsic_u32:145; X86: # %bb.0:146; X86-NEXT: movl {{[0-9]+}}(%esp), %eax147; X86-NEXT: movl %eax, %ecx148; X86-NEXT: xorl $-1, %ecx149; X86-NEXT: subl $1, %eax150; X86-NEXT: orl %ecx, %eax151; X86-NEXT: retl152;153; X64-LABEL: test__blsic_u32:154; X64: # %bb.0:155; X64-NEXT: # kill: def $edi killed $edi def $rdi156; X64-NEXT: leal -1(%rdi), %eax157; X64-NEXT: movl %edi, %ecx158; X64-NEXT: xorl $-1, %ecx159; X64-NEXT: orl %ecx, %eax160; X64-NEXT: retq161 %1 = xor i32 %a0, -1162 %2 = sub i32 %a0, 1163 %3 = or i32 %1, %2164 ret i32 %3165}166 167define i32 @test__t1mskc_u32(i32 %a0) {168; X86-LABEL: test__t1mskc_u32:169; X86: # %bb.0:170; X86-NEXT: movl {{[0-9]+}}(%esp), %eax171; X86-NEXT: movl %eax, %ecx172; X86-NEXT: xorl $-1, %ecx173; X86-NEXT: addl $1, %eax174; X86-NEXT: orl %ecx, %eax175; X86-NEXT: retl176;177; X64-LABEL: test__t1mskc_u32:178; X64: # %bb.0:179; X64-NEXT: # kill: def $edi killed $edi def $rdi180; X64-NEXT: leal 1(%rdi), %eax181; X64-NEXT: movl %edi, %ecx182; X64-NEXT: xorl $-1, %ecx183; X64-NEXT: orl %ecx, %eax184; X64-NEXT: retq185 %1 = xor i32 %a0, -1186 %2 = add i32 %a0, 1187 %3 = or i32 %1, %2188 ret i32 %3189}190 191define i32 @test__tzmsk_u32(i32 %a0) {192; X86-LABEL: test__tzmsk_u32:193; X86: # %bb.0:194; X86-NEXT: movl {{[0-9]+}}(%esp), %eax195; X86-NEXT: movl %eax, %ecx196; X86-NEXT: xorl $-1, %ecx197; X86-NEXT: subl $1, %eax198; X86-NEXT: andl %ecx, %eax199; X86-NEXT: retl200;201; X64-LABEL: test__tzmsk_u32:202; X64: # %bb.0:203; X64-NEXT: # kill: def $edi killed $edi def $rdi204; X64-NEXT: leal -1(%rdi), %eax205; X64-NEXT: movl %edi, %ecx206; X64-NEXT: xorl $-1, %ecx207; X64-NEXT: andl %ecx, %eax208; X64-NEXT: retq209 %1 = xor i32 %a0, -1210 %2 = sub i32 %a0, 1211 %3 = and i32 %1, %2212 ret i32 %3213}214 215declare i32 @llvm.x86.tbm.bextri.u32(i32, i32)216