< prev index next >

src/cpu/aarch64/vm/aarch64.ad

Print this page
rev 12203 : [mq]: casfixes.patch

*** 4280,4296 **** Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false, noreg); %} ! enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegLNoSp oldval, iRegLNoSp newval, iRegP tmp) %{ MacroAssembler _masm(&cbuf); guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding"); Register tmp = $tmp$$Register; - __ shenandoah_store_check($mem$$base$$Register, $newval$$Register); __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register, Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ false); %} // The only difference between aarch64_enc_cmpxchg and // aarch64_enc_cmpxchg_acq is that we use load-acquire in the --- 4280,4295 ---- Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false, noreg); %} ! enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{ MacroAssembler _masm(&cbuf); guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding"); Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ false); %} // The only difference between aarch64_enc_cmpxchg and // aarch64_enc_cmpxchg_acq is that we use load-acquire in the
*** 4313,4329 **** Assembler::word, /*acquire*/ true, /*release*/ true, /*weak*/ false, noreg); %} ! enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegLNoSp oldval, iRegLNoSp newval, iRegP tmp) %{ MacroAssembler _masm(&cbuf); guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding"); Register tmp = $tmp$$Register; - __ shenandoah_store_check($mem$$base$$Register, $newval$$Register); __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register, Assembler::xword, /*acquire*/ true, /*release*/ true, /*weak*/ false); %} // auxiliary used for CompareAndSwapX to set result register enc_class aarch64_enc_cset_eq(iRegINoSp res) %{ --- 4312,4327 ---- Assembler::word, /*acquire*/ true, /*release*/ true, /*weak*/ false, noreg); %} ! enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{ MacroAssembler _masm(&cbuf); guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding"); Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, Assembler::xword, /*acquire*/ true, /*release*/ true, /*weak*/ false); %} // auxiliary used for CompareAndSwapX to set result register enc_class aarch64_enc_cset_eq(iRegINoSp res) %{
*** 9647,9657 **** ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval), aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegP tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndSwapP mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); --- 9645,9655 ---- ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval), aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndSwapP mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST);
*** 9685,9695 **** aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, iRegP tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndSwapN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); --- 9683,9693 ---- aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndSwapN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST);
*** 9701,9711 **** %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false); __ cset($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} --- 9699,9709 ---- %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false); __ cset($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %}
*** 9767,9777 **** aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegP tmp, rFlagsReg cr) %{ predicate(needs_acquiring_load_exclusive(n) && UseShenandoahGC); match(Set res (CompareAndSwapP mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); --- 9765,9775 ---- aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{ predicate(needs_acquiring_load_exclusive(n) && UseShenandoahGC); match(Set res (CompareAndSwapP mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST);
*** 9805,9815 **** aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, iRegP tmp, rFlagsReg cr) %{ predicate(needs_acquiring_load_exclusive(n) && UseShenandoahGC); match(Set res (CompareAndSwapN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); --- 9803,9813 ---- aarch64_enc_cset_eq(res)); ins_pipe(pipe_slow); %} ! instruct compareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{ predicate(needs_acquiring_load_exclusive(n) && UseShenandoahGC); match(Set res (CompareAndSwapN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST);
*** 9821,9831 **** %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ true, /*release*/ true, /*weak*/ false); __ cset($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} --- 9819,9829 ---- %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. ! __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ true, /*release*/ true, /*weak*/ false); __ cset($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %}
*** 9842,9852 **** instruct compareAndExchangeB(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeB mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (byte, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ uxtbw(rscratch2, $oldval$$Register); --- 9840,9850 ---- instruct compareAndExchangeB(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeB mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (byte, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ uxtbw(rscratch2, $oldval$$Register);
*** 9859,9869 **** %} instruct compareAndExchangeS(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeS mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (short, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ uxthw(rscratch2, $oldval$$Register); --- 9857,9867 ---- %} instruct compareAndExchangeS(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeS mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (short, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ uxthw(rscratch2, $oldval$$Register);
*** 9876,9886 **** %} instruct compareAndExchangeI(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeI mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (int, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, --- 9874,9884 ---- %} instruct compareAndExchangeI(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeI mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (int, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
*** 9891,9901 **** %} instruct compareAndExchangeL(iRegL_R0 res, indirect mem, iRegL_R2 oldval, iRegL_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeL mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (long, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, --- 9889,9899 ---- %} instruct compareAndExchangeL(iRegL_R0 res, indirect mem, iRegL_R2 oldval, iRegL_R3 newval, rFlagsReg cr) %{ match(Set res (CompareAndExchangeL mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (long, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
*** 9907,9917 **** instruct compareAndExchangeN(iRegN_R0 res, indirect mem, iRegN_R2 oldval, iRegN_R3 newval, rFlagsReg cr) %{ predicate(! UseShenandoahGC); match(Set res (CompareAndExchangeN mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, --- 9905,9915 ---- instruct compareAndExchangeN(iRegN_R0 res, indirect mem, iRegN_R2 oldval, iRegN_R3 newval, rFlagsReg cr) %{ predicate(! UseShenandoahGC); match(Set res (CompareAndExchangeN mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
*** 9919,9951 **** /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} ! instruct compareAndExchangeN_shenandoah(iRegN_R0 res, indirect mem, iRegN_R2 oldval, iRegN_R3 newval, iRegP tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndExchangeN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); ! effect(TEMP tmp, KILL cr); format %{ "cmpxchg_oop_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::word, /*acquire*/ false, /*release*/ true, ! /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} instruct compareAndExchangeP(iRegP_R0 res, indirect mem, iRegP_R2 oldval, iRegP_R3 newval, rFlagsReg cr) %{ predicate(!UseShenandoahGC || n->in(3)->in(1)->bottom_type() == TypePtr::NULL_PTR); match(Set res (CompareAndExchangeP mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register, --- 9917,9948 ---- /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} ! instruct compareAndExchangeN_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndExchangeN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, TEMP tmp, KILL cr); format %{ "cmpxchg_oop_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} instruct compareAndExchangeP(iRegP_R0 res, indirect mem, iRegP_R2 oldval, iRegP_R3 newval, rFlagsReg cr) %{ predicate(!UseShenandoahGC || n->in(3)->in(1)->bottom_type() == TypePtr::NULL_PTR); match(Set res (CompareAndExchangeP mem (Binary oldval newval))); ins_cost(2 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, KILL cr); format %{ "cmpxchg $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval" %} ins_encode %{ __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
*** 9953,9976 **** /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} ! instruct compareAndExchangeP_shenandoah(iRegP_R0 res, indirect mem, iRegP_R2 oldval, iRegP_R3 newval, iRegP tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndExchangeP mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); ! effect(TEMP tmp, KILL cr); format %{ "cmpxchg_oop_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp" %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::xword, /*acquire*/ false, /*release*/ true, ! /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} instruct weakCompareAndSwapB(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{ --- 9950,9972 ---- /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} ! instruct compareAndExchangeP_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (CompareAndExchangeP mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); ! effect(TEMP_DEF res, TEMP tmp, KILL cr); format %{ "cmpxchg_oop_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp" %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ false, $res$$Register); %} ins_pipe(pipe_slow); %} instruct weakCompareAndSwapB(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
*** 10059,10069 **** __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} ! instruct weakCompareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegP tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (WeakCompareAndSwapN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); effect(TEMP tmp, KILL cr); format %{ --- 10055,10065 ---- __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} ! instruct weakCompareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (WeakCompareAndSwapN mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); effect(TEMP tmp, KILL cr); format %{
*** 10072,10083 **** %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::word, /*acquire*/ false, /*release*/ true, ! /*weak*/ true); __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} --- 10068,10078 ---- %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ true); __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %}
*** 10097,10107 **** __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} ! instruct weakCompareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegP tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (WeakCompareAndSwapP mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); effect(TEMP tmp, KILL cr); format %{ --- 10092,10102 ---- __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} ! instruct weakCompareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{ predicate(UseShenandoahGC); match(Set res (WeakCompareAndSwapP mem (Binary oldval newval))); ins_cost(3 * VOLATILE_REF_COST); effect(TEMP tmp, KILL cr); format %{
*** 10110,10121 **** %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::xword, /*acquire*/ false, /*release*/ true, ! /*weak*/ true); __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} // --------------------------------------------------------------------- --- 10105,10115 ---- %} ins_encode %{ Register tmp = $tmp$$Register; __ mov(tmp, $oldval$$Register); // Must not clobber oldval. __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, ! Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ true); __ csetw($res$$Register, Assembler::EQ); %} ins_pipe(pipe_slow); %} // ---------------------------------------------------------------------
< prev index next >