/* { dg-do compile } */ /* { dg-skip-if "" { *-*-* } { "-mcpu=msp430" "-mcpu=430" "-msmall" } { "" } } */ /* { dg-options "-O1 -mlarge" } */ /* { dg-final { check-function-bodies "**" "" } } */ /* The purpose of this test is to check that all insn patters in msp430.md which use the "Yx" constraint work as expected. So when both of the operands are in lower memory, a 430 instruction is generated, and when at least one of the operands might be in upper memory, a 430X instruction is generated. We do not need to extensively test the situation where one of the operands in an insn is not a mem (i.e. it is a register or immediate). A single test will verify that the constraint correctly assumes that a reg or immediate does not itself require a 430X instruction. */ typedef char qi; typedef int hi; /* For insns which use the QHI mode iterator (therefore accepting QI, HI and PSI modes), we also check the PSImode version. All insns should be 430x in that case. */ typedef __int20 psi; typedef long si; #define ATTR_EITHER __attribute__((either)) #define ATTR_LOWER __attribute__((lower)) /* Use these to generate 430X insns. */ qi ATTR_EITHER eqi1, eqi2, eqi3, eqi4, eqi5, eqi6; hi ATTR_EITHER ehi1, ehi2, ehi3, ehi4, ehi5, ehi6; psi ATTR_EITHER epsi1, epsi2, epsi3, epsi4, epsi5, epsi6; si ATTR_EITHER esi1, esi2, esi3, esi4, esi5, esi6; /* Use these to generate 430 insns. */ qi ATTR_LOWER lqi1, lqi2, lqi3, lqi4, lqi5, lqi6; hi ATTR_LOWER lhi1, lhi2, lhi3, lhi4, lhi5, lhi6; psi ATTR_LOWER lpsi1, lpsi2, lpsi3, lpsi4, lpsi5, lpsi6; si ATTR_LOWER lsi1, lsi2, lsi3, lsi4, lsi5, lsi6; /* The default data region is "lower", so these behave the same as the above "l*" variables unless -mdata-region={upper,either,none} is passed. */ qi qi1, qi2, qi3, qi4, qi5, qi6; hi hi1, hi2, hi3, hi4, hi5, hi6; psi psi1, psi2, psi3, psi4, psi5, psi6; si si1, si2, si3, si4, si5, si6; qi use_qi(qi a); hi use_hi(hi a); psi use_psi(psi a); si use_si(si a); #define USE_MODE(MODE) use_ ## MODE #define USE_MODE_N(MODE,N) use_ ## N ## MODE #define E_VAR(MODE,N) e ## MODE ## N #define L_VAR(MODE,N) l ## MODE ## N #define VAR(MODE,N) MODE ## N #define REG_VAR(MODE,N) MODE ## r ## N /* Verify that a register operand does not influence whether a 430X instruction is used or not. */ /* ** register_operand: { target msp430_region_lower } ** ... ** MOV.B &lqi1, R12 ** ... ** MOV.B &qi1, R12 ** ... ** MOVX.B &eqi1, R12 ** ... */ /* ** register_operand: { target msp430_region_not_lower } ** ... ** MOV.B &lqi1, R12 ** ... ** MOVX.B &qi1, R12 ** ... ** MOVX.B &eqi1, R12 ** ... */ void register_operand (void) { use_qi (lqi1); use_qi (qi1); use_qi (eqi1); } /* Verify that an immediate operand does not influence whether a 430X instruction is used or not. */ /* ** immediate_operand: { target msp430_region_lower } ** ... ** MOV.B #1, &lqi1 ** MOV.B #2, &qi1 ** MOVX.B #3, &eqi1 ** ... */ /* ** immediate_operand: { target msp430_region_not_lower } ** ... ** MOV.B #1, &lqi1 ** MOVX.B #2, &qi1 ** MOVX.B #3, &eqi1 ** ... */ void immediate_operand (void) { lqi1 = 1; qi1 = 2; eqi1 = 3; } /* Verify that variables marked with the noinit, persistent, section and lower attributes have the appropriate format instructions generated to handle them. */ int __attribute__((persistent)) pp = 10; int __attribute__((noinit)) nn; int __attribute__((section(".data.foo"))) s; int __attribute__((section(".data.foo"),lower)) sl1; int __attribute__((lower,section(".data.foo"))) sl2; /* ** attrs: ** ... ** MOVX.W #1, &pp ** MOV.W #2, &nn ** MOVX.W #3, &s ** MOV.W #4, &sl1 ** MOV.W #5, &sl2 ** ... */ void attrs (void) { pp = 1; nn = 2; s = 3; sl1 = 4; sl2 = 5; } #define MOV_INSNS(MODE) \ E_VAR(MODE, 1) = E_VAR(MODE, 2); \ E_VAR(MODE, 3) = L_VAR(MODE, 1); \ E_VAR(MODE, 4) = VAR(MODE, 1); \ L_VAR(MODE, 4) = E_VAR(MODE, 5); \ VAR(MODE, 5) = E_VAR(MODE, 6); \ L_VAR(MODE, 2) = L_VAR(MODE, 3); \ L_VAR(MODE, 5) = VAR(MODE, 2); \ VAR(MODE, 3) = VAR(MODE, 4); \ VAR(MODE, 6) = L_VAR(MODE, 6); /* ** movqi: { target msp430_region_lower } ** ... ** MOVX.B &eqi2, &eqi1 ** MOVX.B &lqi1, &eqi3 ** MOVX.B &qi1, &eqi4 ** MOVX.B &eqi5, &lqi4 ** MOVX.B &eqi6, &qi5 ** MOV.B &lqi3, &lqi2 ** MOV.B &qi2, &lqi5 ** MOV.B &qi4, &qi3 ** MOV.B &lqi6, &qi6 ** ... */ /* ** movqi: { target msp430_region_not_lower } ** ... ** MOVX.B &eqi2, &eqi1 ** MOVX.B &lqi1, &eqi3 ** MOVX.B &qi1, &eqi4 ** MOVX.B &eqi5, &lqi4 ** MOVX.B &eqi6, &qi5 ** MOV.B &lqi3, &lqi2 ** MOVX.B &qi2, &lqi5 ** MOVX.B &qi4, &qi3 ** MOVX.B &lqi6, &qi6 ** ... */ void movqi (void) { MOV_INSNS (qi) } /* ** movhi: { target msp430_region_lower } ** ... ** MOVX.W &ehi2, &ehi1 ** MOVX.W &lhi1, &ehi3 ** MOVX.W &hi1, &ehi4 ** MOVX.W &ehi5, &lhi4 ** MOVX.W &ehi6, &hi5 ** MOV.W &lhi3, &lhi2 ** MOV.W &hi2, &lhi5 ** MOV.W &hi4, &hi3 ** MOV.W &lhi6, &hi6 ** ... */ /* ** movhi: { target msp430_region_not_lower } ** ... ** MOVX.W &ehi2, &ehi1 ** MOVX.W &lhi1, &ehi3 ** MOVX.W &hi1, &ehi4 ** MOVX.W &ehi5, &lhi4 ** MOVX.W &ehi6, &hi5 ** MOV.W &lhi3, &lhi2 ** MOVX.W &hi2, &lhi5 ** MOVX.W &hi4, &hi3 ** MOVX.W &lhi6, &hi6 ** ... */ void movhi (void) { MOV_INSNS (hi) } /* There is no specific movsi3 pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** movsi: { target msp430_region_lower } ** ... ** MOVX.W &esi2, &esi1 ** MOVX.W &esi2\+2, &esi1\+2 ** MOVX.W &lsi1, &esi3 ** MOVX.W &lsi1\+2, &esi3\+2 ** MOVX.W &si1, &esi4 ** MOVX.W &si1\+2, &esi4\+2 ** MOVX.W &esi5, &lsi4 ** MOVX.W &esi5\+2, &lsi4\+2 ** MOVX.W &esi6, &si5 ** MOVX.W &esi6\+2, &si5\+2 ** MOV.W &lsi3, &lsi2 ** MOV.W &lsi3\+2, &lsi2\+2 ** MOV.W &si2, &lsi5 ** MOV.W &si2\+2, &lsi5\+2 ** MOV.W &si4, &si3 ** MOV.W &si4\+2, &si3\+2 ** MOV.W &lsi6, &si6 ** MOV.W &lsi6\+2, &si6\+2 ** ... */ /* ** movsi: { target msp430_region_not_lower } ** ... ** MOVX.W &esi2, &esi1 ** MOVX.W &esi2\+2, &esi1\+2 ** MOVX.W &lsi1, &esi3 ** MOVX.W &lsi1\+2, &esi3\+2 ** MOVX.W &si1, &esi4 ** MOVX.W &si1\+2, &esi4\+2 ** MOVX.W &esi5, &lsi4 ** MOVX.W &esi5\+2, &lsi4\+2 ** MOVX.W &esi6, &si5 ** MOVX.W &esi6\+2, &si5\+2 ** MOV.W &lsi3, &lsi2 ** MOV.W &lsi3\+2, &lsi2\+2 ** MOVX.W &si2, &lsi5 ** MOVX.W &si2\+2, &lsi5\+2 ** MOVX.W &si4, &si3 ** MOVX.W &si4\+2, &si3\+2 ** MOVX.W &lsi6, &si6 ** MOVX.W &lsi6\+2, &si6\+2 ** ... */ void movsi (void) { MOV_INSNS (si) } #define ADD_INSNS(MODE) \ E_VAR(MODE,1) += E_VAR(MODE,2); \ E_VAR(MODE,3) += L_VAR(MODE,1); \ E_VAR(MODE,4) += VAR(MODE,1); \ L_VAR(MODE,2) += E_VAR(MODE,5); \ VAR(MODE,3) += E_VAR(MODE,6); \ L_VAR(MODE,3) += L_VAR(MODE,4); \ L_VAR(MODE,5) += VAR(MODE,2); \ VAR(MODE,4) += L_VAR(MODE,6); \ VAR(MODE,5) += VAR(MODE,6); /* ** addqi3: { target msp430_region_lower } ** ... ** ADDX.B &eqi2, &eqi1 ** ADDX.B &lqi1, &eqi3 ** ADDX.B &qi1, &eqi4 ** ADDX.B &eqi5, &lqi2 ** ADDX.B &eqi6, &qi3 ** ADD.B &lqi4, &lqi3 ** ADD.B &qi2, &lqi5 ** ADD.B &lqi6, &qi4 ** ADD.B &qi6, &qi5 ** ... */ /* ** addqi3: { target msp430_region_not_lower } ** ... ** ADDX.B &eqi2, &eqi1 ** ADDX.B &lqi1, &eqi3 ** ADDX.B &qi1, &eqi4 ** ADDX.B &eqi5, &lqi2 ** ADDX.B &eqi6, &qi3 ** ADD.B &lqi4, &lqi3 ** ADDX.B &qi2, &lqi5 ** ADDX.B &lqi6, &qi4 ** ADDX.B &qi6, &qi5 ** ... */ void addqi3 (void) { ADD_INSNS(qi) } /* ** addhi3: { target msp430_region_lower } ** ... ** ADDX.W &ehi2, &ehi1 ** ADDX.W &lhi1, &ehi3 ** ADDX.W &hi1, &ehi4 ** ADDX.W &ehi5, &lhi2 ** ADDX.W &ehi6, &hi3 ** ADD.W &lhi4, &lhi3 ** ADD.W &hi2, &lhi5 ** ADD.W &lhi6, &hi4 ** ADD.W &hi6, &hi5 ** ... */ /* ** addhi3: { target msp430_region_not_lower } ** ... ** ADDX.W &ehi2, &ehi1 ** ADDX.W &lhi1, &ehi3 ** ADDX.W &hi1, &ehi4 ** ADDX.W &ehi5, &lhi2 ** ADDX.W &ehi6, &hi3 ** ADD.W &lhi4, &lhi3 ** ADDX.W &hi2, &lhi5 ** ADDX.W &lhi6, &hi4 ** ADDX.W &hi6, &hi5 ** ... */ void addhi3 (void) { ADD_INSNS(hi) } /* ** addsi3: { target msp430_region_lower } ** ... ** ADDX &esi2, &esi1 { ADDCX &esi2\+2, &esi1\+2 ** ADDX &lsi1, &esi3 { ADDCX &lsi1\+2, &esi3\+2 ** ADDX &si1, &esi4 { ADDCX &si1\+2, &esi4\+2 ** ADDX &esi5, &lsi2 { ADDCX &esi5\+2, &lsi2\+2 ** ADDX &esi6, &si3 { ADDCX &esi6\+2, &si3\+2 ** ADD &lsi4, &lsi3 { ADDC &lsi4\+2, &lsi3\+2 ** ADD &si2, &lsi5 { ADDC &si2\+2, &lsi5\+2 ** ADD &lsi6, &si4 { ADDC &lsi6\+2, &si4\+2 ** ADD &si6, &si5 { ADDC &si6\+2, &si5\+2 ** ... */ /* ** addsi3: { target msp430_region_not_lower } ** ... ** ADDX &esi2, &esi1 { ADDCX &esi2\+2, &esi1\+2 ** ADDX &lsi1, &esi3 { ADDCX &lsi1\+2, &esi3\+2 ** ADDX &si1, &esi4 { ADDCX &si1\+2, &esi4\+2 ** ADDX &esi5, &lsi2 { ADDCX &esi5\+2, &lsi2\+2 ** ADDX &esi6, &si3 { ADDCX &esi6\+2, &si3\+2 ** ADD &lsi4, &lsi3 { ADDC &lsi4\+2, &lsi3\+2 ** ADDX &si2, &lsi5 { ADDCX &si2\+2, &lsi5\+2 ** ADDX &lsi6, &si4 { ADDCX &lsi6\+2, &si4\+2 ** ADDX &si6, &si5 { ADDCX &si6\+2, &si5\+2 ** ... */ void addsi3 (void) { ADD_INSNS(si) } #define SUB_INSNS(MODE) \ E_VAR(MODE,1) -= E_VAR(MODE,2); \ E_VAR(MODE,3) -= L_VAR(MODE,1); \ E_VAR(MODE,4) -= VAR(MODE,1); \ L_VAR(MODE,2) -= E_VAR(MODE,5); \ VAR(MODE,3) -= E_VAR(MODE,6); \ L_VAR(MODE,3) -= L_VAR(MODE,4); \ L_VAR(MODE,5) -= VAR(MODE,2); \ VAR(MODE,4) -= L_VAR(MODE,6); \ VAR(MODE,5) -= VAR(MODE,6); /* ** subqi3: { target msp430_region_lower } ** ... ** SUBX.B &eqi2, &eqi1 ** SUBX.B &lqi1, &eqi3 ** SUBX.B &qi1, &eqi4 ** SUBX.B &eqi5, &lqi2 ** SUBX.B &eqi6, &qi3 ** SUB.B &lqi4, &lqi3 ** SUB.B &qi2, &lqi5 ** SUB.B &lqi6, &qi4 ** SUB.B &qi6, &qi5 ** ... */ /* ** subqi3: { target msp430_region_not_lower } ** ... ** SUBX.B &eqi2, &eqi1 ** SUBX.B &lqi1, &eqi3 ** SUBX.B &qi1, &eqi4 ** SUBX.B &eqi5, &lqi2 ** SUBX.B &eqi6, &qi3 ** SUB.B &lqi4, &lqi3 ** SUBX.B &qi2, &lqi5 ** SUBX.B &lqi6, &qi4 ** SUBX.B &qi6, &qi5 ** ... */ void subqi3 (void) { SUB_INSNS(qi) } /* ** subhi3: { target msp430_region_lower } ** ... ** SUBX.W &ehi2, &ehi1 ** SUBX.W &lhi1, &ehi3 ** SUBX.W &hi1, &ehi4 ** SUBX.W &ehi5, &lhi2 ** SUBX.W &ehi6, &hi3 ** SUB.W &lhi4, &lhi3 ** SUB.W &hi2, &lhi5 ** SUB.W &lhi6, &hi4 ** SUB.W &hi6, &hi5 ** ... */ /* ** subhi3: { target msp430_region_not_lower } ** ... ** SUBX.W &ehi2, &ehi1 ** SUBX.W &lhi1, &ehi3 ** SUBX.W &hi1, &ehi4 ** SUBX.W &ehi5, &lhi2 ** SUBX.W &ehi6, &hi3 ** SUB.W &lhi4, &lhi3 ** SUBX.W &hi2, &lhi5 ** SUBX.W &lhi6, &hi4 ** SUBX.W &hi6, &hi5 ** ... */ void subhi3 (void) { SUB_INSNS(hi) } /* ** subsi3: { target msp430_region_lower } ** ... ** SUBX &esi2, &esi1 { SUBCX &esi2\+2, &esi1\+2 ** SUBX &lsi1, &esi3 { SUBCX &lsi1\+2, &esi3\+2 ** SUBX &si1, &esi4 { SUBCX &si1\+2, &esi4\+2 ** SUBX &esi5, &lsi2 { SUBCX &esi5\+2, &lsi2\+2 ** SUBX &esi6, &si3 { SUBCX &esi6\+2, &si3\+2 ** SUB &lsi4, &lsi3 { SUBC &lsi4\+2, &lsi3\+2 ** SUB &si2, &lsi5 { SUBC &si2\+2, &lsi5\+2 ** SUB &lsi6, &si4 { SUBC &lsi6\+2, &si4\+2 ** SUB &si6, &si5 { SUBC &si6\+2, &si5\+2 ** ... */ /* ** subsi3: { target msp430_region_not_lower } ** ... ** SUBX &esi2, &esi1 { SUBCX &esi2\+2, &esi1\+2 ** SUBX &lsi1, &esi3 { SUBCX &lsi1\+2, &esi3\+2 ** SUBX &si1, &esi4 { SUBCX &si1\+2, &esi4\+2 ** SUBX &esi5, &lsi2 { SUBCX &esi5\+2, &lsi2\+2 ** SUBX &esi6, &si3 { SUBCX &esi6\+2, &si3\+2 ** SUB &lsi4, &lsi3 { SUBC &lsi4\+2, &lsi3\+2 ** SUBX &si2, &lsi5 { SUBCX &si2\+2, &lsi5\+2 ** SUBX &lsi6, &si4 { SUBCX &lsi6\+2, &si4\+2 ** SUBX &si6, &si5 { SUBCX &si6\+2, &si5\+2 ** ... */ void subsi3 (void) { SUB_INSNS(si) } #define BIC_INSN(MODE) \ E_VAR(MODE,1) &= (E_VAR(MODE,2) ^ E_VAR(MODE,1)); \ E_VAR(MODE,3) &= (L_VAR(MODE,1) ^ E_VAR(MODE,3)); \ E_VAR(MODE,4) &= (VAR(MODE,1) ^ E_VAR(MODE,4)); \ L_VAR(MODE,2) &= (E_VAR(MODE,5) ^ L_VAR(MODE,2)); \ VAR(MODE,2) &= (E_VAR(MODE,6) ^ VAR(MODE,2)); \ L_VAR(MODE,3) &= (L_VAR(MODE,4) ^ L_VAR(MODE,3)); \ L_VAR(MODE,5) &= (VAR(MODE,3) ^ L_VAR(MODE,5)); \ VAR(MODE,4) &= (L_VAR(MODE,6) ^ VAR(MODE,4)); \ VAR(MODE,5) &= (VAR(MODE,6) ^ VAR(MODE,5)); \ /* ** bicqi3: { target msp430_region_lower } ** ... ** BICX.B &eqi2, &eqi1 ** BICX.B &lqi1, &eqi3 ** BICX.B &qi1, &eqi4 ** BICX.B &eqi5, &lqi2 ** BICX.B &eqi6, &qi2 ** BIC.B &lqi4, &lqi3 ** BIC.B &qi3, &lqi5 ** BIC.B &lqi6, &qi4 ** BIC.B &qi6, &qi5 ** ... */ /* ** bicqi3: { target msp430_region_not_lower } ** ... ** BICX.B &eqi2, &eqi1 ** BICX.B &lqi1, &eqi3 ** BICX.B &qi1, &eqi4 ** BICX.B &eqi5, &lqi2 ** BICX.B &eqi6, &qi2 ** BIC.B &lqi4, &lqi3 ** BICX.B &qi3, &lqi5 ** BICX.B &lqi6, &qi4 ** BICX.B &qi6, &qi5 ** ... */ void bicqi3 (void) { BIC_INSN(qi) } /* ** bichi3: { target msp430_region_lower } ** ... ** BICX.W &ehi2, &ehi1 ** BICX.W &lhi1, &ehi3 ** BICX.W &hi1, &ehi4 ** BICX.W &ehi5, &lhi2 ** BICX.W &ehi6, &hi2 ** BIC.W &lhi4, &lhi3 ** BIC.W &hi3, &lhi5 ** BIC.W &lhi6, &hi4 ** BIC.W &hi6, &hi5 ** ... */ /* ** bichi3: { target msp430_region_not_lower } ** ... ** BICX.W &ehi2, &ehi1 ** BICX.W &lhi1, &ehi3 ** BICX.W &hi1, &ehi4 ** BICX.W &ehi5, &lhi2 ** BICX.W &ehi6, &hi2 ** BIC.W &lhi4, &lhi3 ** BICX.W &hi3, &lhi5 ** BICX.W &lhi6, &hi4 ** BICX.W &hi6, &hi5 ** ... */ void bichi3 (void) { BIC_INSN(hi) } /* ** bicpsi3: ** ... ** BICX.A &epsi2, &epsi1 ** BICX.A &lpsi1, &epsi3 ** BICX.A &psi1, &epsi4 ** BICX.A &epsi5, &lpsi2 ** BICX.A &epsi6, &psi2 ** BICX.A &lpsi4, &lpsi3 ** BICX.A &psi3, &lpsi5 ** BICX.A &lpsi6, &psi4 ** BICX.A &psi6, &psi5 ** ... */ void bicpsi3 (void) { BIC_INSN(psi) } /* There is no specific bicsi3 pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** bicsi3: { target msp430_region_lower } ** ... ** BICX.W &esi2, &esi1 ** BICX.W &esi2\+2, &esi1\+2 ** BICX.W &lsi1, &esi3 ** BICX.W &lsi1\+2, &esi3\+2 ** BICX.W &si1, &esi4 ** BICX.W &si1\+2, &esi4\+2 ** BICX.W &esi5, &lsi2 ** BICX.W &esi5\+2, &lsi2\+2 ** BICX.W &esi6, &si2 ** BICX.W &esi6\+2, &si2\+2 ** BIC.W &lsi4, &lsi3 ** BIC.W &lsi4\+2, &lsi3\+2 ** BIC.W &si3, &lsi5 ** BIC.W &si3\+2, &lsi5\+2 ** BIC.W &lsi6, &si4 ** BIC.W &lsi6\+2, &si4\+2 ** BIC.W &si6, &si5 ** BIC.W &si6\+2, &si5\+2 ** ... */ /* ** bicsi3: { target msp430_region_not_lower } ** ... ** BICX.W &esi2, &esi1 ** BICX.W &esi2\+2, &esi1\+2 ** BICX.W &lsi1, &esi3 ** BICX.W &lsi1\+2, &esi3\+2 ** BICX.W &si1, &esi4 ** BICX.W &si1\+2, &esi4\+2 ** BICX.W &esi5, &lsi2 ** BICX.W &esi5\+2, &lsi2\+2 ** BICX.W &esi6, &si2 ** BICX.W &esi6\+2, &si2\+2 ** BIC.W &lsi4, &lsi3 ** BIC.W &lsi4\+2, &lsi3\+2 ** BICX.W &si3, &lsi5 ** BICX.W &si3\+2, &lsi5\+2 ** BICX.W &lsi6, &si4 ** BICX.W &lsi6\+2, &si4\+2 ** BICX.W &si6, &si5 ** BICX.W &si6\+2, &si5\+2 ** ... */ void bicsi3 (void) { BIC_INSN(si) } #define BIC_CG_INSN(MODE) \ E_VAR(MODE,1) &= (1 ^ E_VAR(MODE,1)); \ E_VAR(MODE,2) &= (2 ^ E_VAR(MODE,2)); \ L_VAR(MODE,1) &= (4 ^ L_VAR(MODE,1)); \ VAR(MODE,1) &= (8 ^ VAR(MODE,1)); \ /* ** bic_cg_qi3: { target msp430_region_lower } ** ... ** BICX.B #1, &eqi1 ** BICX.B #2, &eqi2 ** BIC.B #4, &lqi1 ** BIC.B #8, &qi1 ** ... */ /* ** bic_cg_qi3: { target msp430_region_not_lower } ** ... ** BICX.B #1, &eqi1 ** BICX.B #2, &eqi2 ** BIC.B #4, &lqi1 ** BICX.B #8, &qi1 ** ... */ void bic_cg_qi3 (void) { BIC_CG_INSN(qi) } /* ** bic_cg_hi3: { target msp430_region_lower } ** ... ** BICX.W #1, &ehi1 ** BICX.W #2, &ehi2 ** BIC.W #4, &lhi1 ** BIC.W #8, &hi1 ** ... */ /* ** bic_cg_hi3: { target msp430_region_not_lower } ** ... ** BICX.W #1, &ehi1 ** BICX.W #2, &ehi2 ** BIC.W #4, &lhi1 ** BICX.W #8, &hi1 ** ... */ void bic_cg_hi3 (void) { BIC_CG_INSN(hi) } /* ** bic_cg_psi3: ** ... ** BICX.A #1, &epsi1 ** BICX.A #2, &epsi2 ** BICX.A #4, &lpsi1 ** BICX.A #8, &psi1 ** ... */ void bic_cg_psi3 (void) { BIC_CG_INSN(psi) } /* There is no specific bic_cg_si3 pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** bic_cg_si3: { target msp430_region_lower } ** ... ** BICX.W #1, &esi1 ** BICX.W #2, &esi2 ** BIC.W #4, &lsi1 ** BIC.W #8, &si1 ** ... */ /* ** bic_cg_si3: { target msp430_region_not_lower } ** ... ** BICX.W #1, &esi1 ** BICX.W #2, &esi2 ** BIC.W #4, &lsi1 ** BICX.W #8, &si1 ** ... */ void bic_cg_si3 (void) { BIC_CG_INSN(si) } #define AND_INSN(MODE) \ E_VAR(MODE,1) &= E_VAR(MODE,2); \ E_VAR(MODE,3) &= L_VAR(MODE,1); \ E_VAR(MODE,4) &= VAR(MODE,1); \ L_VAR(MODE,2) &= E_VAR(MODE,5); \ VAR(MODE,2) &= E_VAR(MODE,6); \ L_VAR(MODE,3) &= L_VAR(MODE,4); \ L_VAR(MODE,5) &= VAR(MODE,3); \ VAR(MODE,4) &= VAR(MODE,5); \ VAR(MODE,6) &= L_VAR(MODE,6); /* ** andqi3: { target msp430_region_lower } ** ... ** ANDX.B &eqi2, &eqi1 ** ANDX.B &lqi1, &eqi3 ** ANDX.B &qi1, &eqi4 ** ANDX.B &eqi5, &lqi2 ** ANDX.B &eqi6, &qi2 ** AND.B &lqi4, &lqi3 ** AND.B &qi3, &lqi5 ** AND.B &qi5, &qi4 ** AND.B &lqi6, &qi6 ** ... */ /* ** andqi3: { target msp430_region_not_lower } ** ... ** ANDX.B &eqi2, &eqi1 ** ANDX.B &lqi1, &eqi3 ** ANDX.B &qi1, &eqi4 ** ANDX.B &eqi5, &lqi2 ** ANDX.B &eqi6, &qi2 ** AND.B &lqi4, &lqi3 ** ANDX.B &qi3, &lqi5 ** ANDX.B &qi5, &qi4 ** ANDX.B &lqi6, &qi6 ** ... */ void andqi3 (void) { AND_INSN(qi) } /* ** andhi3: { target msp430_region_lower } ** ... ** ANDX.W &ehi2, &ehi1 ** ANDX.W &lhi1, &ehi3 ** ANDX.W &hi1, &ehi4 ** ANDX.W &ehi5, &lhi2 ** ANDX.W &ehi6, &hi2 ** AND.W &lhi4, &lhi3 ** AND.W &hi3, &lhi5 ** AND.W &hi5, &hi4 ** AND.W &lhi6, &hi6 ** ... */ /* ** andhi3: { target msp430_region_not_lower } ** ... ** ANDX.W &ehi2, &ehi1 ** ANDX.W &lhi1, &ehi3 ** ANDX.W &hi1, &ehi4 ** ANDX.W &ehi5, &lhi2 ** ANDX.W &ehi6, &hi2 ** AND.W &lhi4, &lhi3 ** ANDX.W &hi3, &lhi5 ** ANDX.W &hi5, &hi4 ** ANDX.W &lhi6, &hi6 ** ... */ void andhi3 (void) { AND_INSN(hi) } /* ** andpsi3: ** ... ** ANDX.A &epsi2, &epsi1 ** ANDX.A &lpsi1, &epsi3 ** ANDX.A &psi1, &epsi4 ** ANDX.A &epsi5, &lpsi2 ** ANDX.A &epsi6, &psi2 ** ANDX.A &lpsi4, &lpsi3 ** ANDX.A &psi3, &lpsi5 ** ANDX.A &psi5, &psi4 ** ANDX.A &lpsi6, &psi6 ** ... */ void andpsi3 (void) { AND_INSN(psi) } /* There is no specific andsi3 pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** andsi3: { target msp430_region_lower } ** ... ** ANDX.W &esi2, &esi1 ** ANDX.W &esi2\+2, &esi1\+2 ** ANDX.W &lsi1, &esi3 ** ANDX.W &lsi1\+2, &esi3\+2 ** ANDX.W &si1, &esi4 ** ANDX.W &si1\+2, &esi4\+2 ** ANDX.W &esi5, &lsi2 ** ANDX.W &esi5\+2, &lsi2\+2 ** ANDX.W &esi6, &si2 ** ANDX.W &esi6\+2, &si2\+2 ** AND.W &lsi4, &lsi3 ** AND.W &lsi4\+2, &lsi3\+2 ** AND.W &si3, &lsi5 ** AND.W &si3\+2, &lsi5\+2 ** AND.W &si5, &si4 ** AND.W &si5\+2, &si4\+2 ** AND.W &lsi6, &si6 ** AND.W &lsi6\+2, &si6\+2 ** ... */ /* ** andsi3: { target msp430_region_not_lower } ** ... ** ANDX.W &esi2, &esi1 ** ANDX.W &esi2\+2, &esi1\+2 ** ANDX.W &lsi1, &esi3 ** ANDX.W &lsi1\+2, &esi3\+2 ** ANDX.W &si1, &esi4 ** ANDX.W &si1\+2, &esi4\+2 ** ANDX.W &esi5, &lsi2 ** ANDX.W &esi5\+2, &lsi2\+2 ** ANDX.W &esi6, &si2 ** ANDX.W &esi6\+2, &si2\+2 ** AND.W &lsi4, &lsi3 ** AND.W &lsi4\+2, &lsi3\+2 ** ANDX.W &si3, &lsi5 ** ANDX.W &si3\+2, &lsi5\+2 ** ANDX.W &si5, &si4 ** ANDX.W &si5\+2, &si4\+2 ** ANDX.W &lsi6, &si6 ** ANDX.W &lsi6\+2, &si6\+2 ** ... */ void andsi3 (void) { AND_INSN(si) } #define IOR_INSN(MODE) \ E_VAR(MODE,1) |= E_VAR(MODE,2); \ E_VAR(MODE,3) |= L_VAR(MODE,1); \ E_VAR(MODE,4) |= VAR(MODE,1); \ L_VAR(MODE,2) |= E_VAR(MODE,5); \ VAR(MODE,2) |= E_VAR(MODE,6); \ L_VAR(MODE,3) |= L_VAR(MODE,4); \ L_VAR(MODE,5) |= VAR(MODE,3); \ VAR(MODE,4) |= VAR(MODE,5); \ VAR(MODE,6) |= L_VAR(MODE,6); /* ** iorqi3: { target msp430_region_lower } ** ... ** BISX.B &eqi2, &eqi1 ** BISX.B &lqi1, &eqi3 ** BISX.B &qi1, &eqi4 ** BISX.B &eqi5, &lqi2 ** BISX.B &eqi6, &qi2 ** BIS.B &lqi4, &lqi3 ** BIS.B &qi3, &lqi5 ** BIS.B &qi5, &qi4 ** BIS.B &lqi6, &qi6 ** ... */ /* ** iorqi3: { target msp430_region_not_lower } ** ... ** BISX.B &eqi2, &eqi1 ** BISX.B &lqi1, &eqi3 ** BISX.B &qi1, &eqi4 ** BISX.B &eqi5, &lqi2 ** BISX.B &eqi6, &qi2 ** BIS.B &lqi4, &lqi3 ** BISX.B &qi3, &lqi5 ** BISX.B &qi5, &qi4 ** BISX.B &lqi6, &qi6 ** ... */ void iorqi3 (void) { IOR_INSN(qi) } /* ** iorhi3: { target msp430_region_lower } ** ... ** BISX.W &ehi2, &ehi1 ** BISX.W &lhi1, &ehi3 ** BISX.W &hi1, &ehi4 ** BISX.W &ehi5, &lhi2 ** BISX.W &ehi6, &hi2 ** BIS.W &lhi4, &lhi3 ** BIS.W &hi3, &lhi5 ** BIS.W &hi5, &hi4 ** BIS.W &lhi6, &hi6 ** ... */ /* ** iorhi3: { target msp430_region_not_lower } ** ... ** BISX.W &ehi2, &ehi1 ** BISX.W &lhi1, &ehi3 ** BISX.W &hi1, &ehi4 ** BISX.W &ehi5, &lhi2 ** BISX.W &ehi6, &hi2 ** BIS.W &lhi4, &lhi3 ** BISX.W &hi3, &lhi5 ** BISX.W &hi5, &hi4 ** BISX.W &lhi6, &hi6 ** ... */ void iorhi3 (void) { IOR_INSN(hi) } /* ** iorpsi3: ** ... ** BISX.A &epsi2, &epsi1 ** BISX.A &lpsi1, &epsi3 ** BISX.A &psi1, &epsi4 ** BISX.A &epsi5, &lpsi2 ** BISX.A &epsi6, &psi2 ** BISX.A &lpsi4, &lpsi3 ** BISX.A &psi3, &lpsi5 ** BISX.A &psi5, &psi4 ** BISX.A &lpsi6, &psi6 ** ... */ void iorpsi3 (void) { IOR_INSN(psi) } /* There is no specific iorsi3 pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** iorsi3: { target msp430_region_lower } ** ... ** BISX.W &esi2, &esi1 ** BISX.W &esi2\+2, &esi1\+2 ** BISX.W &lsi1, &esi3 ** BISX.W &lsi1\+2, &esi3\+2 ** BISX.W &si1, &esi4 ** BISX.W &si1\+2, &esi4\+2 ** BISX.W &esi5, &lsi2 ** BISX.W &esi5\+2, &lsi2\+2 ** BISX.W &esi6, &si2 ** BISX.W &esi6\+2, &si2\+2 ** BIS.W &lsi4, &lsi3 ** BIS.W &lsi4\+2, &lsi3\+2 ** BIS.W &si3, &lsi5 ** BIS.W &si3\+2, &lsi5\+2 ** BIS.W &si5, &si4 ** BIS.W &si5\+2, &si4\+2 ** BIS.W &lsi6, &si6 ** BIS.W &lsi6\+2, &si6\+2 ** ... */ /* ** iorsi3: { target msp430_region_not_lower } ** ... ** BISX.W &esi2, &esi1 ** BISX.W &esi2\+2, &esi1\+2 ** BISX.W &lsi1, &esi3 ** BISX.W &lsi1\+2, &esi3\+2 ** BISX.W &si1, &esi4 ** BISX.W &si1\+2, &esi4\+2 ** BISX.W &esi5, &lsi2 ** BISX.W &esi5\+2, &lsi2\+2 ** BISX.W &esi6, &si2 ** BISX.W &esi6\+2, &si2\+2 ** BIS.W &lsi4, &lsi3 ** BIS.W &lsi4\+2, &lsi3\+2 ** BISX.W &si3, &lsi5 ** BISX.W &si3\+2, &lsi5\+2 ** BISX.W &si5, &si4 ** BISX.W &si5\+2, &si4\+2 ** BISX.W &lsi6, &si6 ** BISX.W &lsi6\+2, &si6\+2 ** ... */ void iorsi3 (void) { IOR_INSN(si) } #define XOR_INSN(MODE) \ E_VAR(MODE,1) ^= E_VAR(MODE,2); \ E_VAR(MODE,3) ^= L_VAR(MODE,1); \ E_VAR(MODE,4) ^= VAR(MODE,1); \ L_VAR(MODE,2) ^= E_VAR(MODE,5); \ VAR(MODE,2) ^= E_VAR(MODE,6); \ L_VAR(MODE,3) ^= L_VAR(MODE,4); \ L_VAR(MODE,5) ^= VAR(MODE,3); \ VAR(MODE,4) ^= VAR(MODE,5); \ VAR(MODE,6) ^= L_VAR(MODE,6); /* ** xorqi3: { target msp430_region_lower } ** ... ** XORX.B &eqi2, &eqi1 ** XORX.B &lqi1, &eqi3 ** XORX.B &qi1, &eqi4 ** XORX.B &eqi5, &lqi2 ** XORX.B &eqi6, &qi2 ** XOR.B &lqi4, &lqi3 ** XOR.B &qi3, &lqi5 ** XOR.B &qi5, &qi4 ** XOR.B &lqi6, &qi6 ** ... */ /* ** xorqi3: { target msp430_region_not_lower } ** ... ** XORX.B &eqi2, &eqi1 ** XORX.B &lqi1, &eqi3 ** XORX.B &qi1, &eqi4 ** XORX.B &eqi5, &lqi2 ** XORX.B &eqi6, &qi2 ** XOR.B &lqi4, &lqi3 ** XORX.B &qi3, &lqi5 ** XORX.B &qi5, &qi4 ** XORX.B &lqi6, &qi6 ** ... */ void xorqi3 (void) { XOR_INSN(qi) } /* ** xorhi3: { target msp430_region_lower } ** ... ** XORX.W &ehi2, &ehi1 ** XORX.W &lhi1, &ehi3 ** XORX.W &hi1, &ehi4 ** XORX.W &ehi5, &lhi2 ** XORX.W &ehi6, &hi2 ** XOR.W &lhi4, &lhi3 ** XOR.W &hi3, &lhi5 ** XOR.W &hi5, &hi4 ** XOR.W &lhi6, &hi6 ** ... */ /* ** xorhi3: { target msp430_region_not_lower } ** ... ** XORX.W &ehi2, &ehi1 ** XORX.W &lhi1, &ehi3 ** XORX.W &hi1, &ehi4 ** XORX.W &ehi5, &lhi2 ** XORX.W &ehi6, &hi2 ** XOR.W &lhi4, &lhi3 ** XORX.W &hi3, &lhi5 ** XORX.W &hi5, &hi4 ** XORX.W &lhi6, &hi6 ** ... */ void xorhi3 (void) { XOR_INSN(hi) } /* ** xorpsi3: ** ... ** XORX.A &epsi2, &epsi1 ** XORX.A &lpsi1, &epsi3 ** XORX.A &psi1, &epsi4 ** XORX.A &epsi5, &lpsi2 ** XORX.A &epsi6, &psi2 ** XORX.A &lpsi4, &lpsi3 ** XORX.A &psi3, &lpsi5 ** XORX.A &psi5, &psi4 ** XORX.A &lpsi6, &psi6 ** ... */ void xorpsi3 (void) { XOR_INSN(psi) } /* There is no specific xorsi3 pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** xorsi3: { target msp430_region_lower } ** ... ** XORX.W &esi2, &esi1 ** XORX.W &esi2\+2, &esi1\+2 ** XORX.W &lsi1, &esi3 ** XORX.W &lsi1\+2, &esi3\+2 ** XORX.W &si1, &esi4 ** XORX.W &si1\+2, &esi4\+2 ** XORX.W &esi5, &lsi2 ** XORX.W &esi5\+2, &lsi2\+2 ** XORX.W &esi6, &si2 ** XORX.W &esi6\+2, &si2\+2 ** XOR.W &lsi4, &lsi3 ** XOR.W &lsi4\+2, &lsi3\+2 ** XOR.W &si3, &lsi5 ** XOR.W &si3\+2, &lsi5\+2 ** XOR.W &si5, &si4 ** XOR.W &si5\+2, &si4\+2 ** XOR.W &lsi6, &si6 ** XOR.W &lsi6\+2, &si6\+2 ** ... */ /* ** xorsi3: { target msp430_region_not_lower } ** ... ** XORX.W &esi2, &esi1 ** XORX.W &esi2\+2, &esi1\+2 ** XORX.W &lsi1, &esi3 ** XORX.W &lsi1\+2, &esi3\+2 ** XORX.W &si1, &esi4 ** XORX.W &si1\+2, &esi4\+2 ** XORX.W &esi5, &lsi2 ** XORX.W &esi5\+2, &lsi2\+2 ** XORX.W &esi6, &si2 ** XORX.W &esi6\+2, &si2\+2 ** XOR.W &lsi4, &lsi3 ** XOR.W &lsi4\+2, &lsi3\+2 ** XORX.W &si3, &lsi5 ** XORX.W &si3\+2, &lsi5\+2 ** XORX.W &si5, &si4 ** XORX.W &si5\+2, &si4\+2 ** XORX.W &lsi6, &si6 ** XORX.W &lsi6\+2, &si6\+2 ** ... */ void xorsi3 (void) { XOR_INSN(si) } #define DO1 \ { \ qi z; \ z += use_qi(z); \ use_qi(z); \ } #define DO2 \ { \ hi z; \ z += use_hi(z); \ use_hi(z); \ } #define DO3 \ { \ si z; \ z += use_si(z); \ use_si(z); \ } #define CBRANCH_INSN(MODE) \ if (E_VAR(MODE,1) == E_VAR(MODE,2)) \ DO1 \ else if (E_VAR(MODE,3) == L_VAR(MODE,1)) \ DO2 \ else if (E_VAR(MODE,4) == VAR(MODE,1)) \ DO1 \ else if (L_VAR(MODE,2) == E_VAR(MODE,5)) \ DO2 \ else if (VAR(MODE,2) == E_VAR(MODE,6)) \ DO1 \ else if (L_VAR(MODE,3) == L_VAR(MODE,4)) \ DO2 \ else if (L_VAR(MODE,5) == VAR(MODE,3)) \ DO2 \ else if (VAR(MODE,4) == VAR(MODE,5)) \ DO1 \ else if (VAR(MODE,6) == L_VAR(MODE,6)) \ DO2 /* ** cbranchqi4_real: { target msp430_region_lower } ** ... ** CMPX.B &eqi2, &eqi1 { JEQ .L[0-9]+ ** CMPX.B &lqi1, &eqi3 { JEQ .L[0-9]+ ** CMPX.B &qi1, &eqi4 { JEQ .L[0-9]+ ** CMPX.B &eqi5, &lqi2 { JEQ .L[0-9]+ ** CMPX.B &eqi6, &qi2 { JEQ .L[0-9]+ ** CMP.B &lqi4, &lqi3 { JEQ .L[0-9]+ ** CMP.B &qi3, &lqi5 { JEQ .L[0-9]+ ** CMP.B &qi5, &qi4 { JEQ .L[0-9]+ ** CMP.B &lqi6, &qi6 { JNE .L[0-9]+ ** ... */ /* ** cbranchqi4_real: { target msp430_region_not_lower } ** ... ** CMPX.B &eqi2, &eqi1 { JEQ .L[0-9]+ ** CMPX.B &lqi1, &eqi3 { JEQ .L[0-9]+ ** CMPX.B &qi1, &eqi4 { JEQ .L[0-9]+ ** CMPX.B &eqi5, &lqi2 { JEQ .L[0-9]+ ** CMPX.B &eqi6, &qi2 { JEQ .L[0-9]+ ** CMP.B &lqi4, &lqi3 { JEQ .L[0-9]+ ** CMPX.B &qi3, &lqi5 { JEQ .L[0-9]+ ** CMPX.B &qi5, &qi4 { JEQ .L[0-9]+ ** CMPX.B &lqi6, &qi6 { JNE .L[0-9]+ ** ... */ void cbranchqi4_real (void) { CBRANCH_INSN(qi) } /* ** cbranchhi4_real: { target msp430_region_lower } ** ... ** CMPX.W &ehi2, &ehi1 { JEQ .L[0-9]+ ** CMPX.W &lhi1, &ehi3 { JEQ .L[0-9]+ ** CMPX.W &hi1, &ehi4 { JEQ .L[0-9]+ ** CMPX.W &ehi5, &lhi2 { JEQ .L[0-9]+ ** CMPX.W &ehi6, &hi2 { JEQ .L[0-9]+ ** CMP.W &lhi4, &lhi3 { JEQ .L[0-9]+ ** CMP.W &hi3, &lhi5 { JEQ .L[0-9]+ ** CMP.W &hi5, &hi4 { JEQ .L[0-9]+ ** CMP.W &lhi6, &hi6 { JNE .L[0-9]+ ** ... */ /* ** cbranchhi4_real: { target msp430_region_not_lower } ** ... ** CMPX.W &ehi2, &ehi1 { JEQ .L[0-9]+ ** CMPX.W &lhi1, &ehi3 { JEQ .L[0-9]+ ** CMPX.W &hi1, &ehi4 { JEQ .L[0-9]+ ** CMPX.W &ehi5, &lhi2 { JEQ .L[0-9]+ ** CMPX.W &ehi6, &hi2 { JEQ .L[0-9]+ ** CMP.W &lhi4, &lhi3 { JEQ .L[0-9]+ ** CMPX.W &hi3, &lhi5 { JEQ .L[0-9]+ ** CMPX.W &hi5, &hi4 { JEQ .L[0-9]+ ** CMPX.W &lhi6, &hi6 { JNE .L[0-9]+ ** ... */ void cbranchhi4_real (void) { CBRANCH_INSN(hi) } /* There is no specific cbranchsi4_real pattern defined for msp430, but we check this is synthesized correctly anyway. */ /* ** cbranchsi4_real: { target msp430_region_lower } ** ... ** CMPX.W &esi2, &esi1 { JEQ .L[0-9]+ ** CMPX.W &lsi1, &esi3 { JEQ .L[0-9]+ ** CMPX.W &si1, &esi4 { JEQ .L[0-9]+ ** CMPX.W &esi5, &lsi2 { JEQ .L[0-9]+ ** CMPX.W &esi6, &si2 { JEQ .L[0-9]+ ** CMP.W &lsi4, &lsi3 { JEQ .L[0-9]+ ** CMP.W &si3, &lsi5 { JEQ .L[0-9]+ ** CMP.W &si5, &si4 { JEQ .L[0-9]+ ** CMP.W &lsi6, &si6 { JNE .L[0-9]+ ** CMP.W &lsi6\+2, &si6\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &esi2\+2, &esi1\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &lsi1\+2, &esi3\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &si1\+2, &esi4\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &esi5\+2, &lsi2\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &esi6\+2, &si2\+2 { JNE .L[0-9]+ ** ... ** CMP.W &lsi4\+2, &lsi3\+2 { JNE .L[0-9]+ ** ... ** CMP.W &si3\+2, &lsi5\+2 { JNE .L[0-9]+ ** ... ** CMP.W &si5\+2, &si4\+2 { JNE .L[0-9]+ ** ... */ /* ** cbranchsi4_real: { target msp430_region_not_lower } ** ... ** CMPX.W &esi2, &esi1 { JEQ .L[0-9]+ ** CMPX.W &lsi1, &esi3 { JEQ .L[0-9]+ ** CMPX.W &si1, &esi4 { JEQ .L[0-9]+ ** CMPX.W &esi5, &lsi2 { JEQ .L[0-9]+ ** CMPX.W &esi6, &si2 { JEQ .L[0-9]+ ** CMP.W &lsi4, &lsi3 { JEQ .L[0-9]+ ** CMPX.W &si3, &lsi5 { JEQ .L[0-9]+ ** CMPX.W &si5, &si4 { JEQ .L[0-9]+ ** CMPX.W &lsi6, &si6 { JNE .L[0-9]+ ** CMPX.W &lsi6\+2, &si6\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &esi2\+2, &esi1\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &lsi1\+2, &esi3\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &si1\+2, &esi4\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &esi5\+2, &lsi2\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &esi6\+2, &si2\+2 { JNE .L[0-9]+ ** ... ** CMP.W &lsi4\+2, &lsi3\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &si3\+2, &lsi5\+2 { JNE .L[0-9]+ ** ... ** CMPX.W &si5\+2, &si4\+2 { JNE .L[0-9]+ ** ... */ void cbranchsi4_real (void) { CBRANCH_INSN(si) } #define CBRANCH_REVERSE_INSN(MODE) \ if (E_VAR(MODE,1) > E_VAR(MODE,2)) \ DO1 \ else if (E_VAR(MODE,3) > L_VAR(MODE,1)) \ DO2 \ else if (E_VAR(MODE,4) > VAR(MODE,1)) \ DO1 \ else if (L_VAR(MODE,2) > E_VAR(MODE,5)) \ DO2 \ else if (VAR(MODE,2) > E_VAR(MODE,6)) \ DO1 \ else if (L_VAR(MODE,3) > L_VAR(MODE,4)) \ DO2 \ else if (L_VAR(MODE,5) > VAR(MODE,3)) \ DO2 \ else if (VAR(MODE,4) > VAR(MODE,5)) \ DO1 \ else if (VAR(MODE,6) > L_VAR(MODE,6)) \ DO2 /* ** cbranchqi4_reversed: { target msp430_region_lower } ** ... ** CMPX.B &eqi1, &eqi2 { JLO .L[0-9]+ ** CMPX.B &eqi3, &lqi1 { JLO .L[0-9]+ ** CMPX.B &eqi4, &qi1 { JLO .L[0-9]+ ** CMPX.B &lqi2, &eqi5 { JLO .L[0-9]+ ** CMPX.B &qi2, &eqi6 { JLO .L[0-9]+ ** CMP.B &lqi3, &lqi4 { JLO .L[0-9]+ ** CMP.B &lqi5, &qi3 { JLO .L[0-9]+ ** CMP.B &qi4, &qi5 { JLO .L[0-9]+ ** CMP.B &qi6, &lqi6 { JHS .L[0-9]+ ** ... */ /* ** cbranchqi4_reversed: { target msp430_region_not_lower } ** ... ** CMPX.B &eqi1, &eqi2 { JLO .L[0-9]+ ** CMPX.B &eqi3, &lqi1 { JLO .L[0-9]+ ** CMPX.B &eqi4, &qi1 { JLO .L[0-9]+ ** CMPX.B &lqi2, &eqi5 { JLO .L[0-9]+ ** CMPX.B &qi2, &eqi6 { JLO .L[0-9]+ ** CMP.B &lqi3, &lqi4 { JLO .L[0-9]+ ** CMPX.B &lqi5, &qi3 { JLO .L[0-9]+ ** CMPX.B &qi4, &qi5 { JLO .L[0-9]+ ** CMPX.B &qi6, &lqi6 { JHS .L[0-9]+ ** ... */ void cbranchqi4_reversed (void) { CBRANCH_REVERSE_INSN(qi) } /* ** cbranchhi4_reversed: { target msp430_region_lower } ** ... ** CMPX.W &ehi1, &ehi2 { JL .L[0-9]+ ** CMPX.W &ehi3, &lhi1 { JL .L[0-9]+ ** CMPX.W &ehi4, &hi1 { JL .L[0-9]+ ** CMPX.W &lhi2, &ehi5 { JL .L[0-9]+ ** CMPX.W &hi2, &ehi6 { JL .L[0-9]+ ** CMP.W &lhi3, &lhi4 { JL .L[0-9]+ ** CMP.W &lhi5, &hi3 { JL .L[0-9]+ ** CMP.W &hi4, &hi5 { JL .L[0-9]+ ** CMP.W &hi6, &lhi6 { JGE .L[0-9]+ ** ... */ /* ** cbranchhi4_reversed: { target msp430_region_not_lower } ** ... ** CMPX.W &ehi1, &ehi2 { JL .L[0-9]+ ** CMPX.W &ehi3, &lhi1 { JL .L[0-9]+ ** CMPX.W &ehi4, &hi1 { JL .L[0-9]+ ** CMPX.W &lhi2, &ehi5 { JL .L[0-9]+ ** CMPX.W &hi2, &ehi6 { JL .L[0-9]+ ** CMP.W &lhi3, &lhi4 { JL .L[0-9]+ ** CMPX.W &lhi5, &hi3 { JL .L[0-9]+ ** CMPX.W &hi4, &hi5 { JL .L[0-9]+ ** CMPX.W &hi6, &lhi6 { JGE .L[0-9]+ ** ... */ void cbranchhi4_reversed (void) { CBRANCH_REVERSE_INSN(hi) } /* There is no specific cbranchsi4_reversed pattern defined for msp430, but we check this is synthesized correctly anyway. This output assembly for this one is quite long and convoluted so we only check part of it. */ /* ** cbranchsi4_reversed: { target msp430_region_lower } ** ... ** CMPX.W &esi1\+2, &esi2\+2 { JL .L[0-9]+ ** CMPX.W &esi2\+2, &esi1\+2 { JEQ .L[0-9]+ ** CMPX.W &esi3\+2, &lsi1\+2 { JL .L[0-9]+ ** CMPX.W &lsi1\+2, &esi3\+2 { JEQ .L[0-9]+ ** CMPX.W &esi4\+2, &si1\+2 { JL .L[0-9]+ ** CMPX.W &si1\+2, &esi4\+2 { JEQ .L[0-9]+ ** CMPX.W &lsi2\+2, &esi5\+2 { JL .L[0-9]+ ** CMPX.W &esi5\+2, &lsi2\+2 { JEQ .L[0-9]+ ** CMPX.W &si2\+2, &esi6\+2 { JL .L[0-9]+ ** CMPX.W &esi6\+2, &si2\+2 { JEQ .L[0-9]+ ** CMP.W &lsi3\+2, &lsi4\+2 { JL .L[0-9]+ ** CMP.W &lsi4\+2, &lsi3\+2 { JEQ .L[0-9]+ ** CMP.W &lsi5\+2, &si3\+2 { JL .L[0-9]+ ** CMP.W &si3\+2, &lsi5\+2 { JEQ .L[0-9]+ ** CMP.W &si4\+2, &si5\+2 { JL .L[0-9]+ ** CMP.W &si5\+2, &si4\+2 { JEQ .L[0-9]+ ** CMP.W &si6\+2, &lsi6\+2 { JL .L[0-9]+ ** CMP.W &lsi6\+2, &si6\+2 { JNE .L[0-9]+ ** ... */ /* ** cbranchsi4_reversed: { target msp430_region_not_lower } ** ... ** CMPX.W &esi1\+2, &esi2\+2 { JL .L[0-9]+ ** CMPX.W &esi2\+2, &esi1\+2 { JEQ .L[0-9]+ ** CMPX.W &esi3\+2, &lsi1\+2 { JL .L[0-9]+ ** CMPX.W &lsi1\+2, &esi3\+2 { JEQ .L[0-9]+ ** CMPX.W &esi4\+2, &si1\+2 { JL .L[0-9]+ ** CMPX.W &si1\+2, &esi4\+2 { JEQ .L[0-9]+ ** CMPX.W &lsi2\+2, &esi5\+2 { JL .L[0-9]+ ** CMPX.W &esi5\+2, &lsi2\+2 { JEQ .L[0-9]+ ** CMPX.W &si2\+2, &esi6\+2 { JL .L[0-9]+ ** CMPX.W &esi6\+2, &si2\+2 { JEQ .L[0-9]+ ** CMP.W &lsi3\+2, &lsi4\+2 { JL .L[0-9]+ ** CMP.W &lsi4\+2, &lsi3\+2 { JEQ .L[0-9]+ ** CMPX.W &lsi5\+2, &si3\+2 { JL .L[0-9]+ ** CMPX.W &si3\+2, &lsi5\+2 { JEQ .L[0-9]+ ** CMPX.W &si4\+2, &si5\+2 { JL .L[0-9]+ ** CMPX.W &si5\+2, &si4\+2 { JEQ .L[0-9]+ ** CMPX.W &si6\+2, &lsi6\+2 { JL .L[0-9]+ ** CMPX.W &lsi6\+2, &si6\+2 { JNE .L[0-9]+ ** ... */ void cbranchsi4_reversed (void) { CBRANCH_REVERSE_INSN(si) } #define BITBRANCH_NE_INSN(MODE) \ if (E_VAR(MODE,1) & E_VAR(MODE,2)) \ DO1 \ else if (E_VAR(MODE,3) & L_VAR(MODE,1)) \ DO2 \ else if (E_VAR(MODE,4) & VAR(MODE,1)) \ DO1 \ else if (L_VAR(MODE,2) & E_VAR(MODE,5)) \ DO2 \ else if (VAR(MODE,2) & E_VAR(MODE,6)) \ DO1 \ else if (L_VAR(MODE,3) & L_VAR(MODE,4)) \ DO2 \ else if (L_VAR(MODE,5) & VAR(MODE,3)) \ DO2 \ else if (VAR(MODE,4) & VAR(MODE,5)) \ DO1 \ else if (VAR(MODE,6) & L_VAR(MODE,6)) \ DO2 /* ** bitbranchqi4: { target msp430_region_lower } ** ... ** BITX.B &eqi2, &eqi1 { JNE .L[0-9]+ ** BITX.B &lqi1, &eqi3 { JNE .L[0-9]+ ** BITX.B &qi1, &eqi4 { JNE .L[0-9]+ ** BITX.B &eqi5, &lqi2 { JNE .L[0-9]+ ** BITX.B &eqi6, &qi2 { JNE .L[0-9]+ ** BIT.B &lqi4, &lqi3 { JNE .L[0-9]+ ** BIT.B &qi3, &lqi5 { JNE .L[0-9]+ ** BIT.B &qi5, &qi4 { JNE .L[0-9]+ ** BIT.B &lqi6, &qi6 { JEQ .L[0-9]+ ** ... */ /* ** bitbranchqi4: { target msp430_region_not_lower } ** ... ** BITX.B &eqi2, &eqi1 { JNE .L[0-9]+ ** BITX.B &lqi1, &eqi3 { JNE .L[0-9]+ ** BITX.B &qi1, &eqi4 { JNE .L[0-9]+ ** BITX.B &eqi5, &lqi2 { JNE .L[0-9]+ ** BITX.B &eqi6, &qi2 { JNE .L[0-9]+ ** BIT.B &lqi4, &lqi3 { JNE .L[0-9]+ ** BITX.B &qi3, &lqi5 { JNE .L[0-9]+ ** BITX.B &qi5, &qi4 { JNE .L[0-9]+ ** BITX.B &lqi6, &qi6 { JEQ .L[0-9]+ ** ... */ void bitbranchqi4 (void) { BITBRANCH_NE_INSN(qi) } /* ** bitbranchhi4: { target msp430_region_lower } ** ... ** BITX.W &ehi2, &ehi1 { JNE .L[0-9]+ ** BITX.W &lhi1, &ehi3 { JNE .L[0-9]+ ** BITX.W &hi1, &ehi4 { JNE .L[0-9]+ ** BITX.W &ehi5, &lhi2 { JNE .L[0-9]+ ** BITX.W &ehi6, &hi2 { JNE .L[0-9]+ ** BIT.W &lhi4, &lhi3 { JNE .L[0-9]+ ** BIT.W &hi3, &lhi5 { JNE .L[0-9]+ ** BIT.W &hi5, &hi4 { JNE .L[0-9]+ ** BIT.W &lhi6, &hi6 { JEQ .L[0-9]+ ** ... */ /* ** bitbranchhi4: { target msp430_region_not_lower } ** ... ** BITX.W &ehi2, &ehi1 { JNE .L[0-9]+ ** BITX.W &lhi1, &ehi3 { JNE .L[0-9]+ ** BITX.W &hi1, &ehi4 { JNE .L[0-9]+ ** BITX.W &ehi5, &lhi2 { JNE .L[0-9]+ ** BITX.W &ehi6, &hi2 { JNE .L[0-9]+ ** BIT.W &lhi4, &lhi3 { JNE .L[0-9]+ ** BITX.W &hi3, &lhi5 { JNE .L[0-9]+ ** BITX.W &hi5, &hi4 { JNE .L[0-9]+ ** BITX.W &lhi6, &hi6 { JEQ .L[0-9]+ ** ... */ void bitbranchhi4 (void) { BITBRANCH_NE_INSN(hi) } /* ** bitbranchpsi4: ** ... ** BITX.A &epsi2, &epsi1 { JNE .L[0-9]+ ** BITX.A &lpsi1, &epsi3 { JNE .L[0-9]+ ** BITX.A &psi1, &epsi4 { JNE .L[0-9]+ ** BITX.A &epsi5, &lpsi2 { JNE .L[0-9]+ ** BITX.A &epsi6, &psi2 { JNE .L[0-9]+ ** BITX.A &lpsi4, &lpsi3 { JNE .L[0-9]+ ** BITX.A &psi3, &lpsi5 { JNE .L[0-9]+ ** BITX.A &psi5, &psi4 { JNE .L[0-9]+ ** BITX.A &lpsi6, &psi6 { JEQ .L[0-9]+ ** ... */ void bitbranchpsi4 (void) { BITBRANCH_NE_INSN(psi) } /* "bitbranch" using SImode operands is omitted since the resulting assembly uses many temporary registers to perform the bitwise and comparison operations. */