diff options
Diffstat (limited to 'src/cmd/internal/obj')
-rw-r--r-- | src/cmd/internal/obj/ppc64/a.out.go | 6 | ||||
-rw-r--r-- | src/cmd/internal/obj/ppc64/anames.go | 2 | ||||
-rw-r--r-- | src/cmd/internal/obj/ppc64/asm9.go | 18 |
3 files changed, 22 insertions, 4 deletions
diff --git a/src/cmd/internal/obj/ppc64/a.out.go b/src/cmd/internal/obj/ppc64/a.out.go index 460243f8c6..eb0baaf6df 100644 --- a/src/cmd/internal/obj/ppc64/a.out.go +++ b/src/cmd/internal/obj/ppc64/a.out.go @@ -219,8 +219,8 @@ const ( C_LAUTO C_SEXT C_LEXT - C_ZOREG - C_SOREG + C_ZOREG // conjecture: either (1) register + zeroed offset, or (2) "R0" implies zero or C_REG + C_SOREG // register + signed offset C_LOREG C_FPSCR C_MSR @@ -324,6 +324,8 @@ const ( AFMOVDU AFMOVS AFMOVSU + AFMOVSX + AFMOVSZ AFMSUB AFMSUBCC AFMSUBS diff --git a/src/cmd/internal/obj/ppc64/anames.go b/src/cmd/internal/obj/ppc64/anames.go index eb42c9a953..a2e5cf46d8 100644 --- a/src/cmd/internal/obj/ppc64/anames.go +++ b/src/cmd/internal/obj/ppc64/anames.go @@ -91,6 +91,8 @@ var Anames = []string{ "FMOVDU", "FMOVS", "FMOVSU", + "FMOVSX", + "FMOVSZ", "FMSUB", "FMSUBCC", "FMSUBS", diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 5366809d2f..52cae12333 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -53,7 +53,7 @@ type Optab struct { a2 uint8 a3 uint8 a4 uint8 - type_ int8 + type_ int8 // cases in asmout below. E.g., 44 = st r,(ra+rb); 45 = ld (ra+rb), r size int8 param int16 } @@ -310,6 +310,12 @@ var optab = []Optab{ {AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP}, {AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO}, {AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0}, + {AFMOVSX, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0}, + {AFMOVSX, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0}, + {AFMOVSX, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0}, + {AFMOVSX, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0}, + {AFMOVSZ, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0}, + {AFMOVSZ, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0}, {ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0}, {AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 4, 0}, {ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31, 8, 0}, @@ -920,7 +926,7 @@ func buildop(ctxt *obj.Link) { switch r { default: ctxt.Diag("unknown op in build: %v", obj.Aconv(r)) - log.Fatalf("bad code") + log.Fatalf("instruction missing from switch in asm9.go:buildop: %v", obj.Aconv(r)) case ADCBF: /* unary indexed: op (b+a); op (b) */ opset(ADCBI, r0) @@ -1265,6 +1271,8 @@ func buildop(ctxt *obj.Link) { case AADD, AANDCC, /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra; andis. $uimm,Rs,Ra */ + AFMOVSX, + AFMOVSZ, ALSW, AMOVW, /* load/store/move word with sign extension; special 32-bit move; move 32-bit literals */ @@ -3238,6 +3246,10 @@ func oploadx(ctxt *obj.Link, a obj.As) uint32 { return OPVCC(31, 535, 0, 0) /* lfsx */ case AFMOVSU: return OPVCC(31, 567, 0, 0) /* lfsux */ + case AFMOVSX: + return OPVCC(31, 855, 0, 0) /* lfiwax - power6, isa 2.05 */ + case AFMOVSZ: + return OPVCC(31, 887, 0, 0) /* lfiwzx - power7, isa 2.06 */ case AMOVH: return OPVCC(31, 343, 0, 0) /* lhax */ case AMOVHU: @@ -3332,6 +3344,8 @@ func opstorex(ctxt *obj.Link, a obj.As) uint32 { return OPVCC(31, 663, 0, 0) /* stfsx */ case AFMOVSU: return OPVCC(31, 695, 0, 0) /* stfsux */ + case AFMOVSX: + return OPVCC(31, 983, 0, 0) /* stfiwx */ case AMOVHZ, AMOVH: return OPVCC(31, 407, 0, 0) /* sthx */ |