Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=i686-unknown-linux | FileCheck %s --check-prefixes=X86
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux | FileCheck %s --check-prefixes=X64
      4 
      5 define i64 @rotl64(i64 %A, i8 %Amt) nounwind {
      6 ; X86-LABEL: rotl64:
      7 ; X86:       # %bb.0:
      8 ; X86-NEXT:    pushl %ebx
      9 ; X86-NEXT:    pushl %edi
     10 ; X86-NEXT:    pushl %esi
     11 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
     12 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
     13 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
     14 ; X86-NEXT:    movl %esi, %eax
     15 ; X86-NEXT:    shll %cl, %eax
     16 ; X86-NEXT:    movl %edi, %edx
     17 ; X86-NEXT:    shldl %cl, %esi, %edx
     18 ; X86-NEXT:    testb $32, %cl
     19 ; X86-NEXT:    je .LBB0_2
     20 ; X86-NEXT:  # %bb.1:
     21 ; X86-NEXT:    movl %eax, %edx
     22 ; X86-NEXT:    xorl %eax, %eax
     23 ; X86-NEXT:  .LBB0_2:
     24 ; X86-NEXT:    movb $64, %ch
     25 ; X86-NEXT:    subb %cl, %ch
     26 ; X86-NEXT:    movl %edi, %ebx
     27 ; X86-NEXT:    movb %ch, %cl
     28 ; X86-NEXT:    shrl %cl, %ebx
     29 ; X86-NEXT:    shrdl %cl, %edi, %esi
     30 ; X86-NEXT:    testb $32, %ch
     31 ; X86-NEXT:    je .LBB0_4
     32 ; X86-NEXT:  # %bb.3:
     33 ; X86-NEXT:    movl %ebx, %esi
     34 ; X86-NEXT:    xorl %ebx, %ebx
     35 ; X86-NEXT:  .LBB0_4:
     36 ; X86-NEXT:    orl %ebx, %edx
     37 ; X86-NEXT:    orl %esi, %eax
     38 ; X86-NEXT:    popl %esi
     39 ; X86-NEXT:    popl %edi
     40 ; X86-NEXT:    popl %ebx
     41 ; X86-NEXT:    retl
     42 ;
     43 ; X64-LABEL: rotl64:
     44 ; X64:       # %bb.0:
     45 ; X64-NEXT:    movl %esi, %ecx
     46 ; X64-NEXT:    rolq %cl, %rdi
     47 ; X64-NEXT:    movq %rdi, %rax
     48 ; X64-NEXT:    retq
     49 	%shift.upgrd.1 = zext i8 %Amt to i64
     50 	%B = shl i64 %A, %shift.upgrd.1
     51 	%Amt2 = sub i8 64, %Amt
     52 	%shift.upgrd.2 = zext i8 %Amt2 to i64
     53 	%C = lshr i64 %A, %shift.upgrd.2
     54 	%D = or i64 %B, %C
     55 	ret i64 %D
     56 }
     57 
     58 define i64 @rotr64(i64 %A, i8 %Amt) nounwind {
     59 ; X86-LABEL: rotr64:
     60 ; X86:       # %bb.0:
     61 ; X86-NEXT:    pushl %ebx
     62 ; X86-NEXT:    pushl %edi
     63 ; X86-NEXT:    pushl %esi
     64 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
     65 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
     66 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
     67 ; X86-NEXT:    movl %esi, %edx
     68 ; X86-NEXT:    shrl %cl, %edx
     69 ; X86-NEXT:    movl %edi, %eax
     70 ; X86-NEXT:    shrdl %cl, %esi, %eax
     71 ; X86-NEXT:    testb $32, %cl
     72 ; X86-NEXT:    je .LBB1_2
     73 ; X86-NEXT:  # %bb.1:
     74 ; X86-NEXT:    movl %edx, %eax
     75 ; X86-NEXT:    xorl %edx, %edx
     76 ; X86-NEXT:  .LBB1_2:
     77 ; X86-NEXT:    movb $64, %ch
     78 ; X86-NEXT:    subb %cl, %ch
     79 ; X86-NEXT:    movl %edi, %ebx
     80 ; X86-NEXT:    movb %ch, %cl
     81 ; X86-NEXT:    shll %cl, %ebx
     82 ; X86-NEXT:    shldl %cl, %edi, %esi
     83 ; X86-NEXT:    testb $32, %ch
     84 ; X86-NEXT:    je .LBB1_4
     85 ; X86-NEXT:  # %bb.3:
     86 ; X86-NEXT:    movl %ebx, %esi
     87 ; X86-NEXT:    xorl %ebx, %ebx
     88 ; X86-NEXT:  .LBB1_4:
     89 ; X86-NEXT:    orl %esi, %edx
     90 ; X86-NEXT:    orl %ebx, %eax
     91 ; X86-NEXT:    popl %esi
     92 ; X86-NEXT:    popl %edi
     93 ; X86-NEXT:    popl %ebx
     94 ; X86-NEXT:    retl
     95 ;
     96 ; X64-LABEL: rotr64:
     97 ; X64:       # %bb.0:
     98 ; X64-NEXT:    movl %esi, %ecx
     99 ; X64-NEXT:    rorq %cl, %rdi
    100 ; X64-NEXT:    movq %rdi, %rax
    101 ; X64-NEXT:    retq
    102 	%shift.upgrd.3 = zext i8 %Amt to i64
    103 	%B = lshr i64 %A, %shift.upgrd.3
    104 	%Amt2 = sub i8 64, %Amt
    105 	%shift.upgrd.4 = zext i8 %Amt2 to i64
    106 	%C = shl i64 %A, %shift.upgrd.4
    107 	%D = or i64 %B, %C
    108 	ret i64 %D
    109 }
    110 
    111 define i64 @rotli64(i64 %A) nounwind {
    112 ; X86-LABEL: rotli64:
    113 ; X86:       # %bb.0:
    114 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    115 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    116 ; X86-NEXT:    movl %ecx, %edx
    117 ; X86-NEXT:    shldl $5, %eax, %edx
    118 ; X86-NEXT:    shldl $5, %ecx, %eax
    119 ; X86-NEXT:    retl
    120 ;
    121 ; X64-LABEL: rotli64:
    122 ; X64:       # %bb.0:
    123 ; X64-NEXT:    rolq $5, %rdi
    124 ; X64-NEXT:    movq %rdi, %rax
    125 ; X64-NEXT:    retq
    126 	%B = shl i64 %A, 5
    127 	%C = lshr i64 %A, 59
    128 	%D = or i64 %B, %C
    129 	ret i64 %D
    130 }
    131 
    132 define i64 @rotri64(i64 %A) nounwind {
    133 ; X86-LABEL: rotri64:
    134 ; X86:       # %bb.0:
    135 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
    136 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    137 ; X86-NEXT:    movl %ecx, %eax
    138 ; X86-NEXT:    shldl $27, %edx, %eax
    139 ; X86-NEXT:    shldl $27, %ecx, %edx
    140 ; X86-NEXT:    retl
    141 ;
    142 ; X64-LABEL: rotri64:
    143 ; X64:       # %bb.0:
    144 ; X64-NEXT:    rolq $59, %rdi
    145 ; X64-NEXT:    movq %rdi, %rax
    146 ; X64-NEXT:    retq
    147 	%B = lshr i64 %A, 5
    148 	%C = shl i64 %A, 59
    149 	%D = or i64 %B, %C
    150 	ret i64 %D
    151 }
    152 
    153 define i64 @rotl1_64(i64 %A) nounwind {
    154 ; X86-LABEL: rotl1_64:
    155 ; X86:       # %bb.0:
    156 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    157 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    158 ; X86-NEXT:    movl %ecx, %edx
    159 ; X86-NEXT:    shldl $1, %eax, %edx
    160 ; X86-NEXT:    shldl $1, %ecx, %eax
    161 ; X86-NEXT:    retl
    162 ;
    163 ; X64-LABEL: rotl1_64:
    164 ; X64:       # %bb.0:
    165 ; X64-NEXT:    rolq %rdi
    166 ; X64-NEXT:    movq %rdi, %rax
    167 ; X64-NEXT:    retq
    168 	%B = shl i64 %A, 1
    169 	%C = lshr i64 %A, 63
    170 	%D = or i64 %B, %C
    171 	ret i64 %D
    172 }
    173 
    174 define i64 @rotr1_64(i64 %A) nounwind {
    175 ; X86-LABEL: rotr1_64:
    176 ; X86:       # %bb.0:
    177 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
    178 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    179 ; X86-NEXT:    movl %ecx, %eax
    180 ; X86-NEXT:    shldl $31, %edx, %eax
    181 ; X86-NEXT:    shldl $31, %ecx, %edx
    182 ; X86-NEXT:    retl
    183 ;
    184 ; X64-LABEL: rotr1_64:
    185 ; X64:       # %bb.0:
    186 ; X64-NEXT:    rorq %rdi
    187 ; X64-NEXT:    movq %rdi, %rax
    188 ; X64-NEXT:    retq
    189 	%B = shl i64 %A, 63
    190 	%C = lshr i64 %A, 1
    191 	%D = or i64 %B, %C
    192 	ret i64 %D
    193 }
    194 
    195 define i32 @rotl32(i32 %A, i8 %Amt) nounwind {
    196 ; X86-LABEL: rotl32:
    197 ; X86:       # %bb.0:
    198 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
    199 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    200 ; X86-NEXT:    roll %cl, %eax
    201 ; X86-NEXT:    retl
    202 ;
    203 ; X64-LABEL: rotl32:
    204 ; X64:       # %bb.0:
    205 ; X64-NEXT:    movl %esi, %ecx
    206 ; X64-NEXT:    roll %cl, %edi
    207 ; X64-NEXT:    movl %edi, %eax
    208 ; X64-NEXT:    retq
    209 	%shift.upgrd.1 = zext i8 %Amt to i32
    210 	%B = shl i32 %A, %shift.upgrd.1
    211 	%Amt2 = sub i8 32, %Amt
    212 	%shift.upgrd.2 = zext i8 %Amt2 to i32
    213 	%C = lshr i32 %A, %shift.upgrd.2
    214 	%D = or i32 %B, %C
    215 	ret i32 %D
    216 }
    217 
    218 define i32 @rotr32(i32 %A, i8 %Amt) nounwind {
    219 ; X86-LABEL: rotr32:
    220 ; X86:       # %bb.0:
    221 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
    222 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    223 ; X86-NEXT:    rorl %cl, %eax
    224 ; X86-NEXT:    retl
    225 ;
    226 ; X64-LABEL: rotr32:
    227 ; X64:       # %bb.0:
    228 ; X64-NEXT:    movl %esi, %ecx
    229 ; X64-NEXT:    rorl %cl, %edi
    230 ; X64-NEXT:    movl %edi, %eax
    231 ; X64-NEXT:    retq
    232 	%shift.upgrd.3 = zext i8 %Amt to i32
    233 	%B = lshr i32 %A, %shift.upgrd.3
    234 	%Amt2 = sub i8 32, %Amt
    235 	%shift.upgrd.4 = zext i8 %Amt2 to i32
    236 	%C = shl i32 %A, %shift.upgrd.4
    237 	%D = or i32 %B, %C
    238 	ret i32 %D
    239 }
    240 
    241 define i32 @rotli32(i32 %A) nounwind {
    242 ; X86-LABEL: rotli32:
    243 ; X86:       # %bb.0:
    244 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    245 ; X86-NEXT:    roll $5, %eax
    246 ; X86-NEXT:    retl
    247 ;
    248 ; X64-LABEL: rotli32:
    249 ; X64:       # %bb.0:
    250 ; X64-NEXT:    roll $5, %edi
    251 ; X64-NEXT:    movl %edi, %eax
    252 ; X64-NEXT:    retq
    253 	%B = shl i32 %A, 5
    254 	%C = lshr i32 %A, 27
    255 	%D = or i32 %B, %C
    256 	ret i32 %D
    257 }
    258 
    259 define i32 @rotri32(i32 %A) nounwind {
    260 ; X86-LABEL: rotri32:
    261 ; X86:       # %bb.0:
    262 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    263 ; X86-NEXT:    roll $27, %eax
    264 ; X86-NEXT:    retl
    265 ;
    266 ; X64-LABEL: rotri32:
    267 ; X64:       # %bb.0:
    268 ; X64-NEXT:    roll $27, %edi
    269 ; X64-NEXT:    movl %edi, %eax
    270 ; X64-NEXT:    retq
    271 	%B = lshr i32 %A, 5
    272 	%C = shl i32 %A, 27
    273 	%D = or i32 %B, %C
    274 	ret i32 %D
    275 }
    276 
    277 define i32 @rotl1_32(i32 %A) nounwind {
    278 ; X86-LABEL: rotl1_32:
    279 ; X86:       # %bb.0:
    280 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    281 ; X86-NEXT:    roll %eax
    282 ; X86-NEXT:    retl
    283 ;
    284 ; X64-LABEL: rotl1_32:
    285 ; X64:       # %bb.0:
    286 ; X64-NEXT:    roll %edi
    287 ; X64-NEXT:    movl %edi, %eax
    288 ; X64-NEXT:    retq
    289 	%B = shl i32 %A, 1
    290 	%C = lshr i32 %A, 31
    291 	%D = or i32 %B, %C
    292 	ret i32 %D
    293 }
    294 
    295 define i32 @rotr1_32(i32 %A) nounwind {
    296 ; X86-LABEL: rotr1_32:
    297 ; X86:       # %bb.0:
    298 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    299 ; X86-NEXT:    rorl %eax
    300 ; X86-NEXT:    retl
    301 ;
    302 ; X64-LABEL: rotr1_32:
    303 ; X64:       # %bb.0:
    304 ; X64-NEXT:    rorl %edi
    305 ; X64-NEXT:    movl %edi, %eax
    306 ; X64-NEXT:    retq
    307 	%B = shl i32 %A, 31
    308 	%C = lshr i32 %A, 1
    309 	%D = or i32 %B, %C
    310 	ret i32 %D
    311 }
    312 
    313 define i16 @rotl16(i16 %A, i8 %Amt) nounwind {
    314 ; X86-LABEL: rotl16:
    315 ; X86:       # %bb.0:
    316 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
    317 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    318 ; X86-NEXT:    rolw %cl, %ax
    319 ; X86-NEXT:    retl
    320 ;
    321 ; X64-LABEL: rotl16:
    322 ; X64:       # %bb.0:
    323 ; X64-NEXT:    movl %esi, %ecx
    324 ; X64-NEXT:    rolw %cl, %di
    325 ; X64-NEXT:    movl %edi, %eax
    326 ; X64-NEXT:    retq
    327 	%shift.upgrd.5 = zext i8 %Amt to i16
    328 	%B = shl i16 %A, %shift.upgrd.5
    329 	%Amt2 = sub i8 16, %Amt
    330 	%shift.upgrd.6 = zext i8 %Amt2 to i16
    331 	%C = lshr i16 %A, %shift.upgrd.6
    332 	%D = or i16 %B, %C
    333 	ret i16 %D
    334 }
    335 
    336 define i16 @rotr16(i16 %A, i8 %Amt) nounwind {
    337 ; X86-LABEL: rotr16:
    338 ; X86:       # %bb.0:
    339 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
    340 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    341 ; X86-NEXT:    rorw %cl, %ax
    342 ; X86-NEXT:    retl
    343 ;
    344 ; X64-LABEL: rotr16:
    345 ; X64:       # %bb.0:
    346 ; X64-NEXT:    movl %esi, %ecx
    347 ; X64-NEXT:    rorw %cl, %di
    348 ; X64-NEXT:    movl %edi, %eax
    349 ; X64-NEXT:    retq
    350 	%shift.upgrd.7 = zext i8 %Amt to i16
    351 	%B = lshr i16 %A, %shift.upgrd.7
    352 	%Amt2 = sub i8 16, %Amt
    353 	%shift.upgrd.8 = zext i8 %Amt2 to i16
    354 	%C = shl i16 %A, %shift.upgrd.8
    355 	%D = or i16 %B, %C
    356 	ret i16 %D
    357 }
    358 
    359 define i16 @rotli16(i16 %A) nounwind {
    360 ; X86-LABEL: rotli16:
    361 ; X86:       # %bb.0:
    362 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    363 ; X86-NEXT:    rolw $5, %ax
    364 ; X86-NEXT:    retl
    365 ;
    366 ; X64-LABEL: rotli16:
    367 ; X64:       # %bb.0:
    368 ; X64-NEXT:    rolw $5, %di
    369 ; X64-NEXT:    movl %edi, %eax
    370 ; X64-NEXT:    retq
    371 	%B = shl i16 %A, 5
    372 	%C = lshr i16 %A, 11
    373 	%D = or i16 %B, %C
    374 	ret i16 %D
    375 }
    376 
    377 define i16 @rotri16(i16 %A) nounwind {
    378 ; X86-LABEL: rotri16:
    379 ; X86:       # %bb.0:
    380 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    381 ; X86-NEXT:    rolw $11, %ax
    382 ; X86-NEXT:    retl
    383 ;
    384 ; X64-LABEL: rotri16:
    385 ; X64:       # %bb.0:
    386 ; X64-NEXT:    rolw $11, %di
    387 ; X64-NEXT:    movl %edi, %eax
    388 ; X64-NEXT:    retq
    389 	%B = lshr i16 %A, 5
    390 	%C = shl i16 %A, 11
    391 	%D = or i16 %B, %C
    392 	ret i16 %D
    393 }
    394 
    395 define i16 @rotl1_16(i16 %A) nounwind {
    396 ; X86-LABEL: rotl1_16:
    397 ; X86:       # %bb.0:
    398 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    399 ; X86-NEXT:    rolw %ax
    400 ; X86-NEXT:    retl
    401 ;
    402 ; X64-LABEL: rotl1_16:
    403 ; X64:       # %bb.0:
    404 ; X64-NEXT:    rolw %di
    405 ; X64-NEXT:    movl %edi, %eax
    406 ; X64-NEXT:    retq
    407 	%B = shl i16 %A, 1
    408 	%C = lshr i16 %A, 15
    409 	%D = or i16 %B, %C
    410 	ret i16 %D
    411 }
    412 
    413 define i16 @rotr1_16(i16 %A) nounwind {
    414 ; X86-LABEL: rotr1_16:
    415 ; X86:       # %bb.0:
    416 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
    417 ; X86-NEXT:    rorw %ax
    418 ; X86-NEXT:    retl
    419 ;
    420 ; X64-LABEL: rotr1_16:
    421 ; X64:       # %bb.0:
    422 ; X64-NEXT:    rorw %di
    423 ; X64-NEXT:    movl %edi, %eax
    424 ; X64-NEXT:    retq
    425 	%B = lshr i16 %A, 1
    426 	%C = shl i16 %A, 15
    427 	%D = or i16 %B, %C
    428 	ret i16 %D
    429 }
    430 
    431 define i8 @rotl8(i8 %A, i8 %Amt) nounwind {
    432 ; X86-LABEL: rotl8:
    433 ; X86:       # %bb.0:
    434 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
    435 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
    436 ; X86-NEXT:    rolb %cl, %al
    437 ; X86-NEXT:    retl
    438 ;
    439 ; X64-LABEL: rotl8:
    440 ; X64:       # %bb.0:
    441 ; X64-NEXT:    movl %esi, %ecx
    442 ; X64-NEXT:    rolb %cl, %dil
    443 ; X64-NEXT:    movl %edi, %eax
    444 ; X64-NEXT:    retq
    445 	%B = shl i8 %A, %Amt
    446 	%Amt2 = sub i8 8, %Amt
    447 	%C = lshr i8 %A, %Amt2
    448 	%D = or i8 %B, %C
    449 	ret i8 %D
    450 }
    451 
    452 define i8 @rotr8(i8 %A, i8 %Amt) nounwind {
    453 ; X86-LABEL: rotr8:
    454 ; X86:       # %bb.0:
    455 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
    456 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
    457 ; X86-NEXT:    rorb %cl, %al
    458 ; X86-NEXT:    retl
    459 ;
    460 ; X64-LABEL: rotr8:
    461 ; X64:       # %bb.0:
    462 ; X64-NEXT:    movl %esi, %ecx
    463 ; X64-NEXT:    rorb %cl, %dil
    464 ; X64-NEXT:    movl %edi, %eax
    465 ; X64-NEXT:    retq
    466 	%B = lshr i8 %A, %Amt
    467 	%Amt2 = sub i8 8, %Amt
    468 	%C = shl i8 %A, %Amt2
    469 	%D = or i8 %B, %C
    470 	ret i8 %D
    471 }
    472 
    473 define i8 @rotli8(i8 %A) nounwind {
    474 ; X86-LABEL: rotli8:
    475 ; X86:       # %bb.0:
    476 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
    477 ; X86-NEXT:    rolb $5, %al
    478 ; X86-NEXT:    retl
    479 ;
    480 ; X64-LABEL: rotli8:
    481 ; X64:       # %bb.0:
    482 ; X64-NEXT:    rolb $5, %dil
    483 ; X64-NEXT:    movl %edi, %eax
    484 ; X64-NEXT:    retq
    485 	%B = shl i8 %A, 5
    486 	%C = lshr i8 %A, 3
    487 	%D = or i8 %B, %C
    488 	ret i8 %D
    489 }
    490 
    491 define i8 @rotri8(i8 %A) nounwind {
    492 ; X86-LABEL: rotri8:
    493 ; X86:       # %bb.0:
    494 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
    495 ; X86-NEXT:    rolb $3, %al
    496 ; X86-NEXT:    retl
    497 ;
    498 ; X64-LABEL: rotri8:
    499 ; X64:       # %bb.0:
    500 ; X64-NEXT:    rolb $3, %dil
    501 ; X64-NEXT:    movl %edi, %eax
    502 ; X64-NEXT:    retq
    503 	%B = lshr i8 %A, 5
    504 	%C = shl i8 %A, 3
    505 	%D = or i8 %B, %C
    506 	ret i8 %D
    507 }
    508 
    509 define i8 @rotl1_8(i8 %A) nounwind {
    510 ; X86-LABEL: rotl1_8:
    511 ; X86:       # %bb.0:
    512 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
    513 ; X86-NEXT:    rolb %al
    514 ; X86-NEXT:    retl
    515 ;
    516 ; X64-LABEL: rotl1_8:
    517 ; X64:       # %bb.0:
    518 ; X64-NEXT:    rolb %dil
    519 ; X64-NEXT:    movl %edi, %eax
    520 ; X64-NEXT:    retq
    521 	%B = shl i8 %A, 1
    522 	%C = lshr i8 %A, 7
    523 	%D = or i8 %B, %C
    524 	ret i8 %D
    525 }
    526 
    527 define i8 @rotr1_8(i8 %A) nounwind {
    528 ; X86-LABEL: rotr1_8:
    529 ; X86:       # %bb.0:
    530 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
    531 ; X86-NEXT:    rorb %al
    532 ; X86-NEXT:    retl
    533 ;
    534 ; X64-LABEL: rotr1_8:
    535 ; X64:       # %bb.0:
    536 ; X64-NEXT:    rorb %dil
    537 ; X64-NEXT:    movl %edi, %eax
    538 ; X64-NEXT:    retq
    539 	%B = lshr i8 %A, 1
    540 	%C = shl i8 %A, 7
    541 	%D = or i8 %B, %C
    542 	ret i8 %D
    543 }
    544 
    545 define void @rotr1_64_mem(i64* %Aptr) nounwind {
    546 ; X86-LABEL: rotr1_64_mem:
    547 ; X86:       # %bb.0:
    548 ; X86-NEXT:    pushl %esi
    549 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    550 ; X86-NEXT:    movl (%eax), %ecx
    551 ; X86-NEXT:    movl 4(%eax), %edx
    552 ; X86-NEXT:    movl %edx, %esi
    553 ; X86-NEXT:    shldl $31, %ecx, %esi
    554 ; X86-NEXT:    shldl $31, %edx, %ecx
    555 ; X86-NEXT:    movl %ecx, 4(%eax)
    556 ; X86-NEXT:    movl %esi, (%eax)
    557 ; X86-NEXT:    popl %esi
    558 ; X86-NEXT:    retl
    559 ;
    560 ; X64-LABEL: rotr1_64_mem:
    561 ; X64:       # %bb.0:
    562 ; X64-NEXT:    rorq (%rdi)
    563 ; X64-NEXT:    retq
    564 
    565   %A = load i64, i64 *%Aptr
    566   %B = shl i64 %A, 63
    567   %C = lshr i64 %A, 1
    568   %D = or i64 %B, %C
    569   store i64 %D, i64* %Aptr
    570   ret void
    571 }
    572 
    573 define void @rotr1_32_mem(i32* %Aptr) nounwind {
    574 ; X86-LABEL: rotr1_32_mem:
    575 ; X86:       # %bb.0:
    576 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    577 ; X86-NEXT:    rorl (%eax)
    578 ; X86-NEXT:    retl
    579 ;
    580 ; X64-LABEL: rotr1_32_mem:
    581 ; X64:       # %bb.0:
    582 ; X64-NEXT:    rorl (%rdi)
    583 ; X64-NEXT:    retq
    584   %A = load i32, i32 *%Aptr
    585   %B = shl i32 %A, 31
    586   %C = lshr i32 %A, 1
    587   %D = or i32 %B, %C
    588   store i32 %D, i32* %Aptr
    589   ret void
    590 }
    591 
    592 define void @rotr1_16_mem(i16* %Aptr) nounwind {
    593 ; X86-LABEL: rotr1_16_mem:
    594 ; X86:       # %bb.0:
    595 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    596 ; X86-NEXT:    rorw (%eax)
    597 ; X86-NEXT:    retl
    598 ;
    599 ; X64-LABEL: rotr1_16_mem:
    600 ; X64:       # %bb.0:
    601 ; X64-NEXT:    rorw (%rdi)
    602 ; X64-NEXT:    retq
    603   %A = load i16, i16 *%Aptr
    604   %B = shl i16 %A, 15
    605   %C = lshr i16 %A, 1
    606   %D = or i16 %B, %C
    607   store i16 %D, i16* %Aptr
    608   ret void
    609 }
    610 
    611 define void @rotr1_8_mem(i8* %Aptr) nounwind {
    612 ; X86-LABEL: rotr1_8_mem:
    613 ; X86:       # %bb.0:
    614 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
    615 ; X86-NEXT:    rorb (%eax)
    616 ; X86-NEXT:    retl
    617 ;
    618 ; X64-LABEL: rotr1_8_mem:
    619 ; X64:       # %bb.0:
    620 ; X64-NEXT:    rorb (%rdi)
    621 ; X64-NEXT:    retq
    622   %A = load i8, i8 *%Aptr
    623   %B = shl i8 %A, 7
    624   %C = lshr i8 %A, 1
    625   %D = or i8 %B, %C
    626   store i8 %D, i8* %Aptr
    627   ret void
    628 }
    629 
    630 define i64 @truncated_rot(i64 %x, i32 %amt) nounwind {
    631 ; X86-LABEL: truncated_rot:
    632 ; X86:       # %bb.0: # %entry
    633 ; X86-NEXT:    pushl %ebx
    634 ; X86-NEXT:    pushl %edi
    635 ; X86-NEXT:    pushl %esi
    636 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
    637 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
    638 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
    639 ; X86-NEXT:    movl %esi, %eax
    640 ; X86-NEXT:    shll %cl, %eax
    641 ; X86-NEXT:    testb $32, %cl
    642 ; X86-NEXT:    movl $0, %ebx
    643 ; X86-NEXT:    jne .LBB28_2
    644 ; X86-NEXT:  # %bb.1: # %entry
    645 ; X86-NEXT:    movl %eax, %ebx
    646 ; X86-NEXT:  .LBB28_2: # %entry
    647 ; X86-NEXT:    movl $64, %edx
    648 ; X86-NEXT:    subl %ecx, %edx
    649 ; X86-NEXT:    movl %edi, %eax
    650 ; X86-NEXT:    movl %edx, %ecx
    651 ; X86-NEXT:    shrl %cl, %eax
    652 ; X86-NEXT:    shrdl %cl, %edi, %esi
    653 ; X86-NEXT:    testb $32, %dl
    654 ; X86-NEXT:    jne .LBB28_4
    655 ; X86-NEXT:  # %bb.3: # %entry
    656 ; X86-NEXT:    movl %esi, %eax
    657 ; X86-NEXT:  .LBB28_4: # %entry
    658 ; X86-NEXT:    orl %ebx, %eax
    659 ; X86-NEXT:    xorl %edx, %edx
    660 ; X86-NEXT:    popl %esi
    661 ; X86-NEXT:    popl %edi
    662 ; X86-NEXT:    popl %ebx
    663 ; X86-NEXT:    retl
    664 ;
    665 ; X64-LABEL: truncated_rot:
    666 ; X64:       # %bb.0: # %entry
    667 ; X64-NEXT:    movl %esi, %ecx
    668 ; X64-NEXT:    rolq %cl, %rdi
    669 ; X64-NEXT:    movl %edi, %eax
    670 ; X64-NEXT:    retq
    671 entry:
    672   %sh_prom = zext i32 %amt to i64
    673   %shl = shl i64 %x, %sh_prom
    674   %sub = sub nsw i32 64, %amt
    675   %sh_prom1 = zext i32 %sub to i64
    676   %shr = lshr i64 %x, %sh_prom1
    677   %or = or i64 %shr, %shl
    678   %and = and i64 %or, 4294967295
    679   ret i64 %and
    680 }
    681