546 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X864 5; shift left6 7define i32 @and_signbit_shl(i32 %x, ptr %dst) {8; X64-LABEL: and_signbit_shl:9; X64: # %bb.0:10; X64-NEXT: movl %edi, %eax11; X64-NEXT: shll $8, %eax12; X64-NEXT: andl $-16777216, %eax # imm = 0xFF00000013; X64-NEXT: movl %eax, (%rsi)14; X64-NEXT: retq15;16; X86-LABEL: and_signbit_shl:17; X86: # %bb.0:18; X86-NEXT: movl 8(%esp), %ecx19; X86-NEXT: movzbl 6(%esp), %eax20; X86-NEXT: shll $24, %eax21; X86-NEXT: movl %eax, (%ecx)22; X86-NEXT: retl23 %t0 = and i32 %x, 4294901760 ; 0xFFFF000024 %r = shl i32 %t0, 825 store i32 %r, ptr %dst26 ret i32 %r27}28define i32 @and_nosignbit_shl(i32 %x, ptr %dst) {29; X64-LABEL: and_nosignbit_shl:30; X64: # %bb.0:31; X64-NEXT: movl %edi, %eax32; X64-NEXT: shll $8, %eax33; X64-NEXT: andl $-16777216, %eax # imm = 0xFF00000034; X64-NEXT: movl %eax, (%rsi)35; X64-NEXT: retq36;37; X86-LABEL: and_nosignbit_shl:38; X86: # %bb.0:39; X86-NEXT: movl 8(%esp), %ecx40; X86-NEXT: movzbl 6(%esp), %eax41; X86-NEXT: shll $24, %eax42; X86-NEXT: movl %eax, (%ecx)43; X86-NEXT: retl44 %t0 = and i32 %x, 2147418112 ; 0x7FFF000045 %r = shl i32 %t0, 846 store i32 %r, ptr %dst47 ret i32 %r48}49 50define i32 @or_signbit_shl(i32 %x, ptr %dst) {51; X64-LABEL: or_signbit_shl:52; X64: # %bb.0:53; X64-NEXT: movl %edi, %eax54; X64-NEXT: shll $8, %eax55; X64-NEXT: orl $-16777216, %eax # imm = 0xFF00000056; X64-NEXT: movl %eax, (%rsi)57; X64-NEXT: retq58;59; X86-LABEL: or_signbit_shl:60; X86: # %bb.0:61; X86-NEXT: movl 8(%esp), %ecx62; X86-NEXT: movl 4(%esp), %eax63; X86-NEXT: shll $8, %eax64; X86-NEXT: orl $-16777216, %eax # imm = 0xFF00000065; X86-NEXT: movl %eax, (%ecx)66; X86-NEXT: retl67 %t0 = or i32 %x, 4294901760 ; 0xFFFF000068 %r = shl i32 %t0, 869 store i32 %r, ptr %dst70 ret i32 %r71}72define i32 @or_nosignbit_shl(i32 %x, ptr %dst) {73; X64-LABEL: or_nosignbit_shl:74; X64: # %bb.0:75; X64-NEXT: movl %edi, %eax76; X64-NEXT: shll $8, %eax77; X64-NEXT: orl $-16777216, %eax # imm = 0xFF00000078; X64-NEXT: movl %eax, (%rsi)79; X64-NEXT: retq80;81; X86-LABEL: or_nosignbit_shl:82; X86: # %bb.0:83; X86-NEXT: movl 8(%esp), %ecx84; X86-NEXT: movl 4(%esp), %eax85; X86-NEXT: shll $8, %eax86; X86-NEXT: orl $-16777216, %eax # imm = 0xFF00000087; X86-NEXT: movl %eax, (%ecx)88; X86-NEXT: retl89 %t0 = or i32 %x, 2147418112 ; 0x7FFF000090 %r = shl i32 %t0, 891 store i32 %r, ptr %dst92 ret i32 %r93}94 95define i32 @xor_signbit_shl(i32 %x, ptr %dst) {96; X64-LABEL: xor_signbit_shl:97; X64: # %bb.0:98; X64-NEXT: movl %edi, %eax99; X64-NEXT: shll $8, %eax100; X64-NEXT: xorl $-16777216, %eax # imm = 0xFF000000101; X64-NEXT: movl %eax, (%rsi)102; X64-NEXT: retq103;104; X86-LABEL: xor_signbit_shl:105; X86: # %bb.0:106; X86-NEXT: movl 8(%esp), %ecx107; X86-NEXT: movl $16711680, %eax # imm = 0xFF0000108; X86-NEXT: xorl 4(%esp), %eax109; X86-NEXT: shll $8, %eax110; X86-NEXT: movl %eax, (%ecx)111; X86-NEXT: retl112 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000113 %r = shl i32 %t0, 8114 store i32 %r, ptr %dst115 ret i32 %r116}117define i32 @xor_nosignbit_shl(i32 %x, ptr %dst) {118; X64-LABEL: xor_nosignbit_shl:119; X64: # %bb.0:120; X64-NEXT: movl %edi, %eax121; X64-NEXT: shll $8, %eax122; X64-NEXT: xorl $-16777216, %eax # imm = 0xFF000000123; X64-NEXT: movl %eax, (%rsi)124; X64-NEXT: retq125;126; X86-LABEL: xor_nosignbit_shl:127; X86: # %bb.0:128; X86-NEXT: movl 8(%esp), %ecx129; X86-NEXT: movl $16711680, %eax # imm = 0xFF0000130; X86-NEXT: xorl 4(%esp), %eax131; X86-NEXT: shll $8, %eax132; X86-NEXT: movl %eax, (%ecx)133; X86-NEXT: retl134 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000135 %r = shl i32 %t0, 8136 store i32 %r, ptr %dst137 ret i32 %r138}139 140define i32 @add_signbit_shl(i32 %x, ptr %dst) {141; X64-LABEL: add_signbit_shl:142; X64: # %bb.0:143; X64-NEXT: # kill: def $edi killed $edi def $rdi144; X64-NEXT: shll $8, %edi145; X64-NEXT: leal -16777216(%rdi), %eax146; X64-NEXT: movl %eax, (%rsi)147; X64-NEXT: retq148;149; X86-LABEL: add_signbit_shl:150; X86: # %bb.0:151; X86-NEXT: movl 8(%esp), %ecx152; X86-NEXT: movl 4(%esp), %eax153; X86-NEXT: shll $8, %eax154; X86-NEXT: addl $-16777216, %eax # imm = 0xFF000000155; X86-NEXT: movl %eax, (%ecx)156; X86-NEXT: retl157 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000158 %r = shl i32 %t0, 8159 store i32 %r, ptr %dst160 ret i32 %r161}162define i32 @add_nosignbit_shl(i32 %x, ptr %dst) {163; X64-LABEL: add_nosignbit_shl:164; X64: # %bb.0:165; X64-NEXT: # kill: def $edi killed $edi def $rdi166; X64-NEXT: shll $8, %edi167; X64-NEXT: leal -16777216(%rdi), %eax168; X64-NEXT: movl %eax, (%rsi)169; X64-NEXT: retq170;171; X86-LABEL: add_nosignbit_shl:172; X86: # %bb.0:173; X86-NEXT: movl 8(%esp), %ecx174; X86-NEXT: movl 4(%esp), %eax175; X86-NEXT: shll $8, %eax176; X86-NEXT: addl $-16777216, %eax # imm = 0xFF000000177; X86-NEXT: movl %eax, (%ecx)178; X86-NEXT: retl179 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000180 %r = shl i32 %t0, 8181 store i32 %r, ptr %dst182 ret i32 %r183}184 185; logical shift right186 187define i32 @and_signbit_lshr(i32 %x, ptr %dst) {188; X64-LABEL: and_signbit_lshr:189; X64: # %bb.0:190; X64-NEXT: movl %edi, %eax191; X64-NEXT: shrl $8, %eax192; X64-NEXT: andl $16776960, %eax # imm = 0xFFFF00193; X64-NEXT: movl %eax, (%rsi)194; X64-NEXT: retq195;196; X86-LABEL: and_signbit_lshr:197; X86: # %bb.0:198; X86-NEXT: movl 8(%esp), %ecx199; X86-NEXT: movzwl 6(%esp), %eax200; X86-NEXT: shll $8, %eax201; X86-NEXT: movl %eax, (%ecx)202; X86-NEXT: retl203 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000204 %r = lshr i32 %t0, 8205 store i32 %r, ptr %dst206 ret i32 %r207}208define i32 @and_nosignbit_lshr(i32 %x, ptr %dst) {209; X64-LABEL: and_nosignbit_lshr:210; X64: # %bb.0:211; X64-NEXT: movl %edi, %eax212; X64-NEXT: shrl $8, %eax213; X64-NEXT: andl $8388352, %eax # imm = 0x7FFF00214; X64-NEXT: movl %eax, (%rsi)215; X64-NEXT: retq216;217; X86-LABEL: and_nosignbit_lshr:218; X86: # %bb.0:219; X86-NEXT: movl 8(%esp), %ecx220; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000221; X86-NEXT: andl 4(%esp), %eax222; X86-NEXT: shrl $8, %eax223; X86-NEXT: movl %eax, (%ecx)224; X86-NEXT: retl225 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000226 %r = lshr i32 %t0, 8227 store i32 %r, ptr %dst228 ret i32 %r229}230 231define i32 @or_signbit_lshr(i32 %x, ptr %dst) {232; X64-LABEL: or_signbit_lshr:233; X64: # %bb.0:234; X64-NEXT: movl %edi, %eax235; X64-NEXT: shrl $8, %eax236; X64-NEXT: orl $16776960, %eax # imm = 0xFFFF00237; X64-NEXT: movl %eax, (%rsi)238; X64-NEXT: retq239;240; X86-LABEL: or_signbit_lshr:241; X86: # %bb.0:242; X86-NEXT: movl 8(%esp), %ecx243; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000244; X86-NEXT: orl 4(%esp), %eax245; X86-NEXT: shrl $8, %eax246; X86-NEXT: movl %eax, (%ecx)247; X86-NEXT: retl248 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000249 %r = lshr i32 %t0, 8250 store i32 %r, ptr %dst251 ret i32 %r252}253define i32 @or_nosignbit_lshr(i32 %x, ptr %dst) {254; X64-LABEL: or_nosignbit_lshr:255; X64: # %bb.0:256; X64-NEXT: movl %edi, %eax257; X64-NEXT: shrl $8, %eax258; X64-NEXT: orl $8388352, %eax # imm = 0x7FFF00259; X64-NEXT: movl %eax, (%rsi)260; X64-NEXT: retq261;262; X86-LABEL: or_nosignbit_lshr:263; X86: # %bb.0:264; X86-NEXT: movl 8(%esp), %ecx265; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000266; X86-NEXT: orl 4(%esp), %eax267; X86-NEXT: shrl $8, %eax268; X86-NEXT: movl %eax, (%ecx)269; X86-NEXT: retl270 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000271 %r = lshr i32 %t0, 8272 store i32 %r, ptr %dst273 ret i32 %r274}275 276define i32 @xor_signbit_lshr(i32 %x, ptr %dst) {277; X64-LABEL: xor_signbit_lshr:278; X64: # %bb.0:279; X64-NEXT: movl %edi, %eax280; X64-NEXT: shrl $8, %eax281; X64-NEXT: xorl $16776960, %eax # imm = 0xFFFF00282; X64-NEXT: movl %eax, (%rsi)283; X64-NEXT: retq284;285; X86-LABEL: xor_signbit_lshr:286; X86: # %bb.0:287; X86-NEXT: movl 8(%esp), %ecx288; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000289; X86-NEXT: xorl 4(%esp), %eax290; X86-NEXT: shrl $8, %eax291; X86-NEXT: movl %eax, (%ecx)292; X86-NEXT: retl293 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000294 %r = lshr i32 %t0, 8295 store i32 %r, ptr %dst296 ret i32 %r297}298define i32 @xor_nosignbit_lshr(i32 %x, ptr %dst) {299; X64-LABEL: xor_nosignbit_lshr:300; X64: # %bb.0:301; X64-NEXT: movl %edi, %eax302; X64-NEXT: shrl $8, %eax303; X64-NEXT: xorl $8388352, %eax # imm = 0x7FFF00304; X64-NEXT: movl %eax, (%rsi)305; X64-NEXT: retq306;307; X86-LABEL: xor_nosignbit_lshr:308; X86: # %bb.0:309; X86-NEXT: movl 8(%esp), %ecx310; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000311; X86-NEXT: xorl 4(%esp), %eax312; X86-NEXT: shrl $8, %eax313; X86-NEXT: movl %eax, (%ecx)314; X86-NEXT: retl315 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000316 %r = lshr i32 %t0, 8317 store i32 %r, ptr %dst318 ret i32 %r319}320 321define i32 @add_signbit_lshr(i32 %x, ptr %dst) {322; X64-LABEL: add_signbit_lshr:323; X64: # %bb.0:324; X64-NEXT: # kill: def $edi killed $edi def $rdi325; X64-NEXT: leal -65536(%rdi), %eax326; X64-NEXT: shrl $8, %eax327; X64-NEXT: movl %eax, (%rsi)328; X64-NEXT: retq329;330; X86-LABEL: add_signbit_lshr:331; X86: # %bb.0:332; X86-NEXT: movl 8(%esp), %ecx333; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000334; X86-NEXT: addl 4(%esp), %eax335; X86-NEXT: shrl $8, %eax336; X86-NEXT: movl %eax, (%ecx)337; X86-NEXT: retl338 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000339 %r = lshr i32 %t0, 8340 store i32 %r, ptr %dst341 ret i32 %r342}343define i32 @add_nosignbit_lshr(i32 %x, ptr %dst) {344; X64-LABEL: add_nosignbit_lshr:345; X64: # %bb.0:346; X64-NEXT: # kill: def $edi killed $edi def $rdi347; X64-NEXT: leal 2147418112(%rdi), %eax348; X64-NEXT: shrl $8, %eax349; X64-NEXT: movl %eax, (%rsi)350; X64-NEXT: retq351;352; X86-LABEL: add_nosignbit_lshr:353; X86: # %bb.0:354; X86-NEXT: movl 8(%esp), %ecx355; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000356; X86-NEXT: addl 4(%esp), %eax357; X86-NEXT: shrl $8, %eax358; X86-NEXT: movl %eax, (%ecx)359; X86-NEXT: retl360 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000361 %r = lshr i32 %t0, 8362 store i32 %r, ptr %dst363 ret i32 %r364}365 366; arithmetic shift right367 368define i32 @and_signbit_ashr(i32 %x, ptr %dst) {369; X64-LABEL: and_signbit_ashr:370; X64: # %bb.0:371; X64-NEXT: movl %edi, %eax372; X64-NEXT: sarl $8, %eax373; X64-NEXT: andl $-256, %eax374; X64-NEXT: movl %eax, (%rsi)375; X64-NEXT: retq376;377; X86-LABEL: and_signbit_ashr:378; X86: # %bb.0:379; X86-NEXT: movl 8(%esp), %ecx380; X86-NEXT: movswl 6(%esp), %eax381; X86-NEXT: shll $8, %eax382; X86-NEXT: movl %eax, (%ecx)383; X86-NEXT: retl384 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000385 %r = ashr i32 %t0, 8386 store i32 %r, ptr %dst387 ret i32 %r388}389define i32 @and_nosignbit_ashr(i32 %x, ptr %dst) {390; X64-LABEL: and_nosignbit_ashr:391; X64: # %bb.0:392; X64-NEXT: movl %edi, %eax393; X64-NEXT: shrl $8, %eax394; X64-NEXT: andl $8388352, %eax # imm = 0x7FFF00395; X64-NEXT: movl %eax, (%rsi)396; X64-NEXT: retq397;398; X86-LABEL: and_nosignbit_ashr:399; X86: # %bb.0:400; X86-NEXT: movl 8(%esp), %ecx401; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000402; X86-NEXT: andl 4(%esp), %eax403; X86-NEXT: shrl $8, %eax404; X86-NEXT: movl %eax, (%ecx)405; X86-NEXT: retl406 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000407 %r = ashr i32 %t0, 8408 store i32 %r, ptr %dst409 ret i32 %r410}411 412define i32 @or_signbit_ashr(i32 %x, ptr %dst) {413; X64-LABEL: or_signbit_ashr:414; X64: # %bb.0:415; X64-NEXT: movl %edi, %eax416; X64-NEXT: shrl $8, %eax417; X64-NEXT: orl $-256, %eax418; X64-NEXT: movl %eax, (%rsi)419; X64-NEXT: retq420;421; X86-LABEL: or_signbit_ashr:422; X86: # %bb.0:423; X86-NEXT: movl 8(%esp), %ecx424; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000425; X86-NEXT: orl 4(%esp), %eax426; X86-NEXT: sarl $8, %eax427; X86-NEXT: movl %eax, (%ecx)428; X86-NEXT: retl429 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000430 %r = ashr i32 %t0, 8431 store i32 %r, ptr %dst432 ret i32 %r433}434define i32 @or_nosignbit_ashr(i32 %x, ptr %dst) {435; X64-LABEL: or_nosignbit_ashr:436; X64: # %bb.0:437; X64-NEXT: movl %edi, %eax438; X64-NEXT: sarl $8, %eax439; X64-NEXT: orl $8388352, %eax # imm = 0x7FFF00440; X64-NEXT: movl %eax, (%rsi)441; X64-NEXT: retq442;443; X86-LABEL: or_nosignbit_ashr:444; X86: # %bb.0:445; X86-NEXT: movl 8(%esp), %ecx446; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000447; X86-NEXT: orl 4(%esp), %eax448; X86-NEXT: sarl $8, %eax449; X86-NEXT: movl %eax, (%ecx)450; X86-NEXT: retl451 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000452 %r = ashr i32 %t0, 8453 store i32 %r, ptr %dst454 ret i32 %r455}456 457define i32 @xor_signbit_ashr(i32 %x, ptr %dst) {458; X64-LABEL: xor_signbit_ashr:459; X64: # %bb.0:460; X64-NEXT: movl %edi, %eax461; X64-NEXT: sarl $8, %eax462; X64-NEXT: xorl $-256, %eax463; X64-NEXT: movl %eax, (%rsi)464; X64-NEXT: retq465;466; X86-LABEL: xor_signbit_ashr:467; X86: # %bb.0:468; X86-NEXT: movl 8(%esp), %ecx469; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000470; X86-NEXT: xorl 4(%esp), %eax471; X86-NEXT: sarl $8, %eax472; X86-NEXT: movl %eax, (%ecx)473; X86-NEXT: retl474 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000475 %r = ashr i32 %t0, 8476 store i32 %r, ptr %dst477 ret i32 %r478}479define i32 @xor_nosignbit_ashr(i32 %x, ptr %dst) {480; X64-LABEL: xor_nosignbit_ashr:481; X64: # %bb.0:482; X64-NEXT: movl %edi, %eax483; X64-NEXT: sarl $8, %eax484; X64-NEXT: xorl $8388352, %eax # imm = 0x7FFF00485; X64-NEXT: movl %eax, (%rsi)486; X64-NEXT: retq487;488; X86-LABEL: xor_nosignbit_ashr:489; X86: # %bb.0:490; X86-NEXT: movl 8(%esp), %ecx491; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000492; X86-NEXT: xorl 4(%esp), %eax493; X86-NEXT: sarl $8, %eax494; X86-NEXT: movl %eax, (%ecx)495; X86-NEXT: retl496 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000497 %r = ashr i32 %t0, 8498 store i32 %r, ptr %dst499 ret i32 %r500}501 502define i32 @add_signbit_ashr(i32 %x, ptr %dst) {503; X64-LABEL: add_signbit_ashr:504; X64: # %bb.0:505; X64-NEXT: # kill: def $edi killed $edi def $rdi506; X64-NEXT: leal -65536(%rdi), %eax507; X64-NEXT: sarl $8, %eax508; X64-NEXT: movl %eax, (%rsi)509; X64-NEXT: retq510;511; X86-LABEL: add_signbit_ashr:512; X86: # %bb.0:513; X86-NEXT: movl 8(%esp), %ecx514; X86-NEXT: movl $-65536, %eax # imm = 0xFFFF0000515; X86-NEXT: addl 4(%esp), %eax516; X86-NEXT: sarl $8, %eax517; X86-NEXT: movl %eax, (%ecx)518; X86-NEXT: retl519 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000520 %r = ashr i32 %t0, 8521 store i32 %r, ptr %dst522 ret i32 %r523}524define i32 @add_nosignbit_ashr(i32 %x, ptr %dst) {525; X64-LABEL: add_nosignbit_ashr:526; X64: # %bb.0:527; X64-NEXT: # kill: def $edi killed $edi def $rdi528; X64-NEXT: leal 2147418112(%rdi), %eax529; X64-NEXT: sarl $8, %eax530; X64-NEXT: movl %eax, (%rsi)531; X64-NEXT: retq532;533; X86-LABEL: add_nosignbit_ashr:534; X86: # %bb.0:535; X86-NEXT: movl 8(%esp), %ecx536; X86-NEXT: movl $2147418112, %eax # imm = 0x7FFF0000537; X86-NEXT: addl 4(%esp), %eax538; X86-NEXT: sarl $8, %eax539; X86-NEXT: movl %eax, (%ecx)540; X86-NEXT: retl541 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000542 %r = ashr i32 %t0, 8543 store i32 %r, ptr %dst544 ret i32 %r545}546