Changeset 121885 in webkit for trunk/Source/JavaScriptCore/assembler/ARMAssembler.cpp
- Timestamp:
- Jul 5, 2012, 12:04:16 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/assembler/ARMAssembler.cpp
r118413 r121885 263 263 // Memory load/store helpers 264 264 265 void ARMAssembler::dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, int32_t offset, bool bytes) 266 { 267 ARMWord transferFlag = bytes ? DT_BYTE : 0; 265 void ARMAssembler::dataTransfer32(DataTransferTypeA transferType, RegisterID srcDst, RegisterID base, int32_t offset) 266 { 268 267 if (offset >= 0) { 269 268 if (offset <= 0xfff) 270 dtr_u( isLoad, srcDst, base, offset | transferFlag);269 dtr_u(transferType, srcDst, base, offset); 271 270 else if (offset <= 0xfffff) { 272 271 add_r(ARMRegisters::S0, base, OP2_IMM | (offset >> 12) | (10 << 8)); 273 dtr_u( isLoad, srcDst, ARMRegisters::S0, (offset & 0xfff) | transferFlag);272 dtr_u(transferType, srcDst, ARMRegisters::S0, (offset & 0xfff)); 274 273 } else { 275 274 moveImm(offset, ARMRegisters::S0); 276 dtr_ur( isLoad, srcDst, base, ARMRegisters::S0 | transferFlag);275 dtr_ur(transferType, srcDst, base, ARMRegisters::S0); 277 276 } 278 277 } else { 279 278 if (offset >= -0xfff) 280 dtr_d( isLoad, srcDst, base, -offset | transferFlag);279 dtr_d(transferType, srcDst, base, -offset); 281 280 else if (offset >= -0xfffff) { 282 281 sub_r(ARMRegisters::S0, base, OP2_IMM | (-offset >> 12) | (10 << 8)); 283 dtr_d( isLoad, srcDst, ARMRegisters::S0, (-offset & 0xfff) | transferFlag);282 dtr_d(transferType, srcDst, ARMRegisters::S0, (-offset & 0xfff)); 284 283 } else { 285 284 moveImm(offset, ARMRegisters::S0); 286 dtr_ur(isLoad, srcDst, base, ARMRegisters::S0 | transferFlag); 287 } 288 } 289 } 290 291 void ARMAssembler::baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset, bool bytes) 292 { 293 ARMWord op2; 294 ARMWord transferFlag = bytes ? DT_BYTE : 0; 295 285 dtr_ur(transferType, srcDst, base, ARMRegisters::S0); 286 } 287 } 288 } 289 290 void ARMAssembler::baseIndexTransfer32(DataTransferTypeA transferType, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset) 291 { 296 292 ASSERT(scale >= 0 && scale <= 3); 297 op2 = lsl(index, scale); 298 299 if (offset >= 0 && offset <= 0xfff) { 300 add_r(ARMRegisters::S0, base, op2); 301 dtr_u(isLoad, srcDst, ARMRegisters::S0, offset | transferFlag); 293 ARMWord op2 = lsl(index, scale); 294 295 if (!offset) { 296 dtr_ur(transferType, srcDst, base, op2); 302 297 return; 303 298 } 304 if (offset <= 0 && offset >= -0xfff) { 305 add_r(ARMRegisters::S0, base, op2); 306 dtr_d(isLoad, srcDst, ARMRegisters::S0, (-offset & 0xfff) | transferFlag); 299 300 add_r(ARMRegisters::S1, base, op2); 301 dataTransfer32(transferType, srcDst, ARMRegisters::S1, offset); 302 } 303 304 void ARMAssembler::dataTransfer16(DataTransferTypeB transferType, RegisterID srcDst, RegisterID base, int32_t offset) 305 { 306 if (offset >= 0) { 307 if (offset <= 0xff) 308 dtrh_u(transferType, srcDst, base, getOp2Half(offset)); 309 else if (offset <= 0xffff) { 310 add_r(ARMRegisters::S0, base, OP2_IMM | (offset >> 8) | (12 << 8)); 311 dtrh_u(transferType, srcDst, ARMRegisters::S0, getOp2Half(offset & 0xff)); 312 } else { 313 moveImm(offset, ARMRegisters::S0); 314 dtrh_ur(transferType, srcDst, base, ARMRegisters::S0); 315 } 316 } else { 317 if (offset >= -0xff) 318 dtrh_d(transferType, srcDst, base, getOp2Half(-offset)); 319 else if (offset >= -0xffff) { 320 sub_r(ARMRegisters::S0, base, OP2_IMM | (-offset >> 8) | (12 << 8)); 321 dtrh_d(transferType, srcDst, ARMRegisters::S0, getOp2Half(-offset & 0xff)); 322 } else { 323 moveImm(offset, ARMRegisters::S0); 324 dtrh_ur(transferType, srcDst, base, ARMRegisters::S0); 325 } 326 } 327 } 328 329 void ARMAssembler::baseIndexTransfer16(DataTransferTypeB transferType, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset) 330 { 331 if (!scale && !offset) { 332 dtrh_ur(transferType, srcDst, base, index); 307 333 return; 308 334 } 309 335 310 ldr_un_imm(ARMRegisters::S0, offset); 311 add_r(ARMRegisters::S0, ARMRegisters::S0, op2); 312 dtr_ur(isLoad, srcDst, base, ARMRegisters::S0 | transferFlag); 313 } 314 315 void ARMAssembler::doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID base, int32_t offset) 336 add_r(ARMRegisters::S1, base, lsl(index, scale)); 337 dataTransfer16(transferType, srcDst, ARMRegisters::S1, offset); 338 } 339 340 void ARMAssembler::dataTransferFloat(DataTransferTypeFloat transferType, FPRegisterID srcDst, RegisterID base, int32_t offset) 316 341 { 317 342 // VFP cannot directly access memory that is not four-byte-aligned 318 343 if (!(offset & 0x3)) { 319 344 if (offset <= 0x3ff && offset >= 0) { 320 fdtr_u( isLoad, srcDst, base, offset >> 2);345 fdtr_u(transferType, srcDst, base, offset >> 2); 321 346 return; 322 347 } 323 348 if (offset <= 0x3ffff && offset >= 0) { 324 349 add_r(ARMRegisters::S0, base, OP2_IMM | (offset >> 10) | (11 << 8)); 325 fdtr_u( isLoad, srcDst, ARMRegisters::S0, (offset >> 2) & 0xff);350 fdtr_u(transferType, srcDst, ARMRegisters::S0, (offset >> 2) & 0xff); 326 351 return; 327 352 } … … 329 354 330 355 if (offset <= 0x3ff && offset >= 0) { 331 fdtr_d( isLoad, srcDst, base, offset >> 2);356 fdtr_d(transferType, srcDst, base, offset >> 2); 332 357 return; 333 358 } 334 359 if (offset <= 0x3ffff && offset >= 0) { 335 360 sub_r(ARMRegisters::S0, base, OP2_IMM | (offset >> 10) | (11 << 8)); 336 fdtr_d( isLoad, srcDst, ARMRegisters::S0, (offset >> 2) & 0xff);361 fdtr_d(transferType, srcDst, ARMRegisters::S0, (offset >> 2) & 0xff); 337 362 return; 338 363 } … … 340 365 } 341 366 342 ldr_un_imm(ARMRegisters::S0, offset);367 moveImm(offset, ARMRegisters::S0); 343 368 add_r(ARMRegisters::S0, ARMRegisters::S0, base); 344 fdtr_u(isLoad, srcDst, ARMRegisters::S0, 0); 369 fdtr_u(transferType, srcDst, ARMRegisters::S0, 0); 370 } 371 372 void ARMAssembler::baseIndexTransferFloat(DataTransferTypeFloat transferType, FPRegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset) 373 { 374 add_r(ARMRegisters::S1, base, lsl(index, scale)); 375 dataTransferFloat(transferType, srcDst, ARMRegisters::S1, offset); 345 376 } 346 377 … … 362 393 if (*addr != InvalidBranchTarget) { 363 394 if (!(iter->m_offset & 1)) { 364 int diff= reinterpret_cast_ptr<ARMWord*>(data + *addr) - (ldrAddr + DefaultPrefetching);365 366 if ((diff <= BOFFSET_MAX && diff>= BOFFSET_MIN)) {367 *ldrAddr = B | getConditionalField(*ldrAddr) | (diff & BRANCH_MASK);395 intptr_t difference = reinterpret_cast_ptr<ARMWord*>(data + *addr) - (ldrAddr + DefaultPrefetching); 396 397 if ((difference <= BOFFSET_MAX && difference >= BOFFSET_MIN)) { 398 *ldrAddr = B | getConditionalField(*ldrAddr) | (difference & BRANCH_MASK); 368 399 continue; 369 400 }
Note:
See TracChangeset
for help on using the changeset viewer.