brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.5 KiB · 00c3069 Raw
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