(op int, e1, e2 exprDesc, line int)
| 927 | } |
| 928 | |
| 929 | func (f *function) Postfix(op int, e1, e2 exprDesc, line int) exprDesc { |
| 930 | switch op { |
| 931 | case oprAnd: |
| 932 | f.assert(e1.t == noJump) |
| 933 | e2 = f.DischargeVariables(e2) |
| 934 | e2.f = f.Concatenate(e2.f, e1.f) |
| 935 | return e2 |
| 936 | case oprOr: |
| 937 | f.assert(e1.f == noJump) |
| 938 | e2 = f.DischargeVariables(e2) |
| 939 | e2.t = f.Concatenate(e2.t, e1.t) |
| 940 | return e2 |
| 941 | case oprConcat: |
| 942 | if e2 = f.ExpressionToValue(e2); e2.kind == kindRelocatable && f.Instruction(e2).opCode() == opConcat { |
| 943 | f.assert(e1.info == f.Instruction(e2).b()-1) |
| 944 | f.freeExpression(e1) |
| 945 | f.Instruction(e2).setB(e1.info) |
| 946 | return makeExpression(kindRelocatable, e2.info) |
| 947 | } |
| 948 | return f.encodeArithmetic(opConcat, e1, f.ExpressionToNextRegister(e2), line) |
| 949 | case oprAdd, oprSub, oprMul, oprDiv, oprMod, oprPow: |
| 950 | return f.encodeArithmetic(opCode(op-oprAdd)+opAdd, e1, e2, line) |
| 951 | case oprEq, oprLT, oprLE: |
| 952 | return f.encodeComparison(opCode(op-oprEq)+opEqual, 1, e1, e2) |
| 953 | case oprNE, oprGT, oprGE: |
| 954 | return f.encodeComparison(opCode(op-oprNE)+opEqual, 0, e1, e2) |
| 955 | } |
| 956 | panic("unreachable") |
| 957 | } |
| 958 | |
| 959 | func (f *function) FixLine(line int) { f.f.lineInfo[len(f.f.code)-1] = int32(line) } |
| 960 |
no test coverage detected