1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc -mtriple=x86_64-linux -mcpu=atom < %s | FileCheck %s 3; RUN: llc -mtriple=x86_64-linux -mcpu=slm < %s | FileCheck %s -check-prefix=SLM 4; RUN: llc -mtriple=x86_64-linux -mattr=+egpr,+ndd,+movbe --show-mc-encoding < %s | FileCheck %s -check-prefix=EGPR 5; RUN: llc -mtriple=x86_64-linux -mattr=+egpr,+ndd --show-mc-encoding < %s | FileCheck %s -check-prefix=NOMOVBE 6declare i16 @llvm.bswap.i16(i16) nounwind readnone 7declare i32 @llvm.bswap.i32(i32) nounwind readnone 8declare i64 @llvm.bswap.i64(i64) nounwind readnone 9 10define void @test1(ptr nocapture %x, i16 %y) nounwind { 11; CHECK-LABEL: test1: 12; CHECK: # %bb.0: 13; CHECK-NEXT: movbew %si, (%rdi) 14; CHECK-NEXT: nop 15; CHECK-NEXT: nop 16; CHECK-NEXT: nop 17; CHECK-NEXT: nop 18; CHECK-NEXT: nop 19; CHECK-NEXT: nop 20; CHECK-NEXT: retq 21; 22; SLM-LABEL: test1: 23; SLM: # %bb.0: 24; SLM-NEXT: movbew %si, (%rdi) 25; SLM-NEXT: retq 26; 27; EGPR-LABEL: test1: 28; EGPR: # %bb.0: 29; EGPR-NEXT: movbew %si, (%rdi) # EVEX TO LEGACY Compression encoding: [0x66,0x0f,0x38,0xf1,0x37] 30; EGPR-NEXT: retq # encoding: [0xc3] 31; 32; NOMOVBE-LABEL: test1: 33; NOMOVBE: # %bb.0: 34; NOMOVBE-NEXT: rolw $8, %si, %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0xc6,0x08] 35; NOMOVBE-NEXT: movw %ax, (%rdi) # encoding: [0x66,0x89,0x07] 36; NOMOVBE-NEXT: retq # encoding: [0xc3] 37 %bswap = call i16 @llvm.bswap.i16(i16 %y) 38 store i16 %bswap, ptr %x, align 2 39 ret void 40} 41 42define i16 @test2(ptr %x) nounwind { 43; CHECK-LABEL: test2: 44; CHECK: # %bb.0: 45; CHECK-NEXT: movbew (%rdi), %ax 46; CHECK-NEXT: nop 47; CHECK-NEXT: nop 48; CHECK-NEXT: nop 49; CHECK-NEXT: nop 50; CHECK-NEXT: nop 51; CHECK-NEXT: nop 52; CHECK-NEXT: retq 53; 54; SLM-LABEL: test2: 55; SLM: # %bb.0: 56; SLM-NEXT: movbew (%rdi), %ax 57; SLM-NEXT: retq 58; 59; EGPR-LABEL: test2: 60; EGPR: # %bb.0: 61; EGPR-NEXT: movbew (%rdi), %ax # EVEX TO LEGACY Compression encoding: [0x66,0x0f,0x38,0xf0,0x07] 62; EGPR-NEXT: retq # encoding: [0xc3] 63; 64; NOMOVBE-LABEL: test2: 65; NOMOVBE: # %bb.0: 66; NOMOVBE-NEXT: rolw $8, (%rdi), %ax # encoding: [0x62,0xf4,0x7d,0x18,0xc1,0x07,0x08] 67; NOMOVBE-NEXT: retq # encoding: [0xc3] 68 %load = load i16, ptr %x, align 2 69 %bswap = call i16 @llvm.bswap.i16(i16 %load) 70 ret i16 %bswap 71} 72 73define void @test3(ptr nocapture %x, i32 %y) nounwind { 74; CHECK-LABEL: test3: 75; CHECK: # %bb.0: 76; CHECK-NEXT: movbel %esi, (%rdi) 77; CHECK-NEXT: nop 78; CHECK-NEXT: nop 79; CHECK-NEXT: nop 80; CHECK-NEXT: nop 81; CHECK-NEXT: nop 82; CHECK-NEXT: nop 83; CHECK-NEXT: retq 84; 85; SLM-LABEL: test3: 86; SLM: # %bb.0: 87; SLM-NEXT: movbel %esi, (%rdi) 88; SLM-NEXT: retq 89; 90; EGPR-LABEL: test3: 91; EGPR: # %bb.0: 92; EGPR-NEXT: movbel %esi, (%rdi) # EVEX TO LEGACY Compression encoding: [0x0f,0x38,0xf1,0x37] 93; EGPR-NEXT: retq # encoding: [0xc3] 94; 95; NOMOVBE-LABEL: test3: 96; NOMOVBE: # %bb.0: 97; NOMOVBE-NEXT: bswapl %esi # encoding: [0x0f,0xce] 98; NOMOVBE-NEXT: movl %esi, (%rdi) # encoding: [0x89,0x37] 99; NOMOVBE-NEXT: retq # encoding: [0xc3] 100 %bswap = call i32 @llvm.bswap.i32(i32 %y) 101 store i32 %bswap, ptr %x, align 4 102 ret void 103} 104 105define i32 @test4(ptr %x) nounwind { 106; CHECK-LABEL: test4: 107; CHECK: # %bb.0: 108; CHECK-NEXT: movbel (%rdi), %eax 109; CHECK-NEXT: nop 110; CHECK-NEXT: nop 111; CHECK-NEXT: nop 112; CHECK-NEXT: nop 113; CHECK-NEXT: nop 114; CHECK-NEXT: nop 115; CHECK-NEXT: retq 116; 117; SLM-LABEL: test4: 118; SLM: # %bb.0: 119; SLM-NEXT: movbel (%rdi), %eax 120; SLM-NEXT: retq 121; 122; EGPR-LABEL: test4: 123; EGPR: # %bb.0: 124; EGPR-NEXT: movbel (%rdi), %eax # EVEX TO LEGACY Compression encoding: [0x0f,0x38,0xf0,0x07] 125; EGPR-NEXT: retq # encoding: [0xc3] 126; 127; NOMOVBE-LABEL: test4: 128; NOMOVBE: # %bb.0: 129; NOMOVBE-NEXT: movl (%rdi), %eax # encoding: [0x8b,0x07] 130; NOMOVBE-NEXT: bswapl %eax # encoding: [0x0f,0xc8] 131; NOMOVBE-NEXT: retq # encoding: [0xc3] 132 %load = load i32, ptr %x, align 4 133 %bswap = call i32 @llvm.bswap.i32(i32 %load) 134 ret i32 %bswap 135} 136 137define void @test5(ptr %x, i64 %y) nounwind { 138; CHECK-LABEL: test5: 139; CHECK: # %bb.0: 140; CHECK-NEXT: movbeq %rsi, (%rdi) 141; CHECK-NEXT: nop 142; CHECK-NEXT: nop 143; CHECK-NEXT: nop 144; CHECK-NEXT: nop 145; CHECK-NEXT: nop 146; CHECK-NEXT: nop 147; CHECK-NEXT: retq 148; 149; SLM-LABEL: test5: 150; SLM: # %bb.0: 151; SLM-NEXT: movbeq %rsi, (%rdi) 152; SLM-NEXT: retq 153; 154; EGPR-LABEL: test5: 155; EGPR: # %bb.0: 156; EGPR-NEXT: movbeq %rsi, (%rdi) # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0x38,0xf1,0x37] 157; EGPR-NEXT: retq # encoding: [0xc3] 158; 159; NOMOVBE-LABEL: test5: 160; NOMOVBE: # %bb.0: 161; NOMOVBE-NEXT: bswapq %rsi # encoding: [0x48,0x0f,0xce] 162; NOMOVBE-NEXT: movq %rsi, (%rdi) # encoding: [0x48,0x89,0x37] 163; NOMOVBE-NEXT: retq # encoding: [0xc3] 164 %bswap = call i64 @llvm.bswap.i64(i64 %y) 165 store i64 %bswap, ptr %x, align 8 166 ret void 167} 168 169define i64 @test6(ptr %x) nounwind { 170; CHECK-LABEL: test6: 171; CHECK: # %bb.0: 172; CHECK-NEXT: movbeq (%rdi), %rax 173; CHECK-NEXT: nop 174; CHECK-NEXT: nop 175; CHECK-NEXT: nop 176; CHECK-NEXT: nop 177; CHECK-NEXT: nop 178; CHECK-NEXT: nop 179; CHECK-NEXT: retq 180; 181; SLM-LABEL: test6: 182; SLM: # %bb.0: 183; SLM-NEXT: movbeq (%rdi), %rax 184; SLM-NEXT: retq 185; 186; EGPR-LABEL: test6: 187; EGPR: # %bb.0: 188; EGPR-NEXT: movbeq (%rdi), %rax # EVEX TO LEGACY Compression encoding: [0x48,0x0f,0x38,0xf0,0x07] 189; EGPR-NEXT: retq # encoding: [0xc3] 190; 191; NOMOVBE-LABEL: test6: 192; NOMOVBE: # %bb.0: 193; NOMOVBE-NEXT: movq (%rdi), %rax # encoding: [0x48,0x8b,0x07] 194; NOMOVBE-NEXT: bswapq %rax # encoding: [0x48,0x0f,0xc8] 195; NOMOVBE-NEXT: retq # encoding: [0xc3] 196 %load = load i64, ptr %x, align 8 197 %bswap = call i64 @llvm.bswap.i64(i64 %load) 198 ret i64 %bswap 199} 200 201define i64 @test7(i64 %x) nounwind { 202; CHECK-LABEL: test7: 203; CHECK: # %bb.0: 204; CHECK-NEXT: movq %rdi, %rax 205; CHECK-NEXT: bswapq %rax 206; CHECK-NEXT: nop 207; CHECK-NEXT: nop 208; CHECK-NEXT: nop 209; CHECK-NEXT: nop 210; CHECK-NEXT: retq 211; 212; SLM-LABEL: test7: 213; SLM: # %bb.0: 214; SLM-NEXT: movq %rdi, %rax 215; SLM-NEXT: bswapq %rax 216; SLM-NEXT: retq 217; 218; EGPR-LABEL: test7: 219; EGPR: # %bb.0: 220; EGPR-NEXT: movbeq %rdi, %rax # encoding: [0x62,0xf4,0xfc,0x08,0x61,0xf8] 221; EGPR-NEXT: retq # encoding: [0xc3] 222; 223; NOMOVBE-LABEL: test7: 224; NOMOVBE: # %bb.0: 225; NOMOVBE-NEXT: movq %rdi, %rax # encoding: [0x48,0x89,0xf8] 226; NOMOVBE-NEXT: bswapq %rax # encoding: [0x48,0x0f,0xc8] 227; NOMOVBE-NEXT: retq # encoding: [0xc3] 228 %bswap = call i64 @llvm.bswap.i64(i64 %x) 229 ret i64 %bswap 230} 231