fix(amd64): correct guard displacements, frameless FP offsets and immediate ranges
Assisted-by: GLM 5.3
This commit is contained in:
+8
-2
@@ -117,9 +117,9 @@ func (e *enc) encode(mnem string, ops []Operand) error {
|
||||
case "IMUL", "IMUL3":
|
||||
return e.encodeImul(ops, size)
|
||||
case "PUSH":
|
||||
return e.encodePushPop(ops, true)
|
||||
return e.encodePushPop(ops, size, true)
|
||||
case "POP":
|
||||
return e.encodePushPop(ops, false)
|
||||
return e.encodePushPop(ops, size, false)
|
||||
case "BSF", "BSR", "LZCNT", "TZCNT", "POPCNT":
|
||||
return e.encodeCount(base, ops, size)
|
||||
case "BSWAP":
|
||||
@@ -345,6 +345,12 @@ func setMem(i *instr, regField int, m Mem) error {
|
||||
// a memory operand. It is shared by the REX (scalar) and VEX (vector) paths.
|
||||
func memComponents(regField int, m Mem) (modrm, sib int, disp []byte, xBit, bBit int, err error) {
|
||||
sib = -1
|
||||
// A displacement wider than int32 fits no encoding form; truncating it
|
||||
// would address a different location, and go tool asm reports "offset
|
||||
// too large" for the same operand.
|
||||
if m.Disp < -(1<<31) || m.Disp > (1<<31)-1 {
|
||||
return 0, -1, nil, 0, 0, fmt.Errorf("displacement %d does not fit in 32 bits", m.Disp)
|
||||
}
|
||||
// RIP-relative: neither base nor index.
|
||||
if !m.HasBase && !m.HasIndex {
|
||||
return regField<<3 | 0x05, -1, le32(m.Disp), 0, 0, nil // mod=00, rm=101
|
||||
|
||||
Reference in New Issue
Block a user