machine_mode mode)
{
int i;
- unsigned HOST_WIDE_INT val, val2, mask;
+ unsigned HOST_WIDE_INT val, val2, val3, mask;
int one_match, zero_match;
int num_insns;
}
return 3;
}
+
+ /* Try shifting and inserting the bottom 32-bits into the top bits. */
+ val2 = val & 0xffffffff;
+ val3 = 0xffffffff;
+ val3 = val2 | (val3 << 32);
+ for (i = 17; i < 48; i++)
+ if ((val2 | (val2 << i)) == val)
+ {
+ if (generate)
+ {
+ emit_insn (gen_rtx_SET (dest, GEN_INT (val2 & 0xffff)));
+ emit_insn (gen_insv_immdi (dest, GEN_INT (16),
+ GEN_INT (val2 >> 16)));
+ emit_insn (gen_ior_ashldi3 (dest, dest, GEN_INT (i), dest));
+ }
+ return 3;
+ }
+ else if ((val3 & ~(val3 << i)) == val)
+ {
+ if (generate)
+ {
+ emit_insn (gen_rtx_SET (dest, GEN_INT (val3 | 0xffff0000)));
+ emit_insn (gen_insv_immdi (dest, GEN_INT (16),
+ GEN_INT (val2 >> 16)));
+ emit_insn (gen_and_one_cmpl_ashldi3 (dest, dest, GEN_INT (i),
+ dest));
+ }
+ return 3;
+ }
}
/* Generate 2-4 instructions, skipping 16 bits of all zeroes or ones which
rtx lo = gen_lowpart (SImode, src);
rtx hi = gen_highpart_mode (SImode, DImode, src);
- bool size_p = optimize_function_for_size_p (cfun);
-
if (!rtx_equal_p (lo, hi))
return false;
MOV w1, 49370
MOVK w1, 0x140, lsl 16
STP w1, w1, [x0]
- So we want to perform this only when we save two instructions
- or more. When optimizing for size, however, accept any code size
- savings we can. */
- if (size_p && orig_cost <= lo_cost)
- return false;
-
- if (!size_p
- && (orig_cost <= lo_cost + 1))
+ So we want to perform this when we save at least one instruction. */
+ if (orig_cost <= lo_cost)
return false;
rtx mem_lo = adjust_address (dst, SImode, 0);
--- /dev/null
+/* { dg-do assemble } */
+/* { dg-options "-O2 --save-temps" } */
+
+long long f1 (void)
+{
+ return 0x80402010080400;
+}
+
+long long f2 (void)
+{
+ return 0x1234567812345678;
+}
+
+long long f3 (void)
+{
+ return 0x4567800012345678;
+}
+
+long long f4 (void)
+{
+ return 0x3ecccccd3ecccccd;
+}
+
+long long f5 (void)
+{
+ return 0x38e38e38e38e38e;
+}
+
+long long f6 (void)
+{
+ return 0x1745d1745d1745d;
+}
+
+void f7 (long long *p)
+{
+ *p = 0x1234567812345678;
+}
+
+/* { dg-final { scan-assembler-times {\tmovk\t} 7 } } */
+/* { dg-final { scan-assembler-times {\tmov\t} 7 } } */
+/* { dg-final { scan-assembler-times {\tbic\t} 2 } } */
+/* { dg-final { scan-assembler-times {\torr\t} 4 } } */
+/* { dg-final { scan-assembler-times {\tstp\t} 1 } } */
** ushr v[0-9]+.16b, v[0-9]+.16b, 7
** mov x[0-9]+, 16512
** movk x[0-9]+, 0x1020, lsl 16
-** movk x[0-9]+, 0x408, lsl 32
-** movk x[0-9]+, 0x102, lsl 48
+** orr x[0-9]+, x[0-9]+, x[0-9]+, lsl 28
** fmov d[0-9]+, x[0-9]+
** pmull v[0-9]+.1q, v[0-9]+.1d, v[0-9]+.1d
** dup v[0-9]+.2d, v[0-9]+.d\[0\]