From: bill_ofarrell Date: Fri, 26 Oct 2018 21:33:51 +0000 (-0400) Subject: cmd/asm: add s390x VMSLG instruction variants X-Git-Tag: go1.12beta1~606 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3f3142ad99155424007b8e8182265b5b716b44ee;p=gostls13.git cmd/asm: add s390x VMSLG instruction variants VMSLG has three variants on z14 and later machines. These variants are used in "limbified" squaring: VMSLEG: Even Shift Indication -- the even-indexed intermediate result is doubled VMSLOG: Odd Shift Indication -- the odd-indexed intermediate result is doubled VMSLEOG: Even and Odd Shift Indication -- both intermediate results are doubled Limbified squaring is very useful for high performance cryptographic algorithms, such as elliptic curve. This change allows these instructions to be used in Go assembly. Change-Id: Iaad577b07320205539f99b3cb37a2a984882721b Reviewed-on: https://go-review.googlesource.com/c/145180 Reviewed-by: Michael Munday --- diff --git a/src/cmd/asm/internal/asm/testdata/s390x.s b/src/cmd/asm/internal/asm/testdata/s390x.s index ad70d2af44..0e50303d70 100644 --- a/src/cmd/asm/internal/asm/testdata/s390x.s +++ b/src/cmd/asm/internal/asm/testdata/s390x.s @@ -369,6 +369,9 @@ TEXT main·foo(SB),DUPOK|NOSPLIT,$16-0 // TEXT main.foo(SB), DUPOK|NOSPLIT, $16- VSTEH $7, V31, (R2) // e7f020007809 VSTEB $15, V29, 4094(R12) // e7d0cffef808 VMSLG V21, V22, V23, V24 // e78563007fb8 + VMSLEG V21, V22, V23, V24 // e78563807fb8 + VMSLOG V21, V22, V23, V24 // e78563407fb8 + VMSLEOG V21, V22, V23, V24 // e78563c07fb8 RET RET foo(SB) diff --git a/src/cmd/internal/obj/s390x/a.out.go b/src/cmd/internal/obj/s390x/a.out.go index 9ee02a2d0d..af321f6131 100644 --- a/src/cmd/internal/obj/s390x/a.out.go +++ b/src/cmd/internal/obj/s390x/a.out.go @@ -945,6 +945,9 @@ const ( AVUPLHW AVUPLF AVMSLG + AVMSLEG + AVMSLOG + AVMSLEOG // binary ABYTE diff --git a/src/cmd/internal/obj/s390x/anames.go b/src/cmd/internal/obj/s390x/anames.go index 2d6ea5abb4..9cea9f962d 100644 --- a/src/cmd/internal/obj/s390x/anames.go +++ b/src/cmd/internal/obj/s390x/anames.go @@ -678,6 +678,9 @@ var Anames = []string{ "VUPLHW", "VUPLF", "VMSLG", + "VMSLEG", + "VMSLOG", + "VMSLEOG", "BYTE", "WORD", "DWORD", diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 359610c41d..4e43d27790 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -1379,6 +1379,9 @@ func buildop(ctxt *obj.Link) { opset(AVSBCBIQ, r) opset(AVSBIQ, r) opset(AVMSLG, r) + opset(AVMSLEG, r) + opset(AVMSLOG, r) + opset(AVMSLEOG, r) case AVSEL: opset(AVFMADB, r) opset(AWFMADB, r) diff --git a/src/cmd/internal/obj/s390x/vector.go b/src/cmd/internal/obj/s390x/vector.go index 3f1d900367..62adcf6d4a 100644 --- a/src/cmd/internal/obj/s390x/vector.go +++ b/src/cmd/internal/obj/s390x/vector.go @@ -45,7 +45,7 @@ func vop(as obj.As) (opcode, es, cs uint32) { return op_VAC, 0, 0 case AVACQ: return op_VAC, 4, 0 - case AVMSLG: + case AVMSLG, AVMSLEG, AVMSLOG, AVMSLEOG: return op_VMSL, 3, 0 case AVACCC: return op_VACCC, 0, 0 @@ -1058,6 +1058,12 @@ func singleElementMask(as obj.As) uint32 { AWFTCIDB, AWFIDB: return 8 + case AVMSLEG: + return 8 + case AVMSLOG: + return 4 + case AVMSLEOG: + return 12 } return 0 }