brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 7063868 Raw
174 lines · plain
1; Test 16-bit compare and swap.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-MAIN4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-SHIFT5 6; Check compare and swap with a variable.7; - CHECK is for the main loop.8; - CHECK-SHIFT makes sure that the negated shift count used by the second9;   RLL is set up correctly.  The negation is independent of the NILL and L10;   tested in CHECK.  CHECK-SHIFT also checks that %r3 is not modified before11;   being used in the RISBG (in contrast to things like atomic addition,12;   which shift %r3 left so that %b is at the high end of the word).13define i16 @f1(i16 %dummy, ptr %src, i16 %cmp, i16 %swap) {14; CHECK-MAIN-LABEL: f1:15; CHECK-MAIN: risbg [[RISBG:%r[1-9]+]], %r3, 0, 189, 0{{$}}16; CHECK-MAIN-DAG: sll %r3, 317; CHECK-MAIN-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])18; CHECK-MAIN-DAG: llhr %r4, %r419; CHECK-MAIN: [[LOOP:\.[^ ]*]]:20; CHECK-MAIN: rll %r2, [[OLD]], 16(%r3)21; CHECK-MAIN: risbg %r5, %r2, 32, 47, 022; CHECK-MAIN: llhr %r2, %r223; CHECK-MAIN: crjlh %r2, %r4, [[EXIT:\.[^ ]*]]24; CHECK-MAIN: rll [[NEW:%r[0-9]+]], %r5, -16({{%r[1-9]+}})25; CHECK-MAIN: cs [[OLD]], [[NEW]], 0([[RISBG]])26; CHECK-MAIN: jl [[LOOP]]27; CHECK-MAIN: [[EXIT]]:28; CHECK-MAIN-NOT: %r229; CHECK-MAIN: br %r1430;31; CHECK-SHIFT-LABEL: f1:32; CHECK-SHIFT: sll %r3, 333; CHECK-SHIFT: lcr [[NEGSHIFT:%r[1-9]+]], %r334; CHECK-SHIFT: rll35; CHECK-SHIFT: rll {{%r[0-9]+}}, %r5, -16([[NEGSHIFT]])36  %pair = cmpxchg ptr %src, i16 %cmp, i16 %swap seq_cst seq_cst37  %res = extractvalue { i16, i1 } %pair, 038  ret i16 %res39}40 41; Check compare and swap with constants.  We should force the constants into42; registers and use the sequence above.43define i16 @f2(ptr %src) {44; CHECK-LABEL: f2:45; CHECK: lhi [[CMP:%r[0-9]+]], 4246; CHECK: risbg [[CMP]], {{%r[0-9]+}}, 32, 47, 047; CHECK: risbg48; CHECK: br %r1449;50; CHECK-SHIFT-LABEL: f2:51; CHECK-SHIFT: lhi [[SWAP:%r[0-9]+]], 8852; CHECK-SHIFT: risbg [[SWAP]], {{%r[0-9]+}}, 32, 47, 053; CHECK-SHIFT: br %r1454  %pair = cmpxchg ptr %src, i16 42, i16 88 seq_cst seq_cst55  %res = extractvalue { i16, i1 } %pair, 056  ret i16 %res57}58 59; Check generating the comparison result.60define i32 @f3(i16 %dummy, ptr %src, i16 %cmp, i16 %swap) {61; CHECK-MAIN-LABEL: f3:62; CHECK-MAIN: risbg [[RISBG:%r[1-9]+]], %r3, 0, 189, 0{{$}}63; CHECK-MAIN-DAG: sll %r3, 364; CHECK-MAIN-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])65; CHECK-MAIN-DAG: llhr %r2, %r466; CHECK-MAIN: [[LOOP:\.[^ ]*]]:67; CHECK-MAIN: rll [[TMP:%r[0-9]+]], [[OLD]], 16(%r3)68; CHECK-MAIN: risbg %r5, [[TMP]], 32, 47, 069; CHECK-MAIN: llhr %r14, %r1470; CHECK-MAIN: cr [[TMP]], %r271; CHECK-MAIN: jlh [[EXIT:\.[^ ]*]]72; CHECK-MAIN: rll [[NEW:%r[0-9]+]], %r5, -16({{%r[1-9]+}})73; CHECK-MAIN: cs [[OLD]], [[NEW]], 0([[RISBG]])74; CHECK-MAIN: jl [[LOOP]]75; CHECK-MAIN: [[EXIT]]:76; CHECK-MAIN-NEXT: ipm %r277; CHECK-MAIN-NEXT: afi %r2, -26843545678; CHECK-MAIN-NEXT: srl %r2, 3179; CHECK-MAIN-NOT: %r280; CHECK-MAIN: br %r1481;82; CHECK-SHIFT-LABEL: f3:83; CHECK-SHIFT: sll %r3, 384; CHECK-SHIFT: lcr [[NEGSHIFT:%r[1-9]+]], %r385; CHECK-SHIFT: rll86; CHECK-SHIFT: rll {{%r[0-9]+}}, %r5, -16([[NEGSHIFT]])87  %pair = cmpxchg ptr %src, i16 %cmp, i16 %swap seq_cst seq_cst88  %val = extractvalue { i16, i1 } %pair, 189  %res = zext i1 %val to i3290  ret i32 %res91}92 93declare void @g()94 95; Check using the comparison result for a branch.96; CHECK-LABEL: f497; CHECK-MAIN-LABEL: f4:98; CHECK-MAIN: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}}99; CHECK-MAIN-DAG: sll %r2, 3100; CHECK-MAIN-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])101; CHECK-MAIN-DAG: llhr %r3, %r3102; CHECK-MAIN: [[LOOP:\.[^ ]*]]:103; CHECK-MAIN: rll [[TMP:%r[0-9]+]], [[OLD]], 16(%r2)104; CHECK-MAIN: risbg %r4, [[TMP]], 32, 47, 0105; CHECK-MAIN: llhr %r14, %r14106; CHECK-MAIN: cr [[TMP]], %r3107; CHECK-MAIN: jlh [[EXIT:\.[^ ]*]]108; CHECK-MAIN: rll [[NEW:%r[0-9]+]], %r4, -16({{%r[1-9]+}})109; CHECK-MAIN: cs [[OLD]], [[NEW]], 0([[RISBG]])110; CHECK-MAIN: jl [[LOOP]]111; CHECK-MAIN: [[EXIT]]:112; CHECK-MAIN-NEXT: jlh [[LABEL:\.[^ ]*]]113; CHECK-MAIN: jg g114; CHECK-MAIN: [[LABEL]]:115; CHECK-MAIN: br %r14116;117; CHECK-SHIFT-LABEL: f4:118; CHECK-SHIFT: sll %r2, 3119; CHECK-SHIFT: lcr [[NEGSHIFT:%r[1-9]+]], %r2120; CHECK-SHIFT: rll121; CHECK-SHIFT: rll {{%r[0-9]+}}, %r4, -16([[NEGSHIFT]])122define void @f4(ptr %src, i16 %cmp, i16 %swap) {123  %pair = cmpxchg ptr %src, i16 %cmp, i16 %swap seq_cst seq_cst124  %cond = extractvalue { i16, i1 } %pair, 1125  br i1 %cond, label %call, label %exit126 127call:128  tail call void @g()129  br label %exit130 131exit:132  ret void133}134 135; ... and the same with the inverted direction.136; CHECK-MAIN-LABEL: f5:137; CHECK-MAIN: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}}138; CHECK-MAIN-DAG: sll %r2, 3139; CHECK-MAIN-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])140; CHECK-MAIN-DAG: llhr %r3, %r3141; CHECK-MAIN: [[LOOP:\.[^ ]*]]:142; CHECK-MAIN: rll [[TMP:%r[0-9]+]], [[OLD]], 16(%r2)143; CHECK-MAIN: risbg %r4, [[TMP]], 32, 47, 0144; CHECK-MAIN: llhr %r14, %r14145; CHECK-MAIN: cr [[TMP]], %r3146; CHECK-MAIN: jlh [[EXIT:\.[^ ]*]]147; CHECK-MAIN: rll [[NEW:%r[0-9]+]], %r4, -16({{%r[1-9]+}})148; CHECK-MAIN: cs [[OLD]], [[NEW]], 0([[RISBG]])149; CHECK-MAIN: jl [[LOOP]]150; CHECK-MAIN: [[EXIT]]:151; CHECK-MAIN-NEXT: jlh [[LABEL:\.[^ ]*]]152; CHECK-MAIN: br %r14153; CHECK-MAIN: [[LABEL]]:154; CHECK-MAIN: jg g155;156; CHECK-SHIFT-LABEL: f5:157; CHECK-SHIFT: sll %r2, 3158; CHECK-SHIFT: lcr [[NEGSHIFT:%r[1-9]+]], %r2159; CHECK-SHIFT: rll160; CHECK-SHIFT: rll {{%r[0-9]+}}, %r4, -16([[NEGSHIFT]])161define void @f5(ptr %src, i16 %cmp, i16 %swap) {162  %pair = cmpxchg ptr %src, i16 %cmp, i16 %swap seq_cst seq_cst163  %cond = extractvalue { i16, i1 } %pair, 1164  br i1 %cond, label %exit, label %call165 166call:167  tail call void @g()168  br label %exit169 170exit:171  ret void172}173 174