912 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs -mattr=sse | FileCheck %s --check-prefixes=X86,X86-SSE13; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs -mattr=sse2 | FileCheck %s --check-prefixes=X86,X86-SSE24; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs -mattr=avx | FileCheck %s --check-prefixes=X86,X86-AVX5; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs -mattr=avx512f | FileCheck %s --check-prefixes=X86,X86-AVX6; RUN: llc < %s -mtriple=i386-linux-generic -verify-machineinstrs | FileCheck %s --check-prefixes=X86,X86-NOSSE7; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=sse2 | FileCheck %s --check-prefixes=X64-SSE8; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=avx | FileCheck %s --check-prefixes=X64-AVX9; RUN: llc < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=avx512f | FileCheck %s --check-prefixes=X64-AVX10 11; Note: This test is testing that the lowering for atomics matches what we12; currently emit for non-atomics + the atomic restriction. The presence of13; particular lowering detail in these tests should not be read as requiring14; that detail for correctness unless it's related to the atomicity itself.15; (Specifically, there were reviewer questions about the lowering for halfs16; and their calling convention which remain unresolved.)17 18define void @store_half(ptr %fptr, half %v) {19; X86-SSE1-LABEL: store_half:20; X86-SSE1: # %bb.0:21; X86-SSE1-NEXT: movzwl {{[0-9]+}}(%esp), %eax22; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ecx23; X86-SSE1-NEXT: movw %ax, (%ecx)24; X86-SSE1-NEXT: retl25;26; X86-SSE2-LABEL: store_half:27; X86-SSE2: # %bb.0:28; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax29; X86-SSE2-NEXT: movzwl {{[0-9]+}}(%esp), %ecx30; X86-SSE2-NEXT: movw %cx, (%eax)31; X86-SSE2-NEXT: retl32;33; X86-AVX-LABEL: store_half:34; X86-AVX: # %bb.0:35; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax36; X86-AVX-NEXT: movzwl {{[0-9]+}}(%esp), %ecx37; X86-AVX-NEXT: movw %cx, (%eax)38; X86-AVX-NEXT: retl39;40; X86-NOSSE-LABEL: store_half:41; X86-NOSSE: # %bb.0:42; X86-NOSSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax43; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx44; X86-NOSSE-NEXT: movw %ax, (%ecx)45; X86-NOSSE-NEXT: retl46;47; X64-SSE-LABEL: store_half:48; X64-SSE: # %bb.0:49; X64-SSE-NEXT: pextrw $0, %xmm0, %eax50; X64-SSE-NEXT: movw %ax, (%rdi)51; X64-SSE-NEXT: retq52;53; X64-AVX-LABEL: store_half:54; X64-AVX: # %bb.0:55; X64-AVX-NEXT: vpextrw $0, %xmm0, %eax56; X64-AVX-NEXT: movw %ax, (%rdi)57; X64-AVX-NEXT: retq58 store atomic half %v, ptr %fptr unordered, align 259 ret void60}61 62define void @store_float(ptr %fptr, float %v) {63; X86-LABEL: store_float:64; X86: # %bb.0:65; X86-NEXT: movl {{[0-9]+}}(%esp), %eax66; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx67; X86-NEXT: movl %ecx, (%eax)68; X86-NEXT: retl69;70; X64-SSE-LABEL: store_float:71; X64-SSE: # %bb.0:72; X64-SSE-NEXT: movss %xmm0, (%rdi)73; X64-SSE-NEXT: retq74;75; X64-AVX-LABEL: store_float:76; X64-AVX: # %bb.0:77; X64-AVX-NEXT: vmovss %xmm0, (%rdi)78; X64-AVX-NEXT: retq79 store atomic float %v, ptr %fptr unordered, align 480 ret void81}82 83define void @store_double(ptr %fptr, double %v) {84; X86-SSE1-LABEL: store_double:85; X86-SSE1: # %bb.0:86; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax87; X86-SSE1-NEXT: xorps %xmm0, %xmm088; X86-SSE1-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]89; X86-SSE1-NEXT: movlps %xmm0, (%eax)90; X86-SSE1-NEXT: retl91;92; X86-SSE2-LABEL: store_double:93; X86-SSE2: # %bb.0:94; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax95; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero96; X86-SSE2-NEXT: movlps %xmm0, (%eax)97; X86-SSE2-NEXT: retl98;99; X86-AVX-LABEL: store_double:100; X86-AVX: # %bb.0:101; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax102; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero103; X86-AVX-NEXT: vmovlps %xmm0, (%eax)104; X86-AVX-NEXT: retl105;106; X86-NOSSE-LABEL: store_double:107; X86-NOSSE: # %bb.0:108; X86-NOSSE-NEXT: subl $12, %esp109; X86-NOSSE-NEXT: .cfi_def_cfa_offset 16110; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax111; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx112; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %edx113; X86-NOSSE-NEXT: movl %edx, {{[0-9]+}}(%esp)114; X86-NOSSE-NEXT: movl %ecx, (%esp)115; X86-NOSSE-NEXT: fildll (%esp)116; X86-NOSSE-NEXT: fistpll (%eax)117; X86-NOSSE-NEXT: addl $12, %esp118; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4119; X86-NOSSE-NEXT: retl120;121; X64-SSE-LABEL: store_double:122; X64-SSE: # %bb.0:123; X64-SSE-NEXT: movsd %xmm0, (%rdi)124; X64-SSE-NEXT: retq125;126; X64-AVX-LABEL: store_double:127; X64-AVX: # %bb.0:128; X64-AVX-NEXT: vmovsd %xmm0, (%rdi)129; X64-AVX-NEXT: retq130 store atomic double %v, ptr %fptr unordered, align 8131 ret void132}133 134define half @load_half(ptr %fptr) {135; X86-SSE1-LABEL: load_half:136; X86-SSE1: # %bb.0:137; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax138; X86-SSE1-NEXT: movzwl (%eax), %eax139; X86-SSE1-NEXT: retl140;141; X86-SSE2-LABEL: load_half:142; X86-SSE2: # %bb.0:143; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax144; X86-SSE2-NEXT: movzwl (%eax), %eax145; X86-SSE2-NEXT: pinsrw $0, %eax, %xmm0146; X86-SSE2-NEXT: retl147;148; X86-AVX-LABEL: load_half:149; X86-AVX: # %bb.0:150; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax151; X86-AVX-NEXT: movzwl (%eax), %eax152; X86-AVX-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0153; X86-AVX-NEXT: retl154;155; X86-NOSSE-LABEL: load_half:156; X86-NOSSE: # %bb.0:157; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax158; X86-NOSSE-NEXT: movzwl (%eax), %eax159; X86-NOSSE-NEXT: retl160;161; X64-SSE-LABEL: load_half:162; X64-SSE: # %bb.0:163; X64-SSE-NEXT: movzwl (%rdi), %eax164; X64-SSE-NEXT: pinsrw $0, %eax, %xmm0165; X64-SSE-NEXT: retq166;167; X64-AVX-LABEL: load_half:168; X64-AVX: # %bb.0:169; X64-AVX-NEXT: movzwl (%rdi), %eax170; X64-AVX-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0171; X64-AVX-NEXT: retq172 %v = load atomic half, ptr %fptr unordered, align 2173 ret half %v174}175 176define float @load_float(ptr %fptr) {177; X86-SSE1-LABEL: load_float:178; X86-SSE1: # %bb.0:179; X86-SSE1-NEXT: pushl %eax180; X86-SSE1-NEXT: .cfi_def_cfa_offset 8181; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax182; X86-SSE1-NEXT: movl (%eax), %eax183; X86-SSE1-NEXT: movl %eax, (%esp)184; X86-SSE1-NEXT: flds (%esp)185; X86-SSE1-NEXT: popl %eax186; X86-SSE1-NEXT: .cfi_def_cfa_offset 4187; X86-SSE1-NEXT: retl188;189; X86-SSE2-LABEL: load_float:190; X86-SSE2: # %bb.0:191; X86-SSE2-NEXT: pushl %eax192; X86-SSE2-NEXT: .cfi_def_cfa_offset 8193; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax194; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero195; X86-SSE2-NEXT: movss %xmm0, (%esp)196; X86-SSE2-NEXT: flds (%esp)197; X86-SSE2-NEXT: popl %eax198; X86-SSE2-NEXT: .cfi_def_cfa_offset 4199; X86-SSE2-NEXT: retl200;201; X86-AVX-LABEL: load_float:202; X86-AVX: # %bb.0:203; X86-AVX-NEXT: pushl %eax204; X86-AVX-NEXT: .cfi_def_cfa_offset 8205; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax206; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero207; X86-AVX-NEXT: vmovss %xmm0, (%esp)208; X86-AVX-NEXT: flds (%esp)209; X86-AVX-NEXT: popl %eax210; X86-AVX-NEXT: .cfi_def_cfa_offset 4211; X86-AVX-NEXT: retl212;213; X86-NOSSE-LABEL: load_float:214; X86-NOSSE: # %bb.0:215; X86-NOSSE-NEXT: pushl %eax216; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8217; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax218; X86-NOSSE-NEXT: movl (%eax), %eax219; X86-NOSSE-NEXT: movl %eax, (%esp)220; X86-NOSSE-NEXT: flds (%esp)221; X86-NOSSE-NEXT: popl %eax222; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4223; X86-NOSSE-NEXT: retl224;225; X64-SSE-LABEL: load_float:226; X64-SSE: # %bb.0:227; X64-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero228; X64-SSE-NEXT: retq229;230; X64-AVX-LABEL: load_float:231; X64-AVX: # %bb.0:232; X64-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero233; X64-AVX-NEXT: retq234 %v = load atomic float, ptr %fptr unordered, align 4235 ret float %v236}237 238define double @load_double(ptr %fptr) {239; X86-SSE1-LABEL: load_double:240; X86-SSE1: # %bb.0:241; X86-SSE1-NEXT: subl $12, %esp242; X86-SSE1-NEXT: .cfi_def_cfa_offset 16243; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax244; X86-SSE1-NEXT: xorps %xmm0, %xmm0245; X86-SSE1-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]246; X86-SSE1-NEXT: movss %xmm0, (%esp)247; X86-SSE1-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]248; X86-SSE1-NEXT: movss %xmm0, {{[0-9]+}}(%esp)249; X86-SSE1-NEXT: fldl (%esp)250; X86-SSE1-NEXT: addl $12, %esp251; X86-SSE1-NEXT: .cfi_def_cfa_offset 4252; X86-SSE1-NEXT: retl253;254; X86-SSE2-LABEL: load_double:255; X86-SSE2: # %bb.0:256; X86-SSE2-NEXT: subl $12, %esp257; X86-SSE2-NEXT: .cfi_def_cfa_offset 16258; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax259; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero260; X86-SSE2-NEXT: movlps %xmm0, (%esp)261; X86-SSE2-NEXT: fldl (%esp)262; X86-SSE2-NEXT: addl $12, %esp263; X86-SSE2-NEXT: .cfi_def_cfa_offset 4264; X86-SSE2-NEXT: retl265;266; X86-AVX-LABEL: load_double:267; X86-AVX: # %bb.0:268; X86-AVX-NEXT: subl $12, %esp269; X86-AVX-NEXT: .cfi_def_cfa_offset 16270; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax271; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero272; X86-AVX-NEXT: vmovlps %xmm0, (%esp)273; X86-AVX-NEXT: fldl (%esp)274; X86-AVX-NEXT: addl $12, %esp275; X86-AVX-NEXT: .cfi_def_cfa_offset 4276; X86-AVX-NEXT: retl277;278; X86-NOSSE-LABEL: load_double:279; X86-NOSSE: # %bb.0:280; X86-NOSSE-NEXT: subl $20, %esp281; X86-NOSSE-NEXT: .cfi_def_cfa_offset 24282; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax283; X86-NOSSE-NEXT: fildll (%eax)284; X86-NOSSE-NEXT: fistpll {{[0-9]+}}(%esp)285; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax286; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx287; X86-NOSSE-NEXT: movl %ecx, {{[0-9]+}}(%esp)288; X86-NOSSE-NEXT: movl %eax, (%esp)289; X86-NOSSE-NEXT: fldl (%esp)290; X86-NOSSE-NEXT: addl $20, %esp291; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4292; X86-NOSSE-NEXT: retl293;294; X64-SSE-LABEL: load_double:295; X64-SSE: # %bb.0:296; X64-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero297; X64-SSE-NEXT: retq298;299; X64-AVX-LABEL: load_double:300; X64-AVX: # %bb.0:301; X64-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero302; X64-AVX-NEXT: retq303 %v = load atomic double, ptr %fptr unordered, align 8304 ret double %v305}306 307define half @exchange_half(ptr %fptr, half %x) {308; X86-SSE1-LABEL: exchange_half:309; X86-SSE1: # %bb.0:310; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ecx311; X86-SSE1-NEXT: movzwl {{[0-9]+}}(%esp), %eax312; X86-SSE1-NEXT: xchgw %ax, (%ecx)313; X86-SSE1-NEXT: retl314;315; X86-SSE2-LABEL: exchange_half:316; X86-SSE2: # %bb.0:317; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax318; X86-SSE2-NEXT: movzwl {{[0-9]+}}(%esp), %ecx319; X86-SSE2-NEXT: xchgw %cx, (%eax)320; X86-SSE2-NEXT: pinsrw $0, %ecx, %xmm0321; X86-SSE2-NEXT: retl322;323; X86-AVX-LABEL: exchange_half:324; X86-AVX: # %bb.0:325; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax326; X86-AVX-NEXT: movzwl {{[0-9]+}}(%esp), %ecx327; X86-AVX-NEXT: xchgw %cx, (%eax)328; X86-AVX-NEXT: vpinsrw $0, %ecx, %xmm0, %xmm0329; X86-AVX-NEXT: retl330;331; X86-NOSSE-LABEL: exchange_half:332; X86-NOSSE: # %bb.0:333; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx334; X86-NOSSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax335; X86-NOSSE-NEXT: xchgw %ax, (%ecx)336; X86-NOSSE-NEXT: retl337;338; X64-SSE-LABEL: exchange_half:339; X64-SSE: # %bb.0:340; X64-SSE-NEXT: pextrw $0, %xmm0, %eax341; X64-SSE-NEXT: xchgw %ax, (%rdi)342; X64-SSE-NEXT: pinsrw $0, %eax, %xmm0343; X64-SSE-NEXT: retq344;345; X64-AVX-LABEL: exchange_half:346; X64-AVX: # %bb.0:347; X64-AVX-NEXT: vpextrw $0, %xmm0, %eax348; X64-AVX-NEXT: xchgw %ax, (%rdi)349; X64-AVX-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0350; X64-AVX-NEXT: retq351 %v = atomicrmw xchg ptr %fptr, half %x monotonic, align 2352 ret half %v353}354 355define float @exchange_float(ptr %fptr, float %x) {356; X86-SSE1-LABEL: exchange_float:357; X86-SSE1: # %bb.0:358; X86-SSE1-NEXT: pushl %eax359; X86-SSE1-NEXT: .cfi_def_cfa_offset 8360; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax361; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ecx362; X86-SSE1-NEXT: xchgl %ecx, (%eax)363; X86-SSE1-NEXT: movl %ecx, (%esp)364; X86-SSE1-NEXT: flds (%esp)365; X86-SSE1-NEXT: popl %eax366; X86-SSE1-NEXT: .cfi_def_cfa_offset 4367; X86-SSE1-NEXT: retl368;369; X86-SSE2-LABEL: exchange_float:370; X86-SSE2: # %bb.0:371; X86-SSE2-NEXT: pushl %eax372; X86-SSE2-NEXT: .cfi_def_cfa_offset 8373; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax374; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx375; X86-SSE2-NEXT: xchgl %ecx, (%eax)376; X86-SSE2-NEXT: movd %ecx, %xmm0377; X86-SSE2-NEXT: movd %xmm0, (%esp)378; X86-SSE2-NEXT: flds (%esp)379; X86-SSE2-NEXT: popl %eax380; X86-SSE2-NEXT: .cfi_def_cfa_offset 4381; X86-SSE2-NEXT: retl382;383; X86-AVX-LABEL: exchange_float:384; X86-AVX: # %bb.0:385; X86-AVX-NEXT: pushl %eax386; X86-AVX-NEXT: .cfi_def_cfa_offset 8387; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax388; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx389; X86-AVX-NEXT: xchgl %ecx, (%eax)390; X86-AVX-NEXT: vmovd %ecx, %xmm0391; X86-AVX-NEXT: vmovd %xmm0, (%esp)392; X86-AVX-NEXT: flds (%esp)393; X86-AVX-NEXT: popl %eax394; X86-AVX-NEXT: .cfi_def_cfa_offset 4395; X86-AVX-NEXT: retl396;397; X86-NOSSE-LABEL: exchange_float:398; X86-NOSSE: # %bb.0:399; X86-NOSSE-NEXT: pushl %eax400; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8401; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax402; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx403; X86-NOSSE-NEXT: xchgl %ecx, (%eax)404; X86-NOSSE-NEXT: movl %ecx, (%esp)405; X86-NOSSE-NEXT: flds (%esp)406; X86-NOSSE-NEXT: popl %eax407; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4408; X86-NOSSE-NEXT: retl409;410; X64-SSE-LABEL: exchange_float:411; X64-SSE: # %bb.0:412; X64-SSE-NEXT: movd %xmm0, %eax413; X64-SSE-NEXT: xchgl %eax, (%rdi)414; X64-SSE-NEXT: movd %eax, %xmm0415; X64-SSE-NEXT: retq416;417; X64-AVX-LABEL: exchange_float:418; X64-AVX: # %bb.0:419; X64-AVX-NEXT: vmovd %xmm0, %eax420; X64-AVX-NEXT: xchgl %eax, (%rdi)421; X64-AVX-NEXT: vmovd %eax, %xmm0422; X64-AVX-NEXT: retq423 %v = atomicrmw xchg ptr %fptr, float %x monotonic, align 4424 ret float %v425}426 427define double @exchange_double(ptr %fptr, double %x) {428; X86-SSE1-LABEL: exchange_double:429; X86-SSE1: # %bb.0:430; X86-SSE1-NEXT: pushl %ebx431; X86-SSE1-NEXT: .cfi_def_cfa_offset 8432; X86-SSE1-NEXT: pushl %esi433; X86-SSE1-NEXT: .cfi_def_cfa_offset 12434; X86-SSE1-NEXT: subl $12, %esp435; X86-SSE1-NEXT: .cfi_def_cfa_offset 24436; X86-SSE1-NEXT: .cfi_offset %esi, -12437; X86-SSE1-NEXT: .cfi_offset %ebx, -8438; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %esi439; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ebx440; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %ecx441; X86-SSE1-NEXT: movl (%esi), %eax442; X86-SSE1-NEXT: movl 4(%esi), %edx443; X86-SSE1-NEXT: .p2align 4444; X86-SSE1-NEXT: .LBB8_1: # %atomicrmw.start445; X86-SSE1-NEXT: # =>This Inner Loop Header: Depth=1446; X86-SSE1-NEXT: lock cmpxchg8b (%esi)447; X86-SSE1-NEXT: jne .LBB8_1448; X86-SSE1-NEXT: # %bb.2: # %atomicrmw.end449; X86-SSE1-NEXT: movl %eax, (%esp)450; X86-SSE1-NEXT: movl %edx, {{[0-9]+}}(%esp)451; X86-SSE1-NEXT: fldl (%esp)452; X86-SSE1-NEXT: addl $12, %esp453; X86-SSE1-NEXT: .cfi_def_cfa_offset 12454; X86-SSE1-NEXT: popl %esi455; X86-SSE1-NEXT: .cfi_def_cfa_offset 8456; X86-SSE1-NEXT: popl %ebx457; X86-SSE1-NEXT: .cfi_def_cfa_offset 4458; X86-SSE1-NEXT: retl459;460; X86-SSE2-LABEL: exchange_double:461; X86-SSE2: # %bb.0:462; X86-SSE2-NEXT: pushl %ebx463; X86-SSE2-NEXT: .cfi_def_cfa_offset 8464; X86-SSE2-NEXT: pushl %esi465; X86-SSE2-NEXT: .cfi_def_cfa_offset 12466; X86-SSE2-NEXT: subl $12, %esp467; X86-SSE2-NEXT: .cfi_def_cfa_offset 24468; X86-SSE2-NEXT: .cfi_offset %esi, -12469; X86-SSE2-NEXT: .cfi_offset %ebx, -8470; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %esi471; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ebx472; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx473; X86-SSE2-NEXT: movl (%esi), %eax474; X86-SSE2-NEXT: movl 4(%esi), %edx475; X86-SSE2-NEXT: .p2align 4476; X86-SSE2-NEXT: .LBB8_1: # %atomicrmw.start477; X86-SSE2-NEXT: # =>This Inner Loop Header: Depth=1478; X86-SSE2-NEXT: lock cmpxchg8b (%esi)479; X86-SSE2-NEXT: jne .LBB8_1480; X86-SSE2-NEXT: # %bb.2: # %atomicrmw.end481; X86-SSE2-NEXT: movd %eax, %xmm0482; X86-SSE2-NEXT: movd %edx, %xmm1483; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]484; X86-SSE2-NEXT: movq %xmm0, (%esp)485; X86-SSE2-NEXT: fldl (%esp)486; X86-SSE2-NEXT: addl $12, %esp487; X86-SSE2-NEXT: .cfi_def_cfa_offset 12488; X86-SSE2-NEXT: popl %esi489; X86-SSE2-NEXT: .cfi_def_cfa_offset 8490; X86-SSE2-NEXT: popl %ebx491; X86-SSE2-NEXT: .cfi_def_cfa_offset 4492; X86-SSE2-NEXT: retl493;494; X86-AVX-LABEL: exchange_double:495; X86-AVX: # %bb.0:496; X86-AVX-NEXT: pushl %ebx497; X86-AVX-NEXT: .cfi_def_cfa_offset 8498; X86-AVX-NEXT: pushl %esi499; X86-AVX-NEXT: .cfi_def_cfa_offset 12500; X86-AVX-NEXT: subl $12, %esp501; X86-AVX-NEXT: .cfi_def_cfa_offset 24502; X86-AVX-NEXT: .cfi_offset %esi, -12503; X86-AVX-NEXT: .cfi_offset %ebx, -8504; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %esi505; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ebx506; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %ecx507; X86-AVX-NEXT: movl (%esi), %eax508; X86-AVX-NEXT: movl 4(%esi), %edx509; X86-AVX-NEXT: .p2align 4510; X86-AVX-NEXT: .LBB8_1: # %atomicrmw.start511; X86-AVX-NEXT: # =>This Inner Loop Header: Depth=1512; X86-AVX-NEXT: lock cmpxchg8b (%esi)513; X86-AVX-NEXT: jne .LBB8_1514; X86-AVX-NEXT: # %bb.2: # %atomicrmw.end515; X86-AVX-NEXT: vmovd %eax, %xmm0516; X86-AVX-NEXT: vpinsrd $1, %edx, %xmm0, %xmm0517; X86-AVX-NEXT: vmovq %xmm0, (%esp)518; X86-AVX-NEXT: fldl (%esp)519; X86-AVX-NEXT: addl $12, %esp520; X86-AVX-NEXT: .cfi_def_cfa_offset 12521; X86-AVX-NEXT: popl %esi522; X86-AVX-NEXT: .cfi_def_cfa_offset 8523; X86-AVX-NEXT: popl %ebx524; X86-AVX-NEXT: .cfi_def_cfa_offset 4525; X86-AVX-NEXT: retl526;527; X86-NOSSE-LABEL: exchange_double:528; X86-NOSSE: # %bb.0:529; X86-NOSSE-NEXT: pushl %ebx530; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8531; X86-NOSSE-NEXT: pushl %esi532; X86-NOSSE-NEXT: .cfi_def_cfa_offset 12533; X86-NOSSE-NEXT: subl $12, %esp534; X86-NOSSE-NEXT: .cfi_def_cfa_offset 24535; X86-NOSSE-NEXT: .cfi_offset %esi, -12536; X86-NOSSE-NEXT: .cfi_offset %ebx, -8537; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %esi538; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ebx539; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx540; X86-NOSSE-NEXT: movl (%esi), %eax541; X86-NOSSE-NEXT: movl 4(%esi), %edx542; X86-NOSSE-NEXT: .p2align 4543; X86-NOSSE-NEXT: .LBB8_1: # %atomicrmw.start544; X86-NOSSE-NEXT: # =>This Inner Loop Header: Depth=1545; X86-NOSSE-NEXT: lock cmpxchg8b (%esi)546; X86-NOSSE-NEXT: jne .LBB8_1547; X86-NOSSE-NEXT: # %bb.2: # %atomicrmw.end548; X86-NOSSE-NEXT: movl %eax, (%esp)549; X86-NOSSE-NEXT: movl %edx, {{[0-9]+}}(%esp)550; X86-NOSSE-NEXT: fldl (%esp)551; X86-NOSSE-NEXT: addl $12, %esp552; X86-NOSSE-NEXT: .cfi_def_cfa_offset 12553; X86-NOSSE-NEXT: popl %esi554; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8555; X86-NOSSE-NEXT: popl %ebx556; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4557; X86-NOSSE-NEXT: retl558;559; X64-SSE-LABEL: exchange_double:560; X64-SSE: # %bb.0:561; X64-SSE-NEXT: movq %xmm0, %rax562; X64-SSE-NEXT: xchgq %rax, (%rdi)563; X64-SSE-NEXT: movq %rax, %xmm0564; X64-SSE-NEXT: retq565;566; X64-AVX-LABEL: exchange_double:567; X64-AVX: # %bb.0:568; X64-AVX-NEXT: vmovq %xmm0, %rax569; X64-AVX-NEXT: xchgq %rax, (%rdi)570; X64-AVX-NEXT: vmovq %rax, %xmm0571; X64-AVX-NEXT: retq572 %v = atomicrmw xchg ptr %fptr, double %x monotonic, align 8573 ret double %v574}575 576 577; Check the seq_cst lowering since that's the578; interesting one from an ordering perspective on x86.579 580define void @store_float_seq_cst(ptr %fptr, float %v) {581; X86-LABEL: store_float_seq_cst:582; X86: # %bb.0:583; X86-NEXT: movl {{[0-9]+}}(%esp), %eax584; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx585; X86-NEXT: xchgl %ecx, (%eax)586; X86-NEXT: retl587;588; X64-SSE-LABEL: store_float_seq_cst:589; X64-SSE: # %bb.0:590; X64-SSE-NEXT: movd %xmm0, %eax591; X64-SSE-NEXT: xchgl %eax, (%rdi)592; X64-SSE-NEXT: retq593;594; X64-AVX-LABEL: store_float_seq_cst:595; X64-AVX: # %bb.0:596; X64-AVX-NEXT: vmovd %xmm0, %eax597; X64-AVX-NEXT: xchgl %eax, (%rdi)598; X64-AVX-NEXT: retq599 store atomic float %v, ptr %fptr seq_cst, align 4600 ret void601}602 603define void @store_double_seq_cst(ptr %fptr, double %v) {604; X86-SSE1-LABEL: store_double_seq_cst:605; X86-SSE1: # %bb.0:606; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax607; X86-SSE1-NEXT: xorps %xmm0, %xmm0608; X86-SSE1-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]609; X86-SSE1-NEXT: movlps %xmm0, (%eax)610; X86-SSE1-NEXT: lock orl $0, (%esp)611; X86-SSE1-NEXT: retl612;613; X86-SSE2-LABEL: store_double_seq_cst:614; X86-SSE2: # %bb.0:615; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax616; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero617; X86-SSE2-NEXT: movlps %xmm0, (%eax)618; X86-SSE2-NEXT: lock orl $0, (%esp)619; X86-SSE2-NEXT: retl620;621; X86-AVX-LABEL: store_double_seq_cst:622; X86-AVX: # %bb.0:623; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax624; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero625; X86-AVX-NEXT: vmovlps %xmm0, (%eax)626; X86-AVX-NEXT: lock orl $0, (%esp)627; X86-AVX-NEXT: retl628;629; X86-NOSSE-LABEL: store_double_seq_cst:630; X86-NOSSE: # %bb.0:631; X86-NOSSE-NEXT: subl $12, %esp632; X86-NOSSE-NEXT: .cfi_def_cfa_offset 16633; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax634; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx635; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %edx636; X86-NOSSE-NEXT: movl %edx, {{[0-9]+}}(%esp)637; X86-NOSSE-NEXT: movl %ecx, (%esp)638; X86-NOSSE-NEXT: fildll (%esp)639; X86-NOSSE-NEXT: fistpll (%eax)640; X86-NOSSE-NEXT: lock orl $0, (%esp)641; X86-NOSSE-NEXT: addl $12, %esp642; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4643; X86-NOSSE-NEXT: retl644;645; X64-SSE-LABEL: store_double_seq_cst:646; X64-SSE: # %bb.0:647; X64-SSE-NEXT: movq %xmm0, %rax648; X64-SSE-NEXT: xchgq %rax, (%rdi)649; X64-SSE-NEXT: retq650;651; X64-AVX-LABEL: store_double_seq_cst:652; X64-AVX: # %bb.0:653; X64-AVX-NEXT: vmovq %xmm0, %rax654; X64-AVX-NEXT: xchgq %rax, (%rdi)655; X64-AVX-NEXT: retq656 store atomic double %v, ptr %fptr seq_cst, align 8657 ret void658}659 660define float @load_float_seq_cst(ptr %fptr) {661; X86-SSE1-LABEL: load_float_seq_cst:662; X86-SSE1: # %bb.0:663; X86-SSE1-NEXT: pushl %eax664; X86-SSE1-NEXT: .cfi_def_cfa_offset 8665; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax666; X86-SSE1-NEXT: movl (%eax), %eax667; X86-SSE1-NEXT: movl %eax, (%esp)668; X86-SSE1-NEXT: flds (%esp)669; X86-SSE1-NEXT: popl %eax670; X86-SSE1-NEXT: .cfi_def_cfa_offset 4671; X86-SSE1-NEXT: retl672;673; X86-SSE2-LABEL: load_float_seq_cst:674; X86-SSE2: # %bb.0:675; X86-SSE2-NEXT: pushl %eax676; X86-SSE2-NEXT: .cfi_def_cfa_offset 8677; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax678; X86-SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero679; X86-SSE2-NEXT: movss %xmm0, (%esp)680; X86-SSE2-NEXT: flds (%esp)681; X86-SSE2-NEXT: popl %eax682; X86-SSE2-NEXT: .cfi_def_cfa_offset 4683; X86-SSE2-NEXT: retl684;685; X86-AVX-LABEL: load_float_seq_cst:686; X86-AVX: # %bb.0:687; X86-AVX-NEXT: pushl %eax688; X86-AVX-NEXT: .cfi_def_cfa_offset 8689; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax690; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero691; X86-AVX-NEXT: vmovss %xmm0, (%esp)692; X86-AVX-NEXT: flds (%esp)693; X86-AVX-NEXT: popl %eax694; X86-AVX-NEXT: .cfi_def_cfa_offset 4695; X86-AVX-NEXT: retl696;697; X86-NOSSE-LABEL: load_float_seq_cst:698; X86-NOSSE: # %bb.0:699; X86-NOSSE-NEXT: pushl %eax700; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8701; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax702; X86-NOSSE-NEXT: movl (%eax), %eax703; X86-NOSSE-NEXT: movl %eax, (%esp)704; X86-NOSSE-NEXT: flds (%esp)705; X86-NOSSE-NEXT: popl %eax706; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4707; X86-NOSSE-NEXT: retl708;709; X64-SSE-LABEL: load_float_seq_cst:710; X64-SSE: # %bb.0:711; X64-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero712; X64-SSE-NEXT: retq713;714; X64-AVX-LABEL: load_float_seq_cst:715; X64-AVX: # %bb.0:716; X64-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero717; X64-AVX-NEXT: retq718 %v = load atomic float, ptr %fptr seq_cst, align 4719 ret float %v720}721 722define double @load_double_seq_cst(ptr %fptr) {723; X86-SSE1-LABEL: load_double_seq_cst:724; X86-SSE1: # %bb.0:725; X86-SSE1-NEXT: subl $12, %esp726; X86-SSE1-NEXT: .cfi_def_cfa_offset 16727; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax728; X86-SSE1-NEXT: xorps %xmm0, %xmm0729; X86-SSE1-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]730; X86-SSE1-NEXT: movss %xmm0, (%esp)731; X86-SSE1-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]732; X86-SSE1-NEXT: movss %xmm0, {{[0-9]+}}(%esp)733; X86-SSE1-NEXT: fldl (%esp)734; X86-SSE1-NEXT: addl $12, %esp735; X86-SSE1-NEXT: .cfi_def_cfa_offset 4736; X86-SSE1-NEXT: retl737;738; X86-SSE2-LABEL: load_double_seq_cst:739; X86-SSE2: # %bb.0:740; X86-SSE2-NEXT: subl $12, %esp741; X86-SSE2-NEXT: .cfi_def_cfa_offset 16742; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax743; X86-SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero744; X86-SSE2-NEXT: movlps %xmm0, (%esp)745; X86-SSE2-NEXT: fldl (%esp)746; X86-SSE2-NEXT: addl $12, %esp747; X86-SSE2-NEXT: .cfi_def_cfa_offset 4748; X86-SSE2-NEXT: retl749;750; X86-AVX-LABEL: load_double_seq_cst:751; X86-AVX: # %bb.0:752; X86-AVX-NEXT: subl $12, %esp753; X86-AVX-NEXT: .cfi_def_cfa_offset 16754; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax755; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero756; X86-AVX-NEXT: vmovlps %xmm0, (%esp)757; X86-AVX-NEXT: fldl (%esp)758; X86-AVX-NEXT: addl $12, %esp759; X86-AVX-NEXT: .cfi_def_cfa_offset 4760; X86-AVX-NEXT: retl761;762; X86-NOSSE-LABEL: load_double_seq_cst:763; X86-NOSSE: # %bb.0:764; X86-NOSSE-NEXT: subl $20, %esp765; X86-NOSSE-NEXT: .cfi_def_cfa_offset 24766; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax767; X86-NOSSE-NEXT: fildll (%eax)768; X86-NOSSE-NEXT: fistpll {{[0-9]+}}(%esp)769; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax770; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %ecx771; X86-NOSSE-NEXT: movl %ecx, {{[0-9]+}}(%esp)772; X86-NOSSE-NEXT: movl %eax, (%esp)773; X86-NOSSE-NEXT: fldl (%esp)774; X86-NOSSE-NEXT: addl $20, %esp775; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4776; X86-NOSSE-NEXT: retl777;778; X64-SSE-LABEL: load_double_seq_cst:779; X64-SSE: # %bb.0:780; X64-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero781; X64-SSE-NEXT: retq782;783; X64-AVX-LABEL: load_double_seq_cst:784; X64-AVX: # %bb.0:785; X64-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero786; X64-AVX-NEXT: retq787 %v = load atomic double, ptr %fptr seq_cst, align 8788 ret double %v789}790 791define void @store_bfloat(ptr %fptr, bfloat %v) {792; X86-SSE1-LABEL: store_bfloat:793; X86-SSE1: # %bb.0:794; X86-SSE1-NEXT: pushl %esi795; X86-SSE1-NEXT: .cfi_def_cfa_offset 8796; X86-SSE1-NEXT: subl $8, %esp797; X86-SSE1-NEXT: .cfi_def_cfa_offset 16798; X86-SSE1-NEXT: .cfi_offset %esi, -8799; X86-SSE1-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero800; X86-SSE1-NEXT: movss %xmm0, (%esp)801; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %esi802; X86-SSE1-NEXT: calll __truncsfbf2803; X86-SSE1-NEXT: movw %ax, (%esi)804; X86-SSE1-NEXT: addl $8, %esp805; X86-SSE1-NEXT: .cfi_def_cfa_offset 8806; X86-SSE1-NEXT: popl %esi807; X86-SSE1-NEXT: .cfi_def_cfa_offset 4808; X86-SSE1-NEXT: retl809;810; X86-SSE2-LABEL: store_bfloat:811; X86-SSE2: # %bb.0:812; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax813; X86-SSE2-NEXT: movzwl {{[0-9]+}}(%esp), %ecx814; X86-SSE2-NEXT: movw %cx, (%eax)815; X86-SSE2-NEXT: retl816;817; X86-AVX-LABEL: store_bfloat:818; X86-AVX: # %bb.0:819; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax820; X86-AVX-NEXT: movzwl {{[0-9]+}}(%esp), %ecx821; X86-AVX-NEXT: movw %cx, (%eax)822; X86-AVX-NEXT: retl823;824; X86-NOSSE-LABEL: store_bfloat:825; X86-NOSSE: # %bb.0:826; X86-NOSSE-NEXT: pushl %esi827; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8828; X86-NOSSE-NEXT: subl $8, %esp829; X86-NOSSE-NEXT: .cfi_def_cfa_offset 16830; X86-NOSSE-NEXT: .cfi_offset %esi, -8831; X86-NOSSE-NEXT: flds {{[0-9]+}}(%esp)832; X86-NOSSE-NEXT: fstps (%esp)833; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %esi834; X86-NOSSE-NEXT: calll __truncsfbf2835; X86-NOSSE-NEXT: movw %ax, (%esi)836; X86-NOSSE-NEXT: addl $8, %esp837; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8838; X86-NOSSE-NEXT: popl %esi839; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4840; X86-NOSSE-NEXT: retl841;842; X64-SSE-LABEL: store_bfloat:843; X64-SSE: # %bb.0:844; X64-SSE-NEXT: pextrw $0, %xmm0, %eax845; X64-SSE-NEXT: movw %ax, (%rdi)846; X64-SSE-NEXT: retq847;848; X64-AVX-LABEL: store_bfloat:849; X64-AVX: # %bb.0:850; X64-AVX-NEXT: vpextrw $0, %xmm0, %eax851; X64-AVX-NEXT: movw %ax, (%rdi)852; X64-AVX-NEXT: retq853 store atomic bfloat %v, ptr %fptr unordered, align 2854 ret void855}856 857define bfloat @load_bfloat(ptr %fptr) {858; X86-SSE1-LABEL: load_bfloat:859; X86-SSE1: # %bb.0:860; X86-SSE1-NEXT: pushl %eax861; X86-SSE1-NEXT: .cfi_def_cfa_offset 8862; X86-SSE1-NEXT: movl {{[0-9]+}}(%esp), %eax863; X86-SSE1-NEXT: movzwl (%eax), %eax864; X86-SSE1-NEXT: shll $16, %eax865; X86-SSE1-NEXT: movl %eax, (%esp)866; X86-SSE1-NEXT: flds (%esp)867; X86-SSE1-NEXT: popl %eax868; X86-SSE1-NEXT: .cfi_def_cfa_offset 4869; X86-SSE1-NEXT: retl870;871; X86-SSE2-LABEL: load_bfloat:872; X86-SSE2: # %bb.0:873; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax874; X86-SSE2-NEXT: movzwl (%eax), %eax875; X86-SSE2-NEXT: pinsrw $0, %eax, %xmm0876; X86-SSE2-NEXT: retl877;878; X86-AVX-LABEL: load_bfloat:879; X86-AVX: # %bb.0:880; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax881; X86-AVX-NEXT: movzwl (%eax), %eax882; X86-AVX-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0883; X86-AVX-NEXT: retl884;885; X86-NOSSE-LABEL: load_bfloat:886; X86-NOSSE: # %bb.0:887; X86-NOSSE-NEXT: pushl %eax888; X86-NOSSE-NEXT: .cfi_def_cfa_offset 8889; X86-NOSSE-NEXT: movl {{[0-9]+}}(%esp), %eax890; X86-NOSSE-NEXT: movzwl (%eax), %eax891; X86-NOSSE-NEXT: shll $16, %eax892; X86-NOSSE-NEXT: movl %eax, (%esp)893; X86-NOSSE-NEXT: flds (%esp)894; X86-NOSSE-NEXT: popl %eax895; X86-NOSSE-NEXT: .cfi_def_cfa_offset 4896; X86-NOSSE-NEXT: retl897;898; X64-SSE-LABEL: load_bfloat:899; X64-SSE: # %bb.0:900; X64-SSE-NEXT: movzwl (%rdi), %eax901; X64-SSE-NEXT: pinsrw $0, %eax, %xmm0902; X64-SSE-NEXT: retq903;904; X64-AVX-LABEL: load_bfloat:905; X64-AVX: # %bb.0:906; X64-AVX-NEXT: movzwl (%rdi), %eax907; X64-AVX-NEXT: vpinsrw $0, %eax, %xmm0, %xmm0908; X64-AVX-NEXT: retq909 %v = load atomic bfloat, ptr %fptr unordered, align 2910 ret bfloat %v911}912