Optimized operand byte and lo-byte comparisons.
This commit is contained in:
parent
5a944c65af
commit
df7e5349ac
1 changed files with 14 additions and 17 deletions
|
|
@ -381,20 +381,18 @@ func (cg *comparisonGenerator) genByteGreater() ([]string, error) {
|
|||
// CMP sets C=1 if A >= operand
|
||||
if !cg.useLongJump {
|
||||
return []string{
|
||||
cg.loadOperand(cg.param1, 0),
|
||||
cg.cmpOperand(cg.param2, 0),
|
||||
fmt.Sprintf("\tbeq %s", cg.skipLabel), // equal means not greater
|
||||
fmt.Sprintf("\tbcc %s", cg.skipLabel), // carry clear means less
|
||||
cg.loadOperand(cg.param2, 0),
|
||||
cg.cmpOperand(cg.param1, 0),
|
||||
fmt.Sprintf("\tbcs %s", cg.skipLabel), // skip if p2 >= p1 (i.e., p1 <= p2)
|
||||
}, nil
|
||||
}
|
||||
|
||||
success := cg.tempLabel()
|
||||
fail := cg.tempLabel()
|
||||
return []string{
|
||||
cg.loadOperand(cg.param1, 0),
|
||||
cg.cmpOperand(cg.param2, 0),
|
||||
fmt.Sprintf("\tbeq %s", fail),
|
||||
fmt.Sprintf("\tbcs %s", success),
|
||||
cg.loadOperand(cg.param2, 0),
|
||||
cg.cmpOperand(cg.param1, 0),
|
||||
fmt.Sprintf("\tbcc %s", success), // if p2 < p1, success (p1 > p2)
|
||||
fail,
|
||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||
success,
|
||||
|
|
@ -411,11 +409,10 @@ func (cg *comparisonGenerator) genWordGreater() ([]string, error) {
|
|||
cg.cmpOperand(cg.param2, 1),
|
||||
fmt.Sprintf("\tbcc %s", cg.skipLabel), // p1_hi < p2_hi
|
||||
fmt.Sprintf("\tbne %s", success), // p1_hi > p2_hi
|
||||
// High bytes equal, check low
|
||||
cg.loadOperand(cg.param1, 0),
|
||||
cg.cmpOperand(cg.param2, 0),
|
||||
fmt.Sprintf("\tbeq %s", cg.skipLabel), // equal not greater
|
||||
fmt.Sprintf("\tbcc %s", cg.skipLabel), // p1_lo < p2_lo
|
||||
// High bytes equal, check low - swap operands for single branch
|
||||
cg.loadOperand(cg.param2, 0),
|
||||
cg.cmpOperand(cg.param1, 0),
|
||||
fmt.Sprintf("\tbcs %s", cg.skipLabel), // skip if p2 >= p1 (i.e., p1 <= p2)
|
||||
success,
|
||||
}, nil
|
||||
}
|
||||
|
|
@ -426,10 +423,10 @@ func (cg *comparisonGenerator) genWordGreater() ([]string, error) {
|
|||
cg.cmpOperand(cg.param2, 1),
|
||||
fmt.Sprintf("\tbcc %s", fail),
|
||||
fmt.Sprintf("\tbne %s", success),
|
||||
cg.loadOperand(cg.param1, 0),
|
||||
cg.cmpOperand(cg.param2, 0),
|
||||
fmt.Sprintf("\tbeq %s", fail),
|
||||
fmt.Sprintf("\tbcs %s", success),
|
||||
// High bytes equal, check low - swap operands for single branch
|
||||
cg.loadOperand(cg.param2, 0),
|
||||
cg.cmpOperand(cg.param1, 0),
|
||||
fmt.Sprintf("\tbcc %s", success), // if p2 < p1, success (p1 > p2)
|
||||
fail,
|
||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||
success,
|
||||
|
|
|
|||
Loading…
Reference in a new issue