History

arm-gen.c: replace register constants with enum values

and support sp in intr

Daniel Glöckner committed 10 years ago

Commit 52a15221 parent 6775c7c1 file · +17 −10Browse files

Unified · Split

arm-gen.c+17−10
@@ -79,6 +79,8 @@ enum { · 78 unmodified lines
7979 TREG_F6,
8080 TREG_F7,
8181 #endif
82+ TREG_SP = 13,
83+ TREG_LR,
8284 };
8385
8486 #ifdef TCC_ARM_VFP
@@ -406,24 +408,26 @@ static uint32_t vfpr(int r) · 321 unmodified lines
406408 {
407409 if(r<TREG_F0 || r>TREG_F7)
408410 tcc_error("compiler error! register %i is no vfp register",r);
409− return r-5;
411+ return r - TREG_F0;
410412 }
411413 #else
412414 static uint32_t fpr(int r)
413415 {
414416 if(r<TREG_F0 || r>TREG_F3)
415417 tcc_error("compiler error! register %i is no fpa register",r);
416− return r-5;
418+ return r - TREG_F0;
417419 }
418420 #endif
419421
420422 static uint32_t intr(int r)
421423 {
422− if(r==4)
424+ if(r == TREG_R12)
423425 return 12;
424− if((r<0 || r>4) && r!=14)
425− tcc_error("compiler error! register %i is no int register",r);
426− return r;
426+ if(r >= TREG_R0 && r <= TREG_R3)
427+ return r - TREG_R0;
428+ if (r >= TREG_SP && r <= TREG_LR)
429+ return r + (13 - TREG_SP);
430+ tcc_error("compiler error! register %i is no int register",r);
427431 }
428432
429433 static void calcaddr(uint32_t *base, int *off, int *sgn, int maxoff, unsigned shift)
@@ -544,7 +548,8 @@ void load(int r, SValue *sv) · 114 unmodified lines
544548 v1.type.t = VT_PTR;
545549 v1.r = VT_LOCAL | VT_LVAL;
546550 v1.c.i = sv->c.i;
547− load(base=14 /* lr */, &v1);
551+ load(TREG_LR, &v1);
552+ base = 14; /* lr */
548553 fc=sign=0;
549554 v=VT_LOCAL;
550555 } else if(v == VT_CONST) {
@@ -552,7 +557,8 @@ void load(int r, SValue *sv) · 1 unmodified line
552557 v1.r = fr&~VT_LVAL;
553558 v1.c.i = sv->c.i;
554559 v1.sym=sv->sym;
555− load(base=14, &v1);
560+ load(TREG_LR, &v1);
561+ base = 14; /* lr */
556562 fc=sign=0;
557563 v=VT_LOCAL;
558564 } else if(v < VT_CONST) {
@@ -678,7 +684,7 @@ void store(int r, SValue *sv) · 119 unmodified lines
678684
679685 v = fr & VT_VALMASK;
680686 if (fr & VT_LVAL || fr == VT_LOCAL) {
681− uint32_t base = 0xb;
687+ uint32_t base = 0xb; /* fp */
682688 if(v < VT_CONST) {
683689 base=intr(v);
684690 v=VT_LOCAL;
@@ -688,7 +694,8 @@ void store(int r, SValue *sv) · 3 unmodified lines
688694 v1.r = fr&~VT_LVAL;
689695 v1.c.i = sv->c.i;
690696 v1.sym=sv->sym;
691− load(base=14, &v1);
697+ load(TREG_LR, &v1);
698+ base = 14; /* lr */
692699 fc=sign=0;
693700 v=VT_LOCAL;
694701 }