We have helper expanders -- originally for the builtins -- so that we can
write mskwh instead of mskxh-plus-magic-argument.  Use them more often.


r~
+       * config/alpha/alpha.c (alpha_expand_unaligned_load): Use extql.
+       (alpha_expand_unaligned_store): Use mskwl, mskll, mskql.
+       (alpha_expand_unaligned_load_words): Use extql.
+       (alpha_expand_unaligned_store_words): Use insqh, mskqh, mskql.
+       (emit_insxl): Handle all modes for consistency.



diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 4885be6..c55587b 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -3347,7 +3347,7 @@ alpha_expand_unaligned_load (rtx tgt, rtx mem, 
HOST_WIDE_INT size,
     {
       emit_move_insn (addr, plus_constant (mema, ofs+2));
 
-      emit_insn (gen_extxl (extl, meml, GEN_INT (64), addr));
+      emit_insn (gen_extql (extl, meml, addr));
       emit_insn (gen_extqh (exth, memh, addr));
 
       /* We must use tgt here for the target.  Alpha-vms port fails if we use
@@ -3367,17 +3367,14 @@ alpha_expand_unaligned_load (rtx tgt, rtx mem, 
HOST_WIDE_INT size,
          emit_insn (gen_extwh (exth, memh, addr));
          mode = HImode;
          break;
-
        case 4:
          emit_insn (gen_extlh (exth, memh, addr));
          mode = SImode;
          break;
-
        case 8:
          emit_insn (gen_extqh (exth, memh, addr));
          mode = DImode;
          break;
-
        default:
          gcc_unreachable ();
        }
@@ -3475,16 +3472,13 @@ alpha_expand_unaligned_store (rtx dst, rtx src,
   switch ((int) size)
     {
     case 2:
-      emit_insn (gen_mskxl (dstl, dstl, GEN_INT (0xffff), addr));
+      emit_insn (gen_mskwl (dstl, dstl, addr));
       break;
     case 4:
-      {
-       rtx msk = immed_double_const (0xffffffff, 0, DImode);
-       emit_insn (gen_mskxl (dstl, dstl, msk, addr));
-       break;
-      }
+      emit_insn (gen_mskll (dstl, dstl, addr));
+      break;
     case 8:
-      emit_insn (gen_mskxl (dstl, dstl, constm1_rtx, addr));
+      emit_insn (gen_mskql (dstl, dstl, addr));
       break;
     default:
       gcc_unreachable ();
@@ -3516,7 +3510,6 @@ alpha_expand_unaligned_load_words (rtx *out_regs, rtx 
smem,
                                   HOST_WIDE_INT words, HOST_WIDE_INT ofs)
 {
   rtx const im8 = GEN_INT (-8);
-  rtx const i64 = GEN_INT (64);
   rtx ext_tmps[MAX_MOVE_WORDS], data_regs[MAX_MOVE_WORDS+1];
   rtx sreg, areg, tmp, smema;
   HOST_WIDE_INT i;
@@ -3563,7 +3556,7 @@ alpha_expand_unaligned_load_words (rtx *out_regs, rtx 
smem,
                       1, OPTAB_WIDEN);
   for (i = 0; i < words; ++i)
     {
-      emit_insn (gen_extxl (data_regs[i], data_regs[i], i64, sreg));
+      emit_insn (gen_extql (data_regs[i], data_regs[i], sreg));
       emit_insn (gen_extqh (ext_tmps[i], data_regs[i+1], sreg));
       emit_insn (gen_rtx_SET (VOIDmode, ext_tmps[i],
                              gen_rtx_IF_THEN_ELSE (DImode,
@@ -3588,7 +3581,6 @@ alpha_expand_unaligned_store_words (rtx *data_regs, rtx 
dmem,
                                    HOST_WIDE_INT words, HOST_WIDE_INT ofs)
 {
   rtx const im8 = GEN_INT (-8);
-  rtx const i64 = GEN_INT (64);
   rtx ins_tmps[MAX_MOVE_WORDS];
   rtx st_tmp_1, st_tmp_2, dreg;
   rtx st_addr_1, st_addr_2, dmema;
@@ -3628,7 +3620,7 @@ alpha_expand_unaligned_store_words (rtx *data_regs, rtx 
dmem,
     {
       for (i = words-1; i >= 0; --i)
        {
-         emit_insn (gen_insxh (ins_tmps[i], data_regs[i], i64, dreg));
+         emit_insn (gen_insqh (ins_tmps[i], data_regs[i], dreg));
          emit_insn (gen_insql (data_regs[i], data_regs[i], dreg));
        }
       for (i = words-1; i > 0; --i)
@@ -3640,8 +3632,8 @@ alpha_expand_unaligned_store_words (rtx *data_regs, rtx 
dmem,
     }
 
   /* Split and merge the ends with the destination data.  */
-  emit_insn (gen_mskxh (st_tmp_2, st_tmp_2, i64, dreg));
-  emit_insn (gen_mskxl (st_tmp_1, st_tmp_1, constm1_rtx, dreg));
+  emit_insn (gen_mskqh (st_tmp_2, st_tmp_2, dreg));
+  emit_insn (gen_mskql (st_tmp_1, st_tmp_1, dreg));
 
   if (data_regs != NULL)
     {
@@ -4311,12 +4303,24 @@ emit_insxl (enum machine_mode mode, rtx op1, rtx op2)
   rtx ret = gen_reg_rtx (DImode);
   rtx (*fn) (rtx, rtx, rtx);
 
-  if (mode == QImode)
-    fn = gen_insbl;
-  else
-    fn = gen_inswl;
+  switch (mode)
+    {
+    case QImode:
+      fn = gen_insbl;
+      break;
+    case HImode:
+      fn = gen_inswl;
+      break;
+    case SImode:
+      fn = gen_insll;
+      break;
+    case DImode:
+      fn = gen_insql;
+      break;
+    default:
+      gcc_unreachable ();
+    }
 
-  /* The insbl and inswl patterns require a register operand.  */
   op1 = force_reg (mode, op1);
   emit_insn (fn (ret, op1, op2));
 

Reply via email to