Skip to content

Commit 8ea1e39

Browse files
committed
machreg: architecture specific initializations
Signed-off-by: Paul Osmialowski <[email protected]>
1 parent 45d7aeb commit 8ea1e39

File tree

4 files changed

+126
-33
lines changed

4 files changed

+126
-33
lines changed

tools/flang2/flang2exe/aarch64-Linux/machreg.h

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ extern char *zm_reg[MAX_N_XMM_REGS + 1]; /* ZMM_REG_NAMES */
193193

194194
/* Use macros ARG_IR, ARG_XR, etc.
195195
*/
196-
extern int mr_arg_ir[MR_MAX_IREG_ARGS + 1]; /* defd in machreg.c */
197196
extern int mr_arg_xr[MR_MAX_XREG_ARGS + 1]; /* defd in machreg.c */
198197
extern int mr_res_ir[MR_MAX_IREG_RES + 1];
199198
extern int mr_res_xr[MR_MAX_XREG_RES + 1];
@@ -353,6 +352,42 @@ typedef struct {
353352
extern REG reg[];
354353
extern RGSETB rgsetb;
355354

355+
#define SCRATCH_REGS {IR_RAX, IR_RCX, IR_RDX}
356+
357+
#define MACH_REGS \
358+
{ \
359+
{1, 8, 8 /*TBD*/, MR_L1, MR_U1, MR_U1, MR_U1, 0, 0, 'i'}, /* %r's */ \
360+
{1, 8, 8 /*TBD*/, MR_L2, MR_U2, MR_U2, MR_U2, 0, MR_MAX1, 'f'}, /* %f's */ \
361+
{1, 8, 8 /*TBD*/, MR_L3, MR_U3, MR_U3, MR_U3, 0, (MR_MAX1 + MR_MAX2), \
362+
'x'} /* %f's xmm */ \
363+
}
364+
365+
#define REGS(mach_regs) \
366+
{ \
367+
{6, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* IR */ \
368+
{3, 0, 0, 0, &((mach_regs)[1]), RCF_NONE}, /* SP */ \
369+
{3, 0, 0, 0, &((mach_regs)[1]), RCF_NONE}, /* DP */ \
370+
{6, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* AR */ \
371+
{3, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* KR */ \
372+
{0, 0, 0, 0, 0, 0}, /* VECT */ \
373+
{0, 0, 0, 0, 0, 0}, /* QP */ \
374+
{3, 0, 0, 0, 0, RCF_NONE}, /* CSP */ \
375+
{3, 0, 0, 0, 0, RCF_NONE}, /* CDP */ \
376+
{0, 0, 0, 0, 0, 0}, /* CQP */ \
377+
{0, 0, 0, 0, 0, 0}, /* X87 */ \
378+
{0, 0, 0, 0, 0, 0}, /* CX87 */ \
379+
/* the following will be mapped over SP and DP above */ \
380+
{3, 0, 0, 0, &((mach_regs)[2]), RCF_NONE}, /* SPXM */ \
381+
{3, 0, 0, 0, &((mach_regs)[2]), RCF_NONE}, /* DPXM */ \
382+
}
383+
384+
#define MR_RESET_FRGLOBALS(mach_regs) \
385+
{ \
386+
/* effectively turn off fp global regs. */ \
387+
(mach_regs)[1].last_global = mach_reg[1].first_global - 1; \
388+
(mach_regs)[2].last_global = mach_reg[2].first_global - 1; \
389+
}
390+
356391
/***** External Function Declarations *****/
357392

358393
int mr_getnext(int rtype);

tools/flang2/flang2exe/machreg.c

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -37,39 +37,28 @@ static bool mr_restore; /* need to backout for KR registers? */
3737
static char mr_restore_next_global; /* saving the mr.next_global field */
3838
static char mr_restore_nused; /* saving the mr.nused field */
3939

40-
static MACH_REG mach_reg[MR_UNIQ] = {
41-
{1, 8, 8 /*TBD*/, MR_L1, MR_U1, MR_U1, MR_U1, 0, 0, 'i'}, /* %r's */
42-
{1, 8, 8 /*TBD*/, MR_L2, MR_U2, MR_U2, MR_U2, 0, MR_MAX1, 'f'}, /* %f's */
43-
{1, 8, 8 /*TBD*/, MR_L3, MR_U3, MR_U3, MR_U3, 0, (MR_MAX1 + MR_MAX2),
44-
'x'} /* %f's xmm */
45-
};
46-
47-
REG reg[RATA_RTYPES_TOTAL] = {
48-
{6, 0, 0, 0, &mach_reg[0], RCF_NONE}, /* IR */
49-
{3, 0, 0, 0, &mach_reg[1], RCF_NONE}, /* SP */
50-
{3, 0, 0, 0, &mach_reg[1], RCF_NONE}, /* DP */
51-
{6, 0, 0, 0, &mach_reg[0], RCF_NONE}, /* AR */
52-
{3, 0, 0, 0, &mach_reg[0], RCF_NONE}, /* KR */
53-
{0, 0, 0, 0, 0, 0}, /* VECT */
54-
{0, 0, 0, 0, 0, 0}, /* QP */
55-
{3, 0, 0, 0, 0, RCF_NONE}, /* CSP */
56-
{3, 0, 0, 0, 0, RCF_NONE}, /* CDP */
57-
{0, 0, 0, 0, 0, 0}, /* CQP */
58-
{0, 0, 0, 0, 0, 0}, /* X87 */
59-
{0, 0, 0, 0, 0, 0}, /* CX87 */
60-
/* the following will be mapped over SP and DP above */
61-
{3, 0, 0, 0, &mach_reg[2], RCF_NONE}, /* SPXM */
62-
{3, 0, 0, 0, &mach_reg[2], RCF_NONE}, /* DPXM */
63-
};
40+
static MACH_REG mach_reg[MR_UNIQ] = MACH_REGS;
41+
42+
REG reg[RATA_RTYPES_TOTAL] = REGS(mach_reg);
6443

6544
RGSETB rgsetb;
6645

67-
const int scratch_regs[3] = {IR_RAX, IR_RCX, IR_RDX};
46+
const int scratch_regs[] = SCRATCH_REGS;
6847

69-
#if defined(TARGET_LLVM_ARM) || defined(TARGET_LLVM_POWER)
48+
#if defined(TARGET_LLVM_ARM)
49+
50+
/* xmm0 --> xmm7 */
51+
int mr_arg_xr[MR_MAX_XREG_ARGS + 1] = {XR_XMM0, XR_XMM1, XR_XMM2, XR_XMM3,
52+
XR_XMM4, XR_XMM5, XR_XMM6, XR_XMM7};
53+
54+
/* return result registers */
55+
/* rax, rdx */
56+
int mr_res_ir[MR_MAX_IREG_RES + 1] = {IR_RAX, IR_RDX};
57+
/* xmm0, xmm1 */
58+
int mr_res_xr[MR_MAX_XREG_RES + 1] = {XR_XMM0, XR_XMM1};
59+
60+
#elif defined(TARGET_LLVM_POWER)
7061

71-
/* arguments passed in registers */
72-
int mr_arg_ir[MR_MAX_IREG_ARGS + 1];
7362
/* xmm0 --> xmm7 */
7463
int mr_arg_xr[MR_MAX_XREG_ARGS + 1] = {XR_XMM0, XR_XMM1, XR_XMM2, XR_XMM3,
7564
XR_XMM4, XR_XMM5, XR_XMM6, XR_XMM7};
@@ -168,9 +157,7 @@ mr_reset_numglobals(int reduce_by)
168157
void
169158
mr_reset_frglobals()
170159
{
171-
/* effectively turn off fp global regs. */
172-
mach_reg[1].last_global = mach_reg[1].first_global - 1;
173-
mach_reg[2].last_global = mach_reg[2].first_global - 1;
160+
MR_RESET_FRGLOBALS(mach_reg);
174161
}
175162

176163
/** \brief get a global register for a given register type (RATA_IR, etc.).

tools/flang2/flang2exe/ppc64le-Linux/machreg.h

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ extern char *zm_reg[MAX_N_XMM_REGS + 1]; /* ZMM_REG_NAMES */
193193

194194
/* Use macros ARG_IR, ARG_XR, etc.
195195
*/
196-
extern int mr_arg_ir[MR_MAX_IREG_ARGS + 1]; /* defd in machreg.c */
197196
extern int mr_arg_xr[MR_MAX_XREG_ARGS + 1]; /* defd in machreg.c */
198197
extern int mr_res_ir[MR_MAX_IREG_RES + 1];
199198
extern int mr_res_xr[MR_MAX_XREG_RES + 1];
@@ -353,6 +352,42 @@ typedef struct {
353352
extern REG reg[];
354353
extern RGSETB rgsetb;
355354

355+
#define SCRATCH_REGS {IR_RAX, IR_RCX, IR_RDX}
356+
357+
#define MACH_REGS \
358+
{ \
359+
{1, 8, 8 /*TBD*/, MR_L1, MR_U1, MR_U1, MR_U1, 0, 0, 'i'}, /* %r's */ \
360+
{1, 8, 8 /*TBD*/, MR_L2, MR_U2, MR_U2, MR_U2, 0, MR_MAX1, 'f'}, /* %f's */ \
361+
{1, 8, 8 /*TBD*/, MR_L3, MR_U3, MR_U3, MR_U3, 0, (MR_MAX1 + MR_MAX2), \
362+
'x'} /* %f's xmm */ \
363+
}
364+
365+
#define REGS(mach_regs) \
366+
{ \
367+
{6, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* IR */ \
368+
{3, 0, 0, 0, &((mach_regs)[1]), RCF_NONE}, /* SP */ \
369+
{3, 0, 0, 0, &((mach_regs)[1]), RCF_NONE}, /* DP */ \
370+
{6, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* AR */ \
371+
{3, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* KR */ \
372+
{0, 0, 0, 0, 0, 0}, /* VECT */ \
373+
{0, 0, 0, 0, 0, 0}, /* QP */ \
374+
{3, 0, 0, 0, 0, RCF_NONE}, /* CSP */ \
375+
{3, 0, 0, 0, 0, RCF_NONE}, /* CDP */ \
376+
{0, 0, 0, 0, 0, 0}, /* CQP */ \
377+
{0, 0, 0, 0, 0, 0}, /* X87 */ \
378+
{0, 0, 0, 0, 0, 0}, /* CX87 */ \
379+
/* the following will be mapped over SP and DP above */ \
380+
{3, 0, 0, 0, &((mach_regs)[2]), RCF_NONE}, /* SPXM */ \
381+
{3, 0, 0, 0, &((mach_regs)[2]), RCF_NONE}, /* DPXM */ \
382+
}
383+
384+
#define MR_RESET_FRGLOBALS(mach_regs) \
385+
{ \
386+
/* effectively turn off fp global regs. */ \
387+
(mach_regs)[1].last_global = mach_reg[1].first_global - 1; \
388+
(mach_regs)[2].last_global = mach_reg[2].first_global - 1; \
389+
}
390+
356391
/***** External Function Declarations *****/
357392

358393
int mr_getnext(int rtype);

tools/flang2/flang2exe/x86_64-Linux/machreg.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,42 @@ typedef struct {
510510
extern REG reg[];
511511
extern RGSETB rgsetb;
512512

513+
#define SCRATCH_REGS {IR_RAX, IR_RCX, IR_RDX}
514+
515+
#define MACH_REGS \
516+
{ \
517+
{1, 8, 8 /*TBD*/, MR_L1, MR_U1, MR_U1, MR_U1, 0, 0, 'i'}, /* %r's */ \
518+
{1, 8, 8 /*TBD*/, MR_L2, MR_U2, MR_U2, MR_U2, 0, MR_MAX1, 'f'}, /* %f's */ \
519+
{1, 8, 8 /*TBD*/, MR_L3, MR_U3, MR_U3, MR_U3, 0, (MR_MAX1 + MR_MAX2), \
520+
'x'} /* %f's xmm */ \
521+
}
522+
523+
#define REGS(mach_regs) \
524+
{ \
525+
{6, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* IR */ \
526+
{3, 0, 0, 0, &((mach_regs)[1]), RCF_NONE}, /* SP */ \
527+
{3, 0, 0, 0, &((mach_regs)[1]), RCF_NONE}, /* DP */ \
528+
{6, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* AR */ \
529+
{3, 0, 0, 0, &((mach_regs)[0]), RCF_NONE}, /* KR */ \
530+
{0, 0, 0, 0, 0, 0}, /* VECT */ \
531+
{0, 0, 0, 0, 0, 0}, /* QP */ \
532+
{3, 0, 0, 0, 0, RCF_NONE}, /* CSP */ \
533+
{3, 0, 0, 0, 0, RCF_NONE}, /* CDP */ \
534+
{0, 0, 0, 0, 0, 0}, /* CQP */ \
535+
{0, 0, 0, 0, 0, 0}, /* X87 */ \
536+
{0, 0, 0, 0, 0, 0}, /* CX87 */ \
537+
/* the following will be mapped over SP and DP above */ \
538+
{3, 0, 0, 0, &((mach_regs)[2]), RCF_NONE}, /* SPXM */ \
539+
{3, 0, 0, 0, &((mach_regs)[2]), RCF_NONE}, /* DPXM */ \
540+
}
541+
542+
#define MR_RESET_FRGLOBALS(mach_regs) \
543+
{ \
544+
/* effectively turn off fp global regs. */ \
545+
(mach_regs)[1].last_global = mach_reg[1].first_global - 1; \
546+
(mach_regs)[2].last_global = mach_reg[2].first_global - 1; \
547+
}
548+
513549
/***** External Function Declarations *****/
514550

515551
/**

0 commit comments

Comments
 (0)