< prev index next >
src/hotspot/cpu/aarch64/aarch64-asmtest.py
Print this page
rev 61975 : [vector] Address review comments for AArch64 backend changes
1. Seperate newly added NEON instructions to a new ad file
aarch64_neon.ad
2. Add assembler tests for NEON instructions. Trailing spaces
in the python script are also removed.
*** 1,11 ****
--- 1,17 ----
+ import os
import random
+ import subprocess
+ import sys
AARCH64_AS = "<PATH-TO-AS>"
AARCH64_OBJDUMP = "<PATH-TO-OBJDUMP>"
AARCH64_OBJCOPY = "<PATH-TO-OBJCOPY>"
+ # To minimize the changes of assembler test code
+ random.seed(0)
+
class Operand(object):
def generate(self):
return self
*** 78,87 ****
--- 84,95 ----
class OperandFactory:
_modes = {'x' : GeneralRegister,
'w' : GeneralRegister,
+ 'b' : FloatRegister,
+ 'h' : FloatRegister,
's' : FloatRegister,
'd' : FloatRegister,
'z' : FloatZero}
@classmethod
*** 335,346 ****
def generate(self):
AddSubImmOp.generate(self)
self.immed = \
self.immediates32[random.randint(0, len(self.immediates32)-1)] \
! if self.isWord \
! else \
self.immediates[random.randint(0, len(self.immediates)-1)]
return self
def astr(self):
--- 343,353 ----
def generate(self):
AddSubImmOp.generate(self)
self.immed = \
self.immediates32[random.randint(0, len(self.immediates32)-1)] \
! if self.isWord else \
self.immediates[random.randint(0, len(self.immediates)-1)]
return self
def astr(self):
*** 826,836 ****
formatStr = "%s%s" + ''.join([", %s" for i in range(1, self.numRegs)])
return (formatStr
% tuple([Instruction.astr(self)] +
[(self.reg[i].astr(self.modes[i])) for i in range(self.numRegs)]))
! class LdStSIMDOp(Instruction):
def __init__(self, args):
self._name, self.regnum, self.arrangement, self.addresskind = args
def generate(self):
self.address = Address().generate(self.addresskind, 0)
--- 833,843 ----
formatStr = "%s%s" + ''.join([", %s" for i in range(1, self.numRegs)])
return (formatStr
% tuple([Instruction.astr(self)] +
[(self.reg[i].astr(self.modes[i])) for i in range(self.numRegs)]))
! class LdStNEONOp(Instruction):
def __init__(self, args):
self._name, self.regnum, self.arrangement, self.addresskind = args
def generate(self):
self.address = Address().generate(self.addresskind, 0)
*** 845,855 ****
else:
self.address.offset = self.regnum * 16
return self
def cstr(self):
! buf = super(LdStSIMDOp, self).cstr() + str(self._firstSIMDreg)
current = self._firstSIMDreg
for cnt in range(1, self.regnum):
buf = '%s, %s' % (buf, current.nextReg())
current = current.nextReg()
return '%s, __ T%s, %s);' % (buf, self.arrangement, str(self.address))
--- 852,862 ----
else:
self.address.offset = self.regnum * 16
return self
def cstr(self):
! buf = super(LdStNEONOp, self).cstr() + str(self._firstSIMDreg)
current = self._firstSIMDreg
for cnt in range(1, self.regnum):
buf = '%s, %s' % (buf, current.nextReg())
current = current.nextReg()
return '%s, __ T%s, %s);' % (buf, self.arrangement, str(self.address))
*** 863,872 ****
--- 870,930 ----
return '%s}, %s' % (buf, self.address.astr("x"))
def aname(self):
return self._name
+ class NEONReduceInstruction(Instruction):
+ def __init__(self, args):
+ self._name, self.insname, self.arrangement = args
+
+ def generate(self):
+ current = FloatRegister().generate()
+ self.dstSIMDreg = current
+ self.srcSIMDreg = current.nextReg()
+ return self
+
+ def cstr(self):
+ buf = Instruction.cstr(self) + str(self.dstSIMDreg)
+ buf = '%s, __ T%s, %s);' % (buf, self.arrangement, self.srcSIMDreg)
+ return buf
+
+ def astr(self):
+ buf = '%s\t%s' % (self.insname, self.dstSIMDreg.astr(self.arrangement[-1].lower()))
+ buf = '%s, %s.%s' % (buf, self.srcSIMDreg, self.arrangement)
+ return buf
+
+ def aname(self):
+ return self._name
+
+ class CommonNEONInstruction(Instruction):
+ def __init__(self, args):
+ self._name, self.insname, self.arrangement = args
+
+ def generate(self):
+ self._firstSIMDreg = FloatRegister().generate()
+ return self
+
+ def cstr(self):
+ buf = Instruction.cstr(self) + str(self._firstSIMDreg)
+ buf = '%s, __ T%s' % (buf, self.arrangement)
+ current = self._firstSIMDreg
+ for cnt in range(1, self.numRegs):
+ buf = '%s, %s' % (buf, current.nextReg())
+ current = current.nextReg()
+ return '%s);' % (buf)
+
+ def astr(self):
+ buf = '%s\t%s.%s' % (self.insname, self._firstSIMDreg, self.arrangement)
+ current = self._firstSIMDreg
+ for cnt in range(1, self.numRegs):
+ buf = '%s, %s.%s' % (buf, current.nextReg(), self.arrangement)
+ current = current.nextReg()
+ return buf
+
+ def aname(self):
+ return self._name
+
class LSEOp(Instruction):
def __init__(self, args):
self._name, self.asmname, self.size, self.suffix = args
def generate(self):
*** 907,916 ****
--- 965,980 ----
return self._aname
def cname(self):
return self._cname
+ class TwoRegNEONOp(CommonNEONInstruction):
+ numRegs = 2
+
+ class ThreeRegNEONOp(TwoRegNEONOp):
+ numRegs = 3
+
class SpecialCases(Instruction):
def __init__(self, data):
self._name = data[0]
self._cstr = data[1]
self._astr = data[2]
*** 938,947 ****
--- 1002,1012 ----
else:
print " %-50s //\t%s" % (op.cstr(), op.astr())
outfile.write("\t" + op.astr() + "\n")
outfile = open("aarch64ops.s", "w")
+ sys.stdout = open("aarch64ops.asm", "w")
print "// BEGIN Generated code -- do not edit"
print "// Generated by aarch64-asmtest.py"
print " Label back, forth;"
*** 1074,1084 ****
["stp", "stp", kind, "x"], ["ldp", "ldp", kind, "x"]
])
generate(LoadStorePairOp, [["stnp", "stnp", 0, "w"], ["ldnp", "ldnp", 0, "w"],
["stnp", "stnp", 0, "x"], ["ldnp", "ldnp", 0, "x"]])
! generate(LdStSIMDOp, [["ld1", 1, "8B", Address.base_only],
["ld1", 2, "16B", Address.post],
["ld1", 3, "1D", Address.post_reg],
["ld1", 4, "8H", Address.post],
["ld1r", 1, "8B", Address.base_only],
["ld1r", 1, "4S", Address.post],
--- 1139,1149 ----
["stp", "stp", kind, "x"], ["ldp", "ldp", kind, "x"]
])
generate(LoadStorePairOp, [["stnp", "stnp", 0, "w"], ["ldnp", "ldnp", 0, "w"],
["stnp", "stnp", 0, "x"], ["ldnp", "ldnp", 0, "x"]])
! generate(LdStNEONOp, [["ld1", 1, "8B", Address.base_only],
["ld1", 2, "16B", Address.post],
["ld1", 3, "1D", Address.post_reg],
["ld1", 4, "8H", Address.post],
["ld1r", 1, "8B", Address.base_only],
["ld1r", 1, "4S", Address.post],
*** 1098,1107 ****
--- 1163,1259 ----
["ld4r", 4, "8B", Address.base_only],
["ld4r", 4, "4H", Address.post],
["ld4r", 4, "2S", Address.post_reg],
])
+ generate(NEONReduceInstruction,
+ [["addv", "addv", "8B"], ["addv", "addv", "16B"],
+ ["addv", "addv", "4H"], ["addv", "addv", "8H"],
+ ["addv", "addv", "4S"],
+ ["smaxv", "smaxv", "8B"], ["smaxv", "smaxv", "16B"],
+ ["smaxv", "smaxv", "4H"], ["smaxv", "smaxv", "8H"],
+ ["smaxv", "smaxv", "4S"], ["fmaxv", "fmaxv", "4S"],
+ ["sminv", "sminv", "8B"], ["sminv", "sminv", "16B"],
+ ["sminv", "sminv", "4H"], ["sminv", "sminv", "8H"],
+ ["sminv", "sminv", "4S"], ["fminv", "fminv", "4S"],
+ ])
+
+ generate(TwoRegNEONOp,
+ [["absr", "abs", "8B"], ["absr", "abs", "16B"],
+ ["absr", "abs", "4H"], ["absr", "abs", "8H"],
+ ["absr", "abs", "2S"], ["absr", "abs", "4S"],
+ ["absr", "abs", "2D"],
+ ["fabs", "fabs", "2S"], ["fabs", "fabs", "4S"],
+ ["fabs", "fabs", "2D"],
+ ["fneg", "fneg", "2S"], ["fneg", "fneg", "4S"],
+ ["fneg", "fneg", "2D"],
+ ["fsqrt", "fsqrt", "2S"], ["fsqrt", "fsqrt", "4S"],
+ ["fsqrt", "fsqrt", "2D"],
+ ["notr", "not", "8B"], ["notr", "not", "16B"],
+ ])
+
+ generate(ThreeRegNEONOp,
+ [["andr", "and", "8B"], ["andr", "and", "16B"],
+ ["orr", "orr", "8B"], ["orr", "orr", "16B"],
+ ["eor", "eor", "8B"], ["eor", "eor", "16B"],
+ ["addv", "add", "8B"], ["addv", "add", "16B"],
+ ["addv", "add", "4H"], ["addv", "add", "8H"],
+ ["addv", "add", "2S"], ["addv", "add", "4S"],
+ ["addv", "add", "2D"],
+ ["fadd", "fadd", "2S"], ["fadd", "fadd", "4S"],
+ ["fadd", "fadd", "2D"],
+ ["subv", "sub", "8B"], ["subv", "sub", "16B"],
+ ["subv", "sub", "4H"], ["subv", "sub", "8H"],
+ ["subv", "sub", "2S"], ["subv", "sub", "4S"],
+ ["subv", "sub", "2D"],
+ ["fsub", "fsub", "2S"], ["fsub", "fsub", "4S"],
+ ["fsub", "fsub", "2D"],
+ ["mulv", "mul", "8B"], ["mulv", "mul", "16B"],
+ ["mulv", "mul", "4H"], ["mulv", "mul", "8H"],
+ ["mulv", "mul", "2S"], ["mulv", "mul", "4S"],
+ ["fmul", "fmul", "2S"], ["fmul", "fmul", "4S"],
+ ["fmul", "fmul", "2D"],
+ ["mlav", "mla", "4H"], ["mlav", "mla", "8H"],
+ ["mlav", "mla", "2S"], ["mlav", "mla", "4S"],
+ ["fmla", "fmla", "2S"], ["fmla", "fmla", "4S"],
+ ["fmla", "fmla", "2D"],
+ ["mlsv", "mls", "4H"], ["mlsv", "mls", "8H"],
+ ["mlsv", "mls", "2S"], ["mlsv", "mls", "4S"],
+ ["fmls", "fmls", "2S"], ["fmls", "fmls", "4S"],
+ ["fmls", "fmls", "2D"],
+ ["fdiv", "fdiv", "2S"], ["fdiv", "fdiv", "4S"],
+ ["fdiv", "fdiv", "2D"],
+ ["maxv", "smax", "8B"], ["maxv", "smax", "16B"],
+ ["maxv", "smax", "4H"], ["maxv", "smax", "8H"],
+ ["maxv", "smax", "2S"], ["maxv", "smax", "4S"],
+ ["fmax", "fmax", "2S"], ["fmax", "fmax", "4S"],
+ ["fmax", "fmax", "2D"],
+ ["minv", "smin", "8B"], ["minv", "smin", "16B"],
+ ["minv", "smin", "4H"], ["minv", "smin", "8H"],
+ ["minv", "smin", "2S"], ["minv", "smin", "4S"],
+ ["fmin", "fmin", "2S"], ["fmin", "fmin", "4S"],
+ ["fmin", "fmin", "2D"],
+ ["cmeq", "cmeq", "8B"], ["cmeq", "cmeq", "16B"],
+ ["cmeq", "cmeq", "4H"], ["cmeq", "cmeq", "8H"],
+ ["cmeq", "cmeq", "2S"], ["cmeq", "cmeq", "4S"],
+ ["cmeq", "cmeq", "2D"],
+ ["fcmeq", "fcmeq", "2S"], ["fcmeq", "fcmeq", "4S"],
+ ["fcmeq", "fcmeq", "2D"],
+ ["cmgt", "cmgt", "8B"], ["cmgt", "cmgt", "16B"],
+ ["cmgt", "cmgt", "4H"], ["cmgt", "cmgt", "8H"],
+ ["cmgt", "cmgt", "2S"], ["cmgt", "cmgt", "4S"],
+ ["cmgt", "cmgt", "2D"],
+ ["fcmgt", "fcmgt", "2S"], ["fcmgt", "fcmgt", "4S"],
+ ["fcmgt", "fcmgt", "2D"],
+ ["cmge", "cmge", "8B"], ["cmge", "cmge", "16B"],
+ ["cmge", "cmge", "4H"], ["cmge", "cmge", "8H"],
+ ["cmge", "cmge", "2S"], ["cmge", "cmge", "4S"],
+ ["cmge", "cmge", "2D"],
+ ["fcmge", "fcmge", "2S"], ["fcmge", "fcmge", "4S"],
+ ["fcmge", "fcmge", "2D"],
+ ])
+
generate(SpecialCases, [["ccmn", "__ ccmn(zr, zr, 3u, Assembler::LE);", "ccmn\txzr, xzr, #3, LE"],
["ccmnw", "__ ccmnw(zr, zr, 5u, Assembler::EQ);", "ccmn\twzr, wzr, #5, EQ"],
["ccmp", "__ ccmp(zr, 1, 4u, Assembler::NE);", "ccmp\txzr, 1, #4, NE"],
["ccmpw", "__ ccmpw(zr, 2, 2, Assembler::GT);", "ccmp\twzr, 2, #2, GT"],
["extr", "__ extr(zr, zr, zr, 0);", "extr\txzr, xzr, xzr, 0"],
*** 1142,1161 ****
print "\n __ bind(forth);"
outfile.write("forth:\n")
outfile.close()
- import subprocess
- import sys
-
# compile for 8.1 because of lse atomics
subprocess.check_call([AARCH64_AS, "-march=armv8.1-a", "aarch64ops.s", "-o", "aarch64ops.o"])
print
! print "/*",
! sys.stdout.flush()
! subprocess.check_call([AARCH64_OBJDUMP, "-d", "aarch64ops.o"])
print "*/"
subprocess.check_call([AARCH64_OBJCOPY, "-O", "binary", "-j", ".text", "aarch64ops.o", "aarch64ops.bin"])
infile = open("aarch64ops.bin", "r")
--- 1294,1310 ----
print "\n __ bind(forth);"
outfile.write("forth:\n")
outfile.close()
# compile for 8.1 because of lse atomics
subprocess.check_call([AARCH64_AS, "-march=armv8.1-a", "aarch64ops.s", "-o", "aarch64ops.o"])
+ output = subprocess.check_output([AARCH64_OBJDUMP, "-d", "aarch64ops.o"])
print
! print "/*"
! print output
print "*/"
subprocess.check_call([AARCH64_OBJCOPY, "-O", "binary", "-j", ".text", "aarch64ops.o", "aarch64ops.bin"])
infile = open("aarch64ops.bin", "r")
*** 1172,1177 ****
--- 1321,1338 ----
if i%16 == 0:
print
print "\n };"
print "// END Generated code -- do not edit"
+ infile.close()
+ sys.stdout.close()
+
+ # Remove trailing spaces and replace tab with 4 spaces
+ sys.stdout = sys.__stdout__
+ with open("aarch64ops.asm", "r") as infile:
+ for line in infile:
+ line = line.rstrip()
+ line = line.replace("\t", " ")
+ print line
+ for f in ["aarch64ops.s", "aarch64ops.o", "aarch64ops.bin", "aarch64ops.asm"]:
+ os.remove(f)
< prev index next >