Sorry for the newbie question, but I don't seem to get around it.
The backend I'm writing has 32 bit registers, and 64 bit registers (used for
SF, DF, DI).
There is a direct store instruction from a 64 bit register, to memory, and this
instruction is correctly
seen and used by GCC in other occasions.
Nevertheless GCC generate a split 32 bit store, with subreg access.
Is there a way to prevent GCC to perform split/subreg accesses?
struct mooma {
double a, b;
};
extern int vva(int k, ...);
int cvva(int u)
{
struct mooma mm;
mm.a = u - 1;
mm.b = 0;
return vva(u - 2, mm);
}
;; Function cvva (cvva)
Partition 0: size 16 align 4
mm, offset 0
;; Generating RTL for tree basic block 2
;; mm.a = (double) (u + -1)
(insn 6 5 7 wwww.c:44 (set (reg:SI 126)
(const_int -1 [0xffffffffffffffff])) -1 (nil))
(insn 7 6 8 wwww.c:44 (set (reg:SI 125)
(plus:SI (reg/v:SI 124 [ u ])
(reg:SI 126))) -1 (nil))
(insn 8 7 9 wwww.c:44 (set (reg:DF 127)
(float:DF (reg:SI 125))) -1 (nil))
(insn 9 8 10 wwww.c:44 (set (mem/s/c:SI (plus:SI (reg/f:SI 118
virtual-stack-vars)
(const_int -16 [0xfffffffffffffff0])) [0+0 S4 A32])
(subreg:SI (reg:DF 127) 0)) -1 (nil))
(insn 10 9 0 wwww.c:44 (set (mem/s/c:SI (plus:SI (reg/f:SI 118
virtual-stack-vars)
(const_int -12 [0xfffffffffffffff4])) [0+4 S4 A32])
(subreg:SI (reg:DF 127) 4)) -1 (nil))
;; mm.b = 0.0
(insn 11 10 12 wwww.c:45 (set (mem/s/c:SI (plus:SI (reg/f:SI 118
virtual-stack-vars)
(const_int -8 [0xfffffffffffffff8])) [0+0 S4 A32])
(const_int 0 [0x0])) -1 (nil))
(insn 12 11 0 wwww.c:45 (set (mem/s/c:SI (plus:SI (reg/f:SI 118
virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [0+4 S4 A32])
(const_int 0 [0x0])) -1 (nil))
The movdf instruction is defined as (the 'x' regclass maps the 64 bit
registers):
(define_insn "movdf"
[(set (match_operand:DF 0 "nonimmediate_operand" "=x,x,m")
(match_operand:DF 1 "general_operand" "m,x,x"))]
""
"@
ldr.f\t%1,%0
fdmov\t%1,%0
str.f\t%1,%0"
[
(set_attr "length" "3,6,3")
(set_attr "cc" "none,none,none")
]
)
Since this instruction set does not have a direct move of 64 bit constant to
register, I defined
this:
enum reg_class
js1_preferred_reload_class(rtx x, enum reg_class regclass)
{
enum machine_mode mode = GET_MODE(x);
if (regclass == NO_REGS ||
((GET_CODE(x) == CONST_INT ||
GET_CODE(x) == CONST_DOUBLE) && regclass == X_REGS))
return NO_REGS;
return GET_MODE_SIZE(mode) > 4 ? NO_REGS: regclass;
}
Is this the problem?
Thank you,
- Jamie