vx-insn.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. /*
  2. * Support for Vector Instructions
  3. *
  4. * Assembler macros to generate .byte/.word code for particular
  5. * vector instructions that are supported by recent binutils (>= 2.26) only.
  6. *
  7. * Copyright IBM Corp. 2015
  8. * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
  9. */
  10. #ifndef __ASM_S390_VX_INSN_H
  11. #define __ASM_S390_VX_INSN_H
  12. #ifdef __ASSEMBLY__
  13. /* Macros to generate vector instruction byte code */
  14. /* GR_NUM - Retrieve general-purpose register number
  15. *
  16. * @opd: Operand to store register number
  17. * @r64: String designation register in the format "%rN"
  18. */
  19. .macro GR_NUM opd gr
  20. \opd = 255
  21. .ifc \gr,%r0
  22. \opd = 0
  23. .endif
  24. .ifc \gr,%r1
  25. \opd = 1
  26. .endif
  27. .ifc \gr,%r2
  28. \opd = 2
  29. .endif
  30. .ifc \gr,%r3
  31. \opd = 3
  32. .endif
  33. .ifc \gr,%r4
  34. \opd = 4
  35. .endif
  36. .ifc \gr,%r5
  37. \opd = 5
  38. .endif
  39. .ifc \gr,%r6
  40. \opd = 6
  41. .endif
  42. .ifc \gr,%r7
  43. \opd = 7
  44. .endif
  45. .ifc \gr,%r8
  46. \opd = 8
  47. .endif
  48. .ifc \gr,%r9
  49. \opd = 9
  50. .endif
  51. .ifc \gr,%r10
  52. \opd = 10
  53. .endif
  54. .ifc \gr,%r11
  55. \opd = 11
  56. .endif
  57. .ifc \gr,%r12
  58. \opd = 12
  59. .endif
  60. .ifc \gr,%r13
  61. \opd = 13
  62. .endif
  63. .ifc \gr,%r14
  64. \opd = 14
  65. .endif
  66. .ifc \gr,%r15
  67. \opd = 15
  68. .endif
  69. .if \opd == 255
  70. \opd = \gr
  71. .endif
  72. .endm
  73. /* VX_NUM - Retrieve vector register number
  74. *
  75. * @opd: Operand to store register number
  76. * @vxr: String designation register in the format "%vN"
  77. *
  78. * The vector register number is used for as input number to the
  79. * instruction and, as well as, to compute the RXB field of the
  80. * instruction.
  81. */
  82. .macro VX_NUM opd vxr
  83. \opd = 255
  84. .ifc \vxr,%v0
  85. \opd = 0
  86. .endif
  87. .ifc \vxr,%v1
  88. \opd = 1
  89. .endif
  90. .ifc \vxr,%v2
  91. \opd = 2
  92. .endif
  93. .ifc \vxr,%v3
  94. \opd = 3
  95. .endif
  96. .ifc \vxr,%v4
  97. \opd = 4
  98. .endif
  99. .ifc \vxr,%v5
  100. \opd = 5
  101. .endif
  102. .ifc \vxr,%v6
  103. \opd = 6
  104. .endif
  105. .ifc \vxr,%v7
  106. \opd = 7
  107. .endif
  108. .ifc \vxr,%v8
  109. \opd = 8
  110. .endif
  111. .ifc \vxr,%v9
  112. \opd = 9
  113. .endif
  114. .ifc \vxr,%v10
  115. \opd = 10
  116. .endif
  117. .ifc \vxr,%v11
  118. \opd = 11
  119. .endif
  120. .ifc \vxr,%v12
  121. \opd = 12
  122. .endif
  123. .ifc \vxr,%v13
  124. \opd = 13
  125. .endif
  126. .ifc \vxr,%v14
  127. \opd = 14
  128. .endif
  129. .ifc \vxr,%v15
  130. \opd = 15
  131. .endif
  132. .ifc \vxr,%v16
  133. \opd = 16
  134. .endif
  135. .ifc \vxr,%v17
  136. \opd = 17
  137. .endif
  138. .ifc \vxr,%v18
  139. \opd = 18
  140. .endif
  141. .ifc \vxr,%v19
  142. \opd = 19
  143. .endif
  144. .ifc \vxr,%v20
  145. \opd = 20
  146. .endif
  147. .ifc \vxr,%v21
  148. \opd = 21
  149. .endif
  150. .ifc \vxr,%v22
  151. \opd = 22
  152. .endif
  153. .ifc \vxr,%v23
  154. \opd = 23
  155. .endif
  156. .ifc \vxr,%v24
  157. \opd = 24
  158. .endif
  159. .ifc \vxr,%v25
  160. \opd = 25
  161. .endif
  162. .ifc \vxr,%v26
  163. \opd = 26
  164. .endif
  165. .ifc \vxr,%v27
  166. \opd = 27
  167. .endif
  168. .ifc \vxr,%v28
  169. \opd = 28
  170. .endif
  171. .ifc \vxr,%v29
  172. \opd = 29
  173. .endif
  174. .ifc \vxr,%v30
  175. \opd = 30
  176. .endif
  177. .ifc \vxr,%v31
  178. \opd = 31
  179. .endif
  180. .if \opd == 255
  181. \opd = \vxr
  182. .endif
  183. .endm
  184. /* RXB - Compute most significant bit used vector registers
  185. *
  186. * @rxb: Operand to store computed RXB value
  187. * @v1: First vector register designated operand
  188. * @v2: Second vector register designated operand
  189. * @v3: Third vector register designated operand
  190. * @v4: Fourth vector register designated operand
  191. */
  192. .macro RXB rxb v1 v2=0 v3=0 v4=0
  193. \rxb = 0
  194. .if \v1 & 0x10
  195. \rxb = \rxb | 0x08
  196. .endif
  197. .if \v2 & 0x10
  198. \rxb = \rxb | 0x04
  199. .endif
  200. .if \v3 & 0x10
  201. \rxb = \rxb | 0x02
  202. .endif
  203. .if \v4 & 0x10
  204. \rxb = \rxb | 0x01
  205. .endif
  206. .endm
  207. /* MRXB - Generate Element Size Control and RXB value
  208. *
  209. * @m: Element size control
  210. * @v1: First vector register designated operand (for RXB)
  211. * @v2: Second vector register designated operand (for RXB)
  212. * @v3: Third vector register designated operand (for RXB)
  213. * @v4: Fourth vector register designated operand (for RXB)
  214. */
  215. .macro MRXB m v1 v2=0 v3=0 v4=0
  216. rxb = 0
  217. RXB rxb, \v1, \v2, \v3, \v4
  218. .byte (\m << 4) | rxb
  219. .endm
  220. /* MRXBOPC - Generate Element Size Control, RXB, and final Opcode fields
  221. *
  222. * @m: Element size control
  223. * @opc: Opcode
  224. * @v1: First vector register designated operand (for RXB)
  225. * @v2: Second vector register designated operand (for RXB)
  226. * @v3: Third vector register designated operand (for RXB)
  227. * @v4: Fourth vector register designated operand (for RXB)
  228. */
  229. .macro MRXBOPC m opc v1 v2=0 v3=0 v4=0
  230. MRXB \m, \v1, \v2, \v3, \v4
  231. .byte \opc
  232. .endm
  233. /* Vector support instructions */
  234. /* VECTOR GENERATE BYTE MASK */
  235. .macro VGBM vr imm2
  236. VX_NUM v1, \vr
  237. .word (0xE700 | ((v1&15) << 4))
  238. .word \imm2
  239. MRXBOPC 0, 0x44, v1
  240. .endm
  241. .macro VZERO vxr
  242. VGBM \vxr, 0
  243. .endm
  244. .macro VONE vxr
  245. VGBM \vxr, 0xFFFF
  246. .endm
  247. /* VECTOR LOAD VR ELEMENT FROM GR */
  248. .macro VLVG v, gr, disp, m
  249. VX_NUM v1, \v
  250. GR_NUM b2, "%r0"
  251. GR_NUM r3, \gr
  252. .word 0xE700 | ((v1&15) << 4) | r3
  253. .word (b2 << 12) | (\disp)
  254. MRXBOPC \m, 0x22, v1
  255. .endm
  256. .macro VLVGB v, gr, index, base
  257. VLVG \v, \gr, \index, \base, 0
  258. .endm
  259. .macro VLVGH v, gr, index
  260. VLVG \v, \gr, \index, 1
  261. .endm
  262. .macro VLVGF v, gr, index
  263. VLVG \v, \gr, \index, 2
  264. .endm
  265. .macro VLVGG v, gr, index
  266. VLVG \v, \gr, \index, 3
  267. .endm
  268. /* VECTOR LOAD REGISTER */
  269. .macro VLR v1, v2
  270. VX_NUM v1, \v1
  271. VX_NUM v2, \v2
  272. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  273. .word 0
  274. MRXBOPC 0, 0x56, v1, v2
  275. .endm
  276. /* VECTOR LOAD */
  277. .macro VL v, disp, index="%r0", base
  278. VX_NUM v1, \v
  279. GR_NUM x2, \index
  280. GR_NUM b2, \base
  281. .word 0xE700 | ((v1&15) << 4) | x2
  282. .word (b2 << 12) | (\disp)
  283. MRXBOPC 0, 0x06, v1
  284. .endm
  285. /* VECTOR LOAD ELEMENT */
  286. .macro VLEx vr1, disp, index="%r0", base, m3, opc
  287. VX_NUM v1, \vr1
  288. GR_NUM x2, \index
  289. GR_NUM b2, \base
  290. .word 0xE700 | ((v1&15) << 4) | x2
  291. .word (b2 << 12) | (\disp)
  292. MRXBOPC \m3, \opc, v1
  293. .endm
  294. .macro VLEB vr1, disp, index="%r0", base, m3
  295. VLEx \vr1, \disp, \index, \base, \m3, 0x00
  296. .endm
  297. .macro VLEH vr1, disp, index="%r0", base, m3
  298. VLEx \vr1, \disp, \index, \base, \m3, 0x01
  299. .endm
  300. .macro VLEF vr1, disp, index="%r0", base, m3
  301. VLEx \vr1, \disp, \index, \base, \m3, 0x03
  302. .endm
  303. .macro VLEG vr1, disp, index="%r0", base, m3
  304. VLEx \vr1, \disp, \index, \base, \m3, 0x02
  305. .endm
  306. /* VECTOR LOAD ELEMENT IMMEDIATE */
  307. .macro VLEIx vr1, imm2, m3, opc
  308. VX_NUM v1, \vr1
  309. .word 0xE700 | ((v1&15) << 4)
  310. .word \imm2
  311. MRXBOPC \m3, \opc, v1
  312. .endm
  313. .macro VLEIB vr1, imm2, index
  314. VLEIx \vr1, \imm2, \index, 0x40
  315. .endm
  316. .macro VLEIH vr1, imm2, index
  317. VLEIx \vr1, \imm2, \index, 0x41
  318. .endm
  319. .macro VLEIF vr1, imm2, index
  320. VLEIx \vr1, \imm2, \index, 0x43
  321. .endm
  322. .macro VLEIG vr1, imm2, index
  323. VLEIx \vr1, \imm2, \index, 0x42
  324. .endm
  325. /* VECTOR LOAD GR FROM VR ELEMENT */
  326. .macro VLGV gr, vr, disp, base="%r0", m
  327. GR_NUM r1, \gr
  328. GR_NUM b2, \base
  329. VX_NUM v3, \vr
  330. .word 0xE700 | (r1 << 4) | (v3&15)
  331. .word (b2 << 12) | (\disp)
  332. MRXBOPC \m, 0x21, v3
  333. .endm
  334. .macro VLGVB gr, vr, disp, base="%r0"
  335. VLGV \gr, \vr, \disp, \base, 0
  336. .endm
  337. .macro VLGVH gr, vr, disp, base="%r0"
  338. VLGV \gr, \vr, \disp, \base, 1
  339. .endm
  340. .macro VLGVF gr, vr, disp, base="%r0"
  341. VLGV \gr, \vr, \disp, \base, 2
  342. .endm
  343. .macro VLGVG gr, vr, disp, base="%r0"
  344. VLGV \gr, \vr, \disp, \base, 3
  345. .endm
  346. /* VECTOR LOAD MULTIPLE */
  347. .macro VLM vfrom, vto, disp, base
  348. VX_NUM v1, \vfrom
  349. VX_NUM v3, \vto
  350. GR_NUM b2, \base /* Base register */
  351. .word 0xE700 | ((v1&15) << 4) | (v3&15)
  352. .word (b2 << 12) | (\disp)
  353. MRXBOPC 0, 0x36, v1, v3
  354. .endm
  355. /* VECTOR STORE MULTIPLE */
  356. .macro VSTM vfrom, vto, disp, base
  357. VX_NUM v1, \vfrom
  358. VX_NUM v3, \vto
  359. GR_NUM b2, \base /* Base register */
  360. .word 0xE700 | ((v1&15) << 4) | (v3&15)
  361. .word (b2 << 12) | (\disp)
  362. MRXBOPC 0, 0x3E, v1, v3
  363. .endm
  364. /* VECTOR PERMUTE */
  365. .macro VPERM vr1, vr2, vr3, vr4
  366. VX_NUM v1, \vr1
  367. VX_NUM v2, \vr2
  368. VX_NUM v3, \vr3
  369. VX_NUM v4, \vr4
  370. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  371. .word ((v3&15) << 12)
  372. MRXBOPC (v4&15), 0x8C, v1, v2, v3, v4
  373. .endm
  374. /* VECTOR UNPACK LOGICAL LOW */
  375. .macro VUPLL vr1, vr2, m3
  376. VX_NUM v1, \vr1
  377. VX_NUM v2, \vr2
  378. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  379. .word 0x0000
  380. MRXBOPC \m3, 0xD4, v1, v2
  381. .endm
  382. .macro VUPLLB vr1, vr2
  383. VUPLL \vr1, \vr2, 0
  384. .endm
  385. .macro VUPLLH vr1, vr2
  386. VUPLL \vr1, \vr2, 1
  387. .endm
  388. .macro VUPLLF vr1, vr2
  389. VUPLL \vr1, \vr2, 2
  390. .endm
  391. /* Vector integer instructions */
  392. /* VECTOR AND */
  393. .macro VN vr1, vr2, vr3
  394. VX_NUM v1, \vr1
  395. VX_NUM v2, \vr2
  396. VX_NUM v3, \vr3
  397. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  398. .word ((v3&15) << 12)
  399. MRXBOPC 0, 0x68, v1, v2, v3
  400. .endm
  401. /* VECTOR EXCLUSIVE OR */
  402. .macro VX vr1, vr2, vr3
  403. VX_NUM v1, \vr1
  404. VX_NUM v2, \vr2
  405. VX_NUM v3, \vr3
  406. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  407. .word ((v3&15) << 12)
  408. MRXBOPC 0, 0x6D, v1, v2, v3
  409. .endm
  410. /* VECTOR GALOIS FIELD MULTIPLY SUM */
  411. .macro VGFM vr1, vr2, vr3, m4
  412. VX_NUM v1, \vr1
  413. VX_NUM v2, \vr2
  414. VX_NUM v3, \vr3
  415. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  416. .word ((v3&15) << 12)
  417. MRXBOPC \m4, 0xB4, v1, v2, v3
  418. .endm
  419. .macro VGFMB vr1, vr2, vr3
  420. VGFM \vr1, \vr2, \vr3, 0
  421. .endm
  422. .macro VGFMH vr1, vr2, vr3
  423. VGFM \vr1, \vr2, \vr3, 1
  424. .endm
  425. .macro VGFMF vr1, vr2, vr3
  426. VGFM \vr1, \vr2, \vr3, 2
  427. .endm
  428. .macro VGFMG vr1, vr2, vr3
  429. VGFM \vr1, \vr2, \vr3, 3
  430. .endm
  431. /* VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE */
  432. .macro VGFMA vr1, vr2, vr3, vr4, m5
  433. VX_NUM v1, \vr1
  434. VX_NUM v2, \vr2
  435. VX_NUM v3, \vr3
  436. VX_NUM v4, \vr4
  437. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  438. .word ((v3&15) << 12) | (\m5 << 8)
  439. MRXBOPC (v4&15), 0xBC, v1, v2, v3, v4
  440. .endm
  441. .macro VGFMAB vr1, vr2, vr3, vr4
  442. VGFMA \vr1, \vr2, \vr3, \vr4, 0
  443. .endm
  444. .macro VGFMAH vr1, vr2, vr3, vr4
  445. VGFMA \vr1, \vr2, \vr3, \vr4, 1
  446. .endm
  447. .macro VGFMAF vr1, vr2, vr3, vr4
  448. VGFMA \vr1, \vr2, \vr3, \vr4, 2
  449. .endm
  450. .macro VGFMAG vr1, vr2, vr3, vr4
  451. VGFMA \vr1, \vr2, \vr3, \vr4, 3
  452. .endm
  453. /* VECTOR SHIFT RIGHT LOGICAL BY BYTE */
  454. .macro VSRLB vr1, vr2, vr3
  455. VX_NUM v1, \vr1
  456. VX_NUM v2, \vr2
  457. VX_NUM v3, \vr3
  458. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  459. .word ((v3&15) << 12)
  460. MRXBOPC 0, 0x7D, v1, v2, v3
  461. .endm
  462. /* VECTOR REPLICATE IMMEDIATE */
  463. .macro VREPI vr1, imm2, m3
  464. VX_NUM v1, \vr1
  465. .word 0xE700 | ((v1&15) << 4)
  466. .word \imm2
  467. MRXBOPC \m3, 0x45, v1
  468. .endm
  469. .macro VREPIB vr1, imm2
  470. VREPI \vr1, \imm2, 0
  471. .endm
  472. .macro VREPIH vr1, imm2
  473. VREPI \vr1, \imm2, 1
  474. .endm
  475. .macro VREPIF vr1, imm2
  476. VREPI \vr1, \imm2, 2
  477. .endm
  478. .macro VREPIG vr1, imm2
  479. VREP \vr1, \imm2, 3
  480. .endm
  481. /* VECTOR ADD */
  482. .macro VA vr1, vr2, vr3, m4
  483. VX_NUM v1, \vr1
  484. VX_NUM v2, \vr2
  485. VX_NUM v3, \vr3
  486. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  487. .word ((v3&15) << 12)
  488. MRXBOPC \m4, 0xF3, v1, v2, v3
  489. .endm
  490. .macro VAB vr1, vr2, vr3
  491. VA \vr1, \vr2, \vr3, 0
  492. .endm
  493. .macro VAH vr1, vr2, vr3
  494. VA \vr1, \vr2, \vr3, 1
  495. .endm
  496. .macro VAF vr1, vr2, vr3
  497. VA \vr1, \vr2, \vr3, 2
  498. .endm
  499. .macro VAG vr1, vr2, vr3
  500. VA \vr1, \vr2, \vr3, 3
  501. .endm
  502. .macro VAQ vr1, vr2, vr3
  503. VA \vr1, \vr2, \vr3, 4
  504. .endm
  505. /* VECTOR ELEMENT SHIFT RIGHT ARITHMETIC */
  506. .macro VESRAV vr1, vr2, vr3, m4
  507. VX_NUM v1, \vr1
  508. VX_NUM v2, \vr2
  509. VX_NUM v3, \vr3
  510. .word 0xE700 | ((v1&15) << 4) | (v2&15)
  511. .word ((v3&15) << 12)
  512. MRXBOPC \m4, 0x7A, v1, v2, v3
  513. .endm
  514. .macro VESRAVB vr1, vr2, vr3
  515. VESRAV \vr1, \vr2, \vr3, 0
  516. .endm
  517. .macro VESRAVH vr1, vr2, vr3
  518. VESRAV \vr1, \vr2, \vr3, 1
  519. .endm
  520. .macro VESRAVF vr1, vr2, vr3
  521. VESRAV \vr1, \vr2, \vr3, 2
  522. .endm
  523. .macro VESRAVG vr1, vr2, vr3
  524. VESRAV \vr1, \vr2, \vr3, 3
  525. .endm
  526. #endif /* __ASSEMBLY__ */
  527. #endif /* __ASM_S390_VX_INSN_H */