Ignore:
Timestamp:
Nov 5, 2009, 12:28:02 AM (16 years ago)
Author:
[email protected]
Message:

Use ARMv7 specific encoding for immediate constants on ARMv7 target
https://bugs.webkit.org/show_bug.cgi?id=31060

Patch by Gabor Loki <[email protected]> on 2009-11-05
Reviewed by Gavin Barraclough.

  • assembler/ARMAssembler.cpp:

(JSC::ARMAssembler::getOp2): Use INVALID_IMM
(JSC::ARMAssembler::getImm): Use encodeComplexImm for complex immediate
(JSC::ARMAssembler::moveImm): Ditto.
(JSC::ARMAssembler::encodeComplexImm): Encode a constant by one or two
instructions or a PC relative load.

  • assembler/ARMAssembler.h: Use INVALID_IMM if a constant cannot be

encoded as an immediate constant.
(JSC::ARMAssembler::):
(JSC::ARMAssembler::movw_r): 16-bit immediate load
(JSC::ARMAssembler::movt_r): High halfword 16-bit immediate load
(JSC::ARMAssembler::getImm16Op2): Encode immediate constant for
movw_r and mowt_r

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/assembler/ARMAssembler.cpp

    r48525 r50553  
    119119        return OP2_IMM | (imm >> 24) | (rol << 8);
    120120
    121     return 0;
     121    return INVALID_IMM;
    122122}
    123123
     
    237237    // Do it by 1 instruction
    238238    tmp = getOp2(imm);
    239     if (tmp)
     239    if (tmp != INVALID_IMM)
    240240        return tmp;
    241241
    242242    tmp = getOp2(~imm);
    243     if (tmp) {
     243    if (tmp != INVALID_IMM) {
    244244        if (invert)
    245245            return tmp | OP2_INV_IMM;
     
    248248    }
    249249
    250     // Do it by 2 instruction
    251     if (genInt(tmpReg, imm, true))
    252         return tmpReg;
    253     if (genInt(tmpReg, ~imm, false))
    254         return tmpReg;
    255 
    256     ldr_imm(tmpReg, imm);
    257     return tmpReg;
     250    return encodeComplexImm(imm, tmpReg);
    258251}
    259252
     
    264257    // Do it by 1 instruction
    265258    tmp = getOp2(imm);
    266     if (tmp) {
     259    if (tmp != INVALID_IMM) {
    267260        mov_r(dest, tmp);
    268261        return;
     
    270263
    271264    tmp = getOp2(~imm);
    272     if (tmp) {
     265    if (tmp != INVALID_IMM) {
    273266        mvn_r(dest, tmp);
    274267        return;
    275268    }
    276269
     270    encodeComplexImm(imm, dest);
     271}
     272
     273ARMWord ARMAssembler::encodeComplexImm(ARMWord imm, int dest)
     274{
     275    ARMWord tmp;
     276
     277#if ARM_ARCH_VERSION >= 7
     278    tmp = getImm16Op2(imm);
     279    if (tmp != INVALID_IMM) {
     280        movw_r(dest, tmp);
     281        return dest;
     282    }
     283    movw_r(dest, getImm16Op2(imm & 0xffff));
     284    movt_r(dest, getImm16Op2(imm >> 16));
     285    return dest;
     286#else
    277287    // Do it by 2 instruction
    278288    if (genInt(dest, imm, true))
    279         return;
     289        return dest;
    280290    if (genInt(dest, ~imm, false))
    281         return;
     291        return dest;
    282292
    283293    ldr_imm(dest, imm);
     294    return dest;
     295#endif
    284296}
    285297
Note: See TracChangeset for help on using the changeset viewer.