< prev index next >

src/cpu/s390/vm/c1_LIRGenerator_s390.cpp

Print this page
rev 12410 : 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
Reviewed-by:


1220       // CCallingConventionRequiresIntsAsLongs
1221       crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32 stub doesn't care about high bits.
1222       __ leal(LIR_OprFact::address(a), arg2);
1223       load_int_as_long(gen()->lir(), len, arg3);
1224 
1225       __ call_runtime_leaf(StubRoutines::updateBytesCRC32(), LIR_OprFact::illegalOpr, result_reg, cc->args());
1226       __ move(result_reg, result);
1227       break;
1228     }
1229     default: {
1230       ShouldNotReachHere();
1231     }
1232   }
1233 }
1234 
1235 void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
1236   Unimplemented();
1237 }
1238 
1239 void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
1240   fatal("FMA intrinsic is not implemented on this platform");





















1241 }
1242 
1243 void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
1244   fatal("vectorizedMismatch intrinsic is not implemented on this platform");
1245 }
1246 


1220       // CCallingConventionRequiresIntsAsLongs
1221       crc.load_item_force(arg1); // We skip int->long conversion here, because CRC32 stub doesn't care about high bits.
1222       __ leal(LIR_OprFact::address(a), arg2);
1223       load_int_as_long(gen()->lir(), len, arg3);
1224 
1225       __ call_runtime_leaf(StubRoutines::updateBytesCRC32(), LIR_OprFact::illegalOpr, result_reg, cc->args());
1226       __ move(result_reg, result);
1227       break;
1228     }
1229     default: {
1230       ShouldNotReachHere();
1231     }
1232   }
1233 }
1234 
1235 void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
1236   Unimplemented();
1237 }
1238 
1239 void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
1240   assert(x->number_of_arguments() == 3, "wrong type");
1241   assert(UseFMA, "Needs FMA instructions support.");
1242   LIRItem value(x->argument_at(0), this);
1243   LIRItem value1(x->argument_at(1), this);
1244   LIRItem value2(x->argument_at(2), this);
1245 
1246   value2.set_destroys_register();
1247 
1248   value.load_item();
1249   value1.load_item();
1250   value2.load_item();
1251 
1252   LIR_Opr calc_input = value.result();
1253   LIR_Opr calc_input1 = value1.result();
1254   LIR_Opr calc_input2 = value2.result();
1255   LIR_Opr calc_result = rlock_result(x);
1256 
1257   switch (x->id()) {
1258   case vmIntrinsics::_fmaD:   __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
1259   case vmIntrinsics::_fmaF:   __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
1260   default:                    ShouldNotReachHere();
1261   }
1262 }
1263 
1264 void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
1265   fatal("vectorizedMismatch intrinsic is not implemented on this platform");
1266 }
1267 
< prev index next >