diff options
Diffstat (limited to 'src/cmd/internal/obj/arm64/asm7.go')
| -rw-r--r-- | src/cmd/internal/obj/arm64/asm7.go | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index aa1c76368a..972980defe 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -1864,7 +1864,7 @@ func rclass(r int16) int { return C_RSP case r >= REG_ARNG && r < REG_ELEM: return C_ARNG - case r >= REG_ELEM && r < REG_ELEM_END: + case r >= REG_ELEM && r < REG_ZARNG: return C_ELEM case r >= REG_UXTB && r < REG_SPECIAL, r >= REG_LSL && r < REG_ARNG: @@ -8419,19 +8419,54 @@ func EncodeRegisterExtension(a *obj.Addr, ext string, reg, num int16, isAmount, var arng int switch ext { case "B": + if isIndex { + a.Reg = REG_ZARNGELEM + (reg & 31) + int16((ARNG_B&15)<<5) + a.Index = num + return nil + } arng = ARNG_B case "H": + if isIndex { + a.Reg = REG_ZARNGELEM + (reg & 31) + int16((ARNG_H&15)<<5) + a.Index = num + return nil + } arng = ARNG_H case "S": + if isIndex { + a.Reg = REG_ZARNGELEM + (reg & 31) + int16((ARNG_S&15)<<5) + a.Index = num + return nil + } arng = ARNG_S case "D": + if isIndex { + a.Reg = REG_ZARNGELEM + (reg & 31) + int16((ARNG_D&15)<<5) + a.Index = num + return nil + } arng = ARNG_D case "Q": + if isIndex { + a.Reg = REG_ZARNGELEM + (reg & 31) + int16((ARNG_Q&15)<<5) + a.Index = num + return nil + } arng = ARNG_Q default: + if isIndex && ext == "" { + a.Reg = REG_PZELEM + (reg & 31) + a.Index = num + return nil + } return errors.New("invalid Z register arrangement: " + ext) } - a.Reg = REG_ZARNG + (reg & 31) + int16((arng&15)<<5) + if isIndex { + a.Reg = REG_ZARNGELEM + (reg & 31) + int16((arng&15)<<5) + a.Index = num + } else { + a.Reg = REG_ZARNG + (reg & 31) + int16((arng&15)<<5) + } } else if REG_P0 <= reg && reg <= REG_PN15 { var arng int switch ext { @@ -8450,6 +8485,11 @@ func EncodeRegisterExtension(a *obj.Addr, ext string, reg, num int16, isAmount, case "M": arng = PRED_M default: + if isIndex && ext == "" { + a.Reg = REG_PZELEM + (reg & 31) + (1 << 5) + a.Index = num + return nil + } return errors.New("invalid P register arrangement: " + ext) } a.Reg = REG_PARNGZM + (reg & 31) + int16((arng&15)<<5) |
