1000-mforce-l32.patch 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. https://github.com/jcmvbkbc/gcc-xtensa/commit/6b0c9f92fb8e11c6be098febb4f502f6af37cd35.patch
  2. From 6b0c9f92fb8e11c6be098febb4f502f6af37cd35 Mon Sep 17 00:00:00 2001
  3. From: Max Filippov <jcmvbkbc@gmail.com>
  4. Date: Thu, 11 Jun 2015 17:56:57 +0300
  5. Subject: [PATCH] WIP: xtensa: add -mforce-l32
  6. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
  7. ---
  8. gcc/config/xtensa/constraints.md | 15 ++++++++++++
  9. gcc/config/xtensa/xtensa.c | 53 +++++++++++++++++++++++++++++++++++++++-
  10. gcc/config/xtensa/xtensa.md | 49 ++++++++++++++++++++-----------------
  11. gcc/config/xtensa/xtensa.opt | 4 +++
  12. 4 files changed, 98 insertions(+), 23 deletions(-)
  13. diff --git a/gcc/config/xtensa/constraints.md b/gcc/config/xtensa/constraints.md
  14. index 30f4c1f..5fd9337 100644
  15. --- a/gcc/config/xtensa/constraints.md
  16. +++ b/gcc/config/xtensa/constraints.md
  17. @@ -137,3 +137,18 @@
  18. (and (match_code "reg")
  19. (match_test "reload_in_progress
  20. && REGNO (op) >= FIRST_PSEUDO_REGISTER"))))
  21. +
  22. +(define_constraint "Y"
  23. + "Memory that is not in a literal pool."
  24. + (ior (and (and (match_code "mem")
  25. + (match_test "! constantpool_mem_p (op)"))
  26. + (match_test "!TARGET_FORCE_L32"))
  27. + (and (match_code "reg")
  28. + (match_test "reload_in_progress
  29. + && REGNO (op) >= FIRST_PSEUDO_REGISTER"))))
  30. +
  31. +(define_constraint "Z"
  32. + "Memory that is not in a literal pool."
  33. + (and (and (match_code "mem")
  34. + (match_test "! constantpool_mem_p (op)"))
  35. + (match_test "TARGET_FORCE_L32")))
  36. diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
  37. index d8c5b41..559b181 100644
  38. --- a/gcc/config/xtensa/xtensa.c
  39. +++ b/gcc/config/xtensa/xtensa.c
  40. @@ -1824,7 +1824,8 @@ xtensa_legitimate_address_p (machine_mode mode, rtx addr, bool strict)
  41. return true;
  42. /* Check for "register + offset" addressing. */
  43. - if (GET_CODE (addr) == PLUS)
  44. + if (GET_CODE (addr) == PLUS &&
  45. + (!TARGET_FORCE_L32 || (mode != HImode && mode != QImode)))
  46. {
  47. rtx xplus0 = XEXP (addr, 0);
  48. rtx xplus1 = XEXP (addr, 1);
  49. @@ -2308,6 +2309,8 @@ printx (FILE *file, signed int val)
  50. fprintf (file, "0x%x", val);
  51. }
  52. +static void
  53. +output_address_base (FILE *file, rtx addr);
  54. void
  55. print_operand (FILE *file, rtx x, int letter)
  56. @@ -2317,6 +2320,13 @@ print_operand (FILE *file, rtx x, int letter)
  57. switch (letter)
  58. {
  59. + case 'B':
  60. + if (GET_CODE (x) == MEM)
  61. + output_address_base (file, XEXP (x, 0));
  62. + else
  63. + output_operand_lossage ("invalid %%B value");
  64. + break;
  65. +
  66. case 'D':
  67. if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
  68. fprintf (file, "%s", reg_names[xt_true_regnum (x) + 1]);
  69. @@ -2450,6 +2460,47 @@ print_operand (FILE *file, rtx x, int letter)
  70. }
  71. }
  72. +static void
  73. +output_address_base (FILE *file, rtx addr)
  74. +{
  75. + switch (GET_CODE (addr))
  76. + {
  77. + default:
  78. + fatal_insn ("invalid address", addr);
  79. + break;
  80. +
  81. + case REG:
  82. + fprintf (file, "%s", reg_names [REGNO (addr)]);
  83. + break;
  84. +
  85. + case PLUS:
  86. + {
  87. + rtx reg = (rtx)0;
  88. + rtx offset = (rtx)0;
  89. + rtx arg0 = XEXP (addr, 0);
  90. + rtx arg1 = XEXP (addr, 1);
  91. +
  92. + if (GET_CODE (arg0) == REG)
  93. + {
  94. + reg = arg0;
  95. + offset = arg1;
  96. + }
  97. + else if (GET_CODE (arg1) == REG)
  98. + {
  99. + reg = arg1;
  100. + offset = arg0;
  101. + }
  102. + else
  103. + fatal_insn ("no register in address", addr);
  104. +
  105. + if (CONSTANT_P (offset))
  106. + fprintf (file, "%s", reg_names [REGNO (reg)]);
  107. + else
  108. + fatal_insn ("address offset not a constant", addr);
  109. + }
  110. + break;
  111. + }
  112. +}
  113. /* A C compound statement to output to stdio stream STREAM the
  114. assembler syntax for an instruction operand that is a memory
  115. diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md
  116. index a577aa3..f56c45e 100644
  117. --- a/gcc/config/xtensa/xtensa.md
  118. +++ b/gcc/config/xtensa/xtensa.md
  119. @@ -532,26 +532,28 @@
  120. ;; Zero-extend instructions.
  121. (define_insn "zero_extendhisi2"
  122. - [(set (match_operand:SI 0 "register_operand" "=a,a")
  123. - (zero_extend:SI (match_operand:HI 1 "nonimmed_operand" "r,U")))]
  124. + [(set (match_operand:SI 0 "register_operand" "=a,a,a")
  125. + (zero_extend:SI (match_operand:HI 1 "nonimmed_operand" "r,Y,Z")))]
  126. ""
  127. "@
  128. extui\t%0, %1, 0, 16
  129. - l16ui\t%0, %1"
  130. - [(set_attr "type" "arith,load")
  131. + l16ui\t%0, %1
  132. + ssa8l\t%B1 ; srli\t%0, %B1, 2 ; slli\t%0, %0, 2 ; l32i\t%0, %0, 0 ; srl\t%0, %0 ; extui\t%0, %0, 0, 16"
  133. + [(set_attr "type" "arith,load,load")
  134. (set_attr "mode" "SI")
  135. - (set_attr "length" "3,3")])
  136. + (set_attr "length" "3,3,18")])
  137. (define_insn "zero_extendqisi2"
  138. - [(set (match_operand:SI 0 "register_operand" "=a,a")
  139. - (zero_extend:SI (match_operand:QI 1 "nonimmed_operand" "r,U")))]
  140. + [(set (match_operand:SI 0 "register_operand" "=a,a,a")
  141. + (zero_extend:SI (match_operand:QI 1 "nonimmed_operand" "r,Y,Z")))]
  142. ""
  143. "@
  144. extui\t%0, %1, 0, 8
  145. - l8ui\t%0, %1"
  146. - [(set_attr "type" "arith,load")
  147. + l8ui\t%0, %1
  148. + ssa8l\t%B1 ; srli\t%0, %B1, 2 ; slli\t%0, %0, 2 ; l32i\t%0, %0, 0 ; srl\t%0, %0 ; extui\t%0, %0, 0, 8"
  149. + [(set_attr "type" "arith,load,load")
  150. (set_attr "mode" "SI")
  151. - (set_attr "length" "3,3")])
  152. + (set_attr "length" "3,3,18")])
  153. ;; Sign-extend instructions.
  154. @@ -569,15 +571,16 @@
  155. })
  156. (define_insn "extendhisi2_internal"
  157. - [(set (match_operand:SI 0 "register_operand" "=B,a")
  158. - (sign_extend:SI (match_operand:HI 1 "sext_operand" "r,U")))]
  159. + [(set (match_operand:SI 0 "register_operand" "=B,a,a")
  160. + (sign_extend:SI (match_operand:HI 1 "sext_operand" "r,r,Y")))]
  161. ""
  162. "@
  163. sext\t%0, %1, 15
  164. + slli\t%0, %1, 16 ; srai\t%0, %0, 16
  165. l16si\t%0, %1"
  166. - [(set_attr "type" "arith,load")
  167. + [(set_attr "type" "arith,arith,load")
  168. (set_attr "mode" "SI")
  169. - (set_attr "length" "3,3")])
  170. + (set_attr "length" "3,6,3")])
  171. (define_expand "extendqisi2"
  172. [(set (match_operand:SI 0 "register_operand" "")
  173. @@ -796,8 +799,8 @@
  174. })
  175. (define_insn "movhi_internal"
  176. - [(set (match_operand:HI 0 "nonimmed_operand" "=D,D,a,a,a,U,*a,*A")
  177. - (match_operand:HI 1 "move_operand" "M,d,r,I,U,r,*A,*r"))]
  178. + [(set (match_operand:HI 0 "nonimmed_operand" "=D,D,a,a,a,a,U,*a,*A")
  179. + (match_operand:HI 1 "move_operand" "M,d,r,I,Y,Z,r,*A,*r"))]
  180. "xtensa_valid_move (HImode, operands)"
  181. "@
  182. movi.n\t%0, %x1
  183. @@ -805,12 +808,13 @@
  184. mov\t%0, %1
  185. movi\t%0, %x1
  186. %v1l16ui\t%0, %1
  187. + ssa8l\t%B1 ; srli\t%0, %B1, 2 ; slli\t%0, %0, 2 ; %v1l32i\t%0, %0, 0 ; srl\t%0, %0 ; extui\t%0, %0, 0, 16
  188. %v0s16i\t%1, %0
  189. rsr\t%0, ACCLO
  190. wsr\t%1, ACCLO"
  191. - [(set_attr "type" "move,move,move,move,load,store,rsr,wsr")
  192. + [(set_attr "type" "move,move,move,move,load,load,store,rsr,wsr")
  193. (set_attr "mode" "HI")
  194. - (set_attr "length" "2,2,3,3,3,3,3,3")])
  195. + (set_attr "length" "2,2,3,3,3,18,3,3,3")])
  196. ;; 8-bit Integer moves
  197. @@ -824,8 +828,8 @@
  198. })
  199. (define_insn "movqi_internal"
  200. - [(set (match_operand:QI 0 "nonimmed_operand" "=D,D,a,a,a,U,*a,*A")
  201. - (match_operand:QI 1 "move_operand" "M,d,r,I,U,r,*A,*r"))]
  202. + [(set (match_operand:QI 0 "nonimmed_operand" "=D,D,a,a,a,a,U,*a,*A")
  203. + (match_operand:QI 1 "move_operand" "M,d,r,I,Y,Z,r,*A,*r"))]
  204. "xtensa_valid_move (QImode, operands)"
  205. "@
  206. movi.n\t%0, %x1
  207. @@ -833,12 +837,13 @@
  208. mov\t%0, %1
  209. movi\t%0, %x1
  210. %v1l8ui\t%0, %1
  211. + ssa8l\t%B1 ; srli\t%0, %B1, 2 ; slli\t%0, %0, 2 ; %v1l32i\t%0, %0, 0 ; srl\t%0, %0 ; extui\t%0, %0, 0, 8
  212. %v0s8i\t%1, %0
  213. rsr\t%0, ACCLO
  214. wsr\t%1, ACCLO"
  215. - [(set_attr "type" "move,move,move,move,load,store,rsr,wsr")
  216. + [(set_attr "type" "move,move,move,move,load,load,store,rsr,wsr")
  217. (set_attr "mode" "QI")
  218. - (set_attr "length" "2,2,3,3,3,3,3,3")])
  219. + (set_attr "length" "2,2,3,3,3,18,3,3,3")])
  220. ;; Sub-word reloads from the constant pool.
  221. diff --git a/gcc/config/xtensa/xtensa.opt b/gcc/config/xtensa/xtensa.opt
  222. index 2fd6cee..02020d2 100644
  223. --- a/gcc/config/xtensa/xtensa.opt
  224. +++ b/gcc/config/xtensa/xtensa.opt
  225. @@ -41,3 +41,7 @@ Intersperse literal pools with code in the text section
  226. mserialize-volatile
  227. Target Report Mask(SERIALIZE_VOLATILE)
  228. -mno-serialize-volatile Do not serialize volatile memory references with MEMW instructions
  229. +
  230. +mforce-l32
  231. +Target Report Mask(FORCE_L32)
  232. +Use l32i to access 1- and 2-byte quantities in memory instead of l8ui/l16ui