702 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-linux | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-linux | FileCheck %s --check-prefixes=X644 5define i64 @rotl64(i64 %A, i8 %Amt) nounwind {6; X86-LABEL: rotl64:7; X86: # %bb.0:8; X86-NEXT: pushl %ebx9; X86-NEXT: pushl %edi10; X86-NEXT: pushl %esi11; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx12; X86-NEXT: movl {{[0-9]+}}(%esp), %esi13; X86-NEXT: movl {{[0-9]+}}(%esp), %edi14; X86-NEXT: movl %esi, %eax15; X86-NEXT: shll %cl, %eax16; X86-NEXT: movl %edi, %edx17; X86-NEXT: shldl %cl, %esi, %edx18; X86-NEXT: testb $32, %cl19; X86-NEXT: je .LBB0_220; X86-NEXT: # %bb.1:21; X86-NEXT: movl %eax, %edx22; X86-NEXT: xorl %eax, %eax23; X86-NEXT: .LBB0_2:24; X86-NEXT: movb $64, %ch25; X86-NEXT: subb %cl, %ch26; X86-NEXT: movl %edi, %ebx27; X86-NEXT: movb %ch, %cl28; X86-NEXT: shrl %cl, %ebx29; X86-NEXT: shrdl %cl, %edi, %esi30; X86-NEXT: testb $32, %ch31; X86-NEXT: je .LBB0_432; X86-NEXT: # %bb.3:33; X86-NEXT: movl %ebx, %esi34; X86-NEXT: xorl %ebx, %ebx35; X86-NEXT: .LBB0_4:36; X86-NEXT: orl %ebx, %edx37; X86-NEXT: orl %esi, %eax38; X86-NEXT: popl %esi39; X86-NEXT: popl %edi40; X86-NEXT: popl %ebx41; X86-NEXT: retl42;43; X64-LABEL: rotl64:44; X64: # %bb.0:45; X64-NEXT: movl %esi, %ecx46; X64-NEXT: movq %rdi, %rax47; X64-NEXT: # kill: def $cl killed $cl killed $ecx48; X64-NEXT: rolq %cl, %rax49; X64-NEXT: retq50 %shift.upgrd.1 = zext i8 %Amt to i6451 %B = shl i64 %A, %shift.upgrd.152 %Amt2 = sub i8 64, %Amt53 %shift.upgrd.2 = zext i8 %Amt2 to i6454 %C = lshr i64 %A, %shift.upgrd.255 %D = or i64 %B, %C56 ret i64 %D57}58 59define i64 @rotr64(i64 %A, i8 %Amt) nounwind {60; X86-LABEL: rotr64:61; X86: # %bb.0:62; X86-NEXT: pushl %ebx63; X86-NEXT: pushl %edi64; X86-NEXT: pushl %esi65; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx66; X86-NEXT: movl {{[0-9]+}}(%esp), %edi67; X86-NEXT: movl {{[0-9]+}}(%esp), %esi68; X86-NEXT: movl %esi, %edx69; X86-NEXT: shrl %cl, %edx70; X86-NEXT: movl %edi, %eax71; X86-NEXT: shrdl %cl, %esi, %eax72; X86-NEXT: testb $32, %cl73; X86-NEXT: je .LBB1_274; X86-NEXT: # %bb.1:75; X86-NEXT: movl %edx, %eax76; X86-NEXT: xorl %edx, %edx77; X86-NEXT: .LBB1_2:78; X86-NEXT: movb $64, %ch79; X86-NEXT: subb %cl, %ch80; X86-NEXT: movl %edi, %ebx81; X86-NEXT: movb %ch, %cl82; X86-NEXT: shll %cl, %ebx83; X86-NEXT: shldl %cl, %edi, %esi84; X86-NEXT: testb $32, %ch85; X86-NEXT: je .LBB1_486; X86-NEXT: # %bb.3:87; X86-NEXT: movl %ebx, %esi88; X86-NEXT: xorl %ebx, %ebx89; X86-NEXT: .LBB1_4:90; X86-NEXT: orl %esi, %edx91; X86-NEXT: orl %ebx, %eax92; X86-NEXT: popl %esi93; X86-NEXT: popl %edi94; X86-NEXT: popl %ebx95; X86-NEXT: retl96;97; X64-LABEL: rotr64:98; X64: # %bb.0:99; X64-NEXT: movl %esi, %ecx100; X64-NEXT: movq %rdi, %rax101; X64-NEXT: # kill: def $cl killed $cl killed $ecx102; X64-NEXT: rorq %cl, %rax103; X64-NEXT: retq104 %shift.upgrd.3 = zext i8 %Amt to i64105 %B = lshr i64 %A, %shift.upgrd.3106 %Amt2 = sub i8 64, %Amt107 %shift.upgrd.4 = zext i8 %Amt2 to i64108 %C = shl i64 %A, %shift.upgrd.4109 %D = or i64 %B, %C110 ret i64 %D111}112 113define i64 @rotli64(i64 %A) nounwind {114; X86-LABEL: rotli64:115; X86: # %bb.0:116; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx117; X86-NEXT: movl {{[0-9]+}}(%esp), %edx118; X86-NEXT: movl %ecx, %eax119; X86-NEXT: shldl $5, %edx, %eax120; X86-NEXT: shldl $5, %ecx, %edx121; X86-NEXT: retl122;123; X64-LABEL: rotli64:124; X64: # %bb.0:125; X64-NEXT: movq %rdi, %rax126; X64-NEXT: rolq $5, %rax127; X64-NEXT: retq128 %B = shl i64 %A, 5129 %C = lshr i64 %A, 59130 %D = or i64 %B, %C131 ret i64 %D132}133 134define i64 @rotri64(i64 %A) nounwind {135; X86-LABEL: rotri64:136; X86: # %bb.0:137; X86-NEXT: movl {{[0-9]+}}(%esp), %edx138; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx139; X86-NEXT: movl %ecx, %eax140; X86-NEXT: shldl $27, %edx, %eax141; X86-NEXT: shldl $27, %ecx, %edx142; X86-NEXT: retl143;144; X64-LABEL: rotri64:145; X64: # %bb.0:146; X64-NEXT: movq %rdi, %rax147; X64-NEXT: rolq $59, %rax148; X64-NEXT: retq149 %B = lshr i64 %A, 5150 %C = shl i64 %A, 59151 %D = or i64 %B, %C152 ret i64 %D153}154 155define i64 @rotl1_64(i64 %A) nounwind {156; X86-LABEL: rotl1_64:157; X86: # %bb.0:158; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx159; X86-NEXT: movl {{[0-9]+}}(%esp), %edx160; X86-NEXT: movl %ecx, %eax161; X86-NEXT: shldl $1, %edx, %eax162; X86-NEXT: shldl $1, %ecx, %edx163; X86-NEXT: retl164;165; X64-LABEL: rotl1_64:166; X64: # %bb.0:167; X64-NEXT: movq %rdi, %rax168; X64-NEXT: rolq %rax169; X64-NEXT: retq170 %B = shl i64 %A, 1171 %C = lshr i64 %A, 63172 %D = or i64 %B, %C173 ret i64 %D174}175 176define i64 @rotr1_64(i64 %A) nounwind {177; X86-LABEL: rotr1_64:178; X86: # %bb.0:179; X86-NEXT: movl {{[0-9]+}}(%esp), %edx180; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx181; X86-NEXT: movl %ecx, %eax182; X86-NEXT: shldl $31, %edx, %eax183; X86-NEXT: shldl $31, %ecx, %edx184; X86-NEXT: retl185;186; X64-LABEL: rotr1_64:187; X64: # %bb.0:188; X64-NEXT: movq %rdi, %rax189; X64-NEXT: rorq %rax190; X64-NEXT: retq191 %B = shl i64 %A, 63192 %C = lshr i64 %A, 1193 %D = or i64 %B, %C194 ret i64 %D195}196 197define i32 @rotl32(i32 %A, i8 %Amt) nounwind {198; X86-LABEL: rotl32:199; X86: # %bb.0:200; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx201; X86-NEXT: movl {{[0-9]+}}(%esp), %eax202; X86-NEXT: roll %cl, %eax203; X86-NEXT: retl204;205; X64-LABEL: rotl32:206; X64: # %bb.0:207; X64-NEXT: movl %esi, %ecx208; X64-NEXT: movl %edi, %eax209; X64-NEXT: # kill: def $cl killed $cl killed $ecx210; X64-NEXT: roll %cl, %eax211; X64-NEXT: retq212 %shift.upgrd.1 = zext i8 %Amt to i32213 %B = shl i32 %A, %shift.upgrd.1214 %Amt2 = sub i8 32, %Amt215 %shift.upgrd.2 = zext i8 %Amt2 to i32216 %C = lshr i32 %A, %shift.upgrd.2217 %D = or i32 %B, %C218 ret i32 %D219}220 221define i32 @rotr32(i32 %A, i8 %Amt) nounwind {222; X86-LABEL: rotr32:223; X86: # %bb.0:224; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx225; X86-NEXT: movl {{[0-9]+}}(%esp), %eax226; X86-NEXT: rorl %cl, %eax227; X86-NEXT: retl228;229; X64-LABEL: rotr32:230; X64: # %bb.0:231; X64-NEXT: movl %esi, %ecx232; X64-NEXT: movl %edi, %eax233; X64-NEXT: # kill: def $cl killed $cl killed $ecx234; X64-NEXT: rorl %cl, %eax235; X64-NEXT: retq236 %shift.upgrd.3 = zext i8 %Amt to i32237 %B = lshr i32 %A, %shift.upgrd.3238 %Amt2 = sub i8 32, %Amt239 %shift.upgrd.4 = zext i8 %Amt2 to i32240 %C = shl i32 %A, %shift.upgrd.4241 %D = or i32 %B, %C242 ret i32 %D243}244 245define i32 @rotli32(i32 %A) nounwind {246; X86-LABEL: rotli32:247; X86: # %bb.0:248; X86-NEXT: movl {{[0-9]+}}(%esp), %eax249; X86-NEXT: roll $5, %eax250; X86-NEXT: retl251;252; X64-LABEL: rotli32:253; X64: # %bb.0:254; X64-NEXT: movl %edi, %eax255; X64-NEXT: roll $5, %eax256; X64-NEXT: retq257 %B = shl i32 %A, 5258 %C = lshr i32 %A, 27259 %D = or i32 %B, %C260 ret i32 %D261}262 263define i32 @rotri32(i32 %A) nounwind {264; X86-LABEL: rotri32:265; X86: # %bb.0:266; X86-NEXT: movl {{[0-9]+}}(%esp), %eax267; X86-NEXT: roll $27, %eax268; X86-NEXT: retl269;270; X64-LABEL: rotri32:271; X64: # %bb.0:272; X64-NEXT: movl %edi, %eax273; X64-NEXT: roll $27, %eax274; X64-NEXT: retq275 %B = lshr i32 %A, 5276 %C = shl i32 %A, 27277 %D = or i32 %B, %C278 ret i32 %D279}280 281define i32 @rotl1_32(i32 %A) nounwind {282; X86-LABEL: rotl1_32:283; X86: # %bb.0:284; X86-NEXT: movl {{[0-9]+}}(%esp), %eax285; X86-NEXT: roll %eax286; X86-NEXT: retl287;288; X64-LABEL: rotl1_32:289; X64: # %bb.0:290; X64-NEXT: movl %edi, %eax291; X64-NEXT: roll %eax292; X64-NEXT: retq293 %B = shl i32 %A, 1294 %C = lshr i32 %A, 31295 %D = or i32 %B, %C296 ret i32 %D297}298 299define i32 @rotr1_32(i32 %A) nounwind {300; X86-LABEL: rotr1_32:301; X86: # %bb.0:302; X86-NEXT: movl {{[0-9]+}}(%esp), %eax303; X86-NEXT: rorl %eax304; X86-NEXT: retl305;306; X64-LABEL: rotr1_32:307; X64: # %bb.0:308; X64-NEXT: movl %edi, %eax309; X64-NEXT: rorl %eax310; X64-NEXT: retq311 %B = shl i32 %A, 31312 %C = lshr i32 %A, 1313 %D = or i32 %B, %C314 ret i32 %D315}316 317define i16 @rotl16(i16 %A, i8 %Amt) nounwind {318; X86-LABEL: rotl16:319; X86: # %bb.0:320; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx321; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax322; X86-NEXT: rolw %cl, %ax323; X86-NEXT: retl324;325; X64-LABEL: rotl16:326; X64: # %bb.0:327; X64-NEXT: movl %esi, %ecx328; X64-NEXT: movl %edi, %eax329; X64-NEXT: # kill: def $cl killed $cl killed $ecx330; X64-NEXT: rolw %cl, %ax331; X64-NEXT: # kill: def $ax killed $ax killed $eax332; X64-NEXT: retq333 %shift.upgrd.5 = zext i8 %Amt to i16334 %B = shl i16 %A, %shift.upgrd.5335 %Amt2 = sub i8 16, %Amt336 %shift.upgrd.6 = zext i8 %Amt2 to i16337 %C = lshr i16 %A, %shift.upgrd.6338 %D = or i16 %B, %C339 ret i16 %D340}341 342define i16 @rotr16(i16 %A, i8 %Amt) nounwind {343; X86-LABEL: rotr16:344; X86: # %bb.0:345; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx346; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax347; X86-NEXT: rorw %cl, %ax348; X86-NEXT: retl349;350; X64-LABEL: rotr16:351; X64: # %bb.0:352; X64-NEXT: movl %esi, %ecx353; X64-NEXT: movl %edi, %eax354; X64-NEXT: # kill: def $cl killed $cl killed $ecx355; X64-NEXT: rorw %cl, %ax356; X64-NEXT: # kill: def $ax killed $ax killed $eax357; X64-NEXT: retq358 %shift.upgrd.7 = zext i8 %Amt to i16359 %B = lshr i16 %A, %shift.upgrd.7360 %Amt2 = sub i8 16, %Amt361 %shift.upgrd.8 = zext i8 %Amt2 to i16362 %C = shl i16 %A, %shift.upgrd.8363 %D = or i16 %B, %C364 ret i16 %D365}366 367define i16 @rotli16(i16 %A) nounwind {368; X86-LABEL: rotli16:369; X86: # %bb.0:370; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax371; X86-NEXT: rolw $5, %ax372; X86-NEXT: retl373;374; X64-LABEL: rotli16:375; X64: # %bb.0:376; X64-NEXT: movl %edi, %eax377; X64-NEXT: rolw $5, %ax378; X64-NEXT: # kill: def $ax killed $ax killed $eax379; X64-NEXT: retq380 %B = shl i16 %A, 5381 %C = lshr i16 %A, 11382 %D = or i16 %B, %C383 ret i16 %D384}385 386define i16 @rotri16(i16 %A) nounwind {387; X86-LABEL: rotri16:388; X86: # %bb.0:389; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax390; X86-NEXT: rolw $11, %ax391; X86-NEXT: retl392;393; X64-LABEL: rotri16:394; X64: # %bb.0:395; X64-NEXT: movl %edi, %eax396; X64-NEXT: rolw $11, %ax397; X64-NEXT: # kill: def $ax killed $ax killed $eax398; X64-NEXT: retq399 %B = lshr i16 %A, 5400 %C = shl i16 %A, 11401 %D = or i16 %B, %C402 ret i16 %D403}404 405define i16 @rotl1_16(i16 %A) nounwind {406; X86-LABEL: rotl1_16:407; X86: # %bb.0:408; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax409; X86-NEXT: rolw %ax410; X86-NEXT: retl411;412; X64-LABEL: rotl1_16:413; X64: # %bb.0:414; X64-NEXT: movl %edi, %eax415; X64-NEXT: rolw %ax416; X64-NEXT: # kill: def $ax killed $ax killed $eax417; X64-NEXT: retq418 %B = shl i16 %A, 1419 %C = lshr i16 %A, 15420 %D = or i16 %B, %C421 ret i16 %D422}423 424define i16 @rotr1_16(i16 %A) nounwind {425; X86-LABEL: rotr1_16:426; X86: # %bb.0:427; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax428; X86-NEXT: rorw %ax429; X86-NEXT: retl430;431; X64-LABEL: rotr1_16:432; X64: # %bb.0:433; X64-NEXT: movl %edi, %eax434; X64-NEXT: rorw %ax435; X64-NEXT: # kill: def $ax killed $ax killed $eax436; X64-NEXT: retq437 %B = lshr i16 %A, 1438 %C = shl i16 %A, 15439 %D = or i16 %B, %C440 ret i16 %D441}442 443define i8 @rotl8(i8 %A, i8 %Amt) nounwind {444; X86-LABEL: rotl8:445; X86: # %bb.0:446; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx447; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax448; X86-NEXT: rolb %cl, %al449; X86-NEXT: retl450;451; X64-LABEL: rotl8:452; X64: # %bb.0:453; X64-NEXT: movl %esi, %ecx454; X64-NEXT: movl %edi, %eax455; X64-NEXT: # kill: def $cl killed $cl killed $ecx456; X64-NEXT: rolb %cl, %al457; X64-NEXT: # kill: def $al killed $al killed $eax458; X64-NEXT: retq459 %B = shl i8 %A, %Amt460 %Amt2 = sub i8 8, %Amt461 %C = lshr i8 %A, %Amt2462 %D = or i8 %B, %C463 ret i8 %D464}465 466define i8 @rotr8(i8 %A, i8 %Amt) nounwind {467; X86-LABEL: rotr8:468; X86: # %bb.0:469; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx470; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax471; X86-NEXT: rorb %cl, %al472; X86-NEXT: retl473;474; X64-LABEL: rotr8:475; X64: # %bb.0:476; X64-NEXT: movl %esi, %ecx477; X64-NEXT: movl %edi, %eax478; X64-NEXT: # kill: def $cl killed $cl killed $ecx479; X64-NEXT: rorb %cl, %al480; X64-NEXT: # kill: def $al killed $al killed $eax481; X64-NEXT: retq482 %B = lshr i8 %A, %Amt483 %Amt2 = sub i8 8, %Amt484 %C = shl i8 %A, %Amt2485 %D = or i8 %B, %C486 ret i8 %D487}488 489define i8 @rotli8(i8 %A) nounwind {490; X86-LABEL: rotli8:491; X86: # %bb.0:492; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax493; X86-NEXT: rolb $5, %al494; X86-NEXT: retl495;496; X64-LABEL: rotli8:497; X64: # %bb.0:498; X64-NEXT: movl %edi, %eax499; X64-NEXT: rolb $5, %al500; X64-NEXT: # kill: def $al killed $al killed $eax501; X64-NEXT: retq502 %B = shl i8 %A, 5503 %C = lshr i8 %A, 3504 %D = or i8 %B, %C505 ret i8 %D506}507 508define i8 @rotri8(i8 %A) nounwind {509; X86-LABEL: rotri8:510; X86: # %bb.0:511; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax512; X86-NEXT: rolb $3, %al513; X86-NEXT: retl514;515; X64-LABEL: rotri8:516; X64: # %bb.0:517; X64-NEXT: movl %edi, %eax518; X64-NEXT: rolb $3, %al519; X64-NEXT: # kill: def $al killed $al killed $eax520; X64-NEXT: retq521 %B = lshr i8 %A, 5522 %C = shl i8 %A, 3523 %D = or i8 %B, %C524 ret i8 %D525}526 527define i8 @rotl1_8(i8 %A) nounwind {528; X86-LABEL: rotl1_8:529; X86: # %bb.0:530; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax531; X86-NEXT: rolb %al532; X86-NEXT: retl533;534; X64-LABEL: rotl1_8:535; X64: # %bb.0:536; X64-NEXT: movl %edi, %eax537; X64-NEXT: rolb %al538; X64-NEXT: # kill: def $al killed $al killed $eax539; X64-NEXT: retq540 %B = shl i8 %A, 1541 %C = lshr i8 %A, 7542 %D = or i8 %B, %C543 ret i8 %D544}545 546define i8 @rotr1_8(i8 %A) nounwind {547; X86-LABEL: rotr1_8:548; X86: # %bb.0:549; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax550; X86-NEXT: rorb %al551; X86-NEXT: retl552;553; X64-LABEL: rotr1_8:554; X64: # %bb.0:555; X64-NEXT: movl %edi, %eax556; X64-NEXT: rorb %al557; X64-NEXT: # kill: def $al killed $al killed $eax558; X64-NEXT: retq559 %B = lshr i8 %A, 1560 %C = shl i8 %A, 7561 %D = or i8 %B, %C562 ret i8 %D563}564 565define void @rotr1_64_mem(ptr %Aptr) nounwind {566; X86-LABEL: rotr1_64_mem:567; X86: # %bb.0:568; X86-NEXT: pushl %esi569; X86-NEXT: movl {{[0-9]+}}(%esp), %eax570; X86-NEXT: movl (%eax), %ecx571; X86-NEXT: movl 4(%eax), %edx572; X86-NEXT: movl %ecx, %esi573; X86-NEXT: shldl $31, %edx, %esi574; X86-NEXT: shldl $31, %ecx, %edx575; X86-NEXT: movl %edx, (%eax)576; X86-NEXT: movl %esi, 4(%eax)577; X86-NEXT: popl %esi578; X86-NEXT: retl579;580; X64-LABEL: rotr1_64_mem:581; X64: # %bb.0:582; X64-NEXT: rorq (%rdi)583; X64-NEXT: retq584 585 %A = load i64, ptr%Aptr586 %B = shl i64 %A, 63587 %C = lshr i64 %A, 1588 %D = or i64 %B, %C589 store i64 %D, ptr %Aptr590 ret void591}592 593define void @rotr1_32_mem(ptr %Aptr) nounwind {594; X86-LABEL: rotr1_32_mem:595; X86: # %bb.0:596; X86-NEXT: movl {{[0-9]+}}(%esp), %eax597; X86-NEXT: rorl (%eax)598; X86-NEXT: retl599;600; X64-LABEL: rotr1_32_mem:601; X64: # %bb.0:602; X64-NEXT: rorl (%rdi)603; X64-NEXT: retq604 %A = load i32, ptr%Aptr605 %B = shl i32 %A, 31606 %C = lshr i32 %A, 1607 %D = or i32 %B, %C608 store i32 %D, ptr %Aptr609 ret void610}611 612define void @rotr1_16_mem(ptr %Aptr) nounwind {613; X86-LABEL: rotr1_16_mem:614; X86: # %bb.0:615; X86-NEXT: movl {{[0-9]+}}(%esp), %eax616; X86-NEXT: rorw (%eax)617; X86-NEXT: retl618;619; X64-LABEL: rotr1_16_mem:620; X64: # %bb.0:621; X64-NEXT: rorw (%rdi)622; X64-NEXT: retq623 %A = load i16, ptr%Aptr624 %B = shl i16 %A, 15625 %C = lshr i16 %A, 1626 %D = or i16 %B, %C627 store i16 %D, ptr %Aptr628 ret void629}630 631define void @rotr1_8_mem(ptr %Aptr) nounwind {632; X86-LABEL: rotr1_8_mem:633; X86: # %bb.0:634; X86-NEXT: movl {{[0-9]+}}(%esp), %eax635; X86-NEXT: rorb (%eax)636; X86-NEXT: retl637;638; X64-LABEL: rotr1_8_mem:639; X64: # %bb.0:640; X64-NEXT: rorb (%rdi)641; X64-NEXT: retq642 %A = load i8, ptr%Aptr643 %B = shl i8 %A, 7644 %C = lshr i8 %A, 1645 %D = or i8 %B, %C646 store i8 %D, ptr %Aptr647 ret void648}649 650define i64 @truncated_rot(i64 %x, i32 %amt) nounwind {651; X86-LABEL: truncated_rot:652; X86: # %bb.0: # %entry653; X86-NEXT: pushl %ebx654; X86-NEXT: pushl %edi655; X86-NEXT: pushl %esi656; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx657; X86-NEXT: movl {{[0-9]+}}(%esp), %esi658; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx659; X86-NEXT: movl %esi, %eax660; X86-NEXT: shll %cl, %eax661; X86-NEXT: testb $32, %cl662; X86-NEXT: movl $0, %edi663; X86-NEXT: jne .LBB28_2664; X86-NEXT: # %bb.1: # %entry665; X86-NEXT: movl %eax, %edi666; X86-NEXT: .LBB28_2: # %entry667; X86-NEXT: movb $64, %dl668; X86-NEXT: subb %cl, %dl669; X86-NEXT: movl %ebx, %eax670; X86-NEXT: movl %edx, %ecx671; X86-NEXT: shrl %cl, %eax672; X86-NEXT: shrdl %cl, %ebx, %esi673; X86-NEXT: testb $32, %dl674; X86-NEXT: jne .LBB28_4675; X86-NEXT: # %bb.3: # %entry676; X86-NEXT: movl %esi, %eax677; X86-NEXT: .LBB28_4: # %entry678; X86-NEXT: orl %edi, %eax679; X86-NEXT: xorl %edx, %edx680; X86-NEXT: popl %esi681; X86-NEXT: popl %edi682; X86-NEXT: popl %ebx683; X86-NEXT: retl684;685; X64-LABEL: truncated_rot:686; X64: # %bb.0: # %entry687; X64-NEXT: movl %esi, %ecx688; X64-NEXT: # kill: def $cl killed $cl killed $ecx689; X64-NEXT: rolq %cl, %rdi690; X64-NEXT: movl %edi, %eax691; X64-NEXT: retq692entry:693 %sh_prom = zext i32 %amt to i64694 %shl = shl i64 %x, %sh_prom695 %sub = sub nsw i32 64, %amt696 %sh_prom1 = zext i32 %sub to i64697 %shr = lshr i64 %x, %sh_prom1698 %or = or i64 %shr, %shl699 %and = and i64 %or, 4294967295700 ret i64 %and701}702