Optimized operand byte and lo-byte comparisons.

This commit is contained in:
Mattias Hansson 2025-11-04 19:14:09 +01:00
parent 5a944c65af
commit df7e5349ac

View file

@ -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,