Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: src/mips/macro-assembler-mips.cc

Issue 1807263003: MIPS: Replace JR/JALR with JIC/JIALC for r6 part 2 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 2993 matching lines...) Expand 10 before | Expand all | Expand 10 after
3004 return false; 3004 return false;
3005 } 3005 }
3006 3006
3007 3007
3008 void MacroAssembler::Jump(Register target, 3008 void MacroAssembler::Jump(Register target,
3009 Condition cond, 3009 Condition cond,
3010 Register rs, 3010 Register rs,
3011 const Operand& rt, 3011 const Operand& rt,
3012 BranchDelaySlot bd) { 3012 BranchDelaySlot bd) {
3013 BlockTrampolinePoolScope block_trampoline_pool(this); 3013 BlockTrampolinePoolScope block_trampoline_pool(this);
3014 if (cond == cc_always) { 3014 if (IsMipsArchVariant(kMips32r6) && bd == PROTECT) {
3015 jr(target); 3015 if (cond == cc_always) {
3016 jic(target, 0);
3017 } else {
3018 BRANCH_ARGS_CHECK(cond, rs, rt);
3019 Branch(2, NegateCondition(cond), rs, rt);
3020 jic(target, 0);
3021 }
3016 } else { 3022 } else {
3017 BRANCH_ARGS_CHECK(cond, rs, rt); 3023 if (cond == cc_always) {
3018 Branch(2, NegateCondition(cond), rs, rt); 3024 jr(target);
3019 jr(target); 3025 } else {
3026 BRANCH_ARGS_CHECK(cond, rs, rt);
3027 Branch(2, NegateCondition(cond), rs, rt);
3028 jr(target);
3029 }
3030 // Emit a nop in the branch delay slot if required.
3031 if (bd == PROTECT) nop();
3020 } 3032 }
3021 // Emit a nop in the branch delay slot if required.
3022 if (bd == PROTECT)
3023 nop();
3024 } 3033 }
3025 3034
3026 3035
3027 void MacroAssembler::Jump(intptr_t target, 3036 void MacroAssembler::Jump(intptr_t target,
3028 RelocInfo::Mode rmode, 3037 RelocInfo::Mode rmode,
3029 Condition cond, 3038 Condition cond,
3030 Register rs, 3039 Register rs,
3031 const Operand& rt, 3040 const Operand& rt,
3032 BranchDelaySlot bd) { 3041 BranchDelaySlot bd) {
3033 Label skip; 3042 Label skip;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3071 const Operand& rt, 3080 const Operand& rt,
3072 BranchDelaySlot bd) { 3081 BranchDelaySlot bd) {
3073 int size = 0; 3082 int size = 0;
3074 3083
3075 if (cond == cc_always) { 3084 if (cond == cc_always) {
3076 size += 1; 3085 size += 1;
3077 } else { 3086 } else {
3078 size += 3; 3087 size += 3;
3079 } 3088 }
3080 3089
3081 if (bd == PROTECT) 3090 if (bd == PROTECT && !IsMipsArchVariant(kMips32r6)) size += 1;
3082 size += 1;
3083 3091
3084 return size * kInstrSize; 3092 return size * kInstrSize;
3085 } 3093 }
3086 3094
3087 3095
3088 // Note: To call gcc-compiled C code on mips, you must call thru t9. 3096 // Note: To call gcc-compiled C code on mips, you must call thru t9.
3089 void MacroAssembler::Call(Register target, 3097 void MacroAssembler::Call(Register target,
3090 Condition cond, 3098 Condition cond,
3091 Register rs, 3099 Register rs,
3092 const Operand& rt, 3100 const Operand& rt,
3093 BranchDelaySlot bd) { 3101 BranchDelaySlot bd) {
3094 #ifdef DEBUG 3102 #ifdef DEBUG
3095 int size = IsPrevInstrCompactBranch() ? kInstrSize : 0; 3103 int size = IsPrevInstrCompactBranch() ? kInstrSize : 0;
3096 #endif 3104 #endif
3097 3105
3098 BlockTrampolinePoolScope block_trampoline_pool(this); 3106 BlockTrampolinePoolScope block_trampoline_pool(this);
3099 Label start; 3107 Label start;
3100 bind(&start); 3108 bind(&start);
3101 if (cond == cc_always) { 3109 if (IsMipsArchVariant(kMips32r6) && bd == PROTECT) {
3102 jalr(target); 3110 if (cond == cc_always) {
3111 jialc(target, 0);
3112 } else {
3113 BRANCH_ARGS_CHECK(cond, rs, rt);
3114 Branch(1, NegateCondition(cond), rs, rt);
3115 jialc(target, 0);
3116 }
3103 } else { 3117 } else {
3104 BRANCH_ARGS_CHECK(cond, rs, rt); 3118 if (cond == cc_always) {
3105 Branch(2, NegateCondition(cond), rs, rt); 3119 jalr(target);
3106 jalr(target); 3120 } else {
3121 BRANCH_ARGS_CHECK(cond, rs, rt);
3122 Branch(2, NegateCondition(cond), rs, rt);
3123 jalr(target);
3124 }
3125 // Emit a nop in the branch delay slot if required.
3126 if (bd == PROTECT) nop();
3107 } 3127 }
3108 // Emit a nop in the branch delay slot if required.
3109 if (bd == PROTECT)
3110 nop();
3111 3128
3112 #ifdef DEBUG 3129 #ifdef DEBUG
3113 CHECK_EQ(size + CallSize(target, cond, rs, rt, bd), 3130 CHECK_EQ(size + CallSize(target, cond, rs, rt, bd),
3114 SizeOfCodeGeneratedSince(&start)); 3131 SizeOfCodeGeneratedSince(&start));
3115 #endif 3132 #endif
3116 } 3133 }
3117 3134
3118 3135
3119 int MacroAssembler::CallSize(Address target, 3136 int MacroAssembler::CallSize(Address target,
3120 RelocInfo::Mode rmode, 3137 RelocInfo::Mode rmode,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
3191 3208
3192 3209
3193 void MacroAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) { 3210 void MacroAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) {
3194 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT && 3211 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT &&
3195 (!L->is_bound() || is_near_r6(L))) { 3212 (!L->is_bound() || is_near_r6(L))) {
3196 BranchShortHelperR6(0, L); 3213 BranchShortHelperR6(0, L);
3197 } else { 3214 } else {
3198 BlockTrampolinePoolScope block_trampoline_pool(this); 3215 BlockTrampolinePoolScope block_trampoline_pool(this);
3199 uint32_t imm32; 3216 uint32_t imm32;
3200 imm32 = jump_address(L); 3217 imm32 = jump_address(L);
3201 if (IsMipsArchVariant(kMips32r6) && bdslot != USE_DELAY_SLOT) { 3218 if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) {
3202 uint32_t lui_offset, jic_offset; 3219 uint32_t lui_offset, jic_offset;
3203 UnpackTargetAddressUnsigned(imm32, lui_offset, jic_offset); 3220 UnpackTargetAddressUnsigned(imm32, lui_offset, jic_offset);
3204 { 3221 {
3205 BlockGrowBufferScope block_buf_growth(this); 3222 BlockGrowBufferScope block_buf_growth(this);
3206 // Buffer growth (and relocation) must be blocked for internal 3223 // Buffer growth (and relocation) must be blocked for internal
3207 // references until associated instructions are emitted and 3224 // references until associated instructions are emitted and
3208 // available to be patched. 3225 // available to be patched.
3209 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); 3226 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3210 lui(at, lui_offset); 3227 lui(at, lui_offset);
3211 jic(at, jic_offset); 3228 jic(at, jic_offset);
(...skipping 20 matching lines...) Expand all
3232 3249
3233 3250
3234 void MacroAssembler::BranchAndLinkLong(Label* L, BranchDelaySlot bdslot) { 3251 void MacroAssembler::BranchAndLinkLong(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 BranchAndLinkShortHelperR6(0, L); 3254 BranchAndLinkShortHelperR6(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 jialc(at, jic_offset); 3269 jialc(at, jic_offset);
3253 } 3270 }
3254 CheckBuffer(); 3271 CheckBuffer();
3255 } else { 3272 } else {
3256 { 3273 {
3257 BlockGrowBufferScope block_buf_growth(this); 3274 BlockGrowBufferScope block_buf_growth(this);
3258 // Buffer growth (and relocation) must be blocked for internal 3275 // Buffer growth (and relocation) must be blocked for internal
3259 // references 3276 // references
3260 // until associated instructions are emitted and available to be 3277 // until associated instructions are emitted and available to be
3261 // patched. 3278 // patched.
3262 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); 3279 RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED);
3263 lui(at, (imm32 & kHiMask) >> kLuiShift); 3280 lui(at, (imm32 & kHiMask) >> kLuiShift);
3264 ori(at, at, (imm32 & kImm16Mask)); 3281 ori(at, at, (imm32 & kImm16Mask));
3265 } 3282 }
3283 CheckBuffer();
3266 jalr(at); 3284 jalr(at);
3267 // Emit a nop in the branch delay slot if required. 3285 // Emit a nop in the branch delay slot if required.
3268 if (bdslot == PROTECT) nop(); 3286 if (bdslot == PROTECT) nop();
3269 } 3287 }
3270 } 3288 }
3271 } 3289 }
3272 3290
3273 3291
3274 void MacroAssembler::DropAndRet(int drop) { 3292 void MacroAssembler::DropAndRet(int drop) {
3275 DCHECK(is_int16(drop * kPointerSize)); 3293 DCHECK(is_int16(drop * kPointerSize));
(...skipping 2637 matching lines...) Expand 10 before | Expand all | Expand 10 after
5913 if (mag.shift > 0) sra(result, result, mag.shift); 5931 if (mag.shift > 0) sra(result, result, mag.shift);
5914 srl(at, dividend, 31); 5932 srl(at, dividend, 31);
5915 Addu(result, result, Operand(at)); 5933 Addu(result, result, Operand(at));
5916 } 5934 }
5917 5935
5918 5936
5919 } // namespace internal 5937 } // namespace internal
5920 } // namespace v8 5938 } // namespace v8
5921 5939
5922 #endif // V8_TARGET_ARCH_MIPS 5940 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« src/full-codegen/mips/full-codegen-mips.cc ('K') | « src/mips/assembler-mips.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698