245 lines · plain
1; RUN: llc -mtriple=aarch64-- -O0 -fast-isel -fast-isel-abort=4 -verify-machineinstrs < %s | FileCheck %s2; RUN: llc -mtriple=aarch64-- -O0 -fast-isel=0 -global-isel=false -verify-machineinstrs < %s | FileCheck %s3 4; Note that checking SelectionDAG output isn't strictly necessary, but they5; currently match, so we might as well check both! Feel free to remove SDAG.6 7; CHECK-LABEL: atomic_store_monotonic_8:8; CHECK-NEXT: // %bb.0:9; CHECK-NEXT: strb w1, [x0]10; CHECK-NEXT: ret11define void @atomic_store_monotonic_8(ptr %p, i8 %val) #0 {12 store atomic i8 %val, ptr %p monotonic, align 113 ret void14}15 16; CHECK-LABEL: atomic_store_monotonic_8_off:17; CHECK-NEXT: // %bb.0:18; CHECK-NEXT: strb w1, [x0, #1]19; CHECK-NEXT: ret20define void @atomic_store_monotonic_8_off(ptr %p, i8 %val) #0 {21 %tmp0 = getelementptr i8, ptr %p, i32 122 store atomic i8 %val, ptr %tmp0 monotonic, align 123 ret void24}25 26; CHECK-LABEL: atomic_store_monotonic_16:27; CHECK-NEXT: // %bb.0:28; CHECK-NEXT: strh w1, [x0]29; CHECK-NEXT: ret30define void @atomic_store_monotonic_16(ptr %p, i16 %val) #0 {31 store atomic i16 %val, ptr %p monotonic, align 232 ret void33}34 35; CHECK-LABEL: atomic_store_monotonic_16_off:36; CHECK-NEXT: // %bb.0:37; CHECK-NEXT: strh w1, [x0, #2]38; CHECK-NEXT: ret39define void @atomic_store_monotonic_16_off(ptr %p, i16 %val) #0 {40 %tmp0 = getelementptr i16, ptr %p, i32 141 store atomic i16 %val, ptr %tmp0 monotonic, align 242 ret void43}44 45; CHECK-LABEL: atomic_store_monotonic_32:46; CHECK-NEXT: // %bb.0:47; CHECK-NEXT: str w1, [x0]48; CHECK-NEXT: ret49define void @atomic_store_monotonic_32(ptr %p, i32 %val) #0 {50 store atomic i32 %val, ptr %p monotonic, align 451 ret void52}53 54; CHECK-LABEL: atomic_store_monotonic_32_off:55; CHECK-NEXT: // %bb.0:56; CHECK-NEXT: str w1, [x0, #4]57; CHECK-NEXT: ret58define void @atomic_store_monotonic_32_off(ptr %p, i32 %val) #0 {59 %tmp0 = getelementptr i32, ptr %p, i32 160 store atomic i32 %val, ptr %tmp0 monotonic, align 461 ret void62}63 64; CHECK-LABEL: atomic_store_monotonic_64:65; CHECK-NEXT: // %bb.0:66; CHECK-NEXT: str x1, [x0]67; CHECK-NEXT: ret68define void @atomic_store_monotonic_64(ptr %p, i64 %val) #0 {69 store atomic i64 %val, ptr %p monotonic, align 870 ret void71}72 73; CHECK-LABEL: atomic_store_monotonic_64_off:74; CHECK-NEXT: // %bb.0:75; CHECK-NEXT: str x1, [x0, #8]76; CHECK-NEXT: ret77define void @atomic_store_monotonic_64_off(ptr %p, i64 %val) #0 {78 %tmp0 = getelementptr i64, ptr %p, i32 179 store atomic i64 %val, ptr %tmp0 monotonic, align 880 ret void81}82 83; CHECK-LABEL: atomic_store_release_8:84; CHECK-NEXT: // %bb.0:85; CHECK-NEXT: stlrb w1, [x0]86; CHECK-NEXT: ret87define void @atomic_store_release_8(ptr %p, i8 %val) #0 {88 store atomic i8 %val, ptr %p release, align 189 ret void90}91 92; CHECK-LABEL: atomic_store_release_8_off:93; CHECK-NEXT: // %bb.0:94; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #195; CHECK-NEXT: stlrb w1, [[[REG0]]]96; CHECK-NEXT: ret97define void @atomic_store_release_8_off(ptr %p, i8 %val) #0 {98 %tmp0 = getelementptr i8, ptr %p, i32 199 store atomic i8 %val, ptr %tmp0 release, align 1100 ret void101}102 103; CHECK-LABEL: atomic_store_release_16:104; CHECK-NEXT: // %bb.0:105; CHECK-NEXT: stlrh w1, [x0]106; CHECK-NEXT: ret107define void @atomic_store_release_16(ptr %p, i16 %val) #0 {108 store atomic i16 %val, ptr %p release, align 2109 ret void110}111 112; CHECK-LABEL: atomic_store_release_16_off:113; CHECK-NEXT: // %bb.0:114; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #2115; CHECK-NEXT: stlrh w1, [[[REG0]]]116; CHECK-NEXT: ret117define void @atomic_store_release_16_off(ptr %p, i16 %val) #0 {118 %tmp0 = getelementptr i16, ptr %p, i32 1119 store atomic i16 %val, ptr %tmp0 release, align 2120 ret void121}122 123; CHECK-LABEL: atomic_store_release_32:124; CHECK-NEXT: // %bb.0:125; CHECK-NEXT: stlr w1, [x0]126; CHECK-NEXT: ret127define void @atomic_store_release_32(ptr %p, i32 %val) #0 {128 store atomic i32 %val, ptr %p release, align 4129 ret void130}131 132; CHECK-LABEL: atomic_store_release_32_off:133; CHECK-NEXT: // %bb.0:134; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #4135; CHECK-NEXT: stlr w1, [[[REG0]]]136; CHECK-NEXT: ret137define void @atomic_store_release_32_off(ptr %p, i32 %val) #0 {138 %tmp0 = getelementptr i32, ptr %p, i32 1139 store atomic i32 %val, ptr %tmp0 release, align 4140 ret void141}142 143; CHECK-LABEL: atomic_store_release_64:144; CHECK-NEXT: // %bb.0:145; CHECK-NEXT: stlr x1, [x0]146; CHECK-NEXT: ret147define void @atomic_store_release_64(ptr %p, i64 %val) #0 {148 store atomic i64 %val, ptr %p release, align 8149 ret void150}151 152; CHECK-LABEL: atomic_store_release_64_off:153; CHECK-NEXT: // %bb.0:154; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #8155; CHECK-NEXT: stlr x1, [[[REG0]]]156; CHECK-NEXT: ret157define void @atomic_store_release_64_off(ptr %p, i64 %val) #0 {158 %tmp0 = getelementptr i64, ptr %p, i32 1159 store atomic i64 %val, ptr %tmp0 release, align 8160 ret void161}162 163 164; CHECK-LABEL: atomic_store_seq_cst_8:165; CHECK-NEXT: // %bb.0:166; CHECK-NEXT: stlrb w1, [x0]167; CHECK-NEXT: ret168define void @atomic_store_seq_cst_8(ptr %p, i8 %val) #0 {169 store atomic i8 %val, ptr %p seq_cst, align 1170 ret void171}172 173; CHECK-LABEL: atomic_store_seq_cst_8_off:174; CHECK-NEXT: // %bb.0:175; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #1176; CHECK-NEXT: stlrb w1, [[[REG0]]]177; CHECK-NEXT: ret178define void @atomic_store_seq_cst_8_off(ptr %p, i8 %val) #0 {179 %tmp0 = getelementptr i8, ptr %p, i32 1180 store atomic i8 %val, ptr %tmp0 seq_cst, align 1181 ret void182}183 184; CHECK-LABEL: atomic_store_seq_cst_16:185; CHECK-NEXT: // %bb.0:186; CHECK-NEXT: stlrh w1, [x0]187; CHECK-NEXT: ret188define void @atomic_store_seq_cst_16(ptr %p, i16 %val) #0 {189 store atomic i16 %val, ptr %p seq_cst, align 2190 ret void191}192 193; CHECK-LABEL: atomic_store_seq_cst_16_off:194; CHECK-NEXT: // %bb.0:195; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #2196; CHECK-NEXT: stlrh w1, [[[REG0]]]197; CHECK-NEXT: ret198define void @atomic_store_seq_cst_16_off(ptr %p, i16 %val) #0 {199 %tmp0 = getelementptr i16, ptr %p, i32 1200 store atomic i16 %val, ptr %tmp0 seq_cst, align 2201 ret void202}203 204; CHECK-LABEL: atomic_store_seq_cst_32:205; CHECK-NEXT: // %bb.0:206; CHECK-NEXT: stlr w1, [x0]207; CHECK-NEXT: ret208define void @atomic_store_seq_cst_32(ptr %p, i32 %val) #0 {209 store atomic i32 %val, ptr %p seq_cst, align 4210 ret void211}212 213; CHECK-LABEL: atomic_store_seq_cst_32_off:214; CHECK-NEXT: // %bb.0:215; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #4216; CHECK-NEXT: stlr w1, [[[REG0]]]217; CHECK-NEXT: ret218define void @atomic_store_seq_cst_32_off(ptr %p, i32 %val) #0 {219 %tmp0 = getelementptr i32, ptr %p, i32 1220 store atomic i32 %val, ptr %tmp0 seq_cst, align 4221 ret void222}223 224; CHECK-LABEL: atomic_store_seq_cst_64:225; CHECK-NEXT: // %bb.0:226; CHECK-NEXT: stlr x1, [x0]227; CHECK-NEXT: ret228define void @atomic_store_seq_cst_64(ptr %p, i64 %val) #0 {229 store atomic i64 %val, ptr %p seq_cst, align 8230 ret void231}232 233; CHECK-LABEL: atomic_store_seq_cst_64_off:234; CHECK-NEXT: // %bb.0:235; CHECK-NEXT: add [[REG0:x[0-9]+]], x0, #8236; CHECK-NEXT: stlr x1, [[[REG0]]]237; CHECK-NEXT: ret238define void @atomic_store_seq_cst_64_off(ptr %p, i64 %val) #0 {239 %tmp0 = getelementptr i64, ptr %p, i32 1240 store atomic i64 %val, ptr %tmp0 seq_cst, align 8241 ret void242}243 244attributes #0 = { nounwind }245