|
66 | 66 |
|
67 | 67 | // count trailing zero for ARMv5 and ARMv6 |
68 | 68 | // 32 - CLZ(x&-x - 1) |
69 | | -(Ctz32 <t> x) && buildcfg.GOARM<=6 => |
| 69 | +(Ctz32 <t> x) && buildcfg.GOARM.Version<=6 => |
70 | 70 | (RSBconst [32] (CLZ <t> (SUBconst <t> (AND <t> x (RSBconst <t> [0] x)) [1]))) |
71 | | -(Ctz16 <t> x) && buildcfg.GOARM<=6 => |
| 71 | +(Ctz16 <t> x) && buildcfg.GOARM.Version<=6 => |
72 | 72 | (RSBconst [32] (CLZ <t> (SUBconst <typ.UInt32> (AND <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x) (RSBconst <typ.UInt32> [0] (ORconst <typ.UInt32> [0x10000] x))) [1]))) |
73 | | -(Ctz8 <t> x) && buildcfg.GOARM<=6 => |
| 73 | +(Ctz8 <t> x) && buildcfg.GOARM.Version<=6 => |
74 | 74 | (RSBconst [32] (CLZ <t> (SUBconst <typ.UInt32> (AND <typ.UInt32> (ORconst <typ.UInt32> [0x100] x) (RSBconst <typ.UInt32> [0] (ORconst <typ.UInt32> [0x100] x))) [1]))) |
75 | 75 |
|
76 | 76 | // count trailing zero for ARMv7 |
77 | | -(Ctz32 <t> x) && buildcfg.GOARM==7 => (CLZ <t> (RBIT <t> x)) |
78 | | -(Ctz16 <t> x) && buildcfg.GOARM==7 => (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x))) |
79 | | -(Ctz8 <t> x) && buildcfg.GOARM==7 => (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x100] x))) |
| 77 | +(Ctz32 <t> x) && buildcfg.GOARM.Version==7 => (CLZ <t> (RBIT <t> x)) |
| 78 | +(Ctz16 <t> x) && buildcfg.GOARM.Version==7 => (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x10000] x))) |
| 79 | +(Ctz8 <t> x) && buildcfg.GOARM.Version==7 => (CLZ <t> (RBIT <typ.UInt32> (ORconst <typ.UInt32> [0x100] x))) |
80 | 80 |
|
81 | 81 | // bit length |
82 | 82 | (BitLen32 <t> x) => (RSBconst [32] (CLZ <t> x)) |
|
90 | 90 | // t5 = x right rotate 8 bits -- (d, a, b, c ) |
91 | 91 | // result = t4 ^ t5 -- (d, c, b, a ) |
92 | 92 | // using shifted ops this can be done in 4 instructions. |
93 | | -(Bswap32 <t> x) && buildcfg.GOARM==5 => |
| 93 | +(Bswap32 <t> x) && buildcfg.GOARM.Version==5 => |
94 | 94 | (XOR <t> |
95 | 95 | (SRLconst <t> (BICconst <t> (XOR <t> x (SRRconst <t> [16] x)) [0xff0000]) [8]) |
96 | 96 | (SRRconst <t> x [8])) |
97 | 97 |
|
98 | 98 | // byte swap for ARMv6 and above |
99 | | -(Bswap32 x) && buildcfg.GOARM>=6 => (REV x) |
| 99 | +(Bswap32 x) && buildcfg.GOARM.Version>=6 => (REV x) |
100 | 100 |
|
101 | 101 | // boolean ops -- booleans are represented with 0=false, 1=true |
102 | 102 | (AndB ...) => (AND ...) |
|
741 | 741 | (SUBconst [c] x) && !isARMImmRot(uint32(c)) && isARMImmRot(uint32(-c)) => (ADDconst [-c] x) |
742 | 742 | (ANDconst [c] x) && !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) => (BICconst [int32(^uint32(c))] x) |
743 | 743 | (BICconst [c] x) && !isARMImmRot(uint32(c)) && isARMImmRot(^uint32(c)) => (ANDconst [int32(^uint32(c))] x) |
744 | | -(ADDconst [c] x) && buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff => (SUBconst [-c] x) |
745 | | -(SUBconst [c] x) && buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff => (ADDconst [-c] x) |
746 | | -(ANDconst [c] x) && buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff => (BICconst [int32(^uint32(c))] x) |
747 | | -(BICconst [c] x) && buildcfg.GOARM==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff => (ANDconst [int32(^uint32(c))] x) |
| 744 | +(ADDconst [c] x) && buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff => (SUBconst [-c] x) |
| 745 | +(SUBconst [c] x) && buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && uint32(-c)<=0xffff => (ADDconst [-c] x) |
| 746 | +(ANDconst [c] x) && buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff => (BICconst [int32(^uint32(c))] x) |
| 747 | +(BICconst [c] x) && buildcfg.GOARM.Version==7 && !isARMImmRot(uint32(c)) && uint32(c)>0xffff && ^uint32(c)<=0xffff => (ANDconst [int32(^uint32(c))] x) |
748 | 748 | (ADDconst [c] (MOVWconst [d])) => (MOVWconst [c+d]) |
749 | 749 | (ADDconst [c] (ADDconst [d] x)) => (ADDconst [c+d] x) |
750 | 750 | (ADDconst [c] (SUBconst [d] x)) => (ADDconst [c-d] x) |
|
1139 | 1139 | // UBFX instruction is supported by ARMv6T2, ARMv7 and above versions, REV16 is supported by |
1140 | 1140 | // ARMv6 and above versions. So for ARMv6, we need to match SLLconst, SRLconst and ORshiftLL. |
1141 | 1141 | ((ADDshiftLL|ORshiftLL|XORshiftLL) <typ.UInt16> [8] (BFXU <typ.UInt16> [int32(armBFAuxInt(8, 8))] x) x) => (REV16 x) |
1142 | | -((ADDshiftLL|ORshiftLL|XORshiftLL) <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) && buildcfg.GOARM>=6 => (REV16 x) |
| 1142 | +((ADDshiftLL|ORshiftLL|XORshiftLL) <typ.UInt16> [8] (SRLconst <typ.UInt16> [24] (SLLconst [16] x)) x) && buildcfg.GOARM.Version>=6 => (REV16 x) |
1143 | 1143 |
|
1144 | 1144 | // use indexed loads and stores |
1145 | 1145 | (MOVWload [0] {sym} (ADD ptr idx) mem) && sym == nil => (MOVWloadidx ptr idx mem) |
|
1209 | 1209 | (BIC x x) => (MOVWconst [0]) |
1210 | 1210 |
|
1211 | 1211 | (ADD (MUL x y) a) => (MULA x y a) |
1212 | | -(SUB a (MUL x y)) && buildcfg.GOARM == 7 => (MULS x y a) |
1213 | | -(RSB (MUL x y) a) && buildcfg.GOARM == 7 => (MULS x y a) |
| 1212 | +(SUB a (MUL x y)) && buildcfg.GOARM.Version == 7 => (MULS x y a) |
| 1213 | +(RSB (MUL x y) a) && buildcfg.GOARM.Version == 7 => (MULS x y a) |
1214 | 1214 |
|
1215 | | -(NEGF (MULF x y)) && buildcfg.GOARM >= 6 => (NMULF x y) |
1216 | | -(NEGD (MULD x y)) && buildcfg.GOARM >= 6 => (NMULD x y) |
1217 | | -(MULF (NEGF x) y) && buildcfg.GOARM >= 6 => (NMULF x y) |
1218 | | -(MULD (NEGD x) y) && buildcfg.GOARM >= 6 => (NMULD x y) |
| 1215 | +(NEGF (MULF x y)) && buildcfg.GOARM.Version >= 6 => (NMULF x y) |
| 1216 | +(NEGD (MULD x y)) && buildcfg.GOARM.Version >= 6 => (NMULD x y) |
| 1217 | +(MULF (NEGF x) y) && buildcfg.GOARM.Version >= 6 => (NMULF x y) |
| 1218 | +(MULD (NEGD x) y) && buildcfg.GOARM.Version >= 6 => (NMULD x y) |
1219 | 1219 | (NMULF (NEGF x) y) => (MULF x y) |
1220 | 1220 | (NMULD (NEGD x) y) => (MULD x y) |
1221 | 1221 |
|
1222 | 1222 | // the result will overwrite the addend, since they are in the same register |
1223 | | -(ADDF a (MULF x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULAF a x y) |
1224 | | -(ADDF a (NMULF x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULSF a x y) |
1225 | | -(ADDD a (MULD x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULAD a x y) |
1226 | | -(ADDD a (NMULD x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULSD a x y) |
1227 | | -(SUBF a (MULF x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULSF a x y) |
1228 | | -(SUBF a (NMULF x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULAF a x y) |
1229 | | -(SUBD a (MULD x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULSD a x y) |
1230 | | -(SUBD a (NMULD x y)) && a.Uses == 1 && buildcfg.GOARM >= 6 => (MULAD a x y) |
| 1223 | +(ADDF a (MULF x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULAF a x y) |
| 1224 | +(ADDF a (NMULF x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULSF a x y) |
| 1225 | +(ADDD a (MULD x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULAD a x y) |
| 1226 | +(ADDD a (NMULD x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULSD a x y) |
| 1227 | +(SUBF a (MULF x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULSF a x y) |
| 1228 | +(SUBF a (NMULF x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULAF a x y) |
| 1229 | +(SUBD a (MULD x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULSD a x y) |
| 1230 | +(SUBD a (NMULD x y)) && a.Uses == 1 && buildcfg.GOARM.Version >= 6 => (MULAD a x y) |
1231 | 1231 |
|
1232 | 1232 | (AND x (MVN y)) => (BIC x y) |
1233 | 1233 |
|
|
1259 | 1259 | (CMPD x (MOVDconst [0])) => (CMPD0 x) |
1260 | 1260 |
|
1261 | 1261 | // bit extraction |
1262 | | -(SRAconst (SLLconst x [c]) [d]) && buildcfg.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 => (BFX [(d-c)|(32-d)<<8] x) |
1263 | | -(SRLconst (SLLconst x [c]) [d]) && buildcfg.GOARM==7 && uint64(d)>=uint64(c) && uint64(d)<=31 => (BFXU [(d-c)|(32-d)<<8] x) |
| 1262 | +(SRAconst (SLLconst x [c]) [d]) && buildcfg.GOARM.Version==7 && uint64(d)>=uint64(c) && uint64(d)<=31 => (BFX [(d-c)|(32-d)<<8] x) |
| 1263 | +(SRLconst (SLLconst x [c]) [d]) && buildcfg.GOARM.Version==7 && uint64(d)>=uint64(c) && uint64(d)<=31 => (BFXU [(d-c)|(32-d)<<8] x) |
1264 | 1264 |
|
1265 | 1265 | // comparison simplification |
1266 | 1266 | ((EQ|NE) (CMP x (RSBconst [0] y))) => ((EQ|NE) (CMN x y)) // sense of carry bit not preserved; see also #50854 |
|
0 commit comments