From: Alex Velenko Date: Thu, 23 Jan 2014 14:48:40 +0000 (+0000) Subject: [AArch64_BE 2/4] Big-Endian lane numbering fix X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dafb9b6489ef1b45a0831e46d85aa9933de4428e;p=gcc.git [AArch64_BE 2/4] Big-Endian lane numbering fix 2013-01-23 Alex Velenko * config/aarch64/aarch64-simd.md (aarch64_be_checked_get_lane): New define_expand. * config/aarch64/aarch64-simd-builtins.def (BUILTIN_VALL (GETLANE, be_checked_get_lane, 0): New builtin definition. * config/aarch64/arm_neon.h: (__aarch64_vget_lane_any): Use new safe be builtin. From-SVN: r206970 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 28e41625f04..1670683f9e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2013-01-23 Alex Velenko + + * config/aarch64/aarch64-simd.md + (aarch64_be_checked_get_lane): New define_expand. + * config/aarch64/aarch64-simd-builtins.def + (BUILTIN_VALL (GETLANE, be_checked_get_lane, 0): + New builtin definition. + * config/aarch64/arm_neon.h: (__aarch64_vget_lane_any): + Use new safe be builtin. + 2014-01-23 Alex Velenko * config/aarch64/aarch64-simd.md (aarch64_be_ld1): diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def b/gcc/config/aarch64/aarch64-simd-builtins.def index 034afbf515e..185281ae5e9 100644 --- a/gcc/config/aarch64/aarch64-simd-builtins.def +++ b/gcc/config/aarch64/aarch64-simd-builtins.def @@ -49,6 +49,7 @@ BUILTIN_VALL (GETLANE, get_lane, 0) VAR1 (GETLANE, get_lane, 0, di) + BUILTIN_VALL (GETLANE, be_checked_get_lane, 0) BUILTIN_VD_RE (REINTERP, reinterpretdi, 0) BUILTIN_VDC (REINTERP, reinterpretv8qi, 0) diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 1454a7e11ea..14eb7d08d15 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -2062,6 +2062,20 @@ [(set_attr "type" "neon_to_gp")] ) +(define_expand "aarch64_be_checked_get_lane" + [(match_operand: 0 "aarch64_simd_nonimmediate_operand") + (match_operand:VALL 1 "register_operand") + (match_operand:SI 2 "immediate_operand")] + "TARGET_SIMD" + { + operands[2] = GEN_INT (ENDIAN_LANE_N (mode, INTVAL (operands[2]))); + emit_insn (gen_aarch64_get_lane (operands[0], + operands[1], + operands[2])); + DONE; + } +) + ;; Lane extraction of a value, neither sign nor zero extension ;; is guaranteed so upper bits should be considered undefined. (define_insn "aarch64_get_lane" diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h index ac87d7065d1..1dcff675f03 100644 --- a/gcc/config/aarch64/arm_neon.h +++ b/gcc/config/aarch64/arm_neon.h @@ -457,7 +457,7 @@ typedef struct poly16x8x4_t #define __aarch64_vget_lane_any(__size, __cast_ret, __cast_a, __a, __b) \ (__cast_ret \ - __builtin_aarch64_get_lane##__size (__cast_a __a, __b)) + __builtin_aarch64_be_checked_get_lane##__size (__cast_a __a, __b)) #define __aarch64_vget_lane_f32(__a, __b) \ __aarch64_vget_lane_any (v2sf, , , __a, __b)