hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp
changeset 33628 09241459a8b8
parent 33465 6063f28a6efb
child 34162 16b54851eaf6
equal deleted inserted replaced
33627:c5b7455f846e 33628:09241459a8b8
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    26 #define CPU_X86_VM_MACROASSEMBLER_X86_HPP
    26 #define CPU_X86_VM_MACROASSEMBLER_X86_HPP
    27 
    27 
    28 #include "asm/assembler.hpp"
    28 #include "asm/assembler.hpp"
    29 #include "utilities/macros.hpp"
    29 #include "utilities/macros.hpp"
    30 #include "runtime/rtmLocking.hpp"
    30 #include "runtime/rtmLocking.hpp"
    31 
       
    32 
    31 
    33 // MacroAssembler extends Assembler by frequently used macros.
    32 // MacroAssembler extends Assembler by frequently used macros.
    34 //
    33 //
    35 // Instructions for which a 'better' code sequence exists depending
    34 // Instructions for which a 'better' code sequence exists depending
    36 // on arguments should also go in here.
    35 // on arguments should also go in here.
  1210   void verified_entry(int framesize, int stack_bang_size, bool fp_mode_24b);
  1209   void verified_entry(int framesize, int stack_bang_size, bool fp_mode_24b);
  1211 
  1210 
  1212   // clear memory of size 'cnt' qwords, starting at 'base'.
  1211   // clear memory of size 'cnt' qwords, starting at 'base'.
  1213   void clear_mem(Register base, Register cnt, Register rtmp);
  1212   void clear_mem(Register base, Register cnt, Register rtmp);
  1214 
  1213 
       
  1214 #ifdef COMPILER2
       
  1215   void string_indexof_char(Register str1, Register cnt1, Register ch, Register result,
       
  1216                            XMMRegister vec1, XMMRegister vec2, XMMRegister vec3, Register tmp);
       
  1217 
  1215   // IndexOf strings.
  1218   // IndexOf strings.
  1216   // Small strings are loaded through stack if they cross page boundary.
  1219   // Small strings are loaded through stack if they cross page boundary.
  1217   void string_indexof(Register str1, Register str2,
  1220   void string_indexof(Register str1, Register str2,
  1218                       Register cnt1, Register cnt2,
  1221                       Register cnt1, Register cnt2,
  1219                       int int_cnt2,  Register result,
  1222                       int int_cnt2,  Register result,
  1220                       XMMRegister vec, Register tmp);
  1223                       XMMRegister vec, Register tmp,
       
  1224                       int ae);
  1221 
  1225 
  1222   // IndexOf for constant substrings with size >= 8 elements
  1226   // IndexOf for constant substrings with size >= 8 elements
  1223   // which don't need to be loaded through stack.
  1227   // which don't need to be loaded through stack.
  1224   void string_indexofC8(Register str1, Register str2,
  1228   void string_indexofC8(Register str1, Register str2,
  1225                       Register cnt1, Register cnt2,
  1229                       Register cnt1, Register cnt2,
  1226                       int int_cnt2,  Register result,
  1230                       int int_cnt2,  Register result,
  1227                       XMMRegister vec, Register tmp);
  1231                       XMMRegister vec, Register tmp,
       
  1232                       int ae);
  1228 
  1233 
  1229     // Smallest code: we don't need to load through stack,
  1234     // Smallest code: we don't need to load through stack,
  1230     // check string tail.
  1235     // check string tail.
  1231 
  1236 
       
  1237   // helper function for string_compare
       
  1238   void load_next_elements(Register elem1, Register elem2, Register str1, Register str2,
       
  1239                           Address::ScaleFactor scale, Address::ScaleFactor scale1,
       
  1240                           Address::ScaleFactor scale2, Register index, int ae);
  1232   // Compare strings.
  1241   // Compare strings.
  1233   void string_compare(Register str1, Register str2,
  1242   void string_compare(Register str1, Register str2,
  1234                       Register cnt1, Register cnt2, Register result,
  1243                       Register cnt1, Register cnt2, Register result,
  1235                       XMMRegister vec1);
  1244                       XMMRegister vec1, int ae);
  1236 
  1245 
  1237   // Compare char[] arrays.
  1246   // Search for Non-ASCII character (Negative byte value) in a byte array,
  1238   void char_arrays_equals(bool is_array_equ, Register ary1, Register ary2,
  1247   // return true if it has any and false otherwise.
  1239                           Register limit, Register result, Register chr,
  1248   void has_negatives(Register ary1, Register len,
  1240                           XMMRegister vec1, XMMRegister vec2);
  1249                      Register result, Register tmp1,
       
  1250                      XMMRegister vec1, XMMRegister vec2);
       
  1251 
       
  1252   // Compare char[] or byte[] arrays.
       
  1253   void arrays_equals(bool is_array_equ, Register ary1, Register ary2,
       
  1254                      Register limit, Register result, Register chr,
       
  1255                      XMMRegister vec1, XMMRegister vec2, bool is_char);
       
  1256 
       
  1257 #endif
  1241 
  1258 
  1242   // Fill primitive arrays
  1259   // Fill primitive arrays
  1243   void generate_fill(BasicType t, bool aligned,
  1260   void generate_fill(BasicType t, bool aligned,
  1244                      Register to, Register value, Register count,
  1261                      Register to, Register value, Register count,
  1245                      Register rtmp, XMMRegister xtmp);
  1262                      Register rtmp, XMMRegister xtmp);
  1330   void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, XMMRegister xbuf);
  1347   void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, XMMRegister xbuf);
  1331   // Fold 8-bit data
  1348   // Fold 8-bit data
  1332   void fold_8bit_crc32(Register crc, Register table, Register tmp);
  1349   void fold_8bit_crc32(Register crc, Register table, Register tmp);
  1333   void fold_8bit_crc32(XMMRegister crc, Register table, XMMRegister xtmp, Register tmp);
  1350   void fold_8bit_crc32(XMMRegister crc, Register table, XMMRegister xtmp, Register tmp);
  1334 
  1351 
       
  1352   // Compress char[] array to byte[].
       
  1353   void char_array_compress(Register src, Register dst, Register len,
       
  1354                            XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3,
       
  1355                            XMMRegister tmp4, Register tmp5, Register result);
       
  1356 
       
  1357   // Inflate byte[] array to char[].
       
  1358   void byte_array_inflate(Register src, Register dst, Register len,
       
  1359                           XMMRegister tmp1, Register tmp2);
       
  1360 
  1335 #undef VIRTUAL
  1361 #undef VIRTUAL
  1336 
  1362 
  1337 };
  1363 };
  1338 
  1364 
  1339 /**
  1365 /**