Fix for longjumps.
This commit is contained in:
parent
bea0640f0b
commit
cbecb769a0
1 changed files with 20 additions and 8 deletions
|
|
@ -393,11 +393,13 @@ func (cg *comparisonGenerator) genByteGreater() ([]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
success := cg.tempLabel()
|
success := cg.tempLabel()
|
||||||
|
fail := cg.tempLabel()
|
||||||
return []string{
|
return []string{
|
||||||
cg.loadOperand(cg.param1, 0),
|
cg.loadOperand(cg.param1, 0),
|
||||||
cg.cmpOperand(cg.param2, 0),
|
cg.cmpOperand(cg.param2, 0),
|
||||||
fmt.Sprintf("\tbeq %s", cg.skipLabel),
|
fmt.Sprintf("\tbeq %s", fail),
|
||||||
fmt.Sprintf("\tbcs %s", success),
|
fmt.Sprintf("\tbcs %s", success),
|
||||||
|
fail,
|
||||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||||
success,
|
success,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
@ -422,15 +424,17 @@ func (cg *comparisonGenerator) genWordGreater() ([]string, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fail := cg.tempLabel()
|
||||||
return []string{
|
return []string{
|
||||||
cg.loadOperand(cg.param1, 1),
|
cg.loadOperand(cg.param1, 1),
|
||||||
cg.cmpOperand(cg.param2, 1),
|
cg.cmpOperand(cg.param2, 1),
|
||||||
fmt.Sprintf("\tbcc %s", cg.skipLabel),
|
fmt.Sprintf("\tbcc %s", fail),
|
||||||
fmt.Sprintf("\tbne %s", success),
|
fmt.Sprintf("\tbne %s", success),
|
||||||
cg.loadOperand(cg.param1, 0),
|
cg.loadOperand(cg.param1, 0),
|
||||||
cg.cmpOperand(cg.param2, 0),
|
cg.cmpOperand(cg.param2, 0),
|
||||||
fmt.Sprintf("\tbeq %s", cg.skipLabel),
|
fmt.Sprintf("\tbeq %s", fail),
|
||||||
fmt.Sprintf("\tbcs %s", success),
|
fmt.Sprintf("\tbcs %s", success),
|
||||||
|
fail,
|
||||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||||
success,
|
success,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
@ -456,14 +460,16 @@ func (cg *comparisonGenerator) genMixedGreater() ([]string, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fail := cg.tempLabel()
|
||||||
return []string{
|
return []string{
|
||||||
cg.loadOperand(wordOp, 1),
|
cg.loadOperand(wordOp, 1),
|
||||||
"\tcmp #0",
|
"\tcmp #0",
|
||||||
fmt.Sprintf("\tbne %s", cg.skipLabel),
|
fmt.Sprintf("\tbne %s", fail),
|
||||||
cg.loadOperand(byteOp, 0),
|
cg.loadOperand(byteOp, 0),
|
||||||
cg.cmpOperand(wordOp, 0),
|
cg.cmpOperand(wordOp, 0),
|
||||||
fmt.Sprintf("\tbeq %s", cg.skipLabel),
|
fmt.Sprintf("\tbeq %s", fail),
|
||||||
fmt.Sprintf("\tbcs %s", success),
|
fmt.Sprintf("\tbcs %s", success),
|
||||||
|
fail,
|
||||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||||
success,
|
success,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
@ -484,14 +490,16 @@ func (cg *comparisonGenerator) genMixedGreater() ([]string, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fail := cg.tempLabel()
|
||||||
return []string{
|
return []string{
|
||||||
cg.loadOperand(wordOp, 1),
|
cg.loadOperand(wordOp, 1),
|
||||||
"\tcmp #0",
|
"\tcmp #0",
|
||||||
fmt.Sprintf("\tbne %s", success),
|
fmt.Sprintf("\tbne %s", success),
|
||||||
cg.loadOperand(wordOp, 0),
|
cg.loadOperand(wordOp, 0),
|
||||||
cg.cmpOperand(byteOp, 0),
|
cg.cmpOperand(byteOp, 0),
|
||||||
fmt.Sprintf("\tbeq %s", cg.skipLabel),
|
fmt.Sprintf("\tbeq %s", fail),
|
||||||
fmt.Sprintf("\tbcs %s", success),
|
fmt.Sprintf("\tbcs %s", success),
|
||||||
|
fail,
|
||||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||||
success,
|
success,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
@ -554,14 +562,16 @@ func (cg *comparisonGenerator) genWordGreaterEqual() ([]string, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fail := cg.tempLabel()
|
||||||
return []string{
|
return []string{
|
||||||
cg.loadOperand(cg.param1, 1),
|
cg.loadOperand(cg.param1, 1),
|
||||||
cg.cmpOperand(cg.param2, 1),
|
cg.cmpOperand(cg.param2, 1),
|
||||||
fmt.Sprintf("\tbcc %s", cg.skipLabel),
|
fmt.Sprintf("\tbcc %s", fail),
|
||||||
fmt.Sprintf("\tbne %s", success),
|
fmt.Sprintf("\tbne %s", success),
|
||||||
cg.loadOperand(cg.param1, 0),
|
cg.loadOperand(cg.param1, 0),
|
||||||
cg.cmpOperand(cg.param2, 0),
|
cg.cmpOperand(cg.param2, 0),
|
||||||
fmt.Sprintf("\tbcs %s", success),
|
fmt.Sprintf("\tbcs %s", success),
|
||||||
|
fail,
|
||||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||||
success,
|
success,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
@ -584,13 +594,15 @@ func (cg *comparisonGenerator) genMixedGreaterEqual() ([]string, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fail := cg.tempLabel()
|
||||||
return []string{
|
return []string{
|
||||||
cg.loadOperand(wordOp, 1),
|
cg.loadOperand(wordOp, 1),
|
||||||
"\tcmp #0",
|
"\tcmp #0",
|
||||||
fmt.Sprintf("\tbne %s", cg.skipLabel),
|
fmt.Sprintf("\tbne %s", fail),
|
||||||
cg.loadOperand(byteOp, 0),
|
cg.loadOperand(byteOp, 0),
|
||||||
cg.cmpOperand(wordOp, 0),
|
cg.cmpOperand(wordOp, 0),
|
||||||
fmt.Sprintf("\tbcs %s", success),
|
fmt.Sprintf("\tbcs %s", success),
|
||||||
|
fail,
|
||||||
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
fmt.Sprintf("\tjmp %s", cg.skipLabel),
|
||||||
success,
|
success,
|
||||||
}, nil
|
}, nil
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue