|
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