pos: []string{"LSL\t\\$17"},
neg: []string{"CMP"},
},
+ {
+ fn: `
+ func $(a int32, ptr *int) {
+ if a >= 0 {
+ *ptr = 0
+ }
+ }
+ `,
+ pos: []string{"TBNZ"},
+ },
+ {
+ fn: `
+ func $(a int64, ptr *int) {
+ if a >= 0 {
+ *ptr = 0
+ }
+ }
+ `,
+ pos: []string{"TBNZ"},
+ },
+ {
+ fn: `
+ func $(a int32, ptr *int) {
+ if a < 0 {
+ *ptr = 0
+ }
+ }
+ `,
+ pos: []string{"TBZ"},
+ },
+ {
+ fn: `
+ func $(a int64, ptr *int) {
+ if a < 0 {
+ *ptr = 0
+ }
+ }
+ `,
+ pos: []string{"TBZ"},
+ },
}
var linuxMIPSTests = []*asmTest{
(ZW (ANDconst [c] x) yes no) && oneBit(int64(uint32(c))) -> (TBZ {ntz(int64(uint32(c)))} x yes no)
(NZW (ANDconst [c] x) yes no) && oneBit(int64(uint32(c))) -> (TBNZ {ntz(int64(uint32(c)))} x yes no)
+// Test sign-bit for signed comparisons against zero
+(GE (CMPWconst [0] x) yes no) -> (TBZ {int64(31)} x yes no)
+(GE (CMPconst [0] x) yes no) -> (TBZ {int64(63)} x yes no)
+(LT (CMPWconst [0] x) yes no) -> (TBNZ {int64(31)} x yes no)
+(LT (CMPconst [0] x) yes no) -> (TBNZ {int64(63)} x yes no)
+
// fold offset into address
(ADDconst [off1] (MOVDaddr [off2] {sym} ptr)) -> (MOVDaddr [off1+off2] {sym} ptr)
return true
}
case BlockARM64GE:
+ // match: (GE (CMPWconst [0] x) yes no)
+ // cond:
+ // result: (TBZ {int64(31)} x yes no)
+ for {
+ v := b.Control
+ if v.Op != OpARM64CMPWconst {
+ break
+ }
+ if v.AuxInt != 0 {
+ break
+ }
+ x := v.Args[0]
+ b.Kind = BlockARM64TBZ
+ b.SetControl(x)
+ b.Aux = int64(31)
+ return true
+ }
+ // match: (GE (CMPconst [0] x) yes no)
+ // cond:
+ // result: (TBZ {int64(63)} x yes no)
+ for {
+ v := b.Control
+ if v.Op != OpARM64CMPconst {
+ break
+ }
+ if v.AuxInt != 0 {
+ break
+ }
+ x := v.Args[0]
+ b.Kind = BlockARM64TBZ
+ b.SetControl(x)
+ b.Aux = int64(63)
+ return true
+ }
// match: (GE (FlagEQ) yes no)
// cond:
// result: (First nil yes no)
return true
}
case BlockARM64LT:
+ // match: (LT (CMPWconst [0] x) yes no)
+ // cond:
+ // result: (TBNZ {int64(31)} x yes no)
+ for {
+ v := b.Control
+ if v.Op != OpARM64CMPWconst {
+ break
+ }
+ if v.AuxInt != 0 {
+ break
+ }
+ x := v.Args[0]
+ b.Kind = BlockARM64TBNZ
+ b.SetControl(x)
+ b.Aux = int64(31)
+ return true
+ }
+ // match: (LT (CMPconst [0] x) yes no)
+ // cond:
+ // result: (TBNZ {int64(63)} x yes no)
+ for {
+ v := b.Control
+ if v.Op != OpARM64CMPconst {
+ break
+ }
+ if v.AuxInt != 0 {
+ break
+ }
+ x := v.Args[0]
+ b.Kind = BlockARM64TBNZ
+ b.SetControl(x)
+ b.Aux = int64(63)
+ return true
+ }
// match: (LT (FlagEQ) yes no)
// cond:
// result: (First nil no yes)