src/cpu/sparc/vm/sparc.ad

Print this page

        

*** 9693,9702 **** --- 9693,9758 ---- opcode(Assembler::ldxa_op3); ins_encode( form3_mem_reg_little(src, dst) ); ins_pipe( iload_mem ); %} + instruct bytes_reverse_unsigned_short(iRegI dst, stackSlotI src) %{ + match(Set dst (ReverseBytesUS 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 %{ + int disp = $src$$disp; + Register index = $src$$index; + Register base = $src$$base; + if (base == SP || base == FP) { + disp += STACK_BIAS; + } + if (disp != 0) { + index = O7; + __ set(disp, index); + } + __ lduha(base, index, Assembler::ASI_PRIMARY_LITTLE, $dst$$reg); + %} + + 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 %{ + int disp = $src$$disp; + Register index = $src$$index; + Register base = $src$$base; + if (base == SP || base == FP) { + disp += STACK_BIAS; + } + if (disp != 0) { + index = O7; + __ set(disp, index); + } + __ ldsha(base, index, Assembler::ASI_PRIMARY_LITTLE, $dst$$reg); + %} + + 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 **** --- 9775,9834 ---- opcode(Assembler::ldxa_op3); ins_encode( form3_mem_reg_little( src, dst ) ); ins_pipe(iload_mem); %} + // Load unsigned short / char reversed byte order + instruct loadUS_reversed(iRegI dst, memory src) %{ + match(Set dst (ReverseBytesUS (LoadUS src))); + + ins_cost(DEFAULT_COST + MEMORY_REF_COST); + size(8); + format %{ "LDUHA $src, $dst\t!asi=primary_little" %} + + ins_encode %{ + int disp = $src$$disp; + Register index = $src$$index; + Register base = $src$$base; + if (base == SP || base == FP) { + disp += STACK_BIAS; + } + if (disp != 0) { + index = O7; + __ set(disp, index); + } + __ lduha(base, index, Assembler::ASI_PRIMARY_LITTLE, $dst$$reg); + %} + + ins_pipe(iload_mem); + %} + + // Load short reversed byte order + instruct loadS_reversed(iRegI dst, memory src) %{ + match(Set dst (ReverseBytesS (LoadS src))); + + ins_cost(DEFAULT_COST + MEMORY_REF_COST); + size(8); + format %{ "LDSHA $src, $dst\t!asi=primary_little" %} + + ins_encode %{ + int disp = $src$$disp; + Register index = $src$$index; + Register base = $src$$base; + if (base == SP || base == FP) { + disp += STACK_BIAS; + } + if (disp != 0) { + index = O7; + __ set(disp, index); + } + __ ldsha(base, index, Assembler::ASI_PRIMARY_LITTLE, $dst$$reg); + %} + + 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 **** --- 9851,9910 ---- opcode(Assembler::stxa_op3); ins_encode( form3_mem_reg_little( dst, src) ); ins_pipe(istore_mem_reg); %} + // Store unsighed short/char reversed byte order + instruct storeUS_reversed(memory dst, iRegI src) %{ + match(Set dst (StoreUS dst (ReverseBytesUS src))); + + ins_cost(MEMORY_REF_COST); + size(8); + format %{ "STHA $src, $dst\t!asi=primary_little" %} + + ins_encode %{ + int disp = $dst$$disp; + Register index = $dst$index; + Register base = $dst$$base; + if (base == SP || base == FP) { + disp += STACK_BIAS; + } + if (disp != 0) { + index = O7; + __ set(disp, index); + } + __ stha($src$$reg, base, index, 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 %{ "STHA $src, $dst\t!asi=primary_little" %} + + ins_encode %{ + int disp = $dst$$disp; + Register index = $dst$index; + Register base = $dst$$base; + if (base == SP || base == FP) { + disp += STACK_BIAS; + } + if (disp != 0) { + index = O7; + __ set(disp, index); + } + __ stha($src$$reg, base, index, 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]* );