genfma.pl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/perl
  2. %packed_insns = (
  3. 'vfmadd' => 0x98,
  4. 'vfmaddsub' => 0x96,
  5. 'vfmsubadd' => 0x97,
  6. 'vfmsub' => 0x9a,
  7. 'vfnmadd' => 0x9c,
  8. 'vfnmsub' => 0x9e
  9. );
  10. %scalar_insns = (
  11. 'vfmadd' => 0x99,
  12. 'vfmsub' => 0x9b,
  13. 'vfnmadd' => 0x9d,
  14. 'vfnmsub' => 0x9f
  15. );
  16. foreach $pi ( sort(keys(%packed_insns)) ) {
  17. $op = $packed_insns{$pi};
  18. foreach $order ('132', '213', '231') {
  19. $xorder = substr($order,1,1).substr($order,0,1).substr($order,2,1);
  20. foreach $o ($order, $xorder) {
  21. for ($w = 0; $w < 2; $w++) {
  22. $suf = $w ? 'pd' : 'ps';
  23. for ($l = 128; $l <= 256; $l <<= 1) {
  24. $sx = ($l == 256) ? 'SY' : 'SO';
  25. $mm = ($l == 256) ? 'ymm' : 'xmm';
  26. printf "%-15s %-31s %-8s%-39s %s\n",
  27. "\U${pi}${o}${suf}",
  28. "${mm}reg,${mm}reg,${mm}rm",
  29. "[rvm:",
  30. sprintf("vex.dds.%d.66.0f38.w%d %02x /r]",
  31. $l, $w, $op),
  32. "FMA,FUTURE,${sx}";
  33. }
  34. }
  35. }
  36. $op += 0x10;
  37. }
  38. }
  39. foreach $si ( sort(keys(%scalar_insns)) ) {
  40. $op = $scalar_insns{$si};
  41. foreach $order ('132', '213', '231') {
  42. $xorder = substr($order,1,1).substr($order,0,1).substr($order,2,1);
  43. foreach $o ($order, $xorder) {
  44. for ($w = 0; $w < 2; $w++) {
  45. $suf = $w ? 'sd' : 'ss';
  46. $sx = $w ? 'SQ' : 'SD';
  47. $l = 128;
  48. $mm = 'xmm';
  49. printf "%-15s %-31s %-8s%-39s %s\n",
  50. "\U${si}${o}${suf}",
  51. "${mm}reg,${mm}reg,${mm}rm",
  52. '[rvm:',
  53. sprintf("vex.dds.%d.66.0f38.w%d %02x /r]",
  54. $l, $w, $op),
  55. "FMA,FUTURE,${sx}";
  56. }
  57. }
  58. $op += 0x10;
  59. }
  60. }