src/cpu/sparc/vm/sparc.ad
Print this page
*** 9693,9702 ****
--- 9693,9738 ----
opcode(Assembler::ldxa_op3);
ins_encode( form3_mem_reg_little(src, dst) );
ins_pipe( iload_mem );
%}
+ instruct bytes_reverse_char(iRegI dst, stackSlotI src) %{
+ match(Set dst (ReverseBytesC src));
+ effect(DEF dst, USE src);
+
+ // Op cost is artificially doubled to make sure that load or store
+ // instructions are preferred over this one which requires a spill
+ // onto a stack slot.
+ ins_cost(2*DEFAULT_COST + MEMORY_REF_COST);
+ size(8);
+ format %{ "LDUHA $src, $dst\t!asi=primary_little\n\t" %}
+ ins_encode %{
+ emit_form3_mem_reg_asi(cbuf, this, Assembler::lduh_op3, -1,
+ $src$$base, $src$$disp, $src$$index,
+ $dst$$reg, Assembler::ASI_PRIMARY_LITTLE);
+ %}
+ ins_pipe( iload_mem );
+ %}
+
+ instruct bytes_reverse_short(iRegI dst, stackSlotI src) %{
+ match(Set dst (ReverseBytesS src));
+ effect(DEF dst, USE src);
+
+ // Op cost is artificially doubled to make sure that load or store
+ // instructions are preferred over this one which requires a spill
+ // onto a stack slot.
+ ins_cost(2*DEFAULT_COST + MEMORY_REF_COST);
+ size(8);
+ format %{ "LDSHA $src, $dst\t!asi=primary_little\n\t" %}
+ ins_encode %{
+ emit_form3_mem_reg_asi(cbuf, this, Assembler::ldsh_op3, -1,
+ $src$$base, $src$$disp, $src$$index,
+ $dst$$reg, Assembler::ASI_PRIMARY_LITTLE);
+ %}
+ ins_pipe( iload_mem );
+ %}
+
// Load Integer reversed byte order
instruct loadI_reversed(iRegI dst, memory src) %{
match(Set dst (ReverseBytesI (LoadI src)));
ins_cost(DEFAULT_COST + MEMORY_REF_COST);
*** 9719,9728 ****
--- 9755,9796 ----
opcode(Assembler::ldxa_op3);
ins_encode( form3_mem_reg_little( src, dst ) );
ins_pipe(iload_mem);
%}
+ // Load char reversed byte order
+ instruct loadC_reversed(iRegI dst, memory src) %{
+ match(Set dst (ReverseBytesC (LoadUS src)));
+
+ ins_cost(MEMORY_REF_COST);
+ size(8);
+ format %{ "LDUHA $src, $dst\t!asi=primary_little" %}
+
+ ins_encode %{
+ emit_form3_mem_reg_asi(cbuf, this, Assembler::lduh_op3, -1,
+ $src$$base, $src$$disp, $src$$index,
+ $dst$$reg, Assembler::ASI_PRIMARY_LITTLE);
+ %}
+ ins_pipe(iload_mem);
+ %}
+
+ // Load short reversed byte order
+ instruct loadS_reversed(iRegI dst, memory src) %{
+ match(Set dst (ReverseBytesS (LoadS src)));
+
+ ins_cost(MEMORY_REF_COST);
+ size(8);
+ format %{ "LDSHA $src, $dst\t!asi=primary_little" %}
+
+ ins_encode %{
+ emit_form3_mem_reg_asi(cbuf, this, Assembler::ldsh_op3, -1,
+ $src$$base, $src$$disp, $src$$index,
+ $dst$$reg, Assembler::ASI_PRIMARY_LITTLE);
+ %}
+ ins_pipe(iload_mem);
+ %}
+
// Store Integer reversed byte order
instruct storeI_reversed(memory dst, iRegI src) %{
match(Set dst (StoreI dst (ReverseBytesI src)));
ins_cost(MEMORY_REF_COST);
*** 9745,9754 ****
--- 9813,9854 ----
opcode(Assembler::stxa_op3);
ins_encode( form3_mem_reg_little( dst, src) );
ins_pipe(istore_mem_reg);
%}
+ // Store char reversed byte order
+ instruct storeC_reversed(memory dst, iRegI src) %{
+ match(Set dst (StoreUS dst (ReverseBytesC src)));
+
+ ins_cost(MEMORY_REF_COST);
+ size(8);
+ format %{ "STWA $src, $dst\t!asi=primary_little" %}
+
+ ins_encode %{
+ emit_form3_mem_reg_asi(cbuf, this, Assembler::sth_op3, -1,
+ $dst$$base, $dst$$disp, $dst$$index,
+ $src$$reg, Assembler::ASI_PRIMARY_LITTLE);
+ %}
+ ins_pipe(istore_mem_reg);
+ %}
+
+ // Store short reversed byte order
+ instruct storeS_reversed(memory dst, iRegI src) %{
+ match(Set dst (StoreS dst (ReverseBytesS src)));
+
+ ins_cost(MEMORY_REF_COST);
+ size(8);
+ format %{ "STWA $src, $dst\t!asi=primary_little" %}
+
+ ins_encode %{
+ emit_form3_mem_reg_asi(cbuf, this, Assembler::sth_op3, -1,
+ $dst$$base, $dst$$disp, $dst$$index,
+ $src$$reg, Assembler::ASI_PRIMARY_LITTLE);
+ %}
+ ins_pipe(istore_mem_reg);
+ %}
+
//----------PEEPHOLE RULES-----------------------------------------------------
// These must follow all instruction definitions as they use the names
// defined in the instructions definitions.
//
// peepmatch ( root_instr_name [preceding_instruction]* );