1275 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=RV32I %s4; RUN: llc -mtriple=riscv32 -mattr=+a,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-WMO %s6; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-TSO %s8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefix=RV64I %s10; RUN: llc -mtriple=riscv64 -mattr=+a,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \11; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO %s12; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+no-trailing-seq-cst-fence -verify-machineinstrs < %s \13; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO %s14 15 16; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \17; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-WMO-TRAILING-FENCE %s18; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \19; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-TSO-TRAILING-FENCE %s20 21; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \22; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO-TRAILING-FENCE %s23; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \24; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO-TRAILING-FENCE %s25 26; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-zalasr -verify-machineinstrs < %s \27; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZALASR,RV32IA-ZALASR-WMO %s28; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-zalasr,+ztso -verify-machineinstrs < %s \29; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZALASR,RV32IA-ZALASR-TSO %s30 31; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-zalasr -verify-machineinstrs < %s \32; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZALASR,RV64IA-ZALASR-WMO %s33; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-zalasr,+ztso -verify-machineinstrs < %s \34; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZALASR,RV64IA-ZALASR-TSO %s35 36define zeroext i1 @atomic_load_i1_unordered(ptr %a) nounwind {37; RV32I-LABEL: atomic_load_i1_unordered:38; RV32I: # %bb.0:39; RV32I-NEXT: addi sp, sp, -1640; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill41; RV32I-NEXT: li a1, 042; RV32I-NEXT: call __atomic_load_143; RV32I-NEXT: andi a0, a0, 144; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload45; RV32I-NEXT: addi sp, sp, 1646; RV32I-NEXT: ret47;48; RV32IA-LABEL: atomic_load_i1_unordered:49; RV32IA: # %bb.0:50; RV32IA-NEXT: lb a0, 0(a0)51; RV32IA-NEXT: ret52;53; RV64I-LABEL: atomic_load_i1_unordered:54; RV64I: # %bb.0:55; RV64I-NEXT: addi sp, sp, -1656; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill57; RV64I-NEXT: li a1, 058; RV64I-NEXT: call __atomic_load_159; RV64I-NEXT: andi a0, a0, 160; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload61; RV64I-NEXT: addi sp, sp, 1662; RV64I-NEXT: ret63;64; RV64IA-LABEL: atomic_load_i1_unordered:65; RV64IA: # %bb.0:66; RV64IA-NEXT: lb a0, 0(a0)67; RV64IA-NEXT: ret68 %1 = load atomic i8, ptr %a unordered, align 1, !range !0, !noundef !169 %2 = trunc nuw i8 %1 to i170 ret i1 %271}72 73define zeroext i1 @atomic_load_i1_monotonic(ptr %a) nounwind {74; RV32I-LABEL: atomic_load_i1_monotonic:75; RV32I: # %bb.0:76; RV32I-NEXT: addi sp, sp, -1677; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill78; RV32I-NEXT: li a1, 079; RV32I-NEXT: call __atomic_load_180; RV32I-NEXT: andi a0, a0, 181; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload82; RV32I-NEXT: addi sp, sp, 1683; RV32I-NEXT: ret84;85; RV32IA-LABEL: atomic_load_i1_monotonic:86; RV32IA: # %bb.0:87; RV32IA-NEXT: lb a0, 0(a0)88; RV32IA-NEXT: ret89;90; RV64I-LABEL: atomic_load_i1_monotonic:91; RV64I: # %bb.0:92; RV64I-NEXT: addi sp, sp, -1693; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill94; RV64I-NEXT: li a1, 095; RV64I-NEXT: call __atomic_load_196; RV64I-NEXT: andi a0, a0, 197; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload98; RV64I-NEXT: addi sp, sp, 1699; RV64I-NEXT: ret100;101; RV64IA-LABEL: atomic_load_i1_monotonic:102; RV64IA: # %bb.0:103; RV64IA-NEXT: lb a0, 0(a0)104; RV64IA-NEXT: ret105 %1 = load atomic i8, ptr %a monotonic, align 1, !range !0, !noundef !1106 %2 = trunc nuw i8 %1 to i1107 ret i1 %2108}109 110define zeroext i1 @atomic_load_i1_acquire(ptr %a) nounwind {111; RV32I-LABEL: atomic_load_i1_acquire:112; RV32I: # %bb.0:113; RV32I-NEXT: addi sp, sp, -16114; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill115; RV32I-NEXT: li a1, 2116; RV32I-NEXT: call __atomic_load_1117; RV32I-NEXT: andi a0, a0, 1118; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload119; RV32I-NEXT: addi sp, sp, 16120; RV32I-NEXT: ret121;122; RV32IA-WMO-LABEL: atomic_load_i1_acquire:123; RV32IA-WMO: # %bb.0:124; RV32IA-WMO-NEXT: lb a0, 0(a0)125; RV32IA-WMO-NEXT: fence r, rw126; RV32IA-WMO-NEXT: ret127;128; RV32IA-TSO-LABEL: atomic_load_i1_acquire:129; RV32IA-TSO: # %bb.0:130; RV32IA-TSO-NEXT: lb a0, 0(a0)131; RV32IA-TSO-NEXT: ret132;133; RV64I-LABEL: atomic_load_i1_acquire:134; RV64I: # %bb.0:135; RV64I-NEXT: addi sp, sp, -16136; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill137; RV64I-NEXT: li a1, 2138; RV64I-NEXT: call __atomic_load_1139; RV64I-NEXT: andi a0, a0, 1140; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload141; RV64I-NEXT: addi sp, sp, 16142; RV64I-NEXT: ret143;144; RV64IA-WMO-LABEL: atomic_load_i1_acquire:145; RV64IA-WMO: # %bb.0:146; RV64IA-WMO-NEXT: lb a0, 0(a0)147; RV64IA-WMO-NEXT: fence r, rw148; RV64IA-WMO-NEXT: ret149;150; RV64IA-TSO-LABEL: atomic_load_i1_acquire:151; RV64IA-TSO: # %bb.0:152; RV64IA-TSO-NEXT: lb a0, 0(a0)153; RV64IA-TSO-NEXT: ret154;155; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i1_acquire:156; RV32IA-WMO-TRAILING-FENCE: # %bb.0:157; RV32IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)158; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw159; RV32IA-WMO-TRAILING-FENCE-NEXT: ret160;161; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i1_acquire:162; RV32IA-TSO-TRAILING-FENCE: # %bb.0:163; RV32IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)164; RV32IA-TSO-TRAILING-FENCE-NEXT: ret165;166; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i1_acquire:167; RV64IA-WMO-TRAILING-FENCE: # %bb.0:168; RV64IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)169; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw170; RV64IA-WMO-TRAILING-FENCE-NEXT: ret171;172; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i1_acquire:173; RV64IA-TSO-TRAILING-FENCE: # %bb.0:174; RV64IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)175; RV64IA-TSO-TRAILING-FENCE-NEXT: ret176;177; RV32IA-ZALASR-WMO-LABEL: atomic_load_i1_acquire:178; RV32IA-ZALASR-WMO: # %bb.0:179; RV32IA-ZALASR-WMO-NEXT: lb.aq a0, (a0)180; RV32IA-ZALASR-WMO-NEXT: ret181;182; RV32IA-ZALASR-TSO-LABEL: atomic_load_i1_acquire:183; RV32IA-ZALASR-TSO: # %bb.0:184; RV32IA-ZALASR-TSO-NEXT: lb a0, 0(a0)185; RV32IA-ZALASR-TSO-NEXT: ret186;187; RV64IA-ZALASR-WMO-LABEL: atomic_load_i1_acquire:188; RV64IA-ZALASR-WMO: # %bb.0:189; RV64IA-ZALASR-WMO-NEXT: lb.aq a0, (a0)190; RV64IA-ZALASR-WMO-NEXT: ret191;192; RV64IA-ZALASR-TSO-LABEL: atomic_load_i1_acquire:193; RV64IA-ZALASR-TSO: # %bb.0:194; RV64IA-ZALASR-TSO-NEXT: lb a0, 0(a0)195; RV64IA-ZALASR-TSO-NEXT: ret196 %1 = load atomic i8, ptr %a acquire, align 1, !range !0, !noundef !1197 %2 = trunc nuw i8 %1 to i1198 ret i1 %2199}200 201define zeroext i1 @atomic_load_i1_seq_cst(ptr %a) nounwind {202; RV32I-LABEL: atomic_load_i1_seq_cst:203; RV32I: # %bb.0:204; RV32I-NEXT: addi sp, sp, -16205; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill206; RV32I-NEXT: li a1, 5207; RV32I-NEXT: call __atomic_load_1208; RV32I-NEXT: andi a0, a0, 1209; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload210; RV32I-NEXT: addi sp, sp, 16211; RV32I-NEXT: ret212;213; RV32IA-WMO-LABEL: atomic_load_i1_seq_cst:214; RV32IA-WMO: # %bb.0:215; RV32IA-WMO-NEXT: fence rw, rw216; RV32IA-WMO-NEXT: lb a0, 0(a0)217; RV32IA-WMO-NEXT: fence r, rw218; RV32IA-WMO-NEXT: ret219;220; RV32IA-TSO-LABEL: atomic_load_i1_seq_cst:221; RV32IA-TSO: # %bb.0:222; RV32IA-TSO-NEXT: fence rw, rw223; RV32IA-TSO-NEXT: lb a0, 0(a0)224; RV32IA-TSO-NEXT: ret225;226; RV64I-LABEL: atomic_load_i1_seq_cst:227; RV64I: # %bb.0:228; RV64I-NEXT: addi sp, sp, -16229; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill230; RV64I-NEXT: li a1, 5231; RV64I-NEXT: call __atomic_load_1232; RV64I-NEXT: andi a0, a0, 1233; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload234; RV64I-NEXT: addi sp, sp, 16235; RV64I-NEXT: ret236;237; RV64IA-WMO-LABEL: atomic_load_i1_seq_cst:238; RV64IA-WMO: # %bb.0:239; RV64IA-WMO-NEXT: fence rw, rw240; RV64IA-WMO-NEXT: lb a0, 0(a0)241; RV64IA-WMO-NEXT: fence r, rw242; RV64IA-WMO-NEXT: ret243;244; RV64IA-TSO-LABEL: atomic_load_i1_seq_cst:245; RV64IA-TSO: # %bb.0:246; RV64IA-TSO-NEXT: fence rw, rw247; RV64IA-TSO-NEXT: lb a0, 0(a0)248; RV64IA-TSO-NEXT: ret249;250; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i1_seq_cst:251; RV32IA-WMO-TRAILING-FENCE: # %bb.0:252; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw253; RV32IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)254; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw255; RV32IA-WMO-TRAILING-FENCE-NEXT: ret256;257; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i1_seq_cst:258; RV32IA-TSO-TRAILING-FENCE: # %bb.0:259; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw260; RV32IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)261; RV32IA-TSO-TRAILING-FENCE-NEXT: ret262;263; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i1_seq_cst:264; RV64IA-WMO-TRAILING-FENCE: # %bb.0:265; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw266; RV64IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)267; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw268; RV64IA-WMO-TRAILING-FENCE-NEXT: ret269;270; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i1_seq_cst:271; RV64IA-TSO-TRAILING-FENCE: # %bb.0:272; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw273; RV64IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)274; RV64IA-TSO-TRAILING-FENCE-NEXT: ret275;276; RV32IA-ZALASR-LABEL: atomic_load_i1_seq_cst:277; RV32IA-ZALASR: # %bb.0:278; RV32IA-ZALASR-NEXT: lb.aq a0, (a0)279; RV32IA-ZALASR-NEXT: ret280;281; RV64IA-ZALASR-LABEL: atomic_load_i1_seq_cst:282; RV64IA-ZALASR: # %bb.0:283; RV64IA-ZALASR-NEXT: lb.aq a0, (a0)284; RV64IA-ZALASR-NEXT: ret285 %1 = load atomic i8, ptr %a seq_cst, align 1, !range !0, !noundef !1286 %2 = trunc nuw i8 %1 to i1287 ret i1 %2288}289 290define zeroext i8 @atomic_load_i8_unordered(ptr %a) nounwind {291; RV32I-LABEL: atomic_load_i8_unordered:292; RV32I: # %bb.0:293; RV32I-NEXT: addi sp, sp, -16294; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill295; RV32I-NEXT: li a1, 0296; RV32I-NEXT: call __atomic_load_1297; RV32I-NEXT: zext.b a0, a0298; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload299; RV32I-NEXT: addi sp, sp, 16300; RV32I-NEXT: ret301;302; RV32IA-LABEL: atomic_load_i8_unordered:303; RV32IA: # %bb.0:304; RV32IA-NEXT: lbu a0, 0(a0)305; RV32IA-NEXT: ret306;307; RV64I-LABEL: atomic_load_i8_unordered:308; RV64I: # %bb.0:309; RV64I-NEXT: addi sp, sp, -16310; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill311; RV64I-NEXT: li a1, 0312; RV64I-NEXT: call __atomic_load_1313; RV64I-NEXT: zext.b a0, a0314; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload315; RV64I-NEXT: addi sp, sp, 16316; RV64I-NEXT: ret317;318; RV64IA-LABEL: atomic_load_i8_unordered:319; RV64IA: # %bb.0:320; RV64IA-NEXT: lbu a0, 0(a0)321; RV64IA-NEXT: ret322 %1 = load atomic i8, ptr %a unordered, align 1323 ret i8 %1324}325 326define zeroext i8 @atomic_load_i8_monotonic(ptr %a) nounwind {327; RV32I-LABEL: atomic_load_i8_monotonic:328; RV32I: # %bb.0:329; RV32I-NEXT: addi sp, sp, -16330; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill331; RV32I-NEXT: li a1, 0332; RV32I-NEXT: call __atomic_load_1333; RV32I-NEXT: zext.b a0, a0334; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload335; RV32I-NEXT: addi sp, sp, 16336; RV32I-NEXT: ret337;338; RV32IA-LABEL: atomic_load_i8_monotonic:339; RV32IA: # %bb.0:340; RV32IA-NEXT: lbu a0, 0(a0)341; RV32IA-NEXT: ret342;343; RV64I-LABEL: atomic_load_i8_monotonic:344; RV64I: # %bb.0:345; RV64I-NEXT: addi sp, sp, -16346; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill347; RV64I-NEXT: li a1, 0348; RV64I-NEXT: call __atomic_load_1349; RV64I-NEXT: zext.b a0, a0350; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload351; RV64I-NEXT: addi sp, sp, 16352; RV64I-NEXT: ret353;354; RV64IA-LABEL: atomic_load_i8_monotonic:355; RV64IA: # %bb.0:356; RV64IA-NEXT: lbu a0, 0(a0)357; RV64IA-NEXT: ret358 %1 = load atomic i8, ptr %a monotonic, align 1359 ret i8 %1360}361 362define zeroext i8 @atomic_load_i8_acquire(ptr %a) nounwind {363; RV32I-LABEL: atomic_load_i8_acquire:364; RV32I: # %bb.0:365; RV32I-NEXT: addi sp, sp, -16366; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill367; RV32I-NEXT: li a1, 2368; RV32I-NEXT: call __atomic_load_1369; RV32I-NEXT: zext.b a0, a0370; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload371; RV32I-NEXT: addi sp, sp, 16372; RV32I-NEXT: ret373;374; RV32IA-WMO-LABEL: atomic_load_i8_acquire:375; RV32IA-WMO: # %bb.0:376; RV32IA-WMO-NEXT: lbu a0, 0(a0)377; RV32IA-WMO-NEXT: fence r, rw378; RV32IA-WMO-NEXT: ret379;380; RV32IA-TSO-LABEL: atomic_load_i8_acquire:381; RV32IA-TSO: # %bb.0:382; RV32IA-TSO-NEXT: lbu a0, 0(a0)383; RV32IA-TSO-NEXT: ret384;385; RV64I-LABEL: atomic_load_i8_acquire:386; RV64I: # %bb.0:387; RV64I-NEXT: addi sp, sp, -16388; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill389; RV64I-NEXT: li a1, 2390; RV64I-NEXT: call __atomic_load_1391; RV64I-NEXT: zext.b a0, a0392; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload393; RV64I-NEXT: addi sp, sp, 16394; RV64I-NEXT: ret395;396; RV64IA-WMO-LABEL: atomic_load_i8_acquire:397; RV64IA-WMO: # %bb.0:398; RV64IA-WMO-NEXT: lbu a0, 0(a0)399; RV64IA-WMO-NEXT: fence r, rw400; RV64IA-WMO-NEXT: ret401;402; RV64IA-TSO-LABEL: atomic_load_i8_acquire:403; RV64IA-TSO: # %bb.0:404; RV64IA-TSO-NEXT: lbu a0, 0(a0)405; RV64IA-TSO-NEXT: ret406;407; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:408; RV32IA-WMO-TRAILING-FENCE: # %bb.0:409; RV32IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)410; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw411; RV32IA-WMO-TRAILING-FENCE-NEXT: ret412;413; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:414; RV32IA-TSO-TRAILING-FENCE: # %bb.0:415; RV32IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)416; RV32IA-TSO-TRAILING-FENCE-NEXT: ret417;418; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:419; RV64IA-WMO-TRAILING-FENCE: # %bb.0:420; RV64IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)421; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw422; RV64IA-WMO-TRAILING-FENCE-NEXT: ret423;424; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:425; RV64IA-TSO-TRAILING-FENCE: # %bb.0:426; RV64IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)427; RV64IA-TSO-TRAILING-FENCE-NEXT: ret428;429; RV32IA-ZALASR-WMO-LABEL: atomic_load_i8_acquire:430; RV32IA-ZALASR-WMO: # %bb.0:431; RV32IA-ZALASR-WMO-NEXT: lb.aq a0, (a0)432; RV32IA-ZALASR-WMO-NEXT: zext.b a0, a0433; RV32IA-ZALASR-WMO-NEXT: ret434;435; RV32IA-ZALASR-TSO-LABEL: atomic_load_i8_acquire:436; RV32IA-ZALASR-TSO: # %bb.0:437; RV32IA-ZALASR-TSO-NEXT: lbu a0, 0(a0)438; RV32IA-ZALASR-TSO-NEXT: ret439;440; RV64IA-ZALASR-WMO-LABEL: atomic_load_i8_acquire:441; RV64IA-ZALASR-WMO: # %bb.0:442; RV64IA-ZALASR-WMO-NEXT: lb.aq a0, (a0)443; RV64IA-ZALASR-WMO-NEXT: zext.b a0, a0444; RV64IA-ZALASR-WMO-NEXT: ret445;446; RV64IA-ZALASR-TSO-LABEL: atomic_load_i8_acquire:447; RV64IA-ZALASR-TSO: # %bb.0:448; RV64IA-ZALASR-TSO-NEXT: lbu a0, 0(a0)449; RV64IA-ZALASR-TSO-NEXT: ret450 %1 = load atomic i8, ptr %a acquire, align 1451 ret i8 %1452}453 454define zeroext i8 @atomic_load_i8_seq_cst(ptr %a) nounwind {455; RV32I-LABEL: atomic_load_i8_seq_cst:456; RV32I: # %bb.0:457; RV32I-NEXT: addi sp, sp, -16458; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill459; RV32I-NEXT: li a1, 5460; RV32I-NEXT: call __atomic_load_1461; RV32I-NEXT: zext.b a0, a0462; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload463; RV32I-NEXT: addi sp, sp, 16464; RV32I-NEXT: ret465;466; RV32IA-WMO-LABEL: atomic_load_i8_seq_cst:467; RV32IA-WMO: # %bb.0:468; RV32IA-WMO-NEXT: fence rw, rw469; RV32IA-WMO-NEXT: lbu a0, 0(a0)470; RV32IA-WMO-NEXT: fence r, rw471; RV32IA-WMO-NEXT: ret472;473; RV32IA-TSO-LABEL: atomic_load_i8_seq_cst:474; RV32IA-TSO: # %bb.0:475; RV32IA-TSO-NEXT: fence rw, rw476; RV32IA-TSO-NEXT: lbu a0, 0(a0)477; RV32IA-TSO-NEXT: ret478;479; RV64I-LABEL: atomic_load_i8_seq_cst:480; RV64I: # %bb.0:481; RV64I-NEXT: addi sp, sp, -16482; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill483; RV64I-NEXT: li a1, 5484; RV64I-NEXT: call __atomic_load_1485; RV64I-NEXT: zext.b a0, a0486; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload487; RV64I-NEXT: addi sp, sp, 16488; RV64I-NEXT: ret489;490; RV64IA-WMO-LABEL: atomic_load_i8_seq_cst:491; RV64IA-WMO: # %bb.0:492; RV64IA-WMO-NEXT: fence rw, rw493; RV64IA-WMO-NEXT: lbu a0, 0(a0)494; RV64IA-WMO-NEXT: fence r, rw495; RV64IA-WMO-NEXT: ret496;497; RV64IA-TSO-LABEL: atomic_load_i8_seq_cst:498; RV64IA-TSO: # %bb.0:499; RV64IA-TSO-NEXT: fence rw, rw500; RV64IA-TSO-NEXT: lbu a0, 0(a0)501; RV64IA-TSO-NEXT: ret502;503; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:504; RV32IA-WMO-TRAILING-FENCE: # %bb.0:505; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw506; RV32IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)507; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw508; RV32IA-WMO-TRAILING-FENCE-NEXT: ret509;510; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:511; RV32IA-TSO-TRAILING-FENCE: # %bb.0:512; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw513; RV32IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)514; RV32IA-TSO-TRAILING-FENCE-NEXT: ret515;516; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:517; RV64IA-WMO-TRAILING-FENCE: # %bb.0:518; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw519; RV64IA-WMO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)520; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw521; RV64IA-WMO-TRAILING-FENCE-NEXT: ret522;523; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:524; RV64IA-TSO-TRAILING-FENCE: # %bb.0:525; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw526; RV64IA-TSO-TRAILING-FENCE-NEXT: lbu a0, 0(a0)527; RV64IA-TSO-TRAILING-FENCE-NEXT: ret528;529; RV32IA-ZALASR-LABEL: atomic_load_i8_seq_cst:530; RV32IA-ZALASR: # %bb.0:531; RV32IA-ZALASR-NEXT: lb.aq a0, (a0)532; RV32IA-ZALASR-NEXT: zext.b a0, a0533; RV32IA-ZALASR-NEXT: ret534;535; RV64IA-ZALASR-LABEL: atomic_load_i8_seq_cst:536; RV64IA-ZALASR: # %bb.0:537; RV64IA-ZALASR-NEXT: lb.aq a0, (a0)538; RV64IA-ZALASR-NEXT: zext.b a0, a0539; RV64IA-ZALASR-NEXT: ret540 %1 = load atomic i8, ptr %a seq_cst, align 1541 ret i8 %1542}543 544define zeroext i16 @atomic_load_i16_unordered(ptr %a) nounwind {545; RV32I-LABEL: atomic_load_i16_unordered:546; RV32I: # %bb.0:547; RV32I-NEXT: addi sp, sp, -16548; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill549; RV32I-NEXT: li a1, 0550; RV32I-NEXT: call __atomic_load_2551; RV32I-NEXT: slli a0, a0, 16552; RV32I-NEXT: srli a0, a0, 16553; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload554; RV32I-NEXT: addi sp, sp, 16555; RV32I-NEXT: ret556;557; RV32IA-LABEL: atomic_load_i16_unordered:558; RV32IA: # %bb.0:559; RV32IA-NEXT: lhu a0, 0(a0)560; RV32IA-NEXT: ret561;562; RV64I-LABEL: atomic_load_i16_unordered:563; RV64I: # %bb.0:564; RV64I-NEXT: addi sp, sp, -16565; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill566; RV64I-NEXT: li a1, 0567; RV64I-NEXT: call __atomic_load_2568; RV64I-NEXT: slli a0, a0, 48569; RV64I-NEXT: srli a0, a0, 48570; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload571; RV64I-NEXT: addi sp, sp, 16572; RV64I-NEXT: ret573;574; RV64IA-LABEL: atomic_load_i16_unordered:575; RV64IA: # %bb.0:576; RV64IA-NEXT: lhu a0, 0(a0)577; RV64IA-NEXT: ret578 %1 = load atomic i16, ptr %a unordered, align 2579 ret i16 %1580}581 582define zeroext i16 @atomic_load_i16_monotonic(ptr %a) nounwind {583; RV32I-LABEL: atomic_load_i16_monotonic:584; RV32I: # %bb.0:585; RV32I-NEXT: addi sp, sp, -16586; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill587; RV32I-NEXT: li a1, 0588; RV32I-NEXT: call __atomic_load_2589; RV32I-NEXT: slli a0, a0, 16590; RV32I-NEXT: srli a0, a0, 16591; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload592; RV32I-NEXT: addi sp, sp, 16593; RV32I-NEXT: ret594;595; RV32IA-LABEL: atomic_load_i16_monotonic:596; RV32IA: # %bb.0:597; RV32IA-NEXT: lhu a0, 0(a0)598; RV32IA-NEXT: ret599;600; RV64I-LABEL: atomic_load_i16_monotonic:601; RV64I: # %bb.0:602; RV64I-NEXT: addi sp, sp, -16603; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill604; RV64I-NEXT: li a1, 0605; RV64I-NEXT: call __atomic_load_2606; RV64I-NEXT: slli a0, a0, 48607; RV64I-NEXT: srli a0, a0, 48608; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload609; RV64I-NEXT: addi sp, sp, 16610; RV64I-NEXT: ret611;612; RV64IA-LABEL: atomic_load_i16_monotonic:613; RV64IA: # %bb.0:614; RV64IA-NEXT: lhu a0, 0(a0)615; RV64IA-NEXT: ret616 %1 = load atomic i16, ptr %a monotonic, align 2617 ret i16 %1618}619 620define zeroext i16 @atomic_load_i16_acquire(ptr %a) nounwind {621; RV32I-LABEL: atomic_load_i16_acquire:622; RV32I: # %bb.0:623; RV32I-NEXT: addi sp, sp, -16624; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill625; RV32I-NEXT: li a1, 2626; RV32I-NEXT: call __atomic_load_2627; RV32I-NEXT: slli a0, a0, 16628; RV32I-NEXT: srli a0, a0, 16629; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload630; RV32I-NEXT: addi sp, sp, 16631; RV32I-NEXT: ret632;633; RV32IA-WMO-LABEL: atomic_load_i16_acquire:634; RV32IA-WMO: # %bb.0:635; RV32IA-WMO-NEXT: lhu a0, 0(a0)636; RV32IA-WMO-NEXT: fence r, rw637; RV32IA-WMO-NEXT: ret638;639; RV32IA-TSO-LABEL: atomic_load_i16_acquire:640; RV32IA-TSO: # %bb.0:641; RV32IA-TSO-NEXT: lhu a0, 0(a0)642; RV32IA-TSO-NEXT: ret643;644; RV64I-LABEL: atomic_load_i16_acquire:645; RV64I: # %bb.0:646; RV64I-NEXT: addi sp, sp, -16647; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill648; RV64I-NEXT: li a1, 2649; RV64I-NEXT: call __atomic_load_2650; RV64I-NEXT: slli a0, a0, 48651; RV64I-NEXT: srli a0, a0, 48652; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload653; RV64I-NEXT: addi sp, sp, 16654; RV64I-NEXT: ret655;656; RV64IA-WMO-LABEL: atomic_load_i16_acquire:657; RV64IA-WMO: # %bb.0:658; RV64IA-WMO-NEXT: lhu a0, 0(a0)659; RV64IA-WMO-NEXT: fence r, rw660; RV64IA-WMO-NEXT: ret661;662; RV64IA-TSO-LABEL: atomic_load_i16_acquire:663; RV64IA-TSO: # %bb.0:664; RV64IA-TSO-NEXT: lhu a0, 0(a0)665; RV64IA-TSO-NEXT: ret666;667; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:668; RV32IA-WMO-TRAILING-FENCE: # %bb.0:669; RV32IA-WMO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)670; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw671; RV32IA-WMO-TRAILING-FENCE-NEXT: ret672;673; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:674; RV32IA-TSO-TRAILING-FENCE: # %bb.0:675; RV32IA-TSO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)676; RV32IA-TSO-TRAILING-FENCE-NEXT: ret677;678; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:679; RV64IA-WMO-TRAILING-FENCE: # %bb.0:680; RV64IA-WMO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)681; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw682; RV64IA-WMO-TRAILING-FENCE-NEXT: ret683;684; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:685; RV64IA-TSO-TRAILING-FENCE: # %bb.0:686; RV64IA-TSO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)687; RV64IA-TSO-TRAILING-FENCE-NEXT: ret688;689; RV32IA-ZALASR-WMO-LABEL: atomic_load_i16_acquire:690; RV32IA-ZALASR-WMO: # %bb.0:691; RV32IA-ZALASR-WMO-NEXT: lh.aq a0, (a0)692; RV32IA-ZALASR-WMO-NEXT: slli a0, a0, 16693; RV32IA-ZALASR-WMO-NEXT: srli a0, a0, 16694; RV32IA-ZALASR-WMO-NEXT: ret695;696; RV32IA-ZALASR-TSO-LABEL: atomic_load_i16_acquire:697; RV32IA-ZALASR-TSO: # %bb.0:698; RV32IA-ZALASR-TSO-NEXT: lhu a0, 0(a0)699; RV32IA-ZALASR-TSO-NEXT: ret700;701; RV64IA-ZALASR-WMO-LABEL: atomic_load_i16_acquire:702; RV64IA-ZALASR-WMO: # %bb.0:703; RV64IA-ZALASR-WMO-NEXT: lh.aq a0, (a0)704; RV64IA-ZALASR-WMO-NEXT: slli a0, a0, 48705; RV64IA-ZALASR-WMO-NEXT: srli a0, a0, 48706; RV64IA-ZALASR-WMO-NEXT: ret707;708; RV64IA-ZALASR-TSO-LABEL: atomic_load_i16_acquire:709; RV64IA-ZALASR-TSO: # %bb.0:710; RV64IA-ZALASR-TSO-NEXT: lhu a0, 0(a0)711; RV64IA-ZALASR-TSO-NEXT: ret712 %1 = load atomic i16, ptr %a acquire, align 2713 ret i16 %1714}715 716define zeroext i16 @atomic_load_i16_seq_cst(ptr %a) nounwind {717; RV32I-LABEL: atomic_load_i16_seq_cst:718; RV32I: # %bb.0:719; RV32I-NEXT: addi sp, sp, -16720; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill721; RV32I-NEXT: li a1, 5722; RV32I-NEXT: call __atomic_load_2723; RV32I-NEXT: slli a0, a0, 16724; RV32I-NEXT: srli a0, a0, 16725; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload726; RV32I-NEXT: addi sp, sp, 16727; RV32I-NEXT: ret728;729; RV32IA-WMO-LABEL: atomic_load_i16_seq_cst:730; RV32IA-WMO: # %bb.0:731; RV32IA-WMO-NEXT: fence rw, rw732; RV32IA-WMO-NEXT: lhu a0, 0(a0)733; RV32IA-WMO-NEXT: fence r, rw734; RV32IA-WMO-NEXT: ret735;736; RV32IA-TSO-LABEL: atomic_load_i16_seq_cst:737; RV32IA-TSO: # %bb.0:738; RV32IA-TSO-NEXT: fence rw, rw739; RV32IA-TSO-NEXT: lhu a0, 0(a0)740; RV32IA-TSO-NEXT: ret741;742; RV64I-LABEL: atomic_load_i16_seq_cst:743; RV64I: # %bb.0:744; RV64I-NEXT: addi sp, sp, -16745; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill746; RV64I-NEXT: li a1, 5747; RV64I-NEXT: call __atomic_load_2748; RV64I-NEXT: slli a0, a0, 48749; RV64I-NEXT: srli a0, a0, 48750; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload751; RV64I-NEXT: addi sp, sp, 16752; RV64I-NEXT: ret753;754; RV64IA-WMO-LABEL: atomic_load_i16_seq_cst:755; RV64IA-WMO: # %bb.0:756; RV64IA-WMO-NEXT: fence rw, rw757; RV64IA-WMO-NEXT: lhu a0, 0(a0)758; RV64IA-WMO-NEXT: fence r, rw759; RV64IA-WMO-NEXT: ret760;761; RV64IA-TSO-LABEL: atomic_load_i16_seq_cst:762; RV64IA-TSO: # %bb.0:763; RV64IA-TSO-NEXT: fence rw, rw764; RV64IA-TSO-NEXT: lhu a0, 0(a0)765; RV64IA-TSO-NEXT: ret766;767; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:768; RV32IA-WMO-TRAILING-FENCE: # %bb.0:769; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw770; RV32IA-WMO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)771; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw772; RV32IA-WMO-TRAILING-FENCE-NEXT: ret773;774; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:775; RV32IA-TSO-TRAILING-FENCE: # %bb.0:776; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw777; RV32IA-TSO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)778; RV32IA-TSO-TRAILING-FENCE-NEXT: ret779;780; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:781; RV64IA-WMO-TRAILING-FENCE: # %bb.0:782; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw783; RV64IA-WMO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)784; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw785; RV64IA-WMO-TRAILING-FENCE-NEXT: ret786;787; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:788; RV64IA-TSO-TRAILING-FENCE: # %bb.0:789; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw790; RV64IA-TSO-TRAILING-FENCE-NEXT: lhu a0, 0(a0)791; RV64IA-TSO-TRAILING-FENCE-NEXT: ret792;793; RV32IA-ZALASR-LABEL: atomic_load_i16_seq_cst:794; RV32IA-ZALASR: # %bb.0:795; RV32IA-ZALASR-NEXT: lh.aq a0, (a0)796; RV32IA-ZALASR-NEXT: slli a0, a0, 16797; RV32IA-ZALASR-NEXT: srli a0, a0, 16798; RV32IA-ZALASR-NEXT: ret799;800; RV64IA-ZALASR-LABEL: atomic_load_i16_seq_cst:801; RV64IA-ZALASR: # %bb.0:802; RV64IA-ZALASR-NEXT: lh.aq a0, (a0)803; RV64IA-ZALASR-NEXT: slli a0, a0, 48804; RV64IA-ZALASR-NEXT: srli a0, a0, 48805; RV64IA-ZALASR-NEXT: ret806 %1 = load atomic i16, ptr %a seq_cst, align 2807 ret i16 %1808}809 810define zeroext i32 @atomic_load_i32_unordered(ptr %a) nounwind {811; RV32I-LABEL: atomic_load_i32_unordered:812; RV32I: # %bb.0:813; RV32I-NEXT: addi sp, sp, -16814; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill815; RV32I-NEXT: li a1, 0816; RV32I-NEXT: call __atomic_load_4817; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload818; RV32I-NEXT: addi sp, sp, 16819; RV32I-NEXT: ret820;821; RV32IA-LABEL: atomic_load_i32_unordered:822; RV32IA: # %bb.0:823; RV32IA-NEXT: lw a0, 0(a0)824; RV32IA-NEXT: ret825;826; RV64I-LABEL: atomic_load_i32_unordered:827; RV64I: # %bb.0:828; RV64I-NEXT: addi sp, sp, -16829; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill830; RV64I-NEXT: li a1, 0831; RV64I-NEXT: call __atomic_load_4832; RV64I-NEXT: slli a0, a0, 32833; RV64I-NEXT: srli a0, a0, 32834; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload835; RV64I-NEXT: addi sp, sp, 16836; RV64I-NEXT: ret837;838; RV64IA-LABEL: atomic_load_i32_unordered:839; RV64IA: # %bb.0:840; RV64IA-NEXT: lwu a0, 0(a0)841; RV64IA-NEXT: ret842 %1 = load atomic i32, ptr %a unordered, align 4843 ret i32 %1844}845 846define zeroext i32 @atomic_load_i32_monotonic(ptr %a) nounwind {847; RV32I-LABEL: atomic_load_i32_monotonic:848; RV32I: # %bb.0:849; RV32I-NEXT: addi sp, sp, -16850; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill851; RV32I-NEXT: li a1, 0852; RV32I-NEXT: call __atomic_load_4853; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload854; RV32I-NEXT: addi sp, sp, 16855; RV32I-NEXT: ret856;857; RV32IA-LABEL: atomic_load_i32_monotonic:858; RV32IA: # %bb.0:859; RV32IA-NEXT: lw a0, 0(a0)860; RV32IA-NEXT: ret861;862; RV64I-LABEL: atomic_load_i32_monotonic:863; RV64I: # %bb.0:864; RV64I-NEXT: addi sp, sp, -16865; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill866; RV64I-NEXT: li a1, 0867; RV64I-NEXT: call __atomic_load_4868; RV64I-NEXT: slli a0, a0, 32869; RV64I-NEXT: srli a0, a0, 32870; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload871; RV64I-NEXT: addi sp, sp, 16872; RV64I-NEXT: ret873;874; RV64IA-LABEL: atomic_load_i32_monotonic:875; RV64IA: # %bb.0:876; RV64IA-NEXT: lwu a0, 0(a0)877; RV64IA-NEXT: ret878 %1 = load atomic i32, ptr %a monotonic, align 4879 ret i32 %1880}881 882define zeroext i32 @atomic_load_i32_acquire(ptr %a) nounwind {883; RV32I-LABEL: atomic_load_i32_acquire:884; RV32I: # %bb.0:885; RV32I-NEXT: addi sp, sp, -16886; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill887; RV32I-NEXT: li a1, 2888; RV32I-NEXT: call __atomic_load_4889; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload890; RV32I-NEXT: addi sp, sp, 16891; RV32I-NEXT: ret892;893; RV32IA-WMO-LABEL: atomic_load_i32_acquire:894; RV32IA-WMO: # %bb.0:895; RV32IA-WMO-NEXT: lw a0, 0(a0)896; RV32IA-WMO-NEXT: fence r, rw897; RV32IA-WMO-NEXT: ret898;899; RV32IA-TSO-LABEL: atomic_load_i32_acquire:900; RV32IA-TSO: # %bb.0:901; RV32IA-TSO-NEXT: lw a0, 0(a0)902; RV32IA-TSO-NEXT: ret903;904; RV64I-LABEL: atomic_load_i32_acquire:905; RV64I: # %bb.0:906; RV64I-NEXT: addi sp, sp, -16907; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill908; RV64I-NEXT: li a1, 2909; RV64I-NEXT: call __atomic_load_4910; RV64I-NEXT: slli a0, a0, 32911; RV64I-NEXT: srli a0, a0, 32912; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload913; RV64I-NEXT: addi sp, sp, 16914; RV64I-NEXT: ret915;916; RV64IA-WMO-LABEL: atomic_load_i32_acquire:917; RV64IA-WMO: # %bb.0:918; RV64IA-WMO-NEXT: lwu a0, 0(a0)919; RV64IA-WMO-NEXT: fence r, rw920; RV64IA-WMO-NEXT: ret921;922; RV64IA-TSO-LABEL: atomic_load_i32_acquire:923; RV64IA-TSO: # %bb.0:924; RV64IA-TSO-NEXT: lwu a0, 0(a0)925; RV64IA-TSO-NEXT: ret926;927; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:928; RV32IA-WMO-TRAILING-FENCE: # %bb.0:929; RV32IA-WMO-TRAILING-FENCE-NEXT: lw a0, 0(a0)930; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw931; RV32IA-WMO-TRAILING-FENCE-NEXT: ret932;933; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:934; RV32IA-TSO-TRAILING-FENCE: # %bb.0:935; RV32IA-TSO-TRAILING-FENCE-NEXT: lw a0, 0(a0)936; RV32IA-TSO-TRAILING-FENCE-NEXT: ret937;938; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:939; RV64IA-WMO-TRAILING-FENCE: # %bb.0:940; RV64IA-WMO-TRAILING-FENCE-NEXT: lwu a0, 0(a0)941; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw942; RV64IA-WMO-TRAILING-FENCE-NEXT: ret943;944; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:945; RV64IA-TSO-TRAILING-FENCE: # %bb.0:946; RV64IA-TSO-TRAILING-FENCE-NEXT: lwu a0, 0(a0)947; RV64IA-TSO-TRAILING-FENCE-NEXT: ret948;949; RV32IA-ZALASR-WMO-LABEL: atomic_load_i32_acquire:950; RV32IA-ZALASR-WMO: # %bb.0:951; RV32IA-ZALASR-WMO-NEXT: lw.aq a0, (a0)952; RV32IA-ZALASR-WMO-NEXT: ret953;954; RV32IA-ZALASR-TSO-LABEL: atomic_load_i32_acquire:955; RV32IA-ZALASR-TSO: # %bb.0:956; RV32IA-ZALASR-TSO-NEXT: lw a0, 0(a0)957; RV32IA-ZALASR-TSO-NEXT: ret958;959; RV64IA-ZALASR-WMO-LABEL: atomic_load_i32_acquire:960; RV64IA-ZALASR-WMO: # %bb.0:961; RV64IA-ZALASR-WMO-NEXT: lw.aq a0, (a0)962; RV64IA-ZALASR-WMO-NEXT: slli a0, a0, 32963; RV64IA-ZALASR-WMO-NEXT: srli a0, a0, 32964; RV64IA-ZALASR-WMO-NEXT: ret965;966; RV64IA-ZALASR-TSO-LABEL: atomic_load_i32_acquire:967; RV64IA-ZALASR-TSO: # %bb.0:968; RV64IA-ZALASR-TSO-NEXT: lwu a0, 0(a0)969; RV64IA-ZALASR-TSO-NEXT: ret970 %1 = load atomic i32, ptr %a acquire, align 4971 ret i32 %1972}973 974define zeroext i32 @atomic_load_i32_seq_cst(ptr %a) nounwind {975; RV32I-LABEL: atomic_load_i32_seq_cst:976; RV32I: # %bb.0:977; RV32I-NEXT: addi sp, sp, -16978; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill979; RV32I-NEXT: li a1, 5980; RV32I-NEXT: call __atomic_load_4981; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload982; RV32I-NEXT: addi sp, sp, 16983; RV32I-NEXT: ret984;985; RV32IA-WMO-LABEL: atomic_load_i32_seq_cst:986; RV32IA-WMO: # %bb.0:987; RV32IA-WMO-NEXT: fence rw, rw988; RV32IA-WMO-NEXT: lw a0, 0(a0)989; RV32IA-WMO-NEXT: fence r, rw990; RV32IA-WMO-NEXT: ret991;992; RV32IA-TSO-LABEL: atomic_load_i32_seq_cst:993; RV32IA-TSO: # %bb.0:994; RV32IA-TSO-NEXT: fence rw, rw995; RV32IA-TSO-NEXT: lw a0, 0(a0)996; RV32IA-TSO-NEXT: ret997;998; RV64I-LABEL: atomic_load_i32_seq_cst:999; RV64I: # %bb.0:1000; RV64I-NEXT: addi sp, sp, -161001; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1002; RV64I-NEXT: li a1, 51003; RV64I-NEXT: call __atomic_load_41004; RV64I-NEXT: slli a0, a0, 321005; RV64I-NEXT: srli a0, a0, 321006; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1007; RV64I-NEXT: addi sp, sp, 161008; RV64I-NEXT: ret1009;1010; RV64IA-WMO-LABEL: atomic_load_i32_seq_cst:1011; RV64IA-WMO: # %bb.0:1012; RV64IA-WMO-NEXT: fence rw, rw1013; RV64IA-WMO-NEXT: lwu a0, 0(a0)1014; RV64IA-WMO-NEXT: fence r, rw1015; RV64IA-WMO-NEXT: ret1016;1017; RV64IA-TSO-LABEL: atomic_load_i32_seq_cst:1018; RV64IA-TSO: # %bb.0:1019; RV64IA-TSO-NEXT: fence rw, rw1020; RV64IA-TSO-NEXT: lwu a0, 0(a0)1021; RV64IA-TSO-NEXT: ret1022;1023; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:1024; RV32IA-WMO-TRAILING-FENCE: # %bb.0:1025; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw1026; RV32IA-WMO-TRAILING-FENCE-NEXT: lw a0, 0(a0)1027; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw1028; RV32IA-WMO-TRAILING-FENCE-NEXT: ret1029;1030; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:1031; RV32IA-TSO-TRAILING-FENCE: # %bb.0:1032; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw1033; RV32IA-TSO-TRAILING-FENCE-NEXT: lw a0, 0(a0)1034; RV32IA-TSO-TRAILING-FENCE-NEXT: ret1035;1036; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:1037; RV64IA-WMO-TRAILING-FENCE: # %bb.0:1038; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw1039; RV64IA-WMO-TRAILING-FENCE-NEXT: lwu a0, 0(a0)1040; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw1041; RV64IA-WMO-TRAILING-FENCE-NEXT: ret1042;1043; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:1044; RV64IA-TSO-TRAILING-FENCE: # %bb.0:1045; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw1046; RV64IA-TSO-TRAILING-FENCE-NEXT: lwu a0, 0(a0)1047; RV64IA-TSO-TRAILING-FENCE-NEXT: ret1048;1049; RV32IA-ZALASR-LABEL: atomic_load_i32_seq_cst:1050; RV32IA-ZALASR: # %bb.0:1051; RV32IA-ZALASR-NEXT: lw.aq a0, (a0)1052; RV32IA-ZALASR-NEXT: ret1053;1054; RV64IA-ZALASR-LABEL: atomic_load_i32_seq_cst:1055; RV64IA-ZALASR: # %bb.0:1056; RV64IA-ZALASR-NEXT: lw.aq a0, (a0)1057; RV64IA-ZALASR-NEXT: slli a0, a0, 321058; RV64IA-ZALASR-NEXT: srli a0, a0, 321059; RV64IA-ZALASR-NEXT: ret1060 %1 = load atomic i32, ptr %a seq_cst, align 41061 ret i32 %11062}1063 1064define zeroext i64 @atomic_load_i64_unordered(ptr %a) nounwind {1065; RV32I-LABEL: atomic_load_i64_unordered:1066; RV32I: # %bb.0:1067; RV32I-NEXT: addi sp, sp, -161068; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1069; RV32I-NEXT: li a1, 01070; RV32I-NEXT: call __atomic_load_81071; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1072; RV32I-NEXT: addi sp, sp, 161073; RV32I-NEXT: ret1074;1075; RV32IA-LABEL: atomic_load_i64_unordered:1076; RV32IA: # %bb.0:1077; RV32IA-NEXT: addi sp, sp, -161078; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1079; RV32IA-NEXT: li a1, 01080; RV32IA-NEXT: call __atomic_load_81081; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1082; RV32IA-NEXT: addi sp, sp, 161083; RV32IA-NEXT: ret1084;1085; RV64I-LABEL: atomic_load_i64_unordered:1086; RV64I: # %bb.0:1087; RV64I-NEXT: addi sp, sp, -161088; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1089; RV64I-NEXT: li a1, 01090; RV64I-NEXT: call __atomic_load_81091; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1092; RV64I-NEXT: addi sp, sp, 161093; RV64I-NEXT: ret1094;1095; RV64IA-LABEL: atomic_load_i64_unordered:1096; RV64IA: # %bb.0:1097; RV64IA-NEXT: ld a0, 0(a0)1098; RV64IA-NEXT: ret1099 %1 = load atomic i64, ptr %a unordered, align 81100 ret i64 %11101}1102 1103define zeroext i64 @atomic_load_i64_monotonic(ptr %a) nounwind {1104; RV32I-LABEL: atomic_load_i64_monotonic:1105; RV32I: # %bb.0:1106; RV32I-NEXT: addi sp, sp, -161107; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1108; RV32I-NEXT: li a1, 01109; RV32I-NEXT: call __atomic_load_81110; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1111; RV32I-NEXT: addi sp, sp, 161112; RV32I-NEXT: ret1113;1114; RV32IA-LABEL: atomic_load_i64_monotonic:1115; RV32IA: # %bb.0:1116; RV32IA-NEXT: addi sp, sp, -161117; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1118; RV32IA-NEXT: li a1, 01119; RV32IA-NEXT: call __atomic_load_81120; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1121; RV32IA-NEXT: addi sp, sp, 161122; RV32IA-NEXT: ret1123;1124; RV64I-LABEL: atomic_load_i64_monotonic:1125; RV64I: # %bb.0:1126; RV64I-NEXT: addi sp, sp, -161127; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1128; RV64I-NEXT: li a1, 01129; RV64I-NEXT: call __atomic_load_81130; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1131; RV64I-NEXT: addi sp, sp, 161132; RV64I-NEXT: ret1133;1134; RV64IA-LABEL: atomic_load_i64_monotonic:1135; RV64IA: # %bb.0:1136; RV64IA-NEXT: ld a0, 0(a0)1137; RV64IA-NEXT: ret1138 %1 = load atomic i64, ptr %a monotonic, align 81139 ret i64 %11140}1141 1142define zeroext i64 @atomic_load_i64_acquire(ptr %a) nounwind {1143; RV32I-LABEL: atomic_load_i64_acquire:1144; RV32I: # %bb.0:1145; RV32I-NEXT: addi sp, sp, -161146; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1147; RV32I-NEXT: li a1, 21148; RV32I-NEXT: call __atomic_load_81149; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1150; RV32I-NEXT: addi sp, sp, 161151; RV32I-NEXT: ret1152;1153; RV32IA-LABEL: atomic_load_i64_acquire:1154; RV32IA: # %bb.0:1155; RV32IA-NEXT: addi sp, sp, -161156; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1157; RV32IA-NEXT: li a1, 21158; RV32IA-NEXT: call __atomic_load_81159; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1160; RV32IA-NEXT: addi sp, sp, 161161; RV32IA-NEXT: ret1162;1163; RV64I-LABEL: atomic_load_i64_acquire:1164; RV64I: # %bb.0:1165; RV64I-NEXT: addi sp, sp, -161166; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1167; RV64I-NEXT: li a1, 21168; RV64I-NEXT: call __atomic_load_81169; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1170; RV64I-NEXT: addi sp, sp, 161171; RV64I-NEXT: ret1172;1173; RV64IA-WMO-LABEL: atomic_load_i64_acquire:1174; RV64IA-WMO: # %bb.0:1175; RV64IA-WMO-NEXT: ld a0, 0(a0)1176; RV64IA-WMO-NEXT: fence r, rw1177; RV64IA-WMO-NEXT: ret1178;1179; RV64IA-TSO-LABEL: atomic_load_i64_acquire:1180; RV64IA-TSO: # %bb.0:1181; RV64IA-TSO-NEXT: ld a0, 0(a0)1182; RV64IA-TSO-NEXT: ret1183;1184; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i64_acquire:1185; RV64IA-WMO-TRAILING-FENCE: # %bb.0:1186; RV64IA-WMO-TRAILING-FENCE-NEXT: ld a0, 0(a0)1187; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw1188; RV64IA-WMO-TRAILING-FENCE-NEXT: ret1189;1190; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i64_acquire:1191; RV64IA-TSO-TRAILING-FENCE: # %bb.0:1192; RV64IA-TSO-TRAILING-FENCE-NEXT: ld a0, 0(a0)1193; RV64IA-TSO-TRAILING-FENCE-NEXT: ret1194;1195; RV64IA-ZALASR-WMO-LABEL: atomic_load_i64_acquire:1196; RV64IA-ZALASR-WMO: # %bb.0:1197; RV64IA-ZALASR-WMO-NEXT: ld.aq a0, (a0)1198; RV64IA-ZALASR-WMO-NEXT: ret1199;1200; RV64IA-ZALASR-TSO-LABEL: atomic_load_i64_acquire:1201; RV64IA-ZALASR-TSO: # %bb.0:1202; RV64IA-ZALASR-TSO-NEXT: ld a0, 0(a0)1203; RV64IA-ZALASR-TSO-NEXT: ret1204 %1 = load atomic i64, ptr %a acquire, align 81205 ret i64 %11206}1207 1208define zeroext i64 @atomic_load_i64_seq_cst(ptr %a) nounwind {1209; RV32I-LABEL: atomic_load_i64_seq_cst:1210; RV32I: # %bb.0:1211; RV32I-NEXT: addi sp, sp, -161212; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1213; RV32I-NEXT: li a1, 51214; RV32I-NEXT: call __atomic_load_81215; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1216; RV32I-NEXT: addi sp, sp, 161217; RV32I-NEXT: ret1218;1219; RV32IA-LABEL: atomic_load_i64_seq_cst:1220; RV32IA: # %bb.0:1221; RV32IA-NEXT: addi sp, sp, -161222; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1223; RV32IA-NEXT: li a1, 51224; RV32IA-NEXT: call __atomic_load_81225; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1226; RV32IA-NEXT: addi sp, sp, 161227; RV32IA-NEXT: ret1228;1229; RV64I-LABEL: atomic_load_i64_seq_cst:1230; RV64I: # %bb.0:1231; RV64I-NEXT: addi sp, sp, -161232; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1233; RV64I-NEXT: li a1, 51234; RV64I-NEXT: call __atomic_load_81235; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1236; RV64I-NEXT: addi sp, sp, 161237; RV64I-NEXT: ret1238;1239; RV64IA-WMO-LABEL: atomic_load_i64_seq_cst:1240; RV64IA-WMO: # %bb.0:1241; RV64IA-WMO-NEXT: fence rw, rw1242; RV64IA-WMO-NEXT: ld a0, 0(a0)1243; RV64IA-WMO-NEXT: fence r, rw1244; RV64IA-WMO-NEXT: ret1245;1246; RV64IA-TSO-LABEL: atomic_load_i64_seq_cst:1247; RV64IA-TSO: # %bb.0:1248; RV64IA-TSO-NEXT: fence rw, rw1249; RV64IA-TSO-NEXT: ld a0, 0(a0)1250; RV64IA-TSO-NEXT: ret1251;1252; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i64_seq_cst:1253; RV64IA-WMO-TRAILING-FENCE: # %bb.0:1254; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw1255; RV64IA-WMO-TRAILING-FENCE-NEXT: ld a0, 0(a0)1256; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw1257; RV64IA-WMO-TRAILING-FENCE-NEXT: ret1258;1259; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i64_seq_cst:1260; RV64IA-TSO-TRAILING-FENCE: # %bb.0:1261; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw1262; RV64IA-TSO-TRAILING-FENCE-NEXT: ld a0, 0(a0)1263; RV64IA-TSO-TRAILING-FENCE-NEXT: ret1264;1265; RV64IA-ZALASR-LABEL: atomic_load_i64_seq_cst:1266; RV64IA-ZALASR: # %bb.0:1267; RV64IA-ZALASR-NEXT: ld.aq a0, (a0)1268; RV64IA-ZALASR-NEXT: ret1269 %1 = load atomic i64, ptr %a seq_cst, align 81270 ret i64 %11271}1272 1273!0 = !{i8 0, i8 2}1274!1 = !{}1275