1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-apple-darwin10 | FileCheck %s --check-prefixes=X86,SDAG,SDAG-X86 3; RUN: llc < %s -mtriple=i686-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefixes=X86,FASTISEL-X86 4; TODO: llc < %s -mtriple=i686-apple-darwin10 -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X86,GISEL-X86 5; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s --check-prefixes=X64,SDAG,SDAG-X64 6; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s --check-prefixes=X64,FASTISEL-X64 7; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=X64,GISEL-X64 8 9define i8 @shl_i8(i8 %a, i8 %b) { 10; X86-LABEL: shl_i8: 11; X86: ## %bb.0: 12; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 13; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 14; X86-NEXT: shlb %cl, %al 15; X86-NEXT: retl 16; 17; SDAG-X64-LABEL: shl_i8: 18; SDAG-X64: ## %bb.0: 19; SDAG-X64-NEXT: movl %esi, %ecx 20; SDAG-X64-NEXT: movl %edi, %eax 21; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 22; SDAG-X64-NEXT: shlb %cl, %al 23; SDAG-X64-NEXT: ## kill: def $al killed $al killed $eax 24; SDAG-X64-NEXT: retq 25; 26; FASTISEL-X64-LABEL: shl_i8: 27; FASTISEL-X64: ## %bb.0: 28; FASTISEL-X64-NEXT: movl %esi, %ecx 29; FASTISEL-X64-NEXT: movl %edi, %eax 30; FASTISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 31; FASTISEL-X64-NEXT: shlb %cl, %al 32; FASTISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 33; FASTISEL-X64-NEXT: retq 34; 35; GISEL-X64-LABEL: shl_i8: 36; GISEL-X64: ## %bb.0: 37; GISEL-X64-NEXT: movl %edi, %eax 38; GISEL-X64-NEXT: movl %esi, %ecx 39; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 40; GISEL-X64-NEXT: shlb %cl, %al 41; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 42; GISEL-X64-NEXT: retq 43 %c = shl i8 %a, %b 44 ret i8 %c 45} 46 47define i16 @shl_i16(i16 %a, i16 %b) { 48; SDAG-X86-LABEL: shl_i16: 49; SDAG-X86: ## %bb.0: 50; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 51; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 52; SDAG-X86-NEXT: shll %cl, %eax 53; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 54; SDAG-X86-NEXT: retl 55; 56; FASTISEL-X86-LABEL: shl_i16: 57; FASTISEL-X86: ## %bb.0: 58; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 59; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 60; FASTISEL-X86-NEXT: ## kill: def $cl killed $cx 61; FASTISEL-X86-NEXT: shlw %cl, %ax 62; FASTISEL-X86-NEXT: retl 63; 64; SDAG-X64-LABEL: shl_i16: 65; SDAG-X64: ## %bb.0: 66; SDAG-X64-NEXT: movl %esi, %ecx 67; SDAG-X64-NEXT: movl %edi, %eax 68; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 69; SDAG-X64-NEXT: shll %cl, %eax 70; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 71; SDAG-X64-NEXT: retq 72; 73; FASTISEL-X64-LABEL: shl_i16: 74; FASTISEL-X64: ## %bb.0: 75; FASTISEL-X64-NEXT: movl %esi, %ecx 76; FASTISEL-X64-NEXT: movl %edi, %eax 77; FASTISEL-X64-NEXT: ## kill: def $cx killed $cx killed $ecx 78; FASTISEL-X64-NEXT: ## kill: def $cl killed $cx 79; FASTISEL-X64-NEXT: shlw %cl, %ax 80; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 81; FASTISEL-X64-NEXT: retq 82; 83; GISEL-X64-LABEL: shl_i16: 84; GISEL-X64: ## %bb.0: 85; GISEL-X64-NEXT: movl %edi, %eax 86; GISEL-X64-NEXT: movl %esi, %ecx 87; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 88; GISEL-X64-NEXT: shlw %cl, %ax 89; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 90; GISEL-X64-NEXT: retq 91 %c = shl i16 %a, %b 92 ret i16 %c 93} 94 95define i32 @shl_i32(i32 %a, i32 %b) { 96; SDAG-X86-LABEL: shl_i32: 97; SDAG-X86: ## %bb.0: 98; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 99; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 100; SDAG-X86-NEXT: shll %cl, %eax 101; SDAG-X86-NEXT: retl 102; 103; FASTISEL-X86-LABEL: shl_i32: 104; FASTISEL-X86: ## %bb.0: 105; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 106; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 107; FASTISEL-X86-NEXT: ## kill: def $cl killed $ecx 108; FASTISEL-X86-NEXT: shll %cl, %eax 109; FASTISEL-X86-NEXT: retl 110; 111; SDAG-X64-LABEL: shl_i32: 112; SDAG-X64: ## %bb.0: 113; SDAG-X64-NEXT: movl %esi, %ecx 114; SDAG-X64-NEXT: movl %edi, %eax 115; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 116; SDAG-X64-NEXT: shll %cl, %eax 117; SDAG-X64-NEXT: retq 118; 119; FASTISEL-X64-LABEL: shl_i32: 120; FASTISEL-X64: ## %bb.0: 121; FASTISEL-X64-NEXT: movl %esi, %ecx 122; FASTISEL-X64-NEXT: movl %edi, %eax 123; FASTISEL-X64-NEXT: ## kill: def $cl killed $ecx 124; FASTISEL-X64-NEXT: shll %cl, %eax 125; FASTISEL-X64-NEXT: retq 126; 127; GISEL-X64-LABEL: shl_i32: 128; GISEL-X64: ## %bb.0: 129; GISEL-X64-NEXT: movl %edi, %eax 130; GISEL-X64-NEXT: movl %esi, %ecx 131; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 132; GISEL-X64-NEXT: shll %cl, %eax 133; GISEL-X64-NEXT: retq 134 %c = shl i32 %a, %b 135 ret i32 %c 136} 137 138define i64 @shl_i64(i64 %a, i64 %b) nounwind { 139; SDAG-X86-LABEL: shl_i64: 140; SDAG-X86: ## %bb.0: 141; SDAG-X86-NEXT: pushl %esi 142; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 143; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %esi 144; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 145; SDAG-X86-NEXT: movl %esi, %eax 146; SDAG-X86-NEXT: shll %cl, %eax 147; SDAG-X86-NEXT: shldl %cl, %esi, %edx 148; SDAG-X86-NEXT: testb $32, %cl 149; SDAG-X86-NEXT: je LBB3_2 150; SDAG-X86-NEXT: ## %bb.1: 151; SDAG-X86-NEXT: movl %eax, %edx 152; SDAG-X86-NEXT: xorl %eax, %eax 153; SDAG-X86-NEXT: LBB3_2: 154; SDAG-X86-NEXT: popl %esi 155; SDAG-X86-NEXT: retl 156; 157; FASTISEL-X86-LABEL: shl_i64: 158; FASTISEL-X86: ## %bb.0: 159; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 160; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 161; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 162; FASTISEL-X86-NEXT: shldl %cl, %eax, %edx 163; FASTISEL-X86-NEXT: shll %cl, %eax 164; FASTISEL-X86-NEXT: testb $32, %cl 165; FASTISEL-X86-NEXT: je LBB3_2 166; FASTISEL-X86-NEXT: ## %bb.1: 167; FASTISEL-X86-NEXT: movl %eax, %edx 168; FASTISEL-X86-NEXT: xorl %eax, %eax 169; FASTISEL-X86-NEXT: LBB3_2: 170; FASTISEL-X86-NEXT: retl 171; 172; SDAG-X64-LABEL: shl_i64: 173; SDAG-X64: ## %bb.0: 174; SDAG-X64-NEXT: movq %rsi, %rcx 175; SDAG-X64-NEXT: movq %rdi, %rax 176; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $rcx 177; SDAG-X64-NEXT: shlq %cl, %rax 178; SDAG-X64-NEXT: retq 179; 180; FASTISEL-X64-LABEL: shl_i64: 181; FASTISEL-X64: ## %bb.0: 182; FASTISEL-X64-NEXT: movq %rsi, %rcx 183; FASTISEL-X64-NEXT: movq %rdi, %rax 184; FASTISEL-X64-NEXT: ## kill: def $cl killed $rcx 185; FASTISEL-X64-NEXT: shlq %cl, %rax 186; FASTISEL-X64-NEXT: retq 187; 188; GISEL-X64-LABEL: shl_i64: 189; GISEL-X64: ## %bb.0: 190; GISEL-X64-NEXT: movq %rdi, %rax 191; GISEL-X64-NEXT: movq %rsi, %rcx 192; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $rcx 193; GISEL-X64-NEXT: shlq %cl, %rax 194; GISEL-X64-NEXT: retq 195 %c = shl i64 %a, %b 196 ret i64 %c 197} 198 199define i8 @lshr_i8(i8 %a, i8 %b) { 200; X86-LABEL: lshr_i8: 201; X86: ## %bb.0: 202; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 203; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 204; X86-NEXT: shrb %cl, %al 205; X86-NEXT: retl 206; 207; SDAG-X64-LABEL: lshr_i8: 208; SDAG-X64: ## %bb.0: 209; SDAG-X64-NEXT: movl %esi, %ecx 210; SDAG-X64-NEXT: movl %edi, %eax 211; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 212; SDAG-X64-NEXT: shrb %cl, %al 213; SDAG-X64-NEXT: ## kill: def $al killed $al killed $eax 214; SDAG-X64-NEXT: retq 215; 216; FASTISEL-X64-LABEL: lshr_i8: 217; FASTISEL-X64: ## %bb.0: 218; FASTISEL-X64-NEXT: movl %esi, %ecx 219; FASTISEL-X64-NEXT: movl %edi, %eax 220; FASTISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 221; FASTISEL-X64-NEXT: shrb %cl, %al 222; FASTISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 223; FASTISEL-X64-NEXT: retq 224; 225; GISEL-X64-LABEL: lshr_i8: 226; GISEL-X64: ## %bb.0: 227; GISEL-X64-NEXT: movl %edi, %eax 228; GISEL-X64-NEXT: movl %esi, %ecx 229; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 230; GISEL-X64-NEXT: shrb %cl, %al 231; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 232; GISEL-X64-NEXT: retq 233 %c = lshr i8 %a, %b 234 ret i8 %c 235} 236 237define i16 @lshr_i16(i16 %a, i16 %b) { 238; SDAG-X86-LABEL: lshr_i16: 239; SDAG-X86: ## %bb.0: 240; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 241; SDAG-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 242; SDAG-X86-NEXT: shrl %cl, %eax 243; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 244; SDAG-X86-NEXT: retl 245; 246; FASTISEL-X86-LABEL: lshr_i16: 247; FASTISEL-X86: ## %bb.0: 248; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 249; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 250; FASTISEL-X86-NEXT: ## kill: def $cl killed $cx 251; FASTISEL-X86-NEXT: shrw %cl, %ax 252; FASTISEL-X86-NEXT: retl 253; 254; SDAG-X64-LABEL: lshr_i16: 255; SDAG-X64: ## %bb.0: 256; SDAG-X64-NEXT: movl %esi, %ecx 257; SDAG-X64-NEXT: movzwl %di, %eax 258; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 259; SDAG-X64-NEXT: shrl %cl, %eax 260; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 261; SDAG-X64-NEXT: retq 262; 263; FASTISEL-X64-LABEL: lshr_i16: 264; FASTISEL-X64: ## %bb.0: 265; FASTISEL-X64-NEXT: movl %esi, %ecx 266; FASTISEL-X64-NEXT: movl %edi, %eax 267; FASTISEL-X64-NEXT: ## kill: def $cx killed $cx killed $ecx 268; FASTISEL-X64-NEXT: ## kill: def $cl killed $cx 269; FASTISEL-X64-NEXT: shrw %cl, %ax 270; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 271; FASTISEL-X64-NEXT: retq 272; 273; GISEL-X64-LABEL: lshr_i16: 274; GISEL-X64: ## %bb.0: 275; GISEL-X64-NEXT: movl %edi, %eax 276; GISEL-X64-NEXT: movl %esi, %ecx 277; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 278; GISEL-X64-NEXT: shrw %cl, %ax 279; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 280; GISEL-X64-NEXT: retq 281 %c = lshr i16 %a, %b 282 ret i16 %c 283} 284 285define i32 @lshr_i32(i32 %a, i32 %b) { 286; SDAG-X86-LABEL: lshr_i32: 287; SDAG-X86: ## %bb.0: 288; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 289; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 290; SDAG-X86-NEXT: shrl %cl, %eax 291; SDAG-X86-NEXT: retl 292; 293; FASTISEL-X86-LABEL: lshr_i32: 294; FASTISEL-X86: ## %bb.0: 295; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 296; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 297; FASTISEL-X86-NEXT: ## kill: def $cl killed $ecx 298; FASTISEL-X86-NEXT: shrl %cl, %eax 299; FASTISEL-X86-NEXT: retl 300; 301; SDAG-X64-LABEL: lshr_i32: 302; SDAG-X64: ## %bb.0: 303; SDAG-X64-NEXT: movl %esi, %ecx 304; SDAG-X64-NEXT: movl %edi, %eax 305; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 306; SDAG-X64-NEXT: shrl %cl, %eax 307; SDAG-X64-NEXT: retq 308; 309; FASTISEL-X64-LABEL: lshr_i32: 310; FASTISEL-X64: ## %bb.0: 311; FASTISEL-X64-NEXT: movl %esi, %ecx 312; FASTISEL-X64-NEXT: movl %edi, %eax 313; FASTISEL-X64-NEXT: ## kill: def $cl killed $ecx 314; FASTISEL-X64-NEXT: shrl %cl, %eax 315; FASTISEL-X64-NEXT: retq 316; 317; GISEL-X64-LABEL: lshr_i32: 318; GISEL-X64: ## %bb.0: 319; GISEL-X64-NEXT: movl %edi, %eax 320; GISEL-X64-NEXT: movl %esi, %ecx 321; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 322; GISEL-X64-NEXT: shrl %cl, %eax 323; GISEL-X64-NEXT: retq 324 %c = lshr i32 %a, %b 325 ret i32 %c 326} 327 328define i64 @lshr_i64(i64 %a, i64 %b) nounwind { 329; SDAG-X86-LABEL: lshr_i64: 330; SDAG-X86: ## %bb.0: 331; SDAG-X86-NEXT: pushl %esi 332; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 333; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 334; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %esi 335; SDAG-X86-NEXT: movl %esi, %edx 336; SDAG-X86-NEXT: shrl %cl, %edx 337; SDAG-X86-NEXT: shrdl %cl, %esi, %eax 338; SDAG-X86-NEXT: testb $32, %cl 339; SDAG-X86-NEXT: je LBB7_2 340; SDAG-X86-NEXT: ## %bb.1: 341; SDAG-X86-NEXT: movl %edx, %eax 342; SDAG-X86-NEXT: xorl %edx, %edx 343; SDAG-X86-NEXT: LBB7_2: 344; SDAG-X86-NEXT: popl %esi 345; SDAG-X86-NEXT: retl 346; 347; FASTISEL-X86-LABEL: lshr_i64: 348; FASTISEL-X86: ## %bb.0: 349; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 350; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 351; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 352; FASTISEL-X86-NEXT: shrdl %cl, %edx, %eax 353; FASTISEL-X86-NEXT: shrl %cl, %edx 354; FASTISEL-X86-NEXT: testb $32, %cl 355; FASTISEL-X86-NEXT: je LBB7_2 356; FASTISEL-X86-NEXT: ## %bb.1: 357; FASTISEL-X86-NEXT: movl %edx, %eax 358; FASTISEL-X86-NEXT: xorl %edx, %edx 359; FASTISEL-X86-NEXT: LBB7_2: 360; FASTISEL-X86-NEXT: retl 361; 362; SDAG-X64-LABEL: lshr_i64: 363; SDAG-X64: ## %bb.0: 364; SDAG-X64-NEXT: movq %rsi, %rcx 365; SDAG-X64-NEXT: movq %rdi, %rax 366; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $rcx 367; SDAG-X64-NEXT: shrq %cl, %rax 368; SDAG-X64-NEXT: retq 369; 370; FASTISEL-X64-LABEL: lshr_i64: 371; FASTISEL-X64: ## %bb.0: 372; FASTISEL-X64-NEXT: movq %rsi, %rcx 373; FASTISEL-X64-NEXT: movq %rdi, %rax 374; FASTISEL-X64-NEXT: ## kill: def $cl killed $rcx 375; FASTISEL-X64-NEXT: shrq %cl, %rax 376; FASTISEL-X64-NEXT: retq 377; 378; GISEL-X64-LABEL: lshr_i64: 379; GISEL-X64: ## %bb.0: 380; GISEL-X64-NEXT: movq %rdi, %rax 381; GISEL-X64-NEXT: movq %rsi, %rcx 382; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $rcx 383; GISEL-X64-NEXT: shrq %cl, %rax 384; GISEL-X64-NEXT: retq 385 %c = lshr i64 %a, %b 386 ret i64 %c 387} 388 389define i8 @ashr_i8(i8 %a, i8 %b) { 390; X86-LABEL: ashr_i8: 391; X86: ## %bb.0: 392; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 393; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 394; X86-NEXT: sarb %cl, %al 395; X86-NEXT: retl 396; 397; SDAG-X64-LABEL: ashr_i8: 398; SDAG-X64: ## %bb.0: 399; SDAG-X64-NEXT: movl %esi, %ecx 400; SDAG-X64-NEXT: movl %edi, %eax 401; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 402; SDAG-X64-NEXT: sarb %cl, %al 403; SDAG-X64-NEXT: ## kill: def $al killed $al killed $eax 404; SDAG-X64-NEXT: retq 405; 406; FASTISEL-X64-LABEL: ashr_i8: 407; FASTISEL-X64: ## %bb.0: 408; FASTISEL-X64-NEXT: movl %esi, %ecx 409; FASTISEL-X64-NEXT: movl %edi, %eax 410; FASTISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 411; FASTISEL-X64-NEXT: sarb %cl, %al 412; FASTISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 413; FASTISEL-X64-NEXT: retq 414; 415; GISEL-X64-LABEL: ashr_i8: 416; GISEL-X64: ## %bb.0: 417; GISEL-X64-NEXT: movl %edi, %eax 418; GISEL-X64-NEXT: movl %esi, %ecx 419; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 420; GISEL-X64-NEXT: sarb %cl, %al 421; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 422; GISEL-X64-NEXT: retq 423 %c = ashr i8 %a, %b 424 ret i8 %c 425} 426 427define i16 @ashr_i16(i16 %a, i16 %b) { 428; SDAG-X86-LABEL: ashr_i16: 429; SDAG-X86: ## %bb.0: 430; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 431; SDAG-X86-NEXT: movswl {{[0-9]+}}(%esp), %eax 432; SDAG-X86-NEXT: sarl %cl, %eax 433; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 434; SDAG-X86-NEXT: retl 435; 436; FASTISEL-X86-LABEL: ashr_i16: 437; FASTISEL-X86: ## %bb.0: 438; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 439; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 440; FASTISEL-X86-NEXT: ## kill: def $cl killed $cx 441; FASTISEL-X86-NEXT: sarw %cl, %ax 442; FASTISEL-X86-NEXT: retl 443; 444; SDAG-X64-LABEL: ashr_i16: 445; SDAG-X64: ## %bb.0: 446; SDAG-X64-NEXT: movl %esi, %ecx 447; SDAG-X64-NEXT: movswl %di, %eax 448; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 449; SDAG-X64-NEXT: sarl %cl, %eax 450; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 451; SDAG-X64-NEXT: retq 452; 453; FASTISEL-X64-LABEL: ashr_i16: 454; FASTISEL-X64: ## %bb.0: 455; FASTISEL-X64-NEXT: movl %esi, %ecx 456; FASTISEL-X64-NEXT: movl %edi, %eax 457; FASTISEL-X64-NEXT: ## kill: def $cx killed $cx killed $ecx 458; FASTISEL-X64-NEXT: ## kill: def $cl killed $cx 459; FASTISEL-X64-NEXT: sarw %cl, %ax 460; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 461; FASTISEL-X64-NEXT: retq 462; 463; GISEL-X64-LABEL: ashr_i16: 464; GISEL-X64: ## %bb.0: 465; GISEL-X64-NEXT: movl %edi, %eax 466; GISEL-X64-NEXT: movl %esi, %ecx 467; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 468; GISEL-X64-NEXT: sarw %cl, %ax 469; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 470; GISEL-X64-NEXT: retq 471 %c = ashr i16 %a, %b 472 ret i16 %c 473} 474 475define i32 @ashr_i32(i32 %a, i32 %b) { 476; SDAG-X86-LABEL: ashr_i32: 477; SDAG-X86: ## %bb.0: 478; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 479; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 480; SDAG-X86-NEXT: sarl %cl, %eax 481; SDAG-X86-NEXT: retl 482; 483; FASTISEL-X86-LABEL: ashr_i32: 484; FASTISEL-X86: ## %bb.0: 485; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 486; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 487; FASTISEL-X86-NEXT: ## kill: def $cl killed $ecx 488; FASTISEL-X86-NEXT: sarl %cl, %eax 489; FASTISEL-X86-NEXT: retl 490; 491; SDAG-X64-LABEL: ashr_i32: 492; SDAG-X64: ## %bb.0: 493; SDAG-X64-NEXT: movl %esi, %ecx 494; SDAG-X64-NEXT: movl %edi, %eax 495; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 496; SDAG-X64-NEXT: sarl %cl, %eax 497; SDAG-X64-NEXT: retq 498; 499; FASTISEL-X64-LABEL: ashr_i32: 500; FASTISEL-X64: ## %bb.0: 501; FASTISEL-X64-NEXT: movl %esi, %ecx 502; FASTISEL-X64-NEXT: movl %edi, %eax 503; FASTISEL-X64-NEXT: ## kill: def $cl killed $ecx 504; FASTISEL-X64-NEXT: sarl %cl, %eax 505; FASTISEL-X64-NEXT: retq 506; 507; GISEL-X64-LABEL: ashr_i32: 508; GISEL-X64: ## %bb.0: 509; GISEL-X64-NEXT: movl %edi, %eax 510; GISEL-X64-NEXT: movl %esi, %ecx 511; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $ecx 512; GISEL-X64-NEXT: sarl %cl, %eax 513; GISEL-X64-NEXT: retq 514 %c = ashr i32 %a, %b 515 ret i32 %c 516} 517 518define i64 @ashr_i64(i64 %a, i64 %b) nounwind { 519; SDAG-X86-LABEL: ashr_i64: 520; SDAG-X86: ## %bb.0: 521; SDAG-X86-NEXT: pushl %esi 522; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx 523; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 524; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %esi 525; SDAG-X86-NEXT: movl %esi, %edx 526; SDAG-X86-NEXT: sarl %cl, %edx 527; SDAG-X86-NEXT: shrdl %cl, %esi, %eax 528; SDAG-X86-NEXT: testb $32, %cl 529; SDAG-X86-NEXT: je LBB11_2 530; SDAG-X86-NEXT: ## %bb.1: 531; SDAG-X86-NEXT: sarl $31, %esi 532; SDAG-X86-NEXT: movl %edx, %eax 533; SDAG-X86-NEXT: movl %esi, %edx 534; SDAG-X86-NEXT: LBB11_2: 535; SDAG-X86-NEXT: popl %esi 536; SDAG-X86-NEXT: retl 537; 538; FASTISEL-X86-LABEL: ashr_i64: 539; FASTISEL-X86: ## %bb.0: 540; FASTISEL-X86-NEXT: pushl %esi 541; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 542; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %esi 543; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 544; FASTISEL-X86-NEXT: shrdl %cl, %esi, %eax 545; FASTISEL-X86-NEXT: movl %esi, %edx 546; FASTISEL-X86-NEXT: sarl %cl, %edx 547; FASTISEL-X86-NEXT: testb $32, %cl 548; FASTISEL-X86-NEXT: je LBB11_2 549; FASTISEL-X86-NEXT: ## %bb.1: 550; FASTISEL-X86-NEXT: sarl $31, %esi 551; FASTISEL-X86-NEXT: movl %edx, %eax 552; FASTISEL-X86-NEXT: movl %esi, %edx 553; FASTISEL-X86-NEXT: LBB11_2: 554; FASTISEL-X86-NEXT: popl %esi 555; FASTISEL-X86-NEXT: retl 556; 557; SDAG-X64-LABEL: ashr_i64: 558; SDAG-X64: ## %bb.0: 559; SDAG-X64-NEXT: movq %rsi, %rcx 560; SDAG-X64-NEXT: movq %rdi, %rax 561; SDAG-X64-NEXT: ## kill: def $cl killed $cl killed $rcx 562; SDAG-X64-NEXT: sarq %cl, %rax 563; SDAG-X64-NEXT: retq 564; 565; FASTISEL-X64-LABEL: ashr_i64: 566; FASTISEL-X64: ## %bb.0: 567; FASTISEL-X64-NEXT: movq %rsi, %rcx 568; FASTISEL-X64-NEXT: movq %rdi, %rax 569; FASTISEL-X64-NEXT: ## kill: def $cl killed $rcx 570; FASTISEL-X64-NEXT: sarq %cl, %rax 571; FASTISEL-X64-NEXT: retq 572; 573; GISEL-X64-LABEL: ashr_i64: 574; GISEL-X64: ## %bb.0: 575; GISEL-X64-NEXT: movq %rdi, %rax 576; GISEL-X64-NEXT: movq %rsi, %rcx 577; GISEL-X64-NEXT: ## kill: def $cl killed $cl killed $rcx 578; GISEL-X64-NEXT: sarq %cl, %rax 579; GISEL-X64-NEXT: retq 580 %c = ashr i64 %a, %b 581 ret i64 %c 582} 583 584define i8 @shl_imm1_i8(i8 %a) { 585; SDAG-X86-LABEL: shl_imm1_i8: 586; SDAG-X86: ## %bb.0: 587; SDAG-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 588; SDAG-X86-NEXT: addb %al, %al 589; SDAG-X86-NEXT: retl 590; 591; FASTISEL-X86-LABEL: shl_imm1_i8: 592; FASTISEL-X86: ## %bb.0: 593; FASTISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 594; FASTISEL-X86-NEXT: shlb %al 595; FASTISEL-X86-NEXT: retl 596; 597; SDAG-X64-LABEL: shl_imm1_i8: 598; SDAG-X64: ## %bb.0: 599; SDAG-X64-NEXT: ## kill: def $edi killed $edi def $rdi 600; SDAG-X64-NEXT: leal (%rdi,%rdi), %eax 601; SDAG-X64-NEXT: ## kill: def $al killed $al killed $eax 602; SDAG-X64-NEXT: retq 603; 604; FASTISEL-X64-LABEL: shl_imm1_i8: 605; FASTISEL-X64: ## %bb.0: 606; FASTISEL-X64-NEXT: ## kill: def $edi killed $edi def $rdi 607; FASTISEL-X64-NEXT: leal (,%rdi,2), %eax 608; FASTISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 609; FASTISEL-X64-NEXT: retq 610; 611; GISEL-X64-LABEL: shl_imm1_i8: 612; GISEL-X64: ## %bb.0: 613; GISEL-X64-NEXT: ## kill: def $edi killed $edi def $rdi 614; GISEL-X64-NEXT: leal (%rdi,%rdi), %eax 615; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 616; GISEL-X64-NEXT: retq 617 %c = shl i8 %a, 1 618 ret i8 %c 619} 620 621define i16 @shl_imm1_i16(i16 %a) { 622; SDAG-X86-LABEL: shl_imm1_i16: 623; SDAG-X86: ## %bb.0: 624; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 625; SDAG-X86-NEXT: addl %eax, %eax 626; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 627; SDAG-X86-NEXT: retl 628; 629; FASTISEL-X86-LABEL: shl_imm1_i16: 630; FASTISEL-X86: ## %bb.0: 631; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 632; FASTISEL-X86-NEXT: shlw %ax 633; FASTISEL-X86-NEXT: retl 634; 635; SDAG-X64-LABEL: shl_imm1_i16: 636; SDAG-X64: ## %bb.0: 637; SDAG-X64-NEXT: ## kill: def $edi killed $edi def $rdi 638; SDAG-X64-NEXT: leal (%rdi,%rdi), %eax 639; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 640; SDAG-X64-NEXT: retq 641; 642; FASTISEL-X64-LABEL: shl_imm1_i16: 643; FASTISEL-X64: ## %bb.0: 644; FASTISEL-X64-NEXT: ## kill: def $edi killed $edi def $rdi 645; FASTISEL-X64-NEXT: leal (,%rdi,2), %eax 646; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 647; FASTISEL-X64-NEXT: retq 648; 649; GISEL-X64-LABEL: shl_imm1_i16: 650; GISEL-X64: ## %bb.0: 651; GISEL-X64-NEXT: ## kill: def $edi killed $edi def $rdi 652; GISEL-X64-NEXT: leal (%rdi,%rdi), %eax 653; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 654; GISEL-X64-NEXT: retq 655 %c = shl i16 %a, 1 656 ret i16 %c 657} 658 659define i32 @shl_imm1_i32(i32 %a) { 660; SDAG-X86-LABEL: shl_imm1_i32: 661; SDAG-X86: ## %bb.0: 662; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 663; SDAG-X86-NEXT: addl %eax, %eax 664; SDAG-X86-NEXT: retl 665; 666; FASTISEL-X86-LABEL: shl_imm1_i32: 667; FASTISEL-X86: ## %bb.0: 668; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 669; FASTISEL-X86-NEXT: shll %eax 670; FASTISEL-X86-NEXT: retl 671; 672; SDAG-X64-LABEL: shl_imm1_i32: 673; SDAG-X64: ## %bb.0: 674; SDAG-X64-NEXT: ## kill: def $edi killed $edi def $rdi 675; SDAG-X64-NEXT: leal (%rdi,%rdi), %eax 676; SDAG-X64-NEXT: retq 677; 678; FASTISEL-X64-LABEL: shl_imm1_i32: 679; FASTISEL-X64: ## %bb.0: 680; FASTISEL-X64-NEXT: ## kill: def $edi killed $edi def $rdi 681; FASTISEL-X64-NEXT: leal (,%rdi,2), %eax 682; FASTISEL-X64-NEXT: retq 683; 684; GISEL-X64-LABEL: shl_imm1_i32: 685; GISEL-X64: ## %bb.0: 686; GISEL-X64-NEXT: ## kill: def $edi killed $edi def $rdi 687; GISEL-X64-NEXT: leal (%rdi,%rdi), %eax 688; GISEL-X64-NEXT: retq 689 %c = shl i32 %a, 1 690 ret i32 %c 691} 692 693define i64 @shl_imm1_i64(i64 %a) { 694; SDAG-X86-LABEL: shl_imm1_i64: 695; SDAG-X86: ## %bb.0: 696; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 697; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 698; SDAG-X86-NEXT: shldl $1, %eax, %edx 699; SDAG-X86-NEXT: addl %eax, %eax 700; SDAG-X86-NEXT: retl 701; 702; FASTISEL-X86-LABEL: shl_imm1_i64: 703; FASTISEL-X86: ## %bb.0: 704; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 705; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 706; FASTISEL-X86-NEXT: shldl $1, %eax, %edx 707; FASTISEL-X86-NEXT: addl %eax, %eax 708; FASTISEL-X86-NEXT: retl 709; 710; SDAG-X64-LABEL: shl_imm1_i64: 711; SDAG-X64: ## %bb.0: 712; SDAG-X64-NEXT: leaq (%rdi,%rdi), %rax 713; SDAG-X64-NEXT: retq 714; 715; FASTISEL-X64-LABEL: shl_imm1_i64: 716; FASTISEL-X64: ## %bb.0: 717; FASTISEL-X64-NEXT: leaq (,%rdi,2), %rax 718; FASTISEL-X64-NEXT: retq 719; 720; GISEL-X64-LABEL: shl_imm1_i64: 721; GISEL-X64: ## %bb.0: 722; GISEL-X64-NEXT: leaq (%rdi,%rdi), %rax 723; GISEL-X64-NEXT: retq 724 %c = shl i64 %a, 1 725 ret i64 %c 726} 727 728define i8 @lshr_imm1_i8(i8 %a) { 729; X86-LABEL: lshr_imm1_i8: 730; X86: ## %bb.0: 731; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 732; X86-NEXT: shrb %al 733; X86-NEXT: retl 734; 735; X64-LABEL: lshr_imm1_i8: 736; X64: ## %bb.0: 737; X64-NEXT: movl %edi, %eax 738; X64-NEXT: shrb %al 739; X64-NEXT: ## kill: def $al killed $al killed $eax 740; X64-NEXT: retq 741 %c = lshr i8 %a, 1 742 ret i8 %c 743} 744 745define i16 @lshr_imm1_i16(i16 %a) { 746; SDAG-X86-LABEL: lshr_imm1_i16: 747; SDAG-X86: ## %bb.0: 748; SDAG-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 749; SDAG-X86-NEXT: shrl %eax 750; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 751; SDAG-X86-NEXT: retl 752; 753; FASTISEL-X86-LABEL: lshr_imm1_i16: 754; FASTISEL-X86: ## %bb.0: 755; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 756; FASTISEL-X86-NEXT: shrw %ax 757; FASTISEL-X86-NEXT: retl 758; 759; SDAG-X64-LABEL: lshr_imm1_i16: 760; SDAG-X64: ## %bb.0: 761; SDAG-X64-NEXT: movzwl %di, %eax 762; SDAG-X64-NEXT: shrl %eax 763; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 764; SDAG-X64-NEXT: retq 765; 766; FASTISEL-X64-LABEL: lshr_imm1_i16: 767; FASTISEL-X64: ## %bb.0: 768; FASTISEL-X64-NEXT: movl %edi, %eax 769; FASTISEL-X64-NEXT: shrw %ax 770; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 771; FASTISEL-X64-NEXT: retq 772; 773; GISEL-X64-LABEL: lshr_imm1_i16: 774; GISEL-X64: ## %bb.0: 775; GISEL-X64-NEXT: movl %edi, %eax 776; GISEL-X64-NEXT: shrw %ax 777; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 778; GISEL-X64-NEXT: retq 779 %c = lshr i16 %a, 1 780 ret i16 %c 781} 782 783define i32 @lshr_imm1_i32(i32 %a) { 784; X86-LABEL: lshr_imm1_i32: 785; X86: ## %bb.0: 786; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 787; X86-NEXT: shrl %eax 788; X86-NEXT: retl 789; 790; X64-LABEL: lshr_imm1_i32: 791; X64: ## %bb.0: 792; X64-NEXT: movl %edi, %eax 793; X64-NEXT: shrl %eax 794; X64-NEXT: retq 795 %c = lshr i32 %a, 1 796 ret i32 %c 797} 798 799define i64 @lshr_imm1_i64(i64 %a) { 800; SDAG-X86-LABEL: lshr_imm1_i64: 801; SDAG-X86: ## %bb.0: 802; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 803; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 804; SDAG-X86-NEXT: shrdl $1, %edx, %eax 805; SDAG-X86-NEXT: shrl %edx 806; SDAG-X86-NEXT: retl 807; 808; FASTISEL-X86-LABEL: lshr_imm1_i64: 809; FASTISEL-X86: ## %bb.0: 810; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 811; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 812; FASTISEL-X86-NEXT: shrdl $1, %edx, %eax 813; FASTISEL-X86-NEXT: shrl %edx 814; FASTISEL-X86-NEXT: retl 815; 816; X64-LABEL: lshr_imm1_i64: 817; X64: ## %bb.0: 818; X64-NEXT: movq %rdi, %rax 819; X64-NEXT: shrq %rax 820; X64-NEXT: retq 821 %c = lshr i64 %a, 1 822 ret i64 %c 823} 824 825define i8 @ashr_imm1_i8(i8 %a) { 826; X86-LABEL: ashr_imm1_i8: 827; X86: ## %bb.0: 828; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 829; X86-NEXT: sarb %al 830; X86-NEXT: retl 831; 832; X64-LABEL: ashr_imm1_i8: 833; X64: ## %bb.0: 834; X64-NEXT: movl %edi, %eax 835; X64-NEXT: sarb %al 836; X64-NEXT: ## kill: def $al killed $al killed $eax 837; X64-NEXT: retq 838 %c = ashr i8 %a, 1 839 ret i8 %c 840} 841 842define i16 @ashr_imm1_i16(i16 %a) { 843; SDAG-X86-LABEL: ashr_imm1_i16: 844; SDAG-X86: ## %bb.0: 845; SDAG-X86-NEXT: movswl {{[0-9]+}}(%esp), %eax 846; SDAG-X86-NEXT: shrl %eax 847; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 848; SDAG-X86-NEXT: retl 849; 850; FASTISEL-X86-LABEL: ashr_imm1_i16: 851; FASTISEL-X86: ## %bb.0: 852; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 853; FASTISEL-X86-NEXT: sarw %ax 854; FASTISEL-X86-NEXT: retl 855; 856; SDAG-X64-LABEL: ashr_imm1_i16: 857; SDAG-X64: ## %bb.0: 858; SDAG-X64-NEXT: movswl %di, %eax 859; SDAG-X64-NEXT: shrl %eax 860; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 861; SDAG-X64-NEXT: retq 862; 863; FASTISEL-X64-LABEL: ashr_imm1_i16: 864; FASTISEL-X64: ## %bb.0: 865; FASTISEL-X64-NEXT: movl %edi, %eax 866; FASTISEL-X64-NEXT: sarw %ax 867; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 868; FASTISEL-X64-NEXT: retq 869; 870; GISEL-X64-LABEL: ashr_imm1_i16: 871; GISEL-X64: ## %bb.0: 872; GISEL-X64-NEXT: movl %edi, %eax 873; GISEL-X64-NEXT: sarw %ax 874; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 875; GISEL-X64-NEXT: retq 876 %c = ashr i16 %a, 1 877 ret i16 %c 878} 879 880define i32 @ashr_imm1_i32(i32 %a) { 881; X86-LABEL: ashr_imm1_i32: 882; X86: ## %bb.0: 883; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 884; X86-NEXT: sarl %eax 885; X86-NEXT: retl 886; 887; X64-LABEL: ashr_imm1_i32: 888; X64: ## %bb.0: 889; X64-NEXT: movl %edi, %eax 890; X64-NEXT: sarl %eax 891; X64-NEXT: retq 892 %c = ashr i32 %a, 1 893 ret i32 %c 894} 895 896define i64 @ashr_imm1_i64(i64 %a) { 897; SDAG-X86-LABEL: ashr_imm1_i64: 898; SDAG-X86: ## %bb.0: 899; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 900; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 901; SDAG-X86-NEXT: shrdl $1, %edx, %eax 902; SDAG-X86-NEXT: sarl %edx 903; SDAG-X86-NEXT: retl 904; 905; FASTISEL-X86-LABEL: ashr_imm1_i64: 906; FASTISEL-X86: ## %bb.0: 907; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 908; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 909; FASTISEL-X86-NEXT: shrdl $1, %edx, %eax 910; FASTISEL-X86-NEXT: sarl %edx 911; FASTISEL-X86-NEXT: retl 912; 913; X64-LABEL: ashr_imm1_i64: 914; X64: ## %bb.0: 915; X64-NEXT: movq %rdi, %rax 916; X64-NEXT: sarq %rax 917; X64-NEXT: retq 918 %c = ashr i64 %a, 1 919 ret i64 %c 920} 921 922define i8 @shl_imm4_i8(i8 %a) { 923; X86-LABEL: shl_imm4_i8: 924; X86: ## %bb.0: 925; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 926; X86-NEXT: shlb $4, %al 927; X86-NEXT: retl 928; 929; X64-LABEL: shl_imm4_i8: 930; X64: ## %bb.0: 931; X64-NEXT: movl %edi, %eax 932; X64-NEXT: shlb $4, %al 933; X64-NEXT: ## kill: def $al killed $al killed $eax 934; X64-NEXT: retq 935 %c = shl i8 %a, 4 936 ret i8 %c 937} 938 939define i16 @shl_imm4_i16(i16 %a) { 940; SDAG-X86-LABEL: shl_imm4_i16: 941; SDAG-X86: ## %bb.0: 942; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 943; SDAG-X86-NEXT: shll $4, %eax 944; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 945; SDAG-X86-NEXT: retl 946; 947; FASTISEL-X86-LABEL: shl_imm4_i16: 948; FASTISEL-X86: ## %bb.0: 949; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 950; FASTISEL-X86-NEXT: shlw $4, %ax 951; FASTISEL-X86-NEXT: retl 952; 953; SDAG-X64-LABEL: shl_imm4_i16: 954; SDAG-X64: ## %bb.0: 955; SDAG-X64-NEXT: movl %edi, %eax 956; SDAG-X64-NEXT: shll $4, %eax 957; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 958; SDAG-X64-NEXT: retq 959; 960; FASTISEL-X64-LABEL: shl_imm4_i16: 961; FASTISEL-X64: ## %bb.0: 962; FASTISEL-X64-NEXT: movl %edi, %eax 963; FASTISEL-X64-NEXT: shlw $4, %ax 964; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 965; FASTISEL-X64-NEXT: retq 966; 967; GISEL-X64-LABEL: shl_imm4_i16: 968; GISEL-X64: ## %bb.0: 969; GISEL-X64-NEXT: movl %edi, %eax 970; GISEL-X64-NEXT: shlw $4, %ax 971; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 972; GISEL-X64-NEXT: retq 973 %c = shl i16 %a, 4 974 ret i16 %c 975} 976 977define i32 @shl_imm4_i32(i32 %a) { 978; X86-LABEL: shl_imm4_i32: 979; X86: ## %bb.0: 980; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 981; X86-NEXT: shll $4, %eax 982; X86-NEXT: retl 983; 984; X64-LABEL: shl_imm4_i32: 985; X64: ## %bb.0: 986; X64-NEXT: movl %edi, %eax 987; X64-NEXT: shll $4, %eax 988; X64-NEXT: retq 989 %c = shl i32 %a, 4 990 ret i32 %c 991} 992 993define i64 @shl_imm4_i64(i64 %a) { 994; SDAG-X86-LABEL: shl_imm4_i64: 995; SDAG-X86: ## %bb.0: 996; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 997; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 998; SDAG-X86-NEXT: shldl $4, %eax, %edx 999; SDAG-X86-NEXT: shll $4, %eax 1000; SDAG-X86-NEXT: retl 1001; 1002; FASTISEL-X86-LABEL: shl_imm4_i64: 1003; FASTISEL-X86: ## %bb.0: 1004; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 1005; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1006; FASTISEL-X86-NEXT: shldl $4, %eax, %edx 1007; FASTISEL-X86-NEXT: shll $4, %eax 1008; FASTISEL-X86-NEXT: retl 1009; 1010; X64-LABEL: shl_imm4_i64: 1011; X64: ## %bb.0: 1012; X64-NEXT: movq %rdi, %rax 1013; X64-NEXT: shlq $4, %rax 1014; X64-NEXT: retq 1015 %c = shl i64 %a, 4 1016 ret i64 %c 1017} 1018 1019define i8 @lshr_imm4_i8(i8 %a) { 1020; X86-LABEL: lshr_imm4_i8: 1021; X86: ## %bb.0: 1022; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 1023; X86-NEXT: shrb $4, %al 1024; X86-NEXT: retl 1025; 1026; X64-LABEL: lshr_imm4_i8: 1027; X64: ## %bb.0: 1028; X64-NEXT: movl %edi, %eax 1029; X64-NEXT: shrb $4, %al 1030; X64-NEXT: ## kill: def $al killed $al killed $eax 1031; X64-NEXT: retq 1032 %c = lshr i8 %a, 4 1033 ret i8 %c 1034} 1035 1036define i16 @lshr_imm4_i16(i16 %a) { 1037; SDAG-X86-LABEL: lshr_imm4_i16: 1038; SDAG-X86: ## %bb.0: 1039; SDAG-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1040; SDAG-X86-NEXT: shrl $4, %eax 1041; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 1042; SDAG-X86-NEXT: retl 1043; 1044; FASTISEL-X86-LABEL: lshr_imm4_i16: 1045; FASTISEL-X86: ## %bb.0: 1046; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1047; FASTISEL-X86-NEXT: shrw $4, %ax 1048; FASTISEL-X86-NEXT: retl 1049; 1050; SDAG-X64-LABEL: lshr_imm4_i16: 1051; SDAG-X64: ## %bb.0: 1052; SDAG-X64-NEXT: movzwl %di, %eax 1053; SDAG-X64-NEXT: shrl $4, %eax 1054; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 1055; SDAG-X64-NEXT: retq 1056; 1057; FASTISEL-X64-LABEL: lshr_imm4_i16: 1058; FASTISEL-X64: ## %bb.0: 1059; FASTISEL-X64-NEXT: movl %edi, %eax 1060; FASTISEL-X64-NEXT: shrw $4, %ax 1061; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 1062; FASTISEL-X64-NEXT: retq 1063; 1064; GISEL-X64-LABEL: lshr_imm4_i16: 1065; GISEL-X64: ## %bb.0: 1066; GISEL-X64-NEXT: movl %edi, %eax 1067; GISEL-X64-NEXT: shrw $4, %ax 1068; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 1069; GISEL-X64-NEXT: retq 1070 %c = lshr i16 %a, 4 1071 ret i16 %c 1072} 1073 1074define i32 @lshr_imm4_i32(i32 %a) { 1075; X86-LABEL: lshr_imm4_i32: 1076; X86: ## %bb.0: 1077; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1078; X86-NEXT: shrl $4, %eax 1079; X86-NEXT: retl 1080; 1081; X64-LABEL: lshr_imm4_i32: 1082; X64: ## %bb.0: 1083; X64-NEXT: movl %edi, %eax 1084; X64-NEXT: shrl $4, %eax 1085; X64-NEXT: retq 1086 %c = lshr i32 %a, 4 1087 ret i32 %c 1088} 1089 1090define i64 @lshr_imm4_i64(i64 %a) { 1091; SDAG-X86-LABEL: lshr_imm4_i64: 1092; SDAG-X86: ## %bb.0: 1093; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1094; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 1095; SDAG-X86-NEXT: shrdl $4, %edx, %eax 1096; SDAG-X86-NEXT: shrl $4, %edx 1097; SDAG-X86-NEXT: retl 1098; 1099; FASTISEL-X86-LABEL: lshr_imm4_i64: 1100; FASTISEL-X86: ## %bb.0: 1101; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 1102; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1103; FASTISEL-X86-NEXT: shrdl $4, %edx, %eax 1104; FASTISEL-X86-NEXT: shrl $4, %edx 1105; FASTISEL-X86-NEXT: retl 1106; 1107; X64-LABEL: lshr_imm4_i64: 1108; X64: ## %bb.0: 1109; X64-NEXT: movq %rdi, %rax 1110; X64-NEXT: shrq $4, %rax 1111; X64-NEXT: retq 1112 %c = lshr i64 %a, 4 1113 ret i64 %c 1114} 1115 1116define i8 @ashr_imm4_i8(i8 %a) { 1117; X86-LABEL: ashr_imm4_i8: 1118; X86: ## %bb.0: 1119; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 1120; X86-NEXT: sarb $4, %al 1121; X86-NEXT: retl 1122; 1123; X64-LABEL: ashr_imm4_i8: 1124; X64: ## %bb.0: 1125; X64-NEXT: movl %edi, %eax 1126; X64-NEXT: sarb $4, %al 1127; X64-NEXT: ## kill: def $al killed $al killed $eax 1128; X64-NEXT: retq 1129 %c = ashr i8 %a, 4 1130 ret i8 %c 1131} 1132 1133define i16 @ashr_imm4_i16(i16 %a) { 1134; SDAG-X86-LABEL: ashr_imm4_i16: 1135; SDAG-X86: ## %bb.0: 1136; SDAG-X86-NEXT: movswl {{[0-9]+}}(%esp), %eax 1137; SDAG-X86-NEXT: shrl $4, %eax 1138; SDAG-X86-NEXT: ## kill: def $ax killed $ax killed $eax 1139; SDAG-X86-NEXT: retl 1140; 1141; FASTISEL-X86-LABEL: ashr_imm4_i16: 1142; FASTISEL-X86: ## %bb.0: 1143; FASTISEL-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1144; FASTISEL-X86-NEXT: sarw $4, %ax 1145; FASTISEL-X86-NEXT: retl 1146; 1147; SDAG-X64-LABEL: ashr_imm4_i16: 1148; SDAG-X64: ## %bb.0: 1149; SDAG-X64-NEXT: movswl %di, %eax 1150; SDAG-X64-NEXT: shrl $4, %eax 1151; SDAG-X64-NEXT: ## kill: def $ax killed $ax killed $eax 1152; SDAG-X64-NEXT: retq 1153; 1154; FASTISEL-X64-LABEL: ashr_imm4_i16: 1155; FASTISEL-X64: ## %bb.0: 1156; FASTISEL-X64-NEXT: movl %edi, %eax 1157; FASTISEL-X64-NEXT: sarw $4, %ax 1158; FASTISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 1159; FASTISEL-X64-NEXT: retq 1160; 1161; GISEL-X64-LABEL: ashr_imm4_i16: 1162; GISEL-X64: ## %bb.0: 1163; GISEL-X64-NEXT: movl %edi, %eax 1164; GISEL-X64-NEXT: sarw $4, %ax 1165; GISEL-X64-NEXT: ## kill: def $ax killed $ax killed $eax 1166; GISEL-X64-NEXT: retq 1167 %c = ashr i16 %a, 4 1168 ret i16 %c 1169} 1170 1171define i32 @ashr_imm4_i32(i32 %a) { 1172; X86-LABEL: ashr_imm4_i32: 1173; X86: ## %bb.0: 1174; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1175; X86-NEXT: sarl $4, %eax 1176; X86-NEXT: retl 1177; 1178; X64-LABEL: ashr_imm4_i32: 1179; X64: ## %bb.0: 1180; X64-NEXT: movl %edi, %eax 1181; X64-NEXT: sarl $4, %eax 1182; X64-NEXT: retq 1183 %c = ashr i32 %a, 4 1184 ret i32 %c 1185} 1186 1187define i64 @ashr_imm4_i64(i64 %a) { 1188; SDAG-X86-LABEL: ashr_imm4_i64: 1189; SDAG-X86: ## %bb.0: 1190; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1191; SDAG-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 1192; SDAG-X86-NEXT: shrdl $4, %edx, %eax 1193; SDAG-X86-NEXT: sarl $4, %edx 1194; SDAG-X86-NEXT: retl 1195; 1196; FASTISEL-X86-LABEL: ashr_imm4_i64: 1197; FASTISEL-X86: ## %bb.0: 1198; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %edx 1199; FASTISEL-X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1200; FASTISEL-X86-NEXT: shrdl $4, %edx, %eax 1201; FASTISEL-X86-NEXT: sarl $4, %edx 1202; FASTISEL-X86-NEXT: retl 1203; 1204; X64-LABEL: ashr_imm4_i64: 1205; X64: ## %bb.0: 1206; X64-NEXT: movq %rdi, %rax 1207; X64-NEXT: sarq $4, %rax 1208; X64-NEXT: retq 1209 %c = ashr i64 %a, 4 1210 ret i64 %c 1211} 1212 1213define i8 @PR36731(i8 %a) { 1214; SDAG-LABEL: PR36731: 1215; SDAG: ## %bb.0: 1216; SDAG-NEXT: ret{{[l|q]}} 1217; 1218; FASTISEL-X86-LABEL: PR36731: 1219; FASTISEL-X86: ## %bb.0: 1220; FASTISEL-X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 1221; FASTISEL-X86-NEXT: movb $255, %cl 1222; FASTISEL-X86-NEXT: shlb %cl, %al 1223; FASTISEL-X86-NEXT: retl 1224; 1225; FASTISEL-X64-LABEL: PR36731: 1226; FASTISEL-X64: ## %bb.0: 1227; FASTISEL-X64-NEXT: movl %edi, %eax 1228; FASTISEL-X64-NEXT: movb $255, %cl 1229; FASTISEL-X64-NEXT: shlb %cl, %al 1230; FASTISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 1231; FASTISEL-X64-NEXT: retq 1232; 1233; GISEL-X64-LABEL: PR36731: 1234; GISEL-X64: ## %bb.0: 1235; GISEL-X64-NEXT: movl %edi, %eax 1236; GISEL-X64-NEXT: shlb $255, %al 1237; GISEL-X64-NEXT: ## kill: def $al killed $al killed $eax 1238; GISEL-X64-NEXT: retq 1239 %b = shl i8 %a, -1 1240 ret i8 %b 1241} 1242