< prev index next >
src/cpu/aarch64/vm/assembler_aarch64.hpp
Print this page
rev 8896 : 8134869: AARCH64: GHASH intrinsic is not optimal
Summary: Rewrite intrinsic to make better use of SIMD instructions
Reviewed-by: duke
*** 1208,1218 ****
rf((Register)Rt, 0); \
}
INSN(ldrs, 0b00, 1);
INSN(ldrd, 0b01, 1);
! INSN(ldrq, 0x10, 1);
#undef INSN
#define INSN(NAME, opc, V) \
void NAME(address dest, prfop op = PLDL1KEEP) { \
--- 1208,1218 ----
rf((Register)Rt, 0); \
}
INSN(ldrs, 0b00, 1);
INSN(ldrd, 0b01, 1);
! INSN(ldrq, 0b10, 1);
#undef INSN
#define INSN(NAME, opc, V) \
void NAME(address dest, prfop op = PLDL1KEEP) { \
*** 2297,2306 ****
--- 2297,2307 ----
INSN(tbl, 0);
INSN(tbx, 1);
#undef INSN
+ // AdvSIMD two-reg misc
#define INSN(NAME, U, opcode) \
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) { \
starti; \
assert((ASSERTION), MSG); \
f(0, 31), f((int)T & 1, 30), f(U, 29), f(0b01110, 28, 24); \
*** 2314,2327 ****
--- 2315,2337 ----
INSN(rev64, 0, 0b00000);
#undef ASSERTION
#define ASSERTION (T == T8B || T == T16B || T == T4H || T == T8H)
INSN(rev32, 1, 0b00000);
+ private:
+ INSN(_rbit, 1, 0b00101);
+ public:
+
#undef ASSERTION
#define ASSERTION (T == T8B || T == T16B)
INSN(rev16, 0, 0b00001);
+ // RBIT only allows T8B and T16B but encodes them oddly. Argh...
+ void rbit(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
+ assert((ASSERTION), MSG);
+ _rbit(Vd, SIMD_Arrangement(T & 1 | 0b010), Vn);
+ }
#undef ASSERTION
#undef MSG
#undef INSN
< prev index next >