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 // CMP sets C=1 if A >= operand
if !cg.useLongJump { if !cg.useLongJump {
return []string{ return []string{
cg.loadOperand(cg.param1, 0), cg.loadOperand(cg.param2, 0),
cg.cmpOperand(cg.param2, 0), cg.cmpOperand(cg.param1, 0),
fmt.Sprintf("\tbeq %s", cg.skipLabel), // equal means not greater fmt.Sprintf("\tbcs %s", cg.skipLabel), // skip if p2 >= p1 (i.e., p1 <= p2)
fmt.Sprintf("\tbcc %s", cg.skipLabel), // carry clear means less
}, nil }, nil
} }
success := cg.tempLabel() success := cg.tempLabel()
fail := cg.tempLabel() fail := cg.tempLabel()
return []string{ return []string{
cg.loadOperand(cg.param1, 0), cg.loadOperand(cg.param2, 0),
cg.cmpOperand(cg.param2, 0), cg.cmpOperand(cg.param1, 0),
fmt.Sprintf("\tbeq %s", fail), fmt.Sprintf("\tbcc %s", success), // if p2 < p1, success (p1 > p2)
fmt.Sprintf("\tbcs %s", success),
fail, fail,
fmt.Sprintf("\tjmp %s", cg.skipLabel), fmt.Sprintf("\tjmp %s", cg.skipLabel),
success, success,
@ -411,11 +409,10 @@ func (cg *comparisonGenerator) genWordGreater() ([]string, error) {
cg.cmpOperand(cg.param2, 1), cg.cmpOperand(cg.param2, 1),
fmt.Sprintf("\tbcc %s", cg.skipLabel), // p1_hi < p2_hi fmt.Sprintf("\tbcc %s", cg.skipLabel), // p1_hi < p2_hi
fmt.Sprintf("\tbne %s", success), // p1_hi > p2_hi fmt.Sprintf("\tbne %s", success), // p1_hi > p2_hi
// High bytes equal, check low // High bytes equal, check low - swap operands for single branch
cg.loadOperand(cg.param1, 0), cg.loadOperand(cg.param2, 0),
cg.cmpOperand(cg.param2, 0), cg.cmpOperand(cg.param1, 0),
fmt.Sprintf("\tbeq %s", cg.skipLabel), // equal not greater fmt.Sprintf("\tbcs %s", cg.skipLabel), // skip if p2 >= p1 (i.e., p1 <= p2)
fmt.Sprintf("\tbcc %s", cg.skipLabel), // p1_lo < p2_lo
success, success,
}, nil }, nil
} }
@ -426,10 +423,10 @@ func (cg *comparisonGenerator) genWordGreater() ([]string, error) {
cg.cmpOperand(cg.param2, 1), cg.cmpOperand(cg.param2, 1),
fmt.Sprintf("\tbcc %s", fail), fmt.Sprintf("\tbcc %s", fail),
fmt.Sprintf("\tbne %s", success), fmt.Sprintf("\tbne %s", success),
cg.loadOperand(cg.param1, 0), // High bytes equal, check low - swap operands for single branch
cg.cmpOperand(cg.param2, 0), cg.loadOperand(cg.param2, 0),
fmt.Sprintf("\tbeq %s", fail), cg.cmpOperand(cg.param1, 0),
fmt.Sprintf("\tbcs %s", success), fmt.Sprintf("\tbcc %s", success), // if p2 < p1, success (p1 > p2)
fail, fail,
fmt.Sprintf("\tjmp %s", cg.skipLabel), fmt.Sprintf("\tjmp %s", cg.skipLabel),
success, success,