985 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA644 5define i8 @load_acquire_i8(ptr %ptr) {6; LA32-LABEL: load_acquire_i8:7; LA32: # %bb.0:8; LA32-NEXT: ld.b $a0, $a0, 09; LA32-NEXT: dbar 2010; LA32-NEXT: ret11;12; LA64-LABEL: load_acquire_i8:13; LA64: # %bb.0:14; LA64-NEXT: ld.b $a0, $a0, 015; LA64-NEXT: dbar 2016; LA64-NEXT: ret17 %val = load atomic i8, ptr %ptr acquire, align 118 ret i8 %val19}20 21define i16 @load_acquire_i16(ptr %ptr) {22; LA32-LABEL: load_acquire_i16:23; LA32: # %bb.0:24; LA32-NEXT: ld.h $a0, $a0, 025; LA32-NEXT: dbar 2026; LA32-NEXT: ret27;28; LA64-LABEL: load_acquire_i16:29; LA64: # %bb.0:30; LA64-NEXT: ld.h $a0, $a0, 031; LA64-NEXT: dbar 2032; LA64-NEXT: ret33 %val = load atomic i16, ptr %ptr acquire, align 234 ret i16 %val35}36 37define i32 @load_acquire_i32(ptr %ptr) {38; LA32-LABEL: load_acquire_i32:39; LA32: # %bb.0:40; LA32-NEXT: ld.w $a0, $a0, 041; LA32-NEXT: dbar 2042; LA32-NEXT: ret43;44; LA64-LABEL: load_acquire_i32:45; LA64: # %bb.0:46; LA64-NEXT: ld.w $a0, $a0, 047; LA64-NEXT: dbar 2048; LA64-NEXT: ret49 %val = load atomic i32, ptr %ptr acquire, align 450 ret i32 %val51}52 53define i64 @load_acquire_i64(ptr %ptr) {54; LA32-LABEL: load_acquire_i64:55; LA32: # %bb.0:56; LA32-NEXT: addi.w $sp, $sp, -1657; LA32-NEXT: .cfi_def_cfa_offset 1658; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill59; LA32-NEXT: .cfi_offset 1, -460; LA32-NEXT: ori $a1, $zero, 261; LA32-NEXT: bl __atomic_load_862; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload63; LA32-NEXT: addi.w $sp, $sp, 1664; LA32-NEXT: ret65;66; LA64-LABEL: load_acquire_i64:67; LA64: # %bb.0:68; LA64-NEXT: ld.d $a0, $a0, 069; LA64-NEXT: dbar 2070; LA64-NEXT: ret71 %val = load atomic i64, ptr %ptr acquire, align 872 ret i64 %val73}74 75define ptr @load_acquire_ptr(ptr %ptr) {76; LA32-LABEL: load_acquire_ptr:77; LA32: # %bb.0:78; LA32-NEXT: ld.w $a0, $a0, 079; LA32-NEXT: dbar 2080; LA32-NEXT: ret81;82; LA64-LABEL: load_acquire_ptr:83; LA64: # %bb.0:84; LA64-NEXT: ld.d $a0, $a0, 085; LA64-NEXT: dbar 2086; LA64-NEXT: ret87 %val = load atomic ptr, ptr %ptr acquire, align 888 ret ptr %val89}90 91define float @load_acquire_float(ptr %ptr) {92; LA32-LABEL: load_acquire_float:93; LA32: # %bb.0:94; LA32-NEXT: ld.w $a0, $a0, 095; LA32-NEXT: movgr2fr.w $fa0, $a096; LA32-NEXT: dbar 2097; LA32-NEXT: ret98;99; LA64-LABEL: load_acquire_float:100; LA64: # %bb.0:101; LA64-NEXT: ld.w $a0, $a0, 0102; LA64-NEXT: movgr2fr.w $fa0, $a0103; LA64-NEXT: dbar 20104; LA64-NEXT: ret105 %val = load atomic float, ptr %ptr acquire, align 8106 ret float %val107}108 109define double @load_acquire_double(ptr %ptr) {110; LA32-LABEL: load_acquire_double:111; LA32: # %bb.0:112; LA32-NEXT: addi.w $sp, $sp, -16113; LA32-NEXT: .cfi_def_cfa_offset 16114; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill115; LA32-NEXT: .cfi_offset 1, -4116; LA32-NEXT: ori $a1, $zero, 2117; LA32-NEXT: bl __atomic_load_8118; LA32-NEXT: movgr2fr.w $fa0, $a0119; LA32-NEXT: movgr2frh.w $fa0, $a1120; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload121; LA32-NEXT: addi.w $sp, $sp, 16122; LA32-NEXT: ret123;124; LA64-LABEL: load_acquire_double:125; LA64: # %bb.0:126; LA64-NEXT: ld.d $a0, $a0, 0127; LA64-NEXT: movgr2fr.d $fa0, $a0128; LA64-NEXT: dbar 20129; LA64-NEXT: ret130 %val = load atomic double, ptr %ptr acquire, align 8131 ret double %val132}133 134define i8 @load_unordered_i8(ptr %ptr) {135; LA32-LABEL: load_unordered_i8:136; LA32: # %bb.0:137; LA32-NEXT: ld.b $a0, $a0, 0138; LA32-NEXT: ret139;140; LA64-LABEL: load_unordered_i8:141; LA64: # %bb.0:142; LA64-NEXT: ld.b $a0, $a0, 0143; LA64-NEXT: ret144 %val = load atomic i8, ptr %ptr unordered, align 1145 ret i8 %val146}147 148define i16 @load_unordered_i16(ptr %ptr) {149; LA32-LABEL: load_unordered_i16:150; LA32: # %bb.0:151; LA32-NEXT: ld.h $a0, $a0, 0152; LA32-NEXT: ret153;154; LA64-LABEL: load_unordered_i16:155; LA64: # %bb.0:156; LA64-NEXT: ld.h $a0, $a0, 0157; LA64-NEXT: ret158 %val = load atomic i16, ptr %ptr unordered, align 2159 ret i16 %val160}161 162define i32 @load_unordered_i32(ptr %ptr) {163; LA32-LABEL: load_unordered_i32:164; LA32: # %bb.0:165; LA32-NEXT: ld.w $a0, $a0, 0166; LA32-NEXT: ret167;168; LA64-LABEL: load_unordered_i32:169; LA64: # %bb.0:170; LA64-NEXT: ld.w $a0, $a0, 0171; LA64-NEXT: ret172 %val = load atomic i32, ptr %ptr unordered, align 4173 ret i32 %val174}175 176define i64 @load_unordered_i64(ptr %ptr) {177; LA32-LABEL: load_unordered_i64:178; LA32: # %bb.0:179; LA32-NEXT: addi.w $sp, $sp, -16180; LA32-NEXT: .cfi_def_cfa_offset 16181; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill182; LA32-NEXT: .cfi_offset 1, -4183; LA32-NEXT: move $a1, $zero184; LA32-NEXT: bl __atomic_load_8185; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload186; LA32-NEXT: addi.w $sp, $sp, 16187; LA32-NEXT: ret188;189; LA64-LABEL: load_unordered_i64:190; LA64: # %bb.0:191; LA64-NEXT: ld.d $a0, $a0, 0192; LA64-NEXT: ret193 %val = load atomic i64, ptr %ptr unordered, align 8194 ret i64 %val195}196 197define ptr @load_unordered_ptr(ptr %ptr) {198; LA32-LABEL: load_unordered_ptr:199; LA32: # %bb.0:200; LA32-NEXT: ld.w $a0, $a0, 0201; LA32-NEXT: ret202;203; LA64-LABEL: load_unordered_ptr:204; LA64: # %bb.0:205; LA64-NEXT: ld.d $a0, $a0, 0206; LA64-NEXT: ret207 %val = load atomic ptr, ptr %ptr unordered, align 8208 ret ptr %val209}210 211define float @load_unordered_float(ptr %ptr) {212; LA32-LABEL: load_unordered_float:213; LA32: # %bb.0:214; LA32-NEXT: ld.w $a0, $a0, 0215; LA32-NEXT: movgr2fr.w $fa0, $a0216; LA32-NEXT: ret217;218; LA64-LABEL: load_unordered_float:219; LA64: # %bb.0:220; LA64-NEXT: ld.w $a0, $a0, 0221; LA64-NEXT: movgr2fr.w $fa0, $a0222; LA64-NEXT: ret223 %val = load atomic float, ptr %ptr unordered, align 8224 ret float %val225}226 227define double @load_unordered_double(ptr %ptr) {228; LA32-LABEL: load_unordered_double:229; LA32: # %bb.0:230; LA32-NEXT: addi.w $sp, $sp, -16231; LA32-NEXT: .cfi_def_cfa_offset 16232; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill233; LA32-NEXT: .cfi_offset 1, -4234; LA32-NEXT: move $a1, $zero235; LA32-NEXT: bl __atomic_load_8236; LA32-NEXT: movgr2fr.w $fa0, $a0237; LA32-NEXT: movgr2frh.w $fa0, $a1238; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload239; LA32-NEXT: addi.w $sp, $sp, 16240; LA32-NEXT: ret241;242; LA64-LABEL: load_unordered_double:243; LA64: # %bb.0:244; LA64-NEXT: ld.d $a0, $a0, 0245; LA64-NEXT: movgr2fr.d $fa0, $a0246; LA64-NEXT: ret247 %val = load atomic double, ptr %ptr unordered, align 8248 ret double %val249}250 251define i8 @load_monotonic_i8(ptr %ptr) {252; LA32-LABEL: load_monotonic_i8:253; LA32: # %bb.0:254; LA32-NEXT: ld.b $a0, $a0, 0255; LA32-NEXT: ret256;257; LA64-LABEL: load_monotonic_i8:258; LA64: # %bb.0:259; LA64-NEXT: ld.b $a0, $a0, 0260; LA64-NEXT: ret261 %val = load atomic i8, ptr %ptr monotonic, align 1262 ret i8 %val263}264 265define i16 @load_monotonic_i16(ptr %ptr) {266; LA32-LABEL: load_monotonic_i16:267; LA32: # %bb.0:268; LA32-NEXT: ld.h $a0, $a0, 0269; LA32-NEXT: ret270;271; LA64-LABEL: load_monotonic_i16:272; LA64: # %bb.0:273; LA64-NEXT: ld.h $a0, $a0, 0274; LA64-NEXT: ret275 %val = load atomic i16, ptr %ptr monotonic, align 2276 ret i16 %val277}278 279define i32 @load_monotonic_i32(ptr %ptr) {280; LA32-LABEL: load_monotonic_i32:281; LA32: # %bb.0:282; LA32-NEXT: ld.w $a0, $a0, 0283; LA32-NEXT: ret284;285; LA64-LABEL: load_monotonic_i32:286; LA64: # %bb.0:287; LA64-NEXT: ld.w $a0, $a0, 0288; LA64-NEXT: ret289 %val = load atomic i32, ptr %ptr monotonic, align 4290 ret i32 %val291}292 293define i64 @load_monotonic_i64(ptr %ptr) {294; LA32-LABEL: load_monotonic_i64:295; LA32: # %bb.0:296; LA32-NEXT: addi.w $sp, $sp, -16297; LA32-NEXT: .cfi_def_cfa_offset 16298; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill299; LA32-NEXT: .cfi_offset 1, -4300; LA32-NEXT: move $a1, $zero301; LA32-NEXT: bl __atomic_load_8302; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload303; LA32-NEXT: addi.w $sp, $sp, 16304; LA32-NEXT: ret305;306; LA64-LABEL: load_monotonic_i64:307; LA64: # %bb.0:308; LA64-NEXT: ld.d $a0, $a0, 0309; LA64-NEXT: ret310 %val = load atomic i64, ptr %ptr monotonic, align 8311 ret i64 %val312}313 314define ptr @load_monotonic_ptr(ptr %ptr) {315; LA32-LABEL: load_monotonic_ptr:316; LA32: # %bb.0:317; LA32-NEXT: ld.w $a0, $a0, 0318; LA32-NEXT: ret319;320; LA64-LABEL: load_monotonic_ptr:321; LA64: # %bb.0:322; LA64-NEXT: ld.d $a0, $a0, 0323; LA64-NEXT: ret324 %val = load atomic ptr, ptr %ptr monotonic, align 8325 ret ptr %val326}327 328define float @load_monotonic_float(ptr %ptr) {329; LA32-LABEL: load_monotonic_float:330; LA32: # %bb.0:331; LA32-NEXT: ld.w $a0, $a0, 0332; LA32-NEXT: movgr2fr.w $fa0, $a0333; LA32-NEXT: ret334;335; LA64-LABEL: load_monotonic_float:336; LA64: # %bb.0:337; LA64-NEXT: ld.w $a0, $a0, 0338; LA64-NEXT: movgr2fr.w $fa0, $a0339; LA64-NEXT: ret340 %val = load atomic float, ptr %ptr monotonic, align 8341 ret float %val342}343 344define double @load_monotonic_double(ptr %ptr) {345; LA32-LABEL: load_monotonic_double:346; LA32: # %bb.0:347; LA32-NEXT: addi.w $sp, $sp, -16348; LA32-NEXT: .cfi_def_cfa_offset 16349; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill350; LA32-NEXT: .cfi_offset 1, -4351; LA32-NEXT: move $a1, $zero352; LA32-NEXT: bl __atomic_load_8353; LA32-NEXT: movgr2fr.w $fa0, $a0354; LA32-NEXT: movgr2frh.w $fa0, $a1355; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload356; LA32-NEXT: addi.w $sp, $sp, 16357; LA32-NEXT: ret358;359; LA64-LABEL: load_monotonic_double:360; LA64: # %bb.0:361; LA64-NEXT: ld.d $a0, $a0, 0362; LA64-NEXT: movgr2fr.d $fa0, $a0363; LA64-NEXT: ret364 %val = load atomic double, ptr %ptr monotonic, align 8365 ret double %val366}367 368define i8 @load_seq_cst_i8(ptr %ptr) {369; LA32-LABEL: load_seq_cst_i8:370; LA32: # %bb.0:371; LA32-NEXT: ld.b $a0, $a0, 0372; LA32-NEXT: dbar 16373; LA32-NEXT: ret374;375; LA64-LABEL: load_seq_cst_i8:376; LA64: # %bb.0:377; LA64-NEXT: ld.b $a0, $a0, 0378; LA64-NEXT: dbar 16379; LA64-NEXT: ret380 %val = load atomic i8, ptr %ptr seq_cst, align 1381 ret i8 %val382}383 384define i16 @load_seq_cst_i16(ptr %ptr) {385; LA32-LABEL: load_seq_cst_i16:386; LA32: # %bb.0:387; LA32-NEXT: ld.h $a0, $a0, 0388; LA32-NEXT: dbar 16389; LA32-NEXT: ret390;391; LA64-LABEL: load_seq_cst_i16:392; LA64: # %bb.0:393; LA64-NEXT: ld.h $a0, $a0, 0394; LA64-NEXT: dbar 16395; LA64-NEXT: ret396 %val = load atomic i16, ptr %ptr seq_cst, align 2397 ret i16 %val398}399 400define i32 @load_seq_cst_i32(ptr %ptr) {401; LA32-LABEL: load_seq_cst_i32:402; LA32: # %bb.0:403; LA32-NEXT: ld.w $a0, $a0, 0404; LA32-NEXT: dbar 16405; LA32-NEXT: ret406;407; LA64-LABEL: load_seq_cst_i32:408; LA64: # %bb.0:409; LA64-NEXT: ld.w $a0, $a0, 0410; LA64-NEXT: dbar 16411; LA64-NEXT: ret412 %val = load atomic i32, ptr %ptr seq_cst, align 4413 ret i32 %val414}415 416define i64 @load_seq_cst_i64(ptr %ptr) {417; LA32-LABEL: load_seq_cst_i64:418; LA32: # %bb.0:419; LA32-NEXT: addi.w $sp, $sp, -16420; LA32-NEXT: .cfi_def_cfa_offset 16421; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill422; LA32-NEXT: .cfi_offset 1, -4423; LA32-NEXT: ori $a1, $zero, 5424; LA32-NEXT: bl __atomic_load_8425; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload426; LA32-NEXT: addi.w $sp, $sp, 16427; LA32-NEXT: ret428;429; LA64-LABEL: load_seq_cst_i64:430; LA64: # %bb.0:431; LA64-NEXT: ld.d $a0, $a0, 0432; LA64-NEXT: dbar 16433; LA64-NEXT: ret434 %val = load atomic i64, ptr %ptr seq_cst, align 8435 ret i64 %val436}437 438define ptr @load_seq_cst_ptr(ptr %ptr) {439; LA32-LABEL: load_seq_cst_ptr:440; LA32: # %bb.0:441; LA32-NEXT: ld.w $a0, $a0, 0442; LA32-NEXT: dbar 16443; LA32-NEXT: ret444;445; LA64-LABEL: load_seq_cst_ptr:446; LA64: # %bb.0:447; LA64-NEXT: ld.d $a0, $a0, 0448; LA64-NEXT: dbar 16449; LA64-NEXT: ret450 %val = load atomic ptr, ptr %ptr seq_cst, align 8451 ret ptr %val452}453 454define float @load_seq_cst_float(ptr %ptr) {455; LA32-LABEL: load_seq_cst_float:456; LA32: # %bb.0:457; LA32-NEXT: ld.w $a0, $a0, 0458; LA32-NEXT: movgr2fr.w $fa0, $a0459; LA32-NEXT: dbar 16460; LA32-NEXT: ret461;462; LA64-LABEL: load_seq_cst_float:463; LA64: # %bb.0:464; LA64-NEXT: ld.w $a0, $a0, 0465; LA64-NEXT: movgr2fr.w $fa0, $a0466; LA64-NEXT: dbar 16467; LA64-NEXT: ret468 %val = load atomic float, ptr %ptr seq_cst, align 8469 ret float %val470}471 472define double @load_seq_cst_double(ptr %ptr) {473; LA32-LABEL: load_seq_cst_double:474; LA32: # %bb.0:475; LA32-NEXT: addi.w $sp, $sp, -16476; LA32-NEXT: .cfi_def_cfa_offset 16477; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill478; LA32-NEXT: .cfi_offset 1, -4479; LA32-NEXT: ori $a1, $zero, 5480; LA32-NEXT: bl __atomic_load_8481; LA32-NEXT: movgr2fr.w $fa0, $a0482; LA32-NEXT: movgr2frh.w $fa0, $a1483; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload484; LA32-NEXT: addi.w $sp, $sp, 16485; LA32-NEXT: ret486;487; LA64-LABEL: load_seq_cst_double:488; LA64: # %bb.0:489; LA64-NEXT: ld.d $a0, $a0, 0490; LA64-NEXT: movgr2fr.d $fa0, $a0491; LA64-NEXT: dbar 16492; LA64-NEXT: ret493 %val = load atomic double, ptr %ptr seq_cst, align 8494 ret double %val495}496 497define void @store_release_i8(ptr %ptr, i8 signext %v) {498; LA32-LABEL: store_release_i8:499; LA32: # %bb.0:500; LA32-NEXT: dbar 18501; LA32-NEXT: st.b $a1, $a0, 0502; LA32-NEXT: ret503;504; LA64-LABEL: store_release_i8:505; LA64: # %bb.0:506; LA64-NEXT: dbar 18507; LA64-NEXT: st.b $a1, $a0, 0508; LA64-NEXT: ret509 store atomic i8 %v, ptr %ptr release, align 1510 ret void511}512 513define void @store_release_i16(ptr %ptr, i16 signext %v) {514; LA32-LABEL: store_release_i16:515; LA32: # %bb.0:516; LA32-NEXT: dbar 18517; LA32-NEXT: st.h $a1, $a0, 0518; LA32-NEXT: ret519;520; LA64-LABEL: store_release_i16:521; LA64: # %bb.0:522; LA64-NEXT: dbar 18523; LA64-NEXT: st.h $a1, $a0, 0524; LA64-NEXT: ret525 store atomic i16 %v, ptr %ptr release, align 2526 ret void527}528 529define void @store_release_i32(ptr %ptr, i32 signext %v) {530; LA32-LABEL: store_release_i32:531; LA32: # %bb.0:532; LA32-NEXT: dbar 18533; LA32-NEXT: st.w $a1, $a0, 0534; LA32-NEXT: ret535;536; LA64-LABEL: store_release_i32:537; LA64: # %bb.0:538; LA64-NEXT: amswap_db.w $zero, $a1, $a0539; LA64-NEXT: ret540 store atomic i32 %v, ptr %ptr release, align 4541 ret void542}543 544define void @store_release_i64(ptr %ptr, i64 %v) {545; LA32-LABEL: store_release_i64:546; LA32: # %bb.0:547; LA32-NEXT: addi.w $sp, $sp, -16548; LA32-NEXT: .cfi_def_cfa_offset 16549; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill550; LA32-NEXT: .cfi_offset 1, -4551; LA32-NEXT: ori $a3, $zero, 3552; LA32-NEXT: bl __atomic_store_8553; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload554; LA32-NEXT: addi.w $sp, $sp, 16555; LA32-NEXT: ret556;557; LA64-LABEL: store_release_i64:558; LA64: # %bb.0:559; LA64-NEXT: amswap_db.d $zero, $a1, $a0560; LA64-NEXT: ret561 store atomic i64 %v, ptr %ptr release, align 8562 ret void563}564 565define void @store_release_ptr(ptr %ptr, ptr %v) {566; LA32-LABEL: store_release_ptr:567; LA32: # %bb.0:568; LA32-NEXT: dbar 18569; LA32-NEXT: st.w $a1, $a0, 0570; LA32-NEXT: ret571;572; LA64-LABEL: store_release_ptr:573; LA64: # %bb.0:574; LA64-NEXT: amswap_db.d $zero, $a1, $a0575; LA64-NEXT: ret576 store atomic ptr %v, ptr %ptr release, align 8577 ret void578}579 580define void @store_release_float(ptr %ptr, float %v) {581; LA32-LABEL: store_release_float:582; LA32: # %bb.0:583; LA32-NEXT: movfr2gr.s $a1, $fa0584; LA32-NEXT: dbar 18585; LA32-NEXT: st.w $a1, $a0, 0586; LA32-NEXT: ret587;588; LA64-LABEL: store_release_float:589; LA64: # %bb.0:590; LA64-NEXT: movfr2gr.s $a1, $fa0591; LA64-NEXT: amswap_db.w $zero, $a1, $a0592; LA64-NEXT: ret593 store atomic float %v, ptr %ptr release, align 8594 ret void595}596 597define void @store_release_double(ptr %ptr, double %v) {598; LA32-LABEL: store_release_double:599; LA32: # %bb.0:600; LA32-NEXT: addi.w $sp, $sp, -16601; LA32-NEXT: .cfi_def_cfa_offset 16602; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill603; LA32-NEXT: .cfi_offset 1, -4604; LA32-NEXT: movfr2gr.s $a1, $fa0605; LA32-NEXT: movfrh2gr.s $a2, $fa0606; LA32-NEXT: ori $a3, $zero, 3607; LA32-NEXT: bl __atomic_store_8608; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload609; LA32-NEXT: addi.w $sp, $sp, 16610; LA32-NEXT: ret611;612; LA64-LABEL: store_release_double:613; LA64: # %bb.0:614; LA64-NEXT: movfr2gr.d $a1, $fa0615; LA64-NEXT: amswap_db.d $zero, $a1, $a0616; LA64-NEXT: ret617 store atomic double %v, ptr %ptr release, align 8618 ret void619}620 621define void @store_unordered_i8(ptr %ptr, i8 signext %v) {622; LA32-LABEL: store_unordered_i8:623; LA32: # %bb.0:624; LA32-NEXT: st.b $a1, $a0, 0625; LA32-NEXT: ret626;627; LA64-LABEL: store_unordered_i8:628; LA64: # %bb.0:629; LA64-NEXT: st.b $a1, $a0, 0630; LA64-NEXT: ret631 store atomic i8 %v, ptr %ptr unordered, align 1632 ret void633}634 635define void @store_unordered_i16(ptr %ptr, i16 signext %v) {636; LA32-LABEL: store_unordered_i16:637; LA32: # %bb.0:638; LA32-NEXT: st.h $a1, $a0, 0639; LA32-NEXT: ret640;641; LA64-LABEL: store_unordered_i16:642; LA64: # %bb.0:643; LA64-NEXT: st.h $a1, $a0, 0644; LA64-NEXT: ret645 store atomic i16 %v, ptr %ptr unordered, align 2646 ret void647}648 649define void @store_unordered_i32(ptr %ptr, i32 signext %v) {650; LA32-LABEL: store_unordered_i32:651; LA32: # %bb.0:652; LA32-NEXT: st.w $a1, $a0, 0653; LA32-NEXT: ret654;655; LA64-LABEL: store_unordered_i32:656; LA64: # %bb.0:657; LA64-NEXT: st.w $a1, $a0, 0658; LA64-NEXT: ret659 store atomic i32 %v, ptr %ptr unordered, align 4660 ret void661}662 663define void @store_unordered_i64(ptr %ptr, i64 %v) {664; LA32-LABEL: store_unordered_i64:665; LA32: # %bb.0:666; LA32-NEXT: addi.w $sp, $sp, -16667; LA32-NEXT: .cfi_def_cfa_offset 16668; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill669; LA32-NEXT: .cfi_offset 1, -4670; LA32-NEXT: move $a3, $zero671; LA32-NEXT: bl __atomic_store_8672; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload673; LA32-NEXT: addi.w $sp, $sp, 16674; LA32-NEXT: ret675;676; LA64-LABEL: store_unordered_i64:677; LA64: # %bb.0:678; LA64-NEXT: st.d $a1, $a0, 0679; LA64-NEXT: ret680 store atomic i64 %v, ptr %ptr unordered, align 8681 ret void682}683 684define void @store_unordered_ptr(ptr %ptr, ptr %v) {685; LA32-LABEL: store_unordered_ptr:686; LA32: # %bb.0:687; LA32-NEXT: st.w $a1, $a0, 0688; LA32-NEXT: ret689;690; LA64-LABEL: store_unordered_ptr:691; LA64: # %bb.0:692; LA64-NEXT: st.d $a1, $a0, 0693; LA64-NEXT: ret694 store atomic ptr %v, ptr %ptr unordered, align 8695 ret void696}697 698define void @store_unordered_float(ptr %ptr, float %v) {699; LA32-LABEL: store_unordered_float:700; LA32: # %bb.0:701; LA32-NEXT: movfr2gr.s $a1, $fa0702; LA32-NEXT: st.w $a1, $a0, 0703; LA32-NEXT: ret704;705; LA64-LABEL: store_unordered_float:706; LA64: # %bb.0:707; LA64-NEXT: movfr2gr.s $a1, $fa0708; LA64-NEXT: st.w $a1, $a0, 0709; LA64-NEXT: ret710 store atomic float %v, ptr %ptr unordered, align 8711 ret void712}713 714define void @store_unordered_double(ptr %ptr, double %v) {715; LA32-LABEL: store_unordered_double:716; LA32: # %bb.0:717; LA32-NEXT: addi.w $sp, $sp, -16718; LA32-NEXT: .cfi_def_cfa_offset 16719; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill720; LA32-NEXT: .cfi_offset 1, -4721; LA32-NEXT: movfr2gr.s $a1, $fa0722; LA32-NEXT: movfrh2gr.s $a2, $fa0723; LA32-NEXT: move $a3, $zero724; LA32-NEXT: bl __atomic_store_8725; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload726; LA32-NEXT: addi.w $sp, $sp, 16727; LA32-NEXT: ret728;729; LA64-LABEL: store_unordered_double:730; LA64: # %bb.0:731; LA64-NEXT: movfr2gr.d $a1, $fa0732; LA64-NEXT: st.d $a1, $a0, 0733; LA64-NEXT: ret734 store atomic double %v, ptr %ptr unordered, align 8735 ret void736}737 738define void @store_monotonic_i8(ptr %ptr, i8 signext %v) {739; LA32-LABEL: store_monotonic_i8:740; LA32: # %bb.0:741; LA32-NEXT: st.b $a1, $a0, 0742; LA32-NEXT: ret743;744; LA64-LABEL: store_monotonic_i8:745; LA64: # %bb.0:746; LA64-NEXT: st.b $a1, $a0, 0747; LA64-NEXT: ret748 store atomic i8 %v, ptr %ptr monotonic, align 1749 ret void750}751 752define void @store_monotonic_i16(ptr %ptr, i16 signext %v) {753; LA32-LABEL: store_monotonic_i16:754; LA32: # %bb.0:755; LA32-NEXT: st.h $a1, $a0, 0756; LA32-NEXT: ret757;758; LA64-LABEL: store_monotonic_i16:759; LA64: # %bb.0:760; LA64-NEXT: st.h $a1, $a0, 0761; LA64-NEXT: ret762 store atomic i16 %v, ptr %ptr monotonic, align 2763 ret void764}765 766define void @store_monotonic_i32(ptr %ptr, i32 signext %v) {767; LA32-LABEL: store_monotonic_i32:768; LA32: # %bb.0:769; LA32-NEXT: st.w $a1, $a0, 0770; LA32-NEXT: ret771;772; LA64-LABEL: store_monotonic_i32:773; LA64: # %bb.0:774; LA64-NEXT: st.w $a1, $a0, 0775; LA64-NEXT: ret776 store atomic i32 %v, ptr %ptr monotonic, align 4777 ret void778}779 780define void @store_monotonic_i64(ptr %ptr, i64 %v) {781; LA32-LABEL: store_monotonic_i64:782; LA32: # %bb.0:783; LA32-NEXT: addi.w $sp, $sp, -16784; LA32-NEXT: .cfi_def_cfa_offset 16785; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill786; LA32-NEXT: .cfi_offset 1, -4787; LA32-NEXT: move $a3, $zero788; LA32-NEXT: bl __atomic_store_8789; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload790; LA32-NEXT: addi.w $sp, $sp, 16791; LA32-NEXT: ret792;793; LA64-LABEL: store_monotonic_i64:794; LA64: # %bb.0:795; LA64-NEXT: st.d $a1, $a0, 0796; LA64-NEXT: ret797 store atomic i64 %v, ptr %ptr monotonic, align 8798 ret void799}800 801define void @store_monotonic_ptr(ptr %ptr, ptr %v) {802; LA32-LABEL: store_monotonic_ptr:803; LA32: # %bb.0:804; LA32-NEXT: st.w $a1, $a0, 0805; LA32-NEXT: ret806;807; LA64-LABEL: store_monotonic_ptr:808; LA64: # %bb.0:809; LA64-NEXT: st.d $a1, $a0, 0810; LA64-NEXT: ret811 store atomic ptr %v, ptr %ptr monotonic, align 8812 ret void813}814 815define void @store_monotonic_float(ptr %ptr, float %v) {816; LA32-LABEL: store_monotonic_float:817; LA32: # %bb.0:818; LA32-NEXT: movfr2gr.s $a1, $fa0819; LA32-NEXT: st.w $a1, $a0, 0820; LA32-NEXT: ret821;822; LA64-LABEL: store_monotonic_float:823; LA64: # %bb.0:824; LA64-NEXT: movfr2gr.s $a1, $fa0825; LA64-NEXT: st.w $a1, $a0, 0826; LA64-NEXT: ret827 store atomic float %v, ptr %ptr monotonic, align 8828 ret void829}830 831define void @store_monotonic_double(ptr %ptr, double %v) {832; LA32-LABEL: store_monotonic_double:833; LA32: # %bb.0:834; LA32-NEXT: addi.w $sp, $sp, -16835; LA32-NEXT: .cfi_def_cfa_offset 16836; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill837; LA32-NEXT: .cfi_offset 1, -4838; LA32-NEXT: movfr2gr.s $a1, $fa0839; LA32-NEXT: movfrh2gr.s $a2, $fa0840; LA32-NEXT: move $a3, $zero841; LA32-NEXT: bl __atomic_store_8842; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload843; LA32-NEXT: addi.w $sp, $sp, 16844; LA32-NEXT: ret845;846; LA64-LABEL: store_monotonic_double:847; LA64: # %bb.0:848; LA64-NEXT: movfr2gr.d $a1, $fa0849; LA64-NEXT: st.d $a1, $a0, 0850; LA64-NEXT: ret851 store atomic double %v, ptr %ptr monotonic, align 8852 ret void853}854 855define void @store_seq_cst_i8(ptr %ptr, i8 signext %v) {856; LA32-LABEL: store_seq_cst_i8:857; LA32: # %bb.0:858; LA32-NEXT: dbar 16859; LA32-NEXT: st.b $a1, $a0, 0860; LA32-NEXT: dbar 16861; LA32-NEXT: ret862;863; LA64-LABEL: store_seq_cst_i8:864; LA64: # %bb.0:865; LA64-NEXT: dbar 16866; LA64-NEXT: st.b $a1, $a0, 0867; LA64-NEXT: dbar 16868; LA64-NEXT: ret869 store atomic i8 %v, ptr %ptr seq_cst, align 1870 ret void871}872 873define void @store_seq_cst_i16(ptr %ptr, i16 signext %v) {874; LA32-LABEL: store_seq_cst_i16:875; LA32: # %bb.0:876; LA32-NEXT: dbar 16877; LA32-NEXT: st.h $a1, $a0, 0878; LA32-NEXT: dbar 16879; LA32-NEXT: ret880;881; LA64-LABEL: store_seq_cst_i16:882; LA64: # %bb.0:883; LA64-NEXT: dbar 16884; LA64-NEXT: st.h $a1, $a0, 0885; LA64-NEXT: dbar 16886; LA64-NEXT: ret887 store atomic i16 %v, ptr %ptr seq_cst, align 2888 ret void889}890 891define void @store_seq_cst_i32(ptr %ptr, i32 signext %v) {892; LA32-LABEL: store_seq_cst_i32:893; LA32: # %bb.0:894; LA32-NEXT: dbar 16895; LA32-NEXT: st.w $a1, $a0, 0896; LA32-NEXT: dbar 16897; LA32-NEXT: ret898;899; LA64-LABEL: store_seq_cst_i32:900; LA64: # %bb.0:901; LA64-NEXT: amswap_db.w $zero, $a1, $a0902; LA64-NEXT: ret903 store atomic i32 %v, ptr %ptr seq_cst, align 4904 ret void905}906 907define void @store_seq_cst_i64(ptr %ptr, i64 %v) {908; LA32-LABEL: store_seq_cst_i64:909; LA32: # %bb.0:910; LA32-NEXT: addi.w $sp, $sp, -16911; LA32-NEXT: .cfi_def_cfa_offset 16912; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill913; LA32-NEXT: .cfi_offset 1, -4914; LA32-NEXT: ori $a3, $zero, 5915; LA32-NEXT: bl __atomic_store_8916; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload917; LA32-NEXT: addi.w $sp, $sp, 16918; LA32-NEXT: ret919;920; LA64-LABEL: store_seq_cst_i64:921; LA64: # %bb.0:922; LA64-NEXT: amswap_db.d $zero, $a1, $a0923; LA64-NEXT: ret924 store atomic i64 %v, ptr %ptr seq_cst, align 8925 ret void926}927 928define void @store_seq_cst_ptr(ptr %ptr, ptr %v) {929; LA32-LABEL: store_seq_cst_ptr:930; LA32: # %bb.0:931; LA32-NEXT: dbar 16932; LA32-NEXT: st.w $a1, $a0, 0933; LA32-NEXT: dbar 16934; LA32-NEXT: ret935;936; LA64-LABEL: store_seq_cst_ptr:937; LA64: # %bb.0:938; LA64-NEXT: amswap_db.d $zero, $a1, $a0939; LA64-NEXT: ret940 store atomic ptr %v, ptr %ptr seq_cst, align 8941 ret void942}943 944define void @store_seq_cst_float(ptr %ptr, float %v) {945; LA32-LABEL: store_seq_cst_float:946; LA32: # %bb.0:947; LA32-NEXT: movfr2gr.s $a1, $fa0948; LA32-NEXT: dbar 16949; LA32-NEXT: st.w $a1, $a0, 0950; LA32-NEXT: dbar 16951; LA32-NEXT: ret952;953; LA64-LABEL: store_seq_cst_float:954; LA64: # %bb.0:955; LA64-NEXT: movfr2gr.s $a1, $fa0956; LA64-NEXT: amswap_db.w $zero, $a1, $a0957; LA64-NEXT: ret958 store atomic float %v, ptr %ptr seq_cst, align 8959 ret void960}961 962define void @store_seq_cst_double(ptr %ptr, double %v) {963; LA32-LABEL: store_seq_cst_double:964; LA32: # %bb.0:965; LA32-NEXT: addi.w $sp, $sp, -16966; LA32-NEXT: .cfi_def_cfa_offset 16967; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill968; LA32-NEXT: .cfi_offset 1, -4969; LA32-NEXT: movfr2gr.s $a1, $fa0970; LA32-NEXT: movfrh2gr.s $a2, $fa0971; LA32-NEXT: ori $a3, $zero, 5972; LA32-NEXT: bl __atomic_store_8973; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload974; LA32-NEXT: addi.w $sp, $sp, 16975; LA32-NEXT: ret976;977; LA64-LABEL: store_seq_cst_double:978; LA64: # %bb.0:979; LA64-NEXT: movfr2gr.d $a1, $fa0980; LA64-NEXT: amswap_db.d $zero, $a1, $a0981; LA64-NEXT: ret982 store atomic double %v, ptr %ptr seq_cst, align 8983 ret void984}985