| OLD | NEW |
| 1 | 1 |
| 2 // Copyright 2012 the V8 project authors. All rights reserved. | 2 // Copyright 2012 the V8 project authors. All rights reserved. |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 | 5 |
| 6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_MIPS | 8 #if V8_TARGET_ARCH_MIPS |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 3034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3045 return false; | 3045 return false; |
| 3046 } | 3046 } |
| 3047 | 3047 |
| 3048 | 3048 |
| 3049 void MacroAssembler::Jump(Register target, | 3049 void MacroAssembler::Jump(Register target, |
| 3050 Condition cond, | 3050 Condition cond, |
| 3051 Register rs, | 3051 Register rs, |
| 3052 const Operand& rt, | 3052 const Operand& rt, |
| 3053 BranchDelaySlot bd) { | 3053 BranchDelaySlot bd) { |
| 3054 BlockTrampolinePoolScope block_trampoline_pool(this); | 3054 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 3055 if (cond == cc_always) { | 3055 if (IsMipsArchVariant(kMips32r6) && bd == PROTECT) { |
| 3056 jr(target); | 3056 if (cond == cc_always) { |
| 3057 jic(target, 0); |
| 3058 } else { |
| 3059 BRANCH_ARGS_CHECK(cond, rs, rt); |
| 3060 Branch(2, NegateCondition(cond), rs, rt); |
| 3061 jic(target, 0); |
| 3062 } |
| 3057 } else { | 3063 } else { |
| 3058 BRANCH_ARGS_CHECK(cond, rs, rt); | 3064 if (cond == cc_always) { |
| 3059 Branch(2, NegateCondition(cond), rs, rt); | 3065 jr(target); |
| 3060 jr(target); | 3066 } else { |
| 3067 BRANCH_ARGS_CHECK(cond, rs, rt); |
| 3068 Branch(2, NegateCondition(cond), rs, rt); |
| 3069 jr(target); |
| 3070 } |
| 3071 // Emit a nop in the branch delay slot if required. |
| 3072 if (bd == PROTECT) nop(); |
| 3061 } | 3073 } |
| 3062 // Emit a nop in the branch delay slot if required. | |
| 3063 if (bd == PROTECT) | |
| 3064 nop(); | |
| 3065 } | 3074 } |
| 3066 | 3075 |
| 3067 | 3076 |
| 3068 void MacroAssembler::Jump(intptr_t target, | 3077 void MacroAssembler::Jump(intptr_t target, |
| 3069 RelocInfo::Mode rmode, | 3078 RelocInfo::Mode rmode, |
| 3070 Condition cond, | 3079 Condition cond, |
| 3071 Register rs, | 3080 Register rs, |
| 3072 const Operand& rt, | 3081 const Operand& rt, |
| 3073 BranchDelaySlot bd) { | 3082 BranchDelaySlot bd) { |
| 3074 Label skip; | 3083 Label skip; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3112 const Operand& rt, | 3121 const Operand& rt, |
| 3113 BranchDelaySlot bd) { | 3122 BranchDelaySlot bd) { |
| 3114 int size = 0; | 3123 int size = 0; |
| 3115 | 3124 |
| 3116 if (cond == cc_always) { | 3125 if (cond == cc_always) { |
| 3117 size += 1; | 3126 size += 1; |
| 3118 } else { | 3127 } else { |
| 3119 size += 3; | 3128 size += 3; |
| 3120 } | 3129 } |
| 3121 | 3130 |
| 3122 if (bd == PROTECT) | 3131 if (bd == PROTECT && !IsMipsArchVariant(kMips32r6)) size += 1; |
| 3123 size += 1; | |
| 3124 | 3132 |
| 3125 return size * kInstrSize; | 3133 return size * kInstrSize; |
| 3126 } | 3134 } |
| 3127 | 3135 |
| 3128 | 3136 |
| 3129 // Note: To call gcc-compiled C code on mips, you must call thru t9. | 3137 // Note: To call gcc-compiled C code on mips, you must call thru t9. |
| 3130 void MacroAssembler::Call(Register target, | 3138 void MacroAssembler::Call(Register target, |
| 3131 Condition cond, | 3139 Condition cond, |
| 3132 Register rs, | 3140 Register rs, |
| 3133 const Operand& rt, | 3141 const Operand& rt, |
| 3134 BranchDelaySlot bd) { | 3142 BranchDelaySlot bd) { |
| 3135 #ifdef DEBUG | 3143 #ifdef DEBUG |
| 3136 int size = IsPrevInstrCompactBranch() ? kInstrSize : 0; | 3144 int size = IsPrevInstrCompactBranch() ? kInstrSize : 0; |
| 3137 #endif | 3145 #endif |
| 3138 | 3146 |
| 3139 BlockTrampolinePoolScope block_trampoline_pool(this); | 3147 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 3140 Label start; | 3148 Label start; |
| 3141 bind(&start); | 3149 bind(&start); |
| 3142 if (cond == cc_always) { | 3150 if (IsMipsArchVariant(kMips32r6) && bd == PROTECT) { |
| 3143 jalr(target); | 3151 if (cond == cc_always) { |
| 3152 jialc(target, 0); |
| 3153 } else { |
| 3154 BRANCH_ARGS_CHECK(cond, rs, rt); |
| 3155 Branch(2, NegateCondition(cond), rs, rt); |
| 3156 jialc(target, 0); |
| 3157 } |
| 3144 } else { | 3158 } else { |
| 3145 BRANCH_ARGS_CHECK(cond, rs, rt); | 3159 if (cond == cc_always) { |
| 3146 Branch(2, NegateCondition(cond), rs, rt); | 3160 jalr(target); |
| 3147 jalr(target); | 3161 } else { |
| 3162 BRANCH_ARGS_CHECK(cond, rs, rt); |
| 3163 Branch(2, NegateCondition(cond), rs, rt); |
| 3164 jalr(target); |
| 3165 } |
| 3166 // Emit a nop in the branch delay slot if required. |
| 3167 if (bd == PROTECT) nop(); |
| 3148 } | 3168 } |
| 3149 // Emit a nop in the branch delay slot if required. | |
| 3150 if (bd == PROTECT) | |
| 3151 nop(); | |
| 3152 | 3169 |
| 3153 #ifdef DEBUG | 3170 #ifdef DEBUG |
| 3154 CHECK_EQ(size + CallSize(target, cond, rs, rt, bd), | 3171 CHECK_EQ(size + CallSize(target, cond, rs, rt, bd), |
| 3155 SizeOfCodeGeneratedSince(&start)); | 3172 SizeOfCodeGeneratedSince(&start)); |
| 3156 #endif | 3173 #endif |
| 3157 } | 3174 } |
| 3158 | 3175 |
| 3159 | 3176 |
| 3160 int MacroAssembler::CallSize(Address target, | 3177 int MacroAssembler::CallSize(Address target, |
| 3161 RelocInfo::Mode rmode, | 3178 RelocInfo::Mode rmode, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3232 | 3249 |
| 3233 | 3250 |
| 3234 void MacroAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) { | 3251 void MacroAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) { |
| 3235 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT && | 3252 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT && |
| 3236 (!L->is_bound() || is_near_r6(L))) { | 3253 (!L->is_bound() || is_near_r6(L))) { |
| 3237 BranchShortHelperR6(0, L); | 3254 BranchShortHelperR6(0, L); |
| 3238 } else { | 3255 } else { |
| 3239 BlockTrampolinePoolScope block_trampoline_pool(this); | 3256 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 3240 uint32_t imm32; | 3257 uint32_t imm32; |
| 3241 imm32 = jump_address(L); | 3258 imm32 = jump_address(L); |
| 3242 if (IsMipsArchVariant(kMips32r6) && bdslot != USE_DELAY_SLOT) { | 3259 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { |
| 3243 uint32_t lui_offset, jic_offset; | 3260 uint32_t lui_offset, jic_offset; |
| 3244 UnpackTargetAddressUnsigned(imm32, lui_offset, jic_offset); | 3261 UnpackTargetAddressUnsigned(imm32, lui_offset, jic_offset); |
| 3245 { | 3262 { |
| 3246 BlockGrowBufferScope block_buf_growth(this); | 3263 BlockGrowBufferScope block_buf_growth(this); |
| 3247 // Buffer growth (and relocation) must be blocked for internal | 3264 // Buffer growth (and relocation) must be blocked for internal |
| 3248 // references until associated instructions are emitted and | 3265 // references until associated instructions are emitted and |
| 3249 // available to be patched. | 3266 // available to be patched. |
| 3250 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); | 3267 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); |
| 3251 lui(at, lui_offset); | 3268 lui(at, lui_offset); |
| 3252 jic(at, jic_offset); | 3269 jic(at, jic_offset); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3273 | 3290 |
| 3274 | 3291 |
| 3275 void MacroAssembler::BranchAndLinkLong(Label* L, BranchDelaySlot bdslot) { | 3292 void MacroAssembler::BranchAndLinkLong(Label* L, BranchDelaySlot bdslot) { |
| 3276 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT && | 3293 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT && |
| 3277 (!L->is_bound() || is_near_r6(L))) { | 3294 (!L->is_bound() || is_near_r6(L))) { |
| 3278 BranchAndLinkShortHelperR6(0, L); | 3295 BranchAndLinkShortHelperR6(0, L); |
| 3279 } else { | 3296 } else { |
| 3280 BlockTrampolinePoolScope block_trampoline_pool(this); | 3297 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 3281 uint32_t imm32; | 3298 uint32_t imm32; |
| 3282 imm32 = jump_address(L); | 3299 imm32 = jump_address(L); |
| 3283 if (IsMipsArchVariant(kMips32r6) && bdslot != USE_DELAY_SLOT) { | 3300 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { |
| 3284 uint32_t lui_offset, jic_offset; | 3301 uint32_t lui_offset, jic_offset; |
| 3285 UnpackTargetAddressUnsigned(imm32, lui_offset, jic_offset); | 3302 UnpackTargetAddressUnsigned(imm32, lui_offset, jic_offset); |
| 3286 { | 3303 { |
| 3287 BlockGrowBufferScope block_buf_growth(this); | 3304 BlockGrowBufferScope block_buf_growth(this); |
| 3288 // Buffer growth (and relocation) must be blocked for internal | 3305 // Buffer growth (and relocation) must be blocked for internal |
| 3289 // references until associated instructions are emitted and | 3306 // references until associated instructions are emitted and |
| 3290 // available to be patched. | 3307 // available to be patched. |
| 3291 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); | 3308 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); |
| 3292 lui(at, lui_offset); | 3309 lui(at, lui_offset); |
| 3293 jialc(at, jic_offset); | 3310 jialc(at, jic_offset); |
| 3294 } | 3311 } |
| 3295 CheckBuffer(); | 3312 CheckBuffer(); |
| 3296 } else { | 3313 } else { |
| 3297 { | 3314 { |
| 3298 BlockGrowBufferScope block_buf_growth(this); | 3315 BlockGrowBufferScope block_buf_growth(this); |
| 3299 // Buffer growth (and relocation) must be blocked for internal | 3316 // Buffer growth (and relocation) must be blocked for internal |
| 3300 // references | 3317 // references |
| 3301 // until associated instructions are emitted and available to be | 3318 // until associated instructions are emitted and available to be |
| 3302 // patched. | 3319 // patched. |
| 3303 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); | 3320 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); |
| 3304 lui(at, (imm32 & kHiMask) >> kLuiShift); | 3321 lui(at, (imm32 & kHiMask) >> kLuiShift); |
| 3305 ori(at, at, (imm32 & kImm16Mask)); | 3322 ori(at, at, (imm32 & kImm16Mask)); |
| 3306 } | 3323 } |
| 3324 CheckBuffer(); |
| 3307 jalr(at); | 3325 jalr(at); |
| 3308 // Emit a nop in the branch delay slot if required. | 3326 // Emit a nop in the branch delay slot if required. |
| 3309 if (bdslot == PROTECT) nop(); | 3327 if (bdslot == PROTECT) nop(); |
| 3310 } | 3328 } |
| 3311 } | 3329 } |
| 3312 } | 3330 } |
| 3313 | 3331 |
| 3314 | 3332 |
| 3315 void MacroAssembler::DropAndRet(int drop) { | 3333 void MacroAssembler::DropAndRet(int drop) { |
| 3316 DCHECK(is_int16(drop * kPointerSize)); | 3334 DCHECK(is_int16(drop * kPointerSize)); |
| (...skipping 2715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6032 if (mag.shift > 0) sra(result, result, mag.shift); | 6050 if (mag.shift > 0) sra(result, result, mag.shift); |
| 6033 srl(at, dividend, 31); | 6051 srl(at, dividend, 31); |
| 6034 Addu(result, result, Operand(at)); | 6052 Addu(result, result, Operand(at)); |
| 6035 } | 6053 } |
| 6036 | 6054 |
| 6037 | 6055 |
| 6038 } // namespace internal | 6056 } // namespace internal |
| 6039 } // namespace v8 | 6057 } // namespace v8 |
| 6040 | 6058 |
| 6041 #endif // V8_TARGET_ARCH_MIPS | 6059 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |