@@ -4397,6 +4397,12 @@ pipe_class pipe_slow()
43974397 LDST : MEM;
43984398%}
43994399
4400+ // The real do-nothing guy
4401+ pipe_class real_empty()
4402+ %{
4403+ instruction_count(0);
4404+ %}
4405+
44004406// Empty pipeline class
44014407pipe_class pipe_class_empty()
44024408%{
@@ -7902,113 +7908,153 @@ instruct xorL_reg_imm(iRegLNoSp dst, iRegL src1, immLAdd src2) %{
79027908// ============================================================================
79037909// MemBar Instruction
79047910
7905- instruct load_fence() %{
7911+ // RVTSO
7912+
7913+ instruct unnecessary_membar_rvtso() %{
7914+ predicate(UseZtso);
79067915 match(LoadFence);
7907- ins_cost(ALU_COST);
7916+ match(StoreFence);
7917+ match(StoreStoreFence);
7918+ match(MemBarAcquire);
7919+ match(MemBarRelease);
7920+ match(MemBarStoreStore);
7921+ match(MemBarAcquireLock);
7922+ match(MemBarReleaseLock);
79087923
7909- format %{ "#@load_fence" %}
7924+ ins_cost(0);
7925+
7926+ size(0);
79107927
7928+ format %{ "#@unnecessary_membar_rvtso elided/tso (empty encoding)" %}
79117929 ins_encode %{
7912- __ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore );
7930+ __ block_comment("unnecessary_membar_rvtso" );
79137931 %}
7914- ins_pipe(pipe_serial );
7932+ ins_pipe(real_empty );
79157933%}
79167934
7917- instruct membar_acquire() %{
7918- match(MemBarAcquire);
7919- ins_cost(ALU_COST);
7935+ instruct membar_volatile_rvtso() %{
7936+ predicate(UseZtso);
7937+ match(MemBarVolatile);
7938+ ins_cost(VOLATILE_REF_COST);
79207939
7921- format %{ "#@membar_acquire \n\t"
7922- "fence ir iorw" %}
7940+ format %{ "#@membar_volatile_rvtso \n\t"
7941+ "fence w, r" %}
79237942
79247943 ins_encode %{
7925- __ block_comment("membar_acquire ");
7926- __ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore );
7944+ __ block_comment("membar_volatile_rvtso ");
7945+ __ membar(MacroAssembler::StoreLoad );
79277946 %}
79287947
7929- ins_pipe(pipe_serial );
7948+ ins_pipe(pipe_slow );
79307949%}
79317950
7932- instruct membar_acquire_lock() %{
7933- match(MemBarAcquireLock);
7951+ instruct unnecessary_membar_volatile_rvtso() %{
7952+ predicate(UseZtso && Matcher::post_store_load_barrier(n));
7953+ match(MemBarVolatile);
79347954 ins_cost(0);
79357955
7936- format %{ "#@membar_acquire_lock (elided)" %}
7937-
7956+ size(0);
7957+
7958+ format %{ "#@unnecessary_membar_volatile_rvtso (unnecessary so empty encoding)" %}
79387959 ins_encode %{
7939- __ block_comment("membar_acquire_lock (elided) ");
7960+ __ block_comment("unnecessary_membar_volatile_rvtso ");
79407961 %}
7941-
7942- ins_pipe(pipe_serial);
7962+ ins_pipe(real_empty);
79437963%}
79447964
7945- instruct store_fence() %{
7946- match(StoreFence);
7947- ins_cost(ALU_COST);
7965+ // RVWMO
7966+
7967+ instruct membar_aqcuire_rvwmo() %{
7968+ predicate(!UseZtso);
7969+ match(LoadFence);
7970+ match(MemBarAcquire);
7971+ ins_cost(VOLATILE_REF_COST);
79487972
7949- format %{ "#@store_fence" %}
7973+ format %{ "#@membar_aqcuire_rvwmo\n\t"
7974+ "fence r, rw" %}
79507975
79517976 ins_encode %{
7952- __ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
7977+ __ block_comment("membar_aqcuire_rvwmo");
7978+ __ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
79537979 %}
79547980 ins_pipe(pipe_serial);
79557981%}
79567982
7957- instruct membar_release() %{
7983+ instruct membar_release_rvwmo() %{
7984+ predicate(!UseZtso);
7985+ match(StoreFence);
79587986 match(MemBarRelease);
7959- ins_cost(ALU_COST );
7987+ ins_cost(VOLATILE_REF_COST );
79607988
7961- format %{ "#@membar_release \n\t"
7962- "fence iorw ow " %}
7989+ format %{ "#@membar_release_rvwmo \n\t"
7990+ "fence rw, w " %}
79637991
79647992 ins_encode %{
7965- __ block_comment("membar_release ");
7993+ __ block_comment("membar_release_rvwmo ");
79667994 __ membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
79677995 %}
79687996 ins_pipe(pipe_serial);
79697997%}
79707998
7971- instruct membar_storestore() %{
7999+ instruct membar_storestore_rvwmo() %{
8000+ predicate(!UseZtso);
79728001 match(MemBarStoreStore);
79738002 match(StoreStoreFence);
7974- ins_cost(ALU_COST );
8003+ ins_cost(VOLATILE_REF_COST );
79758004
7976- format %{ "MEMBAR-store-store\t#@membar_storestore" %}
8005+ format %{ "#@membar_storestore_rvwmo\n\t"
8006+ "fence w, w" %}
79778007
79788008 ins_encode %{
79798009 __ membar(MacroAssembler::StoreStore);
79808010 %}
79818011 ins_pipe(pipe_serial);
79828012%}
79838013
7984- instruct membar_release_lock() %{
7985- match(MemBarReleaseLock);
7986- ins_cost(0);
8014+ instruct membar_volatile_rvwmo() %{
8015+ predicate(!UseZtso);
8016+ match(MemBarVolatile);
8017+ ins_cost(VOLATILE_REF_COST);
79878018
7988- format %{ "#@membar_release_lock (elided)" %}
8019+ format %{ "#@membar_volatile_rvwmo\n\t"
8020+ "fence w, r"%}
79898021
79908022 ins_encode %{
7991- __ block_comment("membar_release_lock (elided)");
8023+ __ block_comment("membar_volatile_rvwmo");
8024+ __ membar(MacroAssembler::StoreLoad);
79928025 %}
79938026
79948027 ins_pipe(pipe_serial);
79958028%}
79968029
7997- instruct membar_volatile() %{
7998- match(MemBarVolatile);
7999- ins_cost(ALU_COST);
8030+ instruct membar_lock_rvwmo() %{
8031+ predicate(!UseZtso);
8032+ match(MemBarAcquireLock);
8033+ match(MemBarReleaseLock);
8034+ ins_cost(0);
80008035
8001- format %{ "#@membar_volatile\n\t"
8002- "fence iorw iorw"%}
8036+ format %{ "#@membar_lock_rvwmo (elided)" %}
80038037
80048038 ins_encode %{
8005- __ block_comment("membar_volatile");
8006- __ membar(MacroAssembler::StoreLoad);
8039+ __ block_comment("membar_lock_rvwmo (elided)");
80078040 %}
80088041
80098042 ins_pipe(pipe_serial);
80108043%}
80118044
8045+ instruct unnecessary_membar_volatile_rvwmo() %{
8046+ predicate(!UseZtso && Matcher::post_store_load_barrier(n));
8047+ match(MemBarVolatile);
8048+ ins_cost(0);
8049+
8050+ size(0);
8051+ format %{ "#@unnecessary_membar_volatile_rvwmo (unnecessary so empty encoding)" %}
8052+ ins_encode %{
8053+ __ block_comment("unnecessary_membar_volatile_rvwmo");
8054+ %}
8055+ ins_pipe(real_empty);
8056+ %}
8057+
80128058instruct spin_wait() %{
80138059 predicate(UseZihintpause);
80148060 match(OnSpinWait);
0 commit comments