This is the mail archive of the mailing list for the binutils project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH/ARM][v2]PR 16722, support VLDR s/d0, =Imm



-- Jiong

On 17/06/14 11:22, Jiong Wang wrote:
This patch addressed all comments at

important updates including:

* fix 32-bit host bug.
    on 32-bit host, X_add_number field in expression is actually 4 byte, thus 8 byte
    constant will go into big number, while this cause trouble. because big number
    is record in global variable "generic_bignum" which will be overrided by later

    To solve this problem, *parse_big_immediate* is invoked *instead of my_get_expression*,
    so 8 byte value is actually splitted and stored in "imm" and "reg" field in inst.operands,
    "regisimm" marked as true, and the value is kept safely to the time pool emitted.

    so what this new patch done is
      * always split 8 byte entry into two 4 byte entries in the pool.
      * matching existed 8 byte entry still work.
      * 4 byte entry could reuse half of 8 byte entry is matched.

* alignment
      * literal pool always start at 8 byte boundary.
      * 8 byte entry aligned to 8 byte boundary, padding is necessary.
      * 4 byte entry could utilize any padding existed.

* big-endian
* test done
      * no regression on x86-64 cross arm-none-eabi.
      * no regression for check-gas/binutils/ld on chromebook native arm-linux-gnueabihf.
      * big-endian also pass one hand-written execution test on qemu.

please review, thanks.

PR target/16722
    * config/tc-arm.c (literal_pool): New field "alignment".
    (find_or_make_literal_pool): Initialize "alignment" to 2.
    (s_ltorg): Align the pool using value of "alignment"
    (parse_big_immediate): New parameter "in_exp". Return
    parsed expression if "in_exp" is not null.
    (parse_address_main): Invoke "parse_big_immediate" for
    constant parameter.
    (add_to_lit_pool): Add one parameter 'nbytes'.
    Split 8 byte entry into two 4 byte entry.
    Add padding to align 8 byte entry to 8 byte boundary.
    (encode_arm_cp_address): Generate literal pool entry if possible.
    (move_or_literal_pool): Generate entry for vldr case.
    (enum lit_type): New enum type.
    (do_ldst): Use new enum type.
    (do_ldstv4): Likewise.
    (do_t_ldst): Likewise.
    (neon_write_immbits): Support Thumb-2 mode.
    * gas/arm/ldconst.s: Add test cases for symbol literal.
    * gas/arm/ldconst.d: Likewise.
    * gas/arm/vldconst.s: Add test cases for vldr.
    * gas/arm/thumb2_vpool.s: Likewise.
    * gas/arm/vldconst.d: New pattern for little-endian.
    * gas/arm/thumb2_vpool.d: Likewise.
    * gas/arm/vldconst_be.d: New pattern for big-endian.
    * gas/arm/thumb2_vpool_be.d: Likewise.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]