RFR 8222384 [lworld] Calling convention - C2 to C1 (floating point params)

Ioi Lam ioi.lam at oracle.com
Fri Apr 12 04:58:08 UTC 2019


https://bugs.openjdk.java.net/browse/JDK-8222384
http://cr.openjdk.java.net/~iklam/valhalla/8222384-c1-calling-convention-floats.v01/

This changeset supports floating point parameters (x64 only, i.e., XMM 
registers). I also fixed an issue wheresome registers may be trashed 
before their contents are shuffled. Here's an example (see the rdx 
register).


C2 passes outgoing parameters as:

   # {method} {0x00007fb8593f8420} 'test' '(IQFloatTriplet;I)I' in 'Test'
   # parm0:    rsi       = int
   # parm1:    xmm0      = float
   # parm2:    xmm1      = float
   # parm3:    xmm2      = float
   # parm4:    rdx       = int


C1 expects incoming parameters as:

   # parm0:    rsi       = int
   # parm1:    rdx:rdx   = 'FloatTriplet'
   # parm2:    rcx       = int

shuffling code:

      20: mov    0x10(%rax),%r11d  ;r11 = buffered FloatTriplet obj
      24: shl    $0x3,%r11
      28: vmovss %xmm0,0x10(%r11)
      34: vmovss %xmm1,0x14(%r11)
      40: vmovss %xmm2,0x18(%r11)
      46: push   %r11              ; can't write to rdx yet -> save it
      48: mov    %rdx,%rcx         ; rdx is now shuffled
      51: pop    %rdx              ; now update rdx

Thanks
- Ioi


More information about the valhalla-dev mailing list