1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X86 3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+movbe | FileCheck %s --check-prefix=X86-MOVBE 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movbe | FileCheck %s --check-prefix=X64-MOVBE 6 7declare i64 @llvm.bswap.i64(i64) 8declare i128 @llvm.bswap.i128(i128) 9declare i256 @llvm.bswap.i256(i256) 10 11define i64 @bswap_i64(i64 %a0) nounwind { 12; X86-LABEL: bswap_i64: 13; X86: # %bb.0: 14; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 15; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 16; X86-NEXT: bswapl %eax 17; X86-NEXT: bswapl %edx 18; X86-NEXT: retl 19; 20; X86-MOVBE-LABEL: bswap_i64: 21; X86-MOVBE: # %bb.0: 22; X86-MOVBE-NEXT: movbel {{[0-9]+}}(%esp), %eax 23; X86-MOVBE-NEXT: movbel {{[0-9]+}}(%esp), %edx 24; X86-MOVBE-NEXT: retl 25; 26; X64-LABEL: bswap_i64: 27; X64: # %bb.0: 28; X64-NEXT: movq %rdi, %rax 29; X64-NEXT: bswapq %rax 30; X64-NEXT: retq 31; 32; X64-MOVBE-LABEL: bswap_i64: 33; X64-MOVBE: # %bb.0: 34; X64-MOVBE-NEXT: movq %rdi, %rax 35; X64-MOVBE-NEXT: bswapq %rax 36; X64-MOVBE-NEXT: retq 37 %1 = call i64 @llvm.bswap.i64(i64 %a0) 38 ret i64 %1 39} 40 41define i128 @bswap_i128(i128 %a0) nounwind { 42; X86-LABEL: bswap_i128: 43; X86: # %bb.0: 44; X86-NEXT: pushl %edi 45; X86-NEXT: pushl %esi 46; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 47; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 48; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 49; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 50; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 51; X86-NEXT: bswapl %edi 52; X86-NEXT: bswapl %esi 53; X86-NEXT: bswapl %edx 54; X86-NEXT: bswapl %ecx 55; X86-NEXT: movl %ecx, 12(%eax) 56; X86-NEXT: movl %edx, 8(%eax) 57; X86-NEXT: movl %esi, 4(%eax) 58; X86-NEXT: movl %edi, (%eax) 59; X86-NEXT: popl %esi 60; X86-NEXT: popl %edi 61; X86-NEXT: retl $4 62; 63; X86-MOVBE-LABEL: bswap_i128: 64; X86-MOVBE: # %bb.0: 65; X86-MOVBE-NEXT: pushl %edi 66; X86-MOVBE-NEXT: pushl %esi 67; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax 68; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 69; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %edx 70; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %esi 71; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %edi 72; X86-MOVBE-NEXT: movbel %esi, 12(%eax) 73; X86-MOVBE-NEXT: movbel %edi, 8(%eax) 74; X86-MOVBE-NEXT: movbel %edx, 4(%eax) 75; X86-MOVBE-NEXT: movbel %ecx, (%eax) 76; X86-MOVBE-NEXT: popl %esi 77; X86-MOVBE-NEXT: popl %edi 78; X86-MOVBE-NEXT: retl $4 79; 80; X64-LABEL: bswap_i128: 81; X64: # %bb.0: 82; X64-NEXT: movq %rsi, %rax 83; X64-NEXT: bswapq %rax 84; X64-NEXT: bswapq %rdi 85; X64-NEXT: movq %rdi, %rdx 86; X64-NEXT: retq 87; 88; X64-MOVBE-LABEL: bswap_i128: 89; X64-MOVBE: # %bb.0: 90; X64-MOVBE-NEXT: movq %rsi, %rax 91; X64-MOVBE-NEXT: bswapq %rax 92; X64-MOVBE-NEXT: bswapq %rdi 93; X64-MOVBE-NEXT: movq %rdi, %rdx 94; X64-MOVBE-NEXT: retq 95 %1 = call i128 @llvm.bswap.i128(i128 %a0) 96 ret i128 %1 97} 98 99define i256 @bswap_i256(i256 %a0) nounwind { 100; X86-LABEL: bswap_i256: 101; X86: # %bb.0: 102; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 103; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 104; X86-NEXT: bswapl %ecx 105; X86-NEXT: movl %ecx, 28(%eax) 106; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 107; X86-NEXT: bswapl %ecx 108; X86-NEXT: movl %ecx, 24(%eax) 109; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 110; X86-NEXT: bswapl %ecx 111; X86-NEXT: movl %ecx, 20(%eax) 112; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 113; X86-NEXT: bswapl %ecx 114; X86-NEXT: movl %ecx, 16(%eax) 115; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 116; X86-NEXT: bswapl %ecx 117; X86-NEXT: movl %ecx, 12(%eax) 118; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 119; X86-NEXT: bswapl %ecx 120; X86-NEXT: movl %ecx, 8(%eax) 121; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 122; X86-NEXT: bswapl %ecx 123; X86-NEXT: movl %ecx, 4(%eax) 124; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 125; X86-NEXT: bswapl %ecx 126; X86-NEXT: movl %ecx, (%eax) 127; X86-NEXT: retl $4 128; 129; X86-MOVBE-LABEL: bswap_i256: 130; X86-MOVBE: # %bb.0: 131; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax 132; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 133; X86-MOVBE-NEXT: movbel %ecx, 28(%eax) 134; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 135; X86-MOVBE-NEXT: movbel %ecx, 24(%eax) 136; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 137; X86-MOVBE-NEXT: movbel %ecx, 20(%eax) 138; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 139; X86-MOVBE-NEXT: movbel %ecx, 16(%eax) 140; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 141; X86-MOVBE-NEXT: movbel %ecx, 12(%eax) 142; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 143; X86-MOVBE-NEXT: movbel %ecx, 8(%eax) 144; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 145; X86-MOVBE-NEXT: movbel %ecx, 4(%eax) 146; X86-MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx 147; X86-MOVBE-NEXT: movbel %ecx, (%eax) 148; X86-MOVBE-NEXT: retl $4 149; 150; X64-LABEL: bswap_i256: 151; X64: # %bb.0: 152; X64-NEXT: movq %rdi, %rax 153; X64-NEXT: bswapq %r8 154; X64-NEXT: bswapq %rcx 155; X64-NEXT: bswapq %rdx 156; X64-NEXT: bswapq %rsi 157; X64-NEXT: movq %rsi, 24(%rdi) 158; X64-NEXT: movq %rdx, 16(%rdi) 159; X64-NEXT: movq %rcx, 8(%rdi) 160; X64-NEXT: movq %r8, (%rdi) 161; X64-NEXT: retq 162; 163; X64-MOVBE-LABEL: bswap_i256: 164; X64-MOVBE: # %bb.0: 165; X64-MOVBE-NEXT: movq %rdi, %rax 166; X64-MOVBE-NEXT: movbeq %rsi, 24(%rdi) 167; X64-MOVBE-NEXT: movbeq %rdx, 16(%rdi) 168; X64-MOVBE-NEXT: movbeq %rcx, 8(%rdi) 169; X64-MOVBE-NEXT: movbeq %r8, (%rdi) 170; X64-MOVBE-NEXT: retq 171 %1 = call i256 @llvm.bswap.i256(i256 %a0) 172 ret i256 %1 173} 174