src/cpu/mips/vm/assembler_mips.inline.hpp

Tue, 26 Jul 2016 17:06:17 +0800

author
fujie
date
Tue, 26 Jul 2016 17:06:17 +0800
changeset 41
d885f8d65c58
parent 28
29b7198a76b9
child 6880
52ea28d233d2
permissions
-rw-r--r--

Add multiply word to GPR instruction (mul) in MIPS assembler.

aoqi@1 1 /*
aoqi@1 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
aoqi@1 3 * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved.
aoqi@1 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@1 5 *
aoqi@1 6 * This code is free software; you can redistribute it and/or modify it
aoqi@1 7 * under the terms of the GNU General Public License version 2 only, as
aoqi@1 8 * published by the Free Software Foundation.
aoqi@1 9 *
aoqi@1 10 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@1 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@1 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@1 13 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@1 14 * accompanied this code).
aoqi@1 15 *
aoqi@1 16 * You should have received a copy of the GNU General Public License version
aoqi@1 17 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@1 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@1 19 *
aoqi@1 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@1 21 * or visit www.oracle.com if you need additional information or have any
aoqi@1 22 * questions.
aoqi@1 23 *
aoqi@1 24 */
aoqi@1 25
aoqi@1 26 #ifndef CPU_MIPS_VM_ASSEMBLER_MIPS_INLINE_HPP
aoqi@1 27 #define CPU_MIPS_VM_ASSEMBLER_MIPS_INLINE_HPP
aoqi@1 28
aoqi@1 29 #include "asm/assembler.inline.hpp"
aoqi@1 30 #include "asm/codeBuffer.hpp"
aoqi@1 31 #include "code/codeCache.hpp"
aoqi@1 32
aoqi@1 33 /*
aoqi@1 34 inline void MacroAssembler::pd_patch_instruction(address branch, address target) {
aoqi@1 35 jint& stub_inst = *(jint*) branch;
aoqi@1 36 stub_inst = patched_branch(target - branch, stub_inst, 0);
aoqi@1 37 }
aoqi@1 38 */
aoqi@1 39
aoqi@1 40 #ifndef PRODUCT
aoqi@1 41 /*
aoqi@1 42 inline void MacroAssembler::pd_print_patched_instruction(address branch) {
aoqi@1 43 jint stub_inst = *(jint*) branch;
aoqi@1 44 print_instruction(stub_inst);
aoqi@1 45 ::tty->print("%s", " (unresolved)");
aoqi@1 46 }
aoqi@1 47 */
aoqi@1 48 #endif // PRODUCT
aoqi@1 49
aoqi@1 50 //inline bool Address::is_simm13(int offset) { return Assembler::is_simm13(disp() + offset); }
aoqi@1 51
aoqi@1 52
aoqi@1 53 inline void Assembler::check_delay() {
aoqi@1 54 # ifdef CHECK_DELAY
aoqi@1 55 // guarantee( delay_state != at_delay_slot, "must say delayed() when filling delay slot");
aoqi@1 56 delay_state = no_delay;
aoqi@1 57 # endif
aoqi@1 58 }
aoqi@1 59
aoqi@1 60 inline void Assembler::emit_long(int x) {
aoqi@1 61 check_delay();
aoqi@28 62 AbstractAssembler::emit_int32(x);
aoqi@1 63 }
aoqi@1 64
aoqi@1 65 inline void Assembler::emit_data(int x, relocInfo::relocType rtype) {
aoqi@1 66 relocate(rtype);
aoqi@1 67 emit_long(x);
aoqi@1 68 }
aoqi@1 69
aoqi@1 70 inline void Assembler::emit_data(int x, RelocationHolder const& rspec) {
aoqi@1 71 relocate(rspec);
aoqi@1 72 emit_long(x);
aoqi@1 73 }
aoqi@1 74 /*
aoqi@1 75 inline void MacroAssembler::store_int_argument(Register s, Argument &a) {
aoqi@1 76 if(a.is_Register()) {
aoqi@1 77 move(a.as_Register(), s);
aoqi@1 78 } else {
aoqi@1 79 sw(s, a.as_caller_address());
aoqi@1 80 }
aoqi@1 81 }
aoqi@1 82
aoqi@1 83 inline void MacroAssembler::store_long_argument(Register s, Argument &a) {
aoqi@1 84 Argument a1 = a.successor();
aoqi@1 85 if(a.is_Register() && a1.is_Register()) {
aoqi@1 86 move(a.as_Register(), s);
aoqi@1 87 move(a.as_Register(), s);
aoqi@1 88 } else {
aoqi@1 89 sd(s, a.as_caller_address());
aoqi@1 90 }
aoqi@1 91 }
aoqi@1 92
aoqi@1 93 inline void MacroAssembler::store_float_argument(FloatRegister s, Argument &a) {
aoqi@1 94 if(a.is_Register()) {
aoqi@1 95 mov_s(a.as_FloatRegister(), s);
aoqi@1 96 } else {
aoqi@1 97 swc1(s, a.as_caller_address());
aoqi@1 98 }
aoqi@1 99 }
aoqi@1 100
aoqi@1 101 inline void MacroAssembler::store_double_argument(FloatRegister s, Argument &a) {
aoqi@1 102 if(a.is_Register()) {
aoqi@1 103 mov_d(a.as_FloatRegister(), s);
aoqi@1 104 } else {
aoqi@1 105 sdc1(s, a.as_caller_address());
aoqi@1 106 }
aoqi@1 107 }
aoqi@1 108
aoqi@1 109 inline void MacroAssembler::store_ptr_argument(Register s, Argument &a) {
aoqi@1 110 if(a.is_Register()) {
aoqi@1 111 move(a.as_Register(), s);
aoqi@1 112 } else {
aoqi@1 113 st_ptr(s, a.as_caller_address());
aoqi@1 114 }
aoqi@1 115 }
aoqi@1 116 inline void MacroAssembler::ld_ptr(Register rt, Register base, int offset16) {
aoqi@1 117 #ifdef _LP64
aoqi@1 118 ld(rt, base, offset16);
aoqi@1 119 #else
aoqi@1 120 lw(rt, base, offset16);
aoqi@1 121 #endif
aoqi@1 122 }
aoqi@1 123 inline void MacroAssembler::ld_ptr(Register rt, Address a) {
aoqi@1 124 #ifdef _LP64
aoqi@1 125 ld(rt, a.base(), a.disp());
aoqi@1 126 #else
aoqi@1 127 lw(rt, a.base(), a.disp());
aoqi@1 128 #endif
aoqi@1 129 }
aoqi@1 130
aoqi@1 131 inline void MacroAssembler::st_ptr(Register rt, Address a) {
aoqi@1 132 #ifdef _LP64
aoqi@1 133 sd(rt, a.base(), a.disp());
aoqi@1 134 #else
aoqi@1 135 sw(rt, a.base(), a.disp());
aoqi@1 136 #endif
aoqi@1 137 }
aoqi@1 138
aoqi@1 139 inline void MacroAssembler::st_ptr(Register rt, Register base, int offset16) {
aoqi@1 140 #ifdef _LP64
aoqi@1 141 sd(rt, base, offset16);
aoqi@1 142 #else
aoqi@1 143 sw(rt, base, offset16);
aoqi@1 144 #endif
aoqi@1 145 }
aoqi@1 146
aoqi@1 147 inline void MacroAssembler::ld_long(Register rt, Register base, int offset16) {
aoqi@1 148 #ifdef _LP64
aoqi@1 149 ld(rt, base, offset16);
aoqi@1 150 #else
aoqi@1 151 lw(rt, base, offset16);
aoqi@1 152 #endif
aoqi@1 153 }
aoqi@1 154
aoqi@1 155 inline void MacroAssembler::st_long(Register rt, Register base, int offset16) {
aoqi@1 156 #ifdef _LP64
aoqi@1 157 sd(rt, base, offset16);
aoqi@1 158 #else
aoqi@1 159 sw(rt, base, offset16);
aoqi@1 160 #endif
aoqi@1 161 }
aoqi@1 162
aoqi@1 163 inline void MacroAssembler::ld_long(Register rt, Address a) {
aoqi@1 164 #ifdef _LP64
aoqi@1 165 ld(rt, a.base(), a.disp());
aoqi@1 166 #else
aoqi@1 167 lw(rt, a.base(), a.disp());
aoqi@1 168 #endif
aoqi@1 169 }
aoqi@1 170
aoqi@1 171 inline void MacroAssembler::st_long(Register rt, Address a) {
aoqi@1 172 #ifdef _LP64
aoqi@1 173 sd(rt, a.base(), a.disp());
aoqi@1 174 #else
aoqi@1 175 sw(rt, a.base(), a.disp());
aoqi@1 176 #endif
aoqi@1 177 }
aoqi@1 178
aoqi@1 179 inline void MacroAssembler::addu_long(Register rd, Register rs, Register rt) {
aoqi@1 180 #ifdef _LP64
aoqi@1 181 daddu(rd, rs, rt);
aoqi@1 182 #else
aoqi@1 183 addu(rd, rs, rt);
aoqi@1 184 #endif
aoqi@1 185 }
aoqi@1 186
aoqi@1 187 inline void MacroAssembler::addu_long(Register rd, Register rs, long imm32_64) {
aoqi@1 188 #ifdef _LP64
aoqi@1 189 daddiu(rd, rs, imm32_64);
aoqi@1 190 #else
aoqi@1 191 addiu(rd, rs, imm32_64);
aoqi@1 192 #endif
aoqi@1 193 } */
aoqi@1 194
aoqi@1 195 #endif // CPU_MIPS_VM_ASSEMBLER_MIPS_INLINE_HPP
aoqi@1 196

mercurial