389 lines · plain
1; RUN: llc < %s -mtriple=sparc -mcpu=v9 -verify-machineinstrs | FileCheck %s --check-prefixes=SPARC2; RUN: llc < %s -mtriple=sparcv9 -verify-machineinstrs | FileCheck %s --check-prefixes=SPARC643 4; SPARC-LABEL: test_atomic_i85; SPARC: ldub [%o0]6; SPARC: membar7; SPARC: ldub [%o1]8; SPARC: membar9; SPARC: membar10; SPARC: stb {{.+}}, [%o2]11; SPARC64-LABEL: test_atomic_i812; SPARC64: ldub [%o0]13; SPARC64: membar14; SPARC64: ldub [%o1]15; SPARC64: membar16; SPARC64: membar17; SPARC64: stb {{.+}}, [%o2]18define i8 @test_atomic_i8(ptr %ptr1, ptr %ptr2, ptr %ptr3) {19entry:20 %0 = load atomic i8, ptr %ptr1 acquire, align 121 %1 = load atomic i8, ptr %ptr2 acquire, align 122 %2 = add i8 %0, %123 store atomic i8 %2, ptr %ptr3 release, align 124 ret i8 %225}26 27; SPARC-LABEL: test_atomic_i1628; SPARC: lduh [%o0]29; SPARC: membar30; SPARC: lduh [%o1]31; SPARC: membar32; SPARC: membar33; SPARC: sth {{.+}}, [%o2]34; SPARC64-LABEL: test_atomic_i1635; SPARC64: lduh [%o0]36; SPARC64: membar37; SPARC64: lduh [%o1]38; SPARC64: membar39; SPARC64: membar40; SPARC64: sth {{.+}}, [%o2]41define i16 @test_atomic_i16(ptr %ptr1, ptr %ptr2, ptr %ptr3) {42entry:43 %0 = load atomic i16, ptr %ptr1 acquire, align 244 %1 = load atomic i16, ptr %ptr2 acquire, align 245 %2 = add i16 %0, %146 store atomic i16 %2, ptr %ptr3 release, align 247 ret i16 %248}49 50; SPARC-LABEL: test_atomic_i3251; SPARC: ld [%o0]52; SPARC: membar53; SPARC: ld [%o1]54; SPARC: membar55; SPARC: membar56; SPARC: st {{.+}}, [%o2]57; SPARC64-LABEL: test_atomic_i3258; SPARC64: ld [%o0]59; SPARC64: membar60; SPARC64: ld [%o1]61; SPARC64: membar62; SPARC64: membar63; SPARC64: st {{.+}}, [%o2]64define i32 @test_atomic_i32(ptr %ptr1, ptr %ptr2, ptr %ptr3) {65entry:66 %0 = load atomic i32, ptr %ptr1 acquire, align 467 %1 = load atomic i32, ptr %ptr2 acquire, align 468 %2 = add i32 %0, %169 store atomic i32 %2, ptr %ptr3 release, align 470 ret i32 %271}72 73;; TODO: the "move %icc" and related instructions are totally74;; redundant here. There's something weird happening in optimization75;; of the success value of cmpxchg.76 77; SPARC-LABEL: test_cmpxchg_i878; SPARC: and %o1, -4, %o279; SPARC: mov 3, %o380; SPARC: andn %o3, %o1, %o181; SPARC: sll %o1, 3, %o182; SPARC: mov 255, %o383; SPARC: sll %o3, %o1, %o584; SPARC: xor %o5, -1, %o385; SPARC: mov 123, %o486; SPARC: ld [%o2], %g287; SPARC: sll %o4, %o1, %o488; SPARC: and %o0, 255, %o089; SPARC: sll %o0, %o1, %o090; SPARC: andn %g2, %o5, %o591; SPARC: [[LABEL1:\.L.*]]:92; SPARC: or %o5, %o4, %g293; SPARC: or %o5, %o0, %g394; SPARC: cas [%o2], %g3, %g295; SPARC: mov %g0, %g496; SPARC: cmp %g2, %g397; SPARC: move %icc, 1, %g498; SPARC: cmp %g4, 099; SPARC: bne %icc, [[LABEL2:\.L.*]]100; SPARC: nop101; SPARC: and %g2, %o3, %g3102; SPARC: cmp %o5, %g3103; SPARC: bne %icc, [[LABEL1]]104; SPARC: mov %g3, %o5105; SPARC: [[LABEL2]]:106; SPARC: retl107; SPARC: srl %g2, %o1, %o0108; SPARC64-LABEL: test_cmpxchg_i8109; SPARC64: and %o1, -4, %o2110; SPARC64: mov 3, %o3111; SPARC64: andn %o3, %o1, %o1112; SPARC64: sll %o1, 3, %o1113; SPARC64: mov 255, %o3114; SPARC64: sll %o3, %o1, %o5115; SPARC64: xor %o5, -1, %o3116; SPARC64: mov 123, %o4117; SPARC64: ld [%o2], %g2118; SPARC64: sll %o4, %o1, %o4119; SPARC64: and %o0, 255, %o0120; SPARC64: sll %o0, %o1, %o0121; SPARC64: andn %g2, %o5, %o5122; SPARC64: [[LABEL1:\.L.*]]:123; SPARC64: or %o5, %o4, %g2124; SPARC64: or %o5, %o0, %g3125; SPARC64: cas [%o2], %g3, %g2126; SPARC64: mov %g0, %g4127; SPARC64: cmp %g2, %g3128; SPARC64: move %icc, 1, %g4129; SPARC64: cmp %g4, 0130; SPARC64: bne %icc, [[LABEL2:\.L.*]]131; SPARC64: nop132; SPARC64: and %g2, %o3, %g3133; SPARC64: cmp %o5, %g3134; SPARC64: bne %icc, [[LABEL1]]135; SPARC64: mov %g3, %o5136; SPARC64: [[LABEL2]]:137; SPARC64: retl138; SPARC64: srl %g2, %o1, %o0139define i8 @test_cmpxchg_i8(i8 %a, ptr %ptr) {140entry:141 %pair = cmpxchg ptr %ptr, i8 %a, i8 123 monotonic monotonic142 %b = extractvalue { i8, i1 } %pair, 0143 ret i8 %b144}145 146; SPARC-LABEL: test_cmpxchg_i16147; SPARC: and %o1, -4, %o2148; SPARC: and %o1, 3, %o1149; SPARC: xor %o1, 2, %o1150; SPARC: sll %o1, 3, %o1151; SPARC: sethi 63, %o3152; SPARC: or %o3, 1023, %o4153; SPARC: sll %o4, %o1, %o5154; SPARC: xor %o5, -1, %o3155; SPARC: and %o0, %o4, %o4156; SPARC: ld [%o2], %g2157; SPARC: mov 123, %o0158; SPARC: sll %o0, %o1, %o0159; SPARC: sll %o4, %o1, %o4160; SPARC: andn %g2, %o5, %o5161; SPARC: [[LABEL1:\.L.*]]:162; SPARC: or %o5, %o0, %g2163; SPARC: or %o5, %o4, %g3164; SPARC: cas [%o2], %g3, %g2165; SPARC: mov %g0, %g4166; SPARC: cmp %g2, %g3167; SPARC: move %icc, 1, %g4168; SPARC: cmp %g4, 0169; SPARC: bne %icc, [[LABEL2:\.L.*]]170; SPARC: nop171; SPARC: and %g2, %o3, %g3172; SPARC: cmp %o5, %g3173; SPARC: bne %icc, [[LABEL1]]174; SPARC: mov %g3, %o5175; SPARC: [[LABEL2]]:176; SPARC: retl177; SPARC: srl %g2, %o1, %o0178; SPARC64-LABEL: test_cmpxchg_i16179; SPARC64: and %o1, -4, %o2180; SPARC64: and %o1, 3, %o1181; SPARC64: xor %o1, 2, %o1182; SPARC64: sll %o1, 3, %o1183; SPARC64: sethi 63, %o3184; SPARC64: or %o3, 1023, %o4185; SPARC64: sll %o4, %o1, %o5186; SPARC64: xor %o5, -1, %o3187; SPARC64: and %o0, %o4, %o4188; SPARC64: ld [%o2], %g2189; SPARC64: mov 123, %o0190; SPARC64: sll %o0, %o1, %o0191; SPARC64: sll %o4, %o1, %o4192; SPARC64: andn %g2, %o5, %o5193; SPARC64: [[LABEL1:\.L.*]]:194; SPARC64: or %o5, %o0, %g2195; SPARC64: or %o5, %o4, %g3196; SPARC64: cas [%o2], %g3, %g2197; SPARC64: mov %g0, %g4198; SPARC64: cmp %g2, %g3199; SPARC64: move %icc, 1, %g4200; SPARC64: cmp %g4, 0201; SPARC64: bne %icc, [[LABEL2:\.L.*]]202; SPARC64: nop203; SPARC64: and %g2, %o3, %g3204; SPARC64: cmp %o5, %g3205; SPARC64: bne %icc, [[LABEL1]]206; SPARC64: mov %g3, %o5207; SPARC64: [[LABEL2]]:208; SPARC64: retl209; SPARC64: srl %g2, %o1, %o0210define i16 @test_cmpxchg_i16(i16 %a, ptr %ptr) {211entry:212 %pair = cmpxchg ptr %ptr, i16 %a, i16 123 monotonic monotonic213 %b = extractvalue { i16, i1 } %pair, 0214 ret i16 %b215}216 217; SPARC-LABEL: test_cmpxchg_i32218; SPARC: mov 123, [[R:%[gilo][0-7]]]219; SPARC: cas [%o1], %o0, [[R]]220; SPARC64-LABEL: test_cmpxchg_i32221; SPARC64: mov 123, [[R:%[gilo][0-7]]]222; SPARC64: cas [%o1], %o0, [[R]]223define i32 @test_cmpxchg_i32(i32 %a, ptr %ptr) {224entry:225 %pair = cmpxchg ptr %ptr, i32 %a, i32 123 monotonic monotonic226 %b = extractvalue { i32, i1 } %pair, 0227 ret i32 %b228}229 230; SPARC-LABEL: test_swap_i8231; SPARC: mov 42, [[R:%[gilo][0-7]]]232; SPARC: cas233; SPARC64-LABEL: test_swap_i8234; SPARC64: mov 42, [[R:%[gilo][0-7]]]235; SPARC64: cas236define i8 @test_swap_i8(i8 %a, ptr %ptr) {237entry:238 %b = atomicrmw xchg ptr %ptr, i8 42 monotonic239 ret i8 %b240}241 242; SPARC-LABEL: test_swap_i16243; SPARC: mov 42, [[R:%[gilo][0-7]]]244; SPARC: cas245; SPARC64-LABEL: test_swap_i16246; SPARC64: mov 42, [[R:%[gilo][0-7]]]247; SPARC64: cas248define i16 @test_swap_i16(i16 %a, ptr %ptr) {249entry:250 %b = atomicrmw xchg ptr %ptr, i16 42 monotonic251 ret i16 %b252}253 254; SPARC-LABEL: test_swap_i32255; SPARC: mov 42, [[R:%[gilo][0-7]]]256; SPARC: swap [%o1], [[R]]257; SPARC64-LABEL: test_swap_i32258; SPARC64: mov 42, [[R:%[gilo][0-7]]]259; SPARC64: swap [%o1], [[R]]260define i32 @test_swap_i32(i32 %a, ptr %ptr) {261entry:262 %b = atomicrmw xchg ptr %ptr, i32 42 monotonic263 ret i32 %b264}265 266; SPARC-LABEL: test_load_sub_i8267; SPARC: membar268; SPARC: .L{{.*}}:269; SPARC: sub270; SPARC: cas [{{%[gilo][0-7]}}]271; SPARC: membar272; SPARC64-LABEL: test_load_sub_i8273; SPARC64: membar274; SPARC64: .L{{.*}}:275; SPARC64: sub276; SPARC64: cas [{{%[gilo][0-7]}}]277; SPARC64: membar278define zeroext i8 @test_load_sub_i8(ptr %p, i8 zeroext %v) {279entry:280 %0 = atomicrmw sub ptr %p, i8 %v seq_cst281 ret i8 %0282}283 284; SPARC-LABEL: test_load_sub_i16285; SPARC: membar286; SPARC: .L{{.*}}:287; SPARC: sub288; SPARC: cas [{{%[gilo][0-7]}}]289; SPARC: membar290; SPARC64-LABEL: test_load_sub_i16291; SPARC64: membar292; SPARC64: .L{{.*}}:293; SPARC64: sub294; SPARC64: cas [{{%[gilo][0-7]}}]295; SPARC64: membar296define zeroext i16 @test_load_sub_i16(ptr %p, i16 zeroext %v) {297entry:298 %0 = atomicrmw sub ptr %p, i16 %v seq_cst299 ret i16 %0300}301 302; SPARC-LABEL: test_load_add_i32303; SPARC: membar304; SPARC: mov [[U:%[gilo][0-7]]], [[V:%[gilo][0-7]]]305; SPARC: add [[U:%[gilo][0-7]]], %o1, [[V2:%[gilo][0-7]]]306; SPARC: cas [%o0], [[V]], [[V2]]307; SPARC: membar308; SPARC64-LABEL: test_load_add_i32309; SPARC64: membar310; SPARC64: mov [[U:%[gilo][0-7]]], [[V:%[gilo][0-7]]]311; SPARC64: add [[U:%[gilo][0-7]]], %o1, [[V2:%[gilo][0-7]]]312; SPARC64: cas [%o0], [[V]], [[V2]]313; SPARC64: membar314define zeroext i32 @test_load_add_i32(ptr %p, i32 zeroext %v) {315entry:316 %0 = atomicrmw add ptr %p, i32 %v seq_cst317 ret i32 %0318}319 320; SPARC-LABEL: test_load_xor_32321; SPARC: membar322; SPARC: xor323; SPARC: cas [%o0]324; SPARC: membar325; SPARC64-LABEL: test_load_xor_32326; SPARC64: membar327; SPARC64: xor328; SPARC64: cas [%o0]329; SPARC64: membar330define zeroext i32 @test_load_xor_32(ptr %p, i32 zeroext %v) {331entry:332 %0 = atomicrmw xor ptr %p, i32 %v seq_cst333 ret i32 %0334}335 336; SPARC-LABEL: test_load_and_32337; SPARC: membar338; SPARC: and339; SPARC-NOT: xor340; SPARC: cas [%o0]341; SPARC: membar342; SPARC64-LABEL: test_load_and_32343; SPARC64: membar344; SPARC64: and345; SPARC64-NOT: xor346; SPARC64: cas [%o0]347; SPARC64: membar348define zeroext i32 @test_load_and_32(ptr %p, i32 zeroext %v) {349entry:350 %0 = atomicrmw and ptr %p, i32 %v seq_cst351 ret i32 %0352}353 354; SPARC-LABEL: test_load_nand_32355; SPARC: membar356; SPARC: and357; SPARC: xor358; SPARC: cas [%o0]359; SPARC: membar360; SPARC64-LABEL: test_load_nand_32361; SPARC64: membar362; SPARC64: and363; SPARC64: xor364; SPARC64: cas [%o0]365; SPARC64: membar366define zeroext i32 @test_load_nand_32(ptr %p, i32 zeroext %v) {367entry:368 %0 = atomicrmw nand ptr %p, i32 %v seq_cst369 ret i32 %0370}371 372; SPARC-LABEL: test_load_umin_32373; SPARC: membar374; SPARC: cmp375; SPARC: movleu %icc376; SPARC: cas [%o0]377; SPARC: membar378; SPARC64-LABEL: test_load_umin_32379; SPARC64: membar380; SPARC64: cmp381; SPARC64: movleu %icc382; SPARC64: cas [%o0]383; SPARC64: membar384define zeroext i32 @test_load_umin_32(ptr %p, i32 zeroext %v) {385entry:386 %0 = atomicrmw umin ptr %p, i32 %v seq_cst387 ret i32 %0388}389